Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Калькулятор, Не всегда правильно считает. 
:(
    Опции темы
MaxXx
Дата 12.6.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Добрый день...Помогите пожалуйста найти ошибку в реализации калькулятора..Выражения типаsmile 23423423-234234) считаются на ура..А сли ввести (23423423-234234) -234. Начинаются ошибки..



Код

const
max=1000;
type
 STACK = record
          top:integer;
          elem:array [1..max] of char;
         end;

 STACK2 = record
          top:integer;
          elem:array [1..max] of real;
         end;



 var
 s,s2:stack;
 symv:char;
 {---------------------------------------}
   procedure MakeNull (var S:STACK);
       begin
         S.top:=max + 1;
       end;
{---------------------------------------}
    procedure MakeNullR (var S:STACK2);
       begin
         S.top:=max + 1;
       end;

{---------------------------------------}
   function Empty (S:Stack):boolean;
       begin
        if S.top > max then
           Empty:=true
        else
           Empty:=false;
       end;
{----------------------------------------}
   function Top(s : stack) : char;
  begin
    if Empty(s) then exit
  else
      Top := s.elem[s.top];
  end;
{---------------------------------------}
   procedure OutStack (var s:stack; var symv:char);
      begin
        if Empty (s) then exit
       else
        begin
         symv:= s.elem[s.top];
         s.top:=S.top + 1;
        end;
      end;
{--------------------------------------}
  procedure OutStackR (var s:stack2; var x:real);
      begin
        if Empty (s2) then exit
       else
        begin
         x:= s.elem[s.top];
         s.top:=S.top + 1;
        end;
      end;
{---------------------------------------}
     procedure Instack (var S:Stack;x:char);
      begin
        if S.top = 1 then exit
       else
            begin
             s.top:=s.top-1;
             s.elem[s.top]:=x;
            end ;
       end;

{---------------------------------------}
  procedure InstackR (var S:Stack2;x:real);
      begin
        if S.top = 1 then exit
       else
            begin
             s.top:=s.top-1;
             s.elem[s.top]:=x;
            end ;
       end;
{----------------------------------------}
   function Prior(f : char) : Byte;
begin
    case f of
       '+','-' : prior := 2;
       '*','/' : prior := 3;
       '(' , ')' : prior := 1;
        else
     prior := 0;
    end;
end;

{----------------------------------------}
 procedure Dell(var s : stack);
begin
    if Empty(s) then exit
    else
      s.top := s.top + 1;
end;
{----------------------------------------}
  procedure opz (var out:string);
    var
     i: integer; inp:string; p:integer;
     t: boolean; out2:string;
      begin
       p:=0;
       Makenull(s);
         write ('INP = ');
          readln (inp);
        for i:=1 to length (inp) do
          case inp[i] of
           '0'..'9': begin
                      if (inp[i]>='0') and (inp[i]<='9') then
                        out:=out+inp[i];
                         end;

    '+','-','*','/': begin
                       out:=out+' ';
                        while Prior(Top(s))>= Prior(inp[i]) do
                           begin
                            outstack(s,symv);
                            out:=out+symv+' ';
                           end;
                            instack (s,inp[i]);
                          end;


       '(' : begin
                 InStack(s,inp[i]);
                  inc(p);
                   end;
            ')' : begin
                     dec(p);
                      while Prior(Top(s)) <> 1 do
                         begin
                             OutStack(s,symv);
                             out:=out+' '+symv;
                         end;
                      Dell(s);
                  end;
        end;
      if p<>0 then
        begin
         writeln('ERROR');
         exit;
         end;
     for i:=max downto s.top do
            out:=out+' '+s.elem[i];

                writeln ('OPZ = ',out);

              end;
{-----------------------------------------------------}
 procedure Result (out:string ;var res:real);
  var
   error:integer;
   num,x,y:real;
   s3:stack2;
   estr,out2:string;
   i:integer;

    begin
     MakeNullR(s3);
      for i := 1 to Length(out) do
       case out[i] of
         '0'..'9' : begin
                  if (out[i]>='0') and (out[i]<='9') then
                     begin
                      out2:=out2+out[i];
                       end;
                     end;

              ' ': begin
                         val(out2,num,error);
                         InstackR(s3,num);
                         out2:='';
                   end;
              '+': begin
                     OutStackR(s3,x);
                     OutStackR(s3,y);
                     res:=x+y;
                     InStackR(s3,res);
                   end;
              '-': begin
                     OutStackR(s3,x);
                     OutStackR(s3,y);
                     res:=x-y;
                     InStackR(s3,res);
                   end;
              '*': begin
                     OutStackR(s3,x);
                     OutStackR(s3,y);
                     res:=x*y;
                     InStackR(s3,res);
                   end;
              '/': begin
                     OutStackR(s3,x);
                     OutStackR(s3,y);
                     res:=x/y;
                     InStackR(s3,res);
                   end;




              end;
   writeln('mass:');

     for i:=max downto s3.top do
      writeln(s3.elem[i]);

   writeln('----------');
  writeln('RES = ',res);
    writeln('----------');
  end;



  var
   outp,inp:string; res:real;
    begin
     OPZ (outp);
      Result(outp,res);


      readln;
     end.

 
PM MAIL   Вверх
Zero
Дата 12.6.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(MaxXx @  12.6.2006,  11:48 Найти цитируемый пост)
Выражения типаsmile 23423423-234234) считаются на ура.

Если по твоему результат выражения: 23423423-234234=-23189189 -- это верно, то обясни что он должен выдать если там поставить скобку.
PS: т.е. сам синтаксис выражений как должен выглядить??? 
PM MAIL ICQ   Вверх
MaxXx
Дата 12.6.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Все разобрался...теперь все работает...Тема закрыта!!!!!!  smile 
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0803 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.