![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
выход из процедуры
rena © (2008-05-28 20:10:00)Имеется процедура, заносящая математическое выражение вида 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 23:20:00) [1]Млин, вот это я ступила..массив-то динамический..я длину массива (Setlength(a,n)) не задала..и на поиск этой ошибки убила столько времени((
Renegat, большое спасибо - массив использовала по вашему совету, задача решена^_^
rena (2008-05-28 23:16:00) [2]проверяла в самой процедуре (turbo delphi же отображает значение переменной, если навести на нее при пошаговом выполнении) t <>nil точно, причем t^.left и t^.right тоже <>nil
Renegat (2008-05-28 22:17:00) [3]> 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, оставляя его нулём.
Renegat (2008-05-28 22:13:00) [4]ну раз не выполняется, то t=NIL, вестимо! Смотри, что ты в Vichislenieпередаёшь и почему оно NIL.
rena (2008-05-28 22:08:00) [5]Да, задание такое. Нужно занести выражение в дерево (занесено вроде правильно) и посчитать его..вот с последним проблемы, ибо как посчитать я знаю, но почему-то процедура дальше первой строки не выполняется..
Renegat (2008-05-28 22:05:00) [6]А это принципиально нужно делать через связанные списки? Массивы, имхо, удобнее...
rena (2008-05-28 21:58:00) [7]не в ней дело) даже если напишу просто
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;
После выполнения первого действия осуществляется выход из процедуры, что бы я не писала в ней..не пойму почему..меня этот вопрос волнует..
Сергей М. (2008-05-28 20:58:00) [8]
> осознаю, что процедура подсчета пока не доделана
Ты ее содрал что ли откуда-то ?
Скажи на милость, за каким лешим первым параметром в процедуру "Vichislenie" передается (да еще и по ссылке) переменная f, если нигдев теле этой процедуры обрашения к значению этой переменной не происходит ?
Renegat (2008-05-28 20:23:00) [9]извиняюмсь - обратная польская запись... во блин проглюкнуло %)
Renegat (2008-05-28 20:22:00) [10]Сдаётся мне, что здесь поможет массив и обротная венгерская нотация. Заносим в массив сначала два числа, а потом знак операции над ними. Потом сканируем знаки операции и производим действие, записав результат в ячейку "с операцией". И идём дальше.
rena (2008-05-28 20:17:00) [11]при занесении получается дерево вида
*
/ \
a +
\ \
* e
/ \
b +
/ \
c d