Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
Внизвыход из процедуры Найти похожие ветки
← →
rena © (2008-05-28 20:10) [0]Имеется процедура, заносящая математическое выражение вида a*(b*(c+d)+e) в дерево. Нужно совершить обход дерева и с помощью него посчитать данное выражение. В процедуре посчета после проверки первого условия if..then.. второе не проверяется и осуществляется выход из процедуры, хотя по идее после этого должно проверяться второе условие..помогите, пожалуйста, понять чем проблема..
begin
{ TODO -oUser -cConsole Main : Insert code here }
//Основная программа
//*a+*b+cde *2+*3+125
//a*(b*(c+d)+e)
Writeln("Vvedite virajenie vida a*(b*(c+d)+e)");
readln(s);
//Процедуры
//Заносим выражение в дерево
t:=nil; root:=nil; r:=nil;
i:=1;
Virajenie(root,t,r,s,i);
//Вычисляем значение выражения
Vivod(root,0);
Writeln("Vichislit"" znachenie virajeniya?");
readln(a);
if a="y" then
begin
t:=root; i:=0; f:=0;
Vichislenie(f,t,i);
Writeln("Zna4enie virajeniya=",f);
readln;readln;
end;
procedure Vichislenie(var f:integer;t:P_Node;i:integer);
var a:array of integer;
begin
if t<>nil then
if (t^.left<>nil)and(t^.right<>nil) then
begin
if t^.left^.info in ["+","*"] then
Vichislenie(f,t^.left,i) else
begin
i:=i+1;
a[i]:=StrToInt(t^.left^.info);
end;
if t^.right^.info in ["+","*"] then
Vichislenie(f,t^.right,i) else
begin
i:=i+1;
a[i]:=StrToInt(t^.right^.info);
end;
case t^.info of
"*": a[i]:=a[i]*a[i-1];
"+": a[i]:=a[i]+a[i-1];
end;
end;
end;
Я осознаю, что процедура подсчета пока не доделана, но мне надо хотя бы в массив занести сначала значения, а тут и это не выходит..
← →
rena © (2008-05-28 20:17) [1]при занесении получается дерево вида
*
/ \
a +
\ \
* e
/ \
b +
/ \
c d
← →
Renegat (2008-05-28 20:22) [2]Сдаётся мне, что здесь поможет массив и обротная венгерская нотация. Заносим в массив сначала два числа, а потом знак операции над ними. Потом сканируем знаки операции и производим действие, записав результат в ячейку "с операцией". И идём дальше.
← →
Renegat (2008-05-28 20:23) [3]извиняюмсь - обратная польская запись... во блин проглюкнуло %)
← →
Сергей М. © (2008-05-28 20:58) [4]
> осознаю, что процедура подсчета пока не доделана
Ты ее содрал что ли откуда-то ?
Скажи на милость, за каким лешим первым параметром в процедуру "Vichislenie" передается (да еще и по ссылке) переменная f, если нигде в теле этой процедуры обрашения к значению этой переменной не происходит ?
← →
rena © (2008-05-28 21:58) [5]не в ней дело) даже если напишу просто
procedure Vichislenie(t:P_Node);
var a:array of char;
begin
if t<>nil then begin
a[i]:=t^.info;
Vichislenie(t^.left);
Vichislenie(t^.right);
i:=i+1;
end;
end;
После выполнения первого действия осуществляется выход из процедуры, что бы я не писала в ней..не пойму почему..меня этот вопрос волнует..
← →
Renegat (2008-05-28 22:05) [6]А это принципиально нужно делать через связанные списки? Массивы, имхо, удобнее...
← →
rena © (2008-05-28 22:08) [7]Да, задание такое. Нужно занести выражение в дерево (занесено вроде правильно) и посчитать его..вот с последним проблемы, ибо как посчитать я знаю, но почему-то процедура дальше первой строки не выполняется..
← →
Renegat (2008-05-28 22:13) [8]ну раз не выполняется, то t=NIL, вестимо! Смотри, что ты в Vichislenie передаёшь и почему оно NIL.
← →
Renegat (2008-05-28 22:17) [9]> t:=nil; root:=nil; r:=nil;
> i:=1;
> Virajenie(root,t,r,s,i);
> //Вычисляем значение выражения
> Vivod(root,0);
> Writeln("Vichislit"" znachenie virajeniya?");
> readln(a);
> if a="y" then
> begin
> t:=root; i:=0; f:=0;
грабли походу где-то здесь. Возможно, процедуры просто не модифицируют root, оставляя его нулём.
← →
rena © (2008-05-28 23:16) [10]проверяла в самой процедуре (turbo delphi же отображает значение переменной, если навести на нее при пошаговом выполнении) t <>nil точно, причем t^.left и t^.right тоже <>nil
← →
rena © (2008-05-28 23:20) [11]Млин, вот это я ступила..массив-то динамический..я длину массива (Setlength(a,n)) не задала..и на поиск этой ошибки убила столько времени((
Renegat, большое спасибо - массив использовала по вашему совету, задача решена^_^
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c