Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1211792539
Leo
2008-05-26 13:02
2008.06.22
Зеленый вопрос IF ... THEN


3-1200551154
saNat
2008-01-17 09:25
2008.06.22
Ошибка в запросе с парметром: DBQuery: Field Table_a2 not found


6-1189211020
ArtemVac
2007-09-08 04:23
2008.06.22
Доска для рисования по локальной сети


15-1210561061
Slider007
2008-05-12 06:57
2008.06.22
С днем рождения ! 12 мая 2008 понедельник


2-1211957443
Ega23
2008-05-28 10:50
2008.06.22
Надо ли ставить override?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский