回 帖 发 新 帖 刷新版面

主题:菜鸟急救!!!

怎么可以用最简单的pascal程序写出四则运算要有优先级的
如100+5-6*5+5/6=
最后保留两个小数位
哪位高手帮帮忙

回复列表 (共3个回复)

沙发

我的是带括号的加、减、乘、除运算;
输入算式,输出结果;
方法是:
1、一般表达式转换成后缀表达式;
2、利用堆栈算出后缀表达式;

program exam;
        var a:array[1..50] of integer;
            b:array[1..50] of char;
            i,j,k:integer;
            temp,leng:integer;
            s,ss,top:string;
{初始化}
procedure init;
  begin
     readln(s);
     leng:=length(s);
     j:=0;k:=0;
  end;
{普通表达式转化成后缀表达式}
procedure zhz;
  begin
     repeat
       inc(k);
       case s[k] of
         '0'..'9':begin
                    while s[k] in ['0'..'9'] do
                      begin
                        ss:=ss+s[k];
                        inc(k);
                      end;
                      dec(k);ss:=ss+'.';
                  end;
              '(':begin
                    inc(j);
                    b[j]:=s[k];
                  end;
              ')':begin
                    ss:=ss+b[j];ss:=ss+'.';dec(j);
                    while b[j]<>'(' do
                      begin
                        ss:=ss+b[j];ss:=ss+'.';dec(j);
                      end;
                    dec(j);
                  end;
          '+','-':begin
                    if j<>0 then
                      begin
                        top:=b[j];
                        while top<>'(' do
                          begin
                            ss:=ss+b[j];ss:=ss+'.';dec(j);
                              if j=0 then break
                                     else top:=b[j];
                          end;
                      end;
                      inc(j);b[j]:=s[k];
                  end;
          '*','/':begin
                    if j<>0 then
                    begin
                      top:=b[j];
                        while (top='*') or (top='/') do
                          begin
                            ss:=ss+b[j];ss:=ss+'.';dec(j);
                              if j=0 then break
                                     else top:=b[j];
                          end;
                    end;
                    inc(j);b[j]:=s[k];
                  end;

       end;
     until k=leng;
     while j<>0 do
       begin
         ss:=ss+b[j];ss:=ss+'.';dec(j);
       end;
  end;
{计算后缀表达式}
procedure shz;
          var s1,s2,s3:integer;
  begin
    i:=0;j:=0;k:=0;
    leng:=length(ss);
    repeat
      inc(i);
      case ss[i] of
           '0'..'9':begin
                      j:=0;
                      repeat
                       j:=j*10+ord(ss[i])-ord('0');
                       inc(i);
                      until ss[i]='.';
                      inc(k);a[k]:=j;
                    end;
                '*':begin
                     s2:=a[k];dec(k);
                     s1:=a[k];dec(k);
                     s3:=s1*s2;
                     inc(k);a[k]:=s3;
                    end;
                '/':begin
                     s2:=a[k];dec(k);
                     s1:=a[k];dec(k);
                     s3:=s1 div s2;
                     inc(k);a[k]:=s3;
                    end;
                '+':begin
                     s2:=a[k];dec(k);
                     s1:=a[k];dec(k);
                     s3:=s1+s2;
                     inc(k);a[k]:=s3;
                    end;
                '-':begin
                     s2:=a[k];dec(k);
                     s1:=a[k];dec(k);
                     s3:=s1-s2;
                     inc(k);a[k]:=s3;
                    end;
           end;
    until i=leng;
    writeln(a[1]);
  end;

begin
   assign(input,'p109.in');reset(input);
   assign(output,'p109.out');rewrite(output);
      init;
      zhz;
      shz;
   close(input);close(output);
end.

板凳

有没有发现很麻烦啊

3 楼

可以直接建立优先级表用栈算。另外to楼上的,你有什么好办法吗

我来回复

您尚未登录,请登录后再回复。点此登录或注册