Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

выход из процедуры


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо