1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Формулу вида <формула >::=<терминал >|(<формула ><знак><формула >) <знак>::= + | – | * | / <терминал >::=<переменная>|<цифра > <переменная>::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z <цифра >::=0|1|2|3|4|5|6|7|8|9 можно представить в виде двоичного дерева по следующим правилам: формула из одного терминального символа (цифры или переменной ) представляется деревом, состоящим из одной вершины, содержащей этот символ, а формула вида (f1 s f2) — деревом, в котором корень — это знак s, а левое и правое поддеревья — это соответствующие представления формул f1 и f2. О писать подпрограмму, которая: преобразует дерево-формулу, заменяя в нем все поддеревья, соответствующие формулам ((f1 +- f2) * f3) и (f1 * (f2 + - f3)), на поддеревья, соответствующие формулам ((f1 * f3) +-(f2 * f3)) и ((f1 * f2) +-(f1 * f3));
есть несколько готовых методов: модуль создания корня дерева, здесь функция создания узла
function NewNode (var str : string; var i : integer): PNode;
implementation
uses SysUtils, UIntKnot, UVarNameKnot, USignKnot;
function NewNode(var str: string; var i: integer): PNode; begin While (i<=Length(str)) and (str[i]=' ') do inc(i); if i>Length(str) then Result:=nil else begin case str[i] of '0','1'..'9': Result:=New(PIntNode, InitEmpty); 'a'..'z': Result:=New(PVarNode, InitEmpty); '(': Result:=New(PSignNode, InitEmpty); else Result:=nil end; if Result<> nil then if not result.LoadFromStr(str,i) then begin dispose(Result); Result:=nil; end; end; end;
function TIntNode.LoadFromStr (var str : string ; var i : integer) : boolean; var d: string; begin d:=''; While (i<=length(str)) and (str[i] in ['0'..'9']) do begin d:=d+str[i]; inc(i); end; FInf:=StrToInt(d); Result:=true; end;
function TVarNode.LoadFromStr (var str : string ; var i : integer) : boolean; var c: string; begin c:=''; While (i<=length(str))and(str[i] in ['a'..'z']) do begin c:=c+str[i]; inc(i); end; FInf:=c; VarMas.Add(FInf); Result:=true; end;
function TSignNode.LoadFromStr (var str : string ; var i : integer) : boolean; begin Result:=true; if (i>Length(str)) then Result:=false else if str[i]<>'(' then Result:=false else begin i:=i+1; While (i<=Length(str)) and (str[i]=' ') do inc(i); SetLeft(NewNode(str,i)); if GetLeft=nil Then result:=false else begin While (i<=Length(str)) and (str[i]=' ') do inc(i); if (i>Length(str)) or not (Str[i] in ['+','-','*','/']) then Result:=false else begin FInf:=StrToSign(Str[i]); i:=i+1; While (i<=Length(str)) and (str[i]=' ') do inc(i); SetRight(NewNode(str,i)); if GetRight=nil then Result:=false else begin While (i<=Length(str)) and (str[i]=' ') do inc(i); if (i>Length(str)) or (str[i]<>')') then Result:=false else i:=i+1; end; end end; end; end;
Procedure TFormula.LoadFromText(FName: string); var F: Text; s, str: string; begin AssignFile(F,FName); reset(f); str:=''; while not eof(f) do begin readln(f, s); str:=str+s end; close(f); if not LoadFromStr(str) then writeln; end;
Помогите пожалуйста дописать нехватающие методы и оформить задачу. Заранее спасибо, кто поможет
Сообщение отредактировано: Веталь - 17.04.2009 16:36