Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Калькулятор


Автор: MaxXx 12.6.2006, 10:48
Добрый день...Помогите пожалуйста найти ошибку в реализации калькулятора..Выражения типа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.

 

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

Если по твоему результат выражения: 23423423-234234=-23189189 -- это верно, то обясни что он должен выдать если там поставить скобку.
PS: т.е. сам синтаксис выражений как должен выглядить??? 

Автор: MaxXx 12.6.2006, 16:39
Все разобрался...теперь все работает...Тема закрыта!!!!!!  smile 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)