Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2011, 15:27   #1
Cannibal
Форумчанин
 
Регистрация: 17.02.2008
Сообщений: 191
По умолчанию дерево арифметического выражения

пишу программу, вычисляющую значение выражения с помощью дерева.

вот кусок программы
Код:
type
  TDer = ^TVersh;
  TKlVersh = (kOper, kVar, KNum, KOpBr, KClBr, KEnd);
  Tversh = record
    KlVersh : TklVersh;
    inf : char;
    left, right : TDer;
    end;


  TKlLek = TKlVersh;
  TLek = record
    klass : TKlLek;
    inf : char;
    end;

var
  TekLek : Tlek;
  VirTree : TDer;
  s : set of byte;

procedure Error(mess : string);
begin
  writeln(mess);
  halt;
end;

procedure scan;
var
  c : Char;

begin
  read(c);
  with TekLek Do begin
    inf := c;
    case C of
      '+', '-', '*', '/' : Klass := KOper;
      '0'..'9' : Klass := KNum;
      'A'..'Z','a'..'z' : klass := KVar;
      '(' : klass :=KOpBr;
      ')' : klass := KClBr;
      '=' : klass := KEnd;
    else
      Error('Íå ìîãó ðàñïîçíàòü ñèìâîë '+c+'. Ïðîãðàììà çàâåðøåíà');
    end;
  end;
end;

function IsOperUmn:boolean;
begin
  isOperUmn:=tekLek.inf in ['*','/'];
end;

function IsOperSloz:boolean;
begin
  isOperSloz:=tekLek.inf in ['+','-'];
end;

function novVersh( lev : TDer) : TDer;
var
  versh : TDer;
Begin
  new(versh);
  versh^.KlVersh := tekLek.Klass;
  versh^.inf := TekLek.inf;
  versh^.left := lev;
  versh^.right := nil;
  novVersh := versh;
end;

function mnozh : TDer;
var
  ver : TDer;
begin
  if (TekLek.klass = KVar) or (TekLek.Klass = KNum) then begin
    ver := NovVersh(nil);
    mnozh := ver;
    scan;
  end
  else
    if TekLek.klass = KOpBr then begin
      scan;
      mnozh := vir;
      if TekLek.Klass = KClBr then
        scan
      else
        Error('Îæèäàëàñü ) âìåñòî <'+TekLek.inf+'>')
    end
    else
      error('Îæèäàëîñü ÷èñëî èëè èäåíòèôèêàòîð âìåñòî <'+TekLek.inf+'>');
end;

Function slag :TDer;
var
  PerMnozh : TDer;
  ver : TDer;
begin
  perMnozh := mnozh;
  if not IsOperUmn then
    slag := perMnozh
  else begin
   ver := novVersh(PerMnozh);
   Scan;
   ver^.right := slag;
   slag := Ver;
  end;
end;

Function Vir :TDer;
var
  PerSlag : TDer;
  ver : TDer;
begin
  perSlag := Slag;
  if not IsOperSloz then
    Vir := PerSlag
  else begin
   ver := novVersh(PerSlag);
   Scan;
   ver^.right := Vir;
   vir := Ver;
  end;
end;
проблема в том, что выражение 2*6/3*7 она вычисляет как 2*(6/(3*7))
я подозреваю, что дело в неправильном построении дерева



как можно это исправить?
Mathematicians often mix up Christmas and Halloween, because Dec.25=Oct.31.
Cannibal вне форума Ответить с цитированием
Старый 15.05.2011, 16:01   #2
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

может просто здесь поменять местами?

Код:

function novVersh( lev : TDer) : TDer;
var
  versh : TDer;
Begin
  new(versh);
  versh^.KlVersh := tekLek.Klass;
  versh^.inf := TekLek.inf;

  versh^.left := nil;
  versh^.right := lev;

  novVersh := versh;
end;
а здесь так

Код:
Function slag :TDer;
var
  PerMnozh : TDer;
  ver : TDer;
begin
  perMnozh := mnozh;
  if not IsOperUmn then
    slag := perMnozh
  else begin
   ver := novVersh(PerMnozh);
   Scan;
ver^.left := slag;
   
   slag := Ver;
  end;
end;

Function Vir :TDer;
var
  PerSlag : TDer;
  ver : TDer;
begin
  perSlag := Slag;
  if not IsOperSloz then
    Vir := PerSlag
  else begin
   ver := novVersh(PerSlag);
   Scan;
ver^.left := Vir;
   
   vir := Ver;
  end;
end;
Могу лишь пнуть в нужном направлении (ну или как получится)

Последний раз редактировалось Swarog; 15.05.2011 в 16:34.
Swarog вне форума Ответить с цитированием
Старый 15.05.2011, 16:06   #3
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

а вы уверены что так надо как у вас нарисована XD???
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 15.05.2011, 16:15   #4
Cannibal
Форумчанин
 
Регистрация: 17.02.2008
Сообщений: 191
По умолчанию

пробовал. бесполезно.

Да. картинка веселая получилась, но суть то из нее понятна XD
Mathematicians often mix up Christmas and Halloween, because Dec.25=Oct.31.
Cannibal вне форума Ответить с цитированием
Старый 15.05.2011, 16:25   #5
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

В принципе разбор ведется верно. просто ведите вычисление не слева направа, а справа налево
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 15.05.2011, 16:40   #6
Cannibal
Форумчанин
 
Регистрация: 17.02.2008
Сообщений: 191
По умолчанию

вот исходники. Попробовал в обратном порядке вычислять - тоже не получается.
Вложения
Тип файла: rar дерево арифметического выражения.rar (2.7 Кб, 35 просмотров)
Mathematicians often mix up Christmas and Halloween, because Dec.25=Oct.31.
Cannibal вне форума Ответить с цитированием
Старый 15.05.2011, 17:18   #7
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Запустить не удалось, адаптировать долго, но чисто так по разумению должно все быть нормально именно так как у вас в исходнике...
Могу лишь пнуть в нужном направлении (ну или как получится)

Последний раз редактировалось Swarog; 15.05.2011 в 17:20.
Swarog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дерево арифметического выражения papos Помощь студентам 1 01.11.2010 18:48
Как вычслить на Ассемблере значение арифметического выражения Ветас Помощь студентам 5 18.10.2010 18:06
расчет арифметического выражения через бинарное дерево darklexus1990 Помощь студентам 1 07.06.2010 18:48
Вычисление условного арифметического выражения doda666 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 16.03.2010 08:02
Построение арифметического выражения. Arugin Помощь студентам 5 16.03.2009 09:49