作业帮 > 综合 > 作业

编写pascal(delphi程序)计算数学算式

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/07/14 21:23:30
编写pascal(delphi程序)计算数学算式
s是一个数学算式,
里面包括数字,加号,减号,乘号,除号,乘方号,小括号,中括号和大括号
也就是包括0-9 ,+ ,- ,* ,/ ,^ ,( ,) ,[ ,] ,{ ,}
要求按照正常的数学计算顺序进行计算
比如s:='53+6*[31-(5^3*6)/40]'
求程序.
编写pascal(delphi程序)计算数学算式
procedure TForm1.btn1Click(Sender: TObject);begin  edt2.Text := untJCalc.CalcExpr(edt1.Text);end;确定合你的意喽.unit untJCalc;interfaceuses   classes,sysutils, Math;type   TJStack=class      private         Lines:TStrings;      public         constructor Create;         destructor Destroy;         procedure init;         procedure push(s:string);         function GetTop:String;         function Pop:String;      end;   TJExpr=class      private         Expr:String;         Position:Integer;         Min,max:Integer;         Eof:Boolean;      public         constructor Create(pExpr:String);         function read:String;         procedure GoFirst;      end;function CalcExpr(sExpr:String):String;function CalcExprItem(sOptr,sA,sB:String):String;function OptrIndex(w:string):Integer;function GetParamCount(pFunc:String):Integer;function ExecFunc(pFunc:String;pParam:Array  of string;pParamCount:Integer):string;implementationconstructor TJStack.Create;begin   inherited Create;   lines:=TStringList.create;end;procedure TJStack.init;begin   lines.free;end;destructor TJStack.Destroy;begin   lines.free;   inherited Destroy;end;procedure TJStack.push(s:string);begin   lines.add(s);end;function TJStack.GetTop:String;begin   if Lines.count>0 then      Result:=lines[lines.count-1]      else      Result:='';end;function TJStack.Pop:String;begin   if Lines.Count>0 then   begin      Result:=GetTop;      lines.delete(lines.count-1);   end   else      Result:='';end;//////////////////////TJExpr////////////////constructor TJExpr.Create(pExpr:String);begin   Expr:=lowercase(pExpr)+'#';   Min:=1;   Max:=length(Expr);   Position:=1;   Eof:=false;end;function TJExpr.read:String;   function SameType(s1,s2:string):boolean;   var      c1,c2:string;   begin      c1:='';c2:='';      if length(s1)>0 then c1:=s1[length(s1)];      if length(s2)>0 then c2:=s2[Length(s2)];      if ((pos(c1,'0123456789.')>0) and (pos(c2,'0123456789.')>0))         then         begin            result:=true;         end         else         begin            Result:=false;         end;      if (c1='-')and(c2='-') then Result:=false;      if s1+s2='>=' then Result:=true;      if s1+s2='<=' then Result:=true;      if s1+s2='<>' then Result:=true;      if pos(s1+s2,'max(')>0 then Result:=true;      if pos('-',s1+s2)>1 then Result:=false;      if (s1='')or(s2='') then result:=true;    end;begin   if Position<=Max then   begin      Result:=trim(Expr[Position]);      Inc(Position);      while Position<=Max do      begin         if SameType(Result,Expr[Position]) then         begin            Result:=Result+trim(Expr[Position]);            Inc(Position);         end         else         begin            exit;         end;      end;   end   else   begin      Result:='';      Eof:=true;   end;end;procedure  TJExpr.GoFirst;begin   Position:=1;   Eof:=false;end;/////////////////////////////////////////function DiffOptr(a,b:string):Integer;const   sa:array [1..18,1..18] of      integer=(      //  +  -  *  /  (  )  #  >  < >= <=  = <> &  :  ,   max(, ^      {+}(2 ,2 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,0),      {-}(2 ,2 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,0),      {*}(2 ,2 ,2 ,2 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,2),      {/}(2 ,2 ,2 ,2 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,2),      {(}(0 ,0 ,0 ,0 ,0 ,1 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0),      {)}(2 ,2 ,2 ,2 ,1 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,1 ,2),      {#}(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0),      {>}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,0),      {<}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,0),     {>=}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,0),     {<=}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,0),      {=}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,0),     {<>}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,0),      {&}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,0 ,0),      {:}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2 ,2 ,0 ,0),      {,}(0 ,0 ,0 ,0 ,0 ,1 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0),   {max(}(0 ,0 ,0 ,0 ,0 ,1 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0),      {^}(2 ,2 ,2 ,2 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0 ,2)           );var   aIndex,bIndex:integer;begin   aIndex:=OptrIndex(a);   bIndex:=OptrIndex(b);   if (aIndex>0)and(bIndex>0) then      Result:=sa[aIndex,bIndex]-1      else      Result:=1;end;function CalcExpr(sExpr:String):String;var   optr,opnd:TJStack;   w,theta,a,b:string;   position:integer;   jexpr:TJExpr;   sParam:array[1..20] of string;   sFunc, stExpr:String;   i,nParamCount:integer;begin   stExpr := sExpr;   stExpr := StringReplace(stExpr, '[', '(', [rfReplaceAll]);   stExpr := StringReplace(stExpr, ']', ')', [rfReplaceAll]);     stExpr := StringReplace(stExpr, '{', '(', [rfReplaceAll]);   stExpr := StringReplace(stExpr, '}', ')', [rfReplaceAll]);   jexpr:=TjExpr.Create(stExpr);   optr:=TJStack.create;   opnd:=TJStack.create;   optr.push('#');   w:=jexpr.read;   while (not ((w='#')and(optr.GetTop='#'))) and (jexpr.Eof =false) do   begin      if OptrIndex(w)<0 then      begin         opnd.push(w);         w:=jexpr.read;      end      else      begin         Case DiffOptr(optr.GetTop,w) of            -1://<              begin                 optr.push(w);                 w:=jexpr.read;              end;            0://=              begin                 sFunc:=optr.pop;                 if (sFunc<>'(') then                 begin                    nParamCount:=1;                    while sFunc=',' do                    begin                       Inc(nParamCount);                       sFunc:=optr.pop;                    end;                    if GetParamCount(sFunc)=0 then nParamCount:=0;                    for i:=1 to nParamCount do sParam[i]:=opnd.Pop;                    opnd.push(ExecFunc(sFunc,sParam,nParamCount));                 end;                 w:=jexpr.read;              end;            1://>              begin                 theta:=optr.pop;                 b:=opnd.pop;                 a:=opnd.pop;                 opnd.push(CalcExprItem(theta,a,b));              end;         end;      end;   end;   Result:=opnd.GetTop;   opnd.free;   optr.free;end;function CalcExprItem(sOptr,sA,sB:String):String;begin   if sOptr='+' then   begin      if (sA<>'')and(sB<>'') then      begin         Result:=floattostr(strtofloat(sA)+strtofloat(sB));      end      else      begin         Result:=sA+sB;         if Result='' then Result:='0';      end;      exit;   end;   if sOptr='-' then   begin      if sA='' then         Result:=floattostr(-strtofloat(sB))         else         Result:=floattostr(strtofloat(sA)-strtofloat(sB));      exit;   end;   if sOptr='*' then   begin      Result:=floattostr(strtofloat(sA)*strtofloat(sB));      exit;   end;   if sOptr='/' then   begin      Result:=floattostr(strtofloat(sA)/strtofloat(sB));      exit;   end;   if sOptr='>' then   begin      if strtofloat(sA)>strtofloat(sB) then         Result:='1'         else         Result:='0';      exit;   end;   if sOptr='<' then   begin      if strtofloat(sA)<strtofloat(sB) then         Result:='1'         else         Result:='0';      exit;   end;   if sOptr='>=' then   begin      if strtofloat(sA)>=strtofloat(sB) then         Result:='1'         else         Result:='0';      exit;   end;   if sOptr='<=' then   begin      if strtofloat(sA)<=strtofloat(sB) then         Result:='1'         else         Result:='0';      exit;   end;   if sOptr='=' then   begin      if strtofloat(sA)=strtofloat(sB) then         Result:='1'         else         Result:='0';      exit;   end;   if sOptr='<>' then   begin      if strtofloat(sA)<>strtofloat(sB) then         Result:='1'         else         Result:='0';      exit;   end;   if sOptr='&' then   begin      if (strtofloat(sA)<>0)and(strtofloat(sB)<>0) then         Result:='1'         else         Result:='0';      exit;   end;   if sOptr=':' then   begin      if strtofloat(sA)=0 then         Result:='0'         else         Result:=sB;      exit;   end;     if sOptr='^' then   begin      if (sA<>'')and(sB<>'') then      begin         Result:=floattostr(power(strtofloat(sA),strtofloat(sB)));      end      else      begin         Result:='0';      end;      exit;   end;end;function GetParamCount(pFunc:String):Integer;begin   if pFunc='max(' then result:=2;end;function OptrIndex(w:string):Integer;begin   if w='+' then begin result:=1; exit; end;   if w='-' then begin result:=2; exit; end;   if w='*' then begin result:=3; exit; end;   if w='/' then begin result:=4; exit; end;   if w='(' then begin result:=5; exit; end;   if w=')' then begin result:=6; exit; end;   if w='#' then begin result:=7; exit; end;   if w='>' then begin result:=8; exit; end;   if w='<' then begin result:=9; exit; end;   if w='>=' then begin result:=10; exit; end;   if w='<= 'then begin result:=11; exit; end;   if w='=' then begin result:=12; exit; end;   if w='<>' then begin result:=13; exit; end;   if w='&' then begin result:=14; exit; end;   if w=':' then begin result:=15; exit; end;   if w=',' then begin result:=16; exit; end;   if w='max(' then begin Result:=17; exit; end;      if w='^' then begin Result:=18; exit; end;   result:=-1;end;function ExecFunc(pFunc:String;pParam:Array of string;pParamCount:Integer):string;var   tmpFloat:real;   i:integer;begin   //   if pFunc='max(' then   begin      tmpFloat:=strtofloat(pParam[0]);      for i:=1 to pParamCount-1 do      begin         if tmpFloat<strtofloat(pParam[i]) then            tmpFloat:=strtofloat(pParam[i]);      end;      Result:=floattostr(tmpFloat);   end;end;end.
再问: 问一下 在function TJExpr.read:String;函数过程中有一句 Result:=trim(Expr[Position]); 这个trim是什么过程? 没有找到这个过程和函数,delphi在这里报错:untJCalc.pas(154,15) Error: Can't determine which overloaded function to call 怎么回事?
再答: 我的腾讯号:516988551 trim()是delphi中去掉字符串中左右两边的空格。