Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.22;
Скачать: CL | DM;

Вниз

выход из процедуры   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
8-1182364153
Жидкое стекло
2007-06-20 22:29
2008.06.22
Звук и буферы


2-1211872333
Первокласник Вася
2008-05-27 11:12
2008.06.22
Отправка письма на NMSMTP1


2-1211785530
Sergey2
2008-05-26 11:05
2008.06.22
EConvertError при вызове StrToDAte


3-1200756387
IvanCoFox
2008-01-19 18:26
2008.06.22
Проблемы с AnyDAC и MySQL


2-1211870709
Radgar
2008-05-27 10:45
2008.06.22
Мерцание при перемещении