回 帖 发 新 帖 刷新版面

主题:对不起,上一个发错了,这一个就真的要你们帮我了!!

写一个程序,模拟袖珍计算器的加、减、乘、除四则运算。该程序能
读入数据;并按算式计算出结果。如当你在终端键盘上打入:
     3.5+0.7*10=
后,程序将显示出结果10.5,且把它输出。


帮个忙吧!!!!!!!!!!![em11][em12]

回复列表 (共3个回复)

沙发

字符串操作,不是很难,不过很麻烦的喔!

板凳

我很久以前编过一个,但这程序有点儿问题,一直没有修正。大家有兴趣就帮忙修一修吧!

var
  c,d:char;
  r:real;
  str1,str2:string;
  a,b,xxx:integer;
procedure readc;
begin
  d:=c;
  read(c)
end;
function ji(n1:real;d:char;n2:real):real;
begin
  case d of
   '+':ji:=n1+n2;
   '-':ji:=n1-n2;
   '*':ji:=n1*n2;
   '/':ji:=n1/n2;
   '^':ji:=exp(n2*ln(n1));
   '|':ji:=exp(1/n2*ln(n1))
  end
end;
function shun(c:char):integer;
begin
  case c of
   '=',')':shun:=0;
   '+','-':shun:=1;
   '*','/':shun:=2;
   '^','|':shun:=3
  end
end;
function calc:real;
var
  s:string;
  a:array[1..7]of real;
  b:array[1..7]of char;
  i,xxx:integer;
begin
  i:=1;
  s:='';
  repeat
   if (c>='0')and(c<='9')or(c='.')or(c='e')
     then s:=s+c
     else if ((d<'0')or(d>'9'))and((c='+')or(c='-'))
      then s:=s+c
     else begin
       if length(s)>0 then begin
         val(s,a[i],xxx);
         s:=''
       end;{if}
       case c of
         '(':begin
               readc;
               a[i]:=calc;
               i:=i-1
             end;
         '+','-','*','/','^','|','=',')':begin
               b[i]:=c;
               while (i>1) and (shun(b[i-1])>=shun(b[i])) do
                begin
                 a[i-1]:=ji(a[i-1],b[i-1],a[i]);
                 b[i-1]:=b[i];
                 a[i]:=0;
                 i:=i-1;
                end;{while}
               end;{case+-*/}
       end;{case}
       i:=i+1;
     end;{else}
   if (c='=')or(c=')')then c:='z'  else readc;
  until (c='z')or(c='o');
  calc:=a[1];
end;

3 楼

(继续)
begin
  read(c);
  while c<>'o' do begin
    r:=calc;
     str(r,str1);
     str2:=copy(str1,length(str1)-2,length(str1));
     val(str2,a,xxx);
     if abs(a)<=16 then begin
       if a<0 then str(r:16:15,str1)
              else str(r:16:15-a,str1);
       b:=16;
       while (str1[b]='0') or (str1[b]='.') do b:=b-1;
       str1:=copy(str1,1,b);
       writeln(str1:74);
     end{if}
     else begin
       str1:=copy(str1,1,length(str1)-4);
       b:=length(str1);
       while (str1[b]='0') or (str1[b]='.') do b:=b-1;
       str1:=copy(str1,1,b);
       writeln(str1:74,' E',a:3);
     end;{else}
    readln;
    readc
  end
end.
程序可处理+-*/和乘方(^)、开方(|),并且支持括号运算,输入表达式要以“=”结束,输入“o”退出。

我来回复

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