编写pascal(delphi程序)计算数学算式
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/10/05 15:36:05
编写pascal(delphi程序)计算数学算式
s是一个数学算式,
里面包括数字,加号,减号,乘号,除号,乘方号,小括号,中括号和大括号
也就是包括0-9 ,+ ,- ,* ,/ ,^ ,( ,) ,[ ,] ,{ ,}
要求按照正常的数学计算顺序进行计算
比如s:='53+6*[31-(5^3*6)/40]'
求程序.
s是一个数学算式,
里面包括数字,加号,减号,乘号,除号,乘方号,小括号,中括号和大括号
也就是包括0-9 ,+ ,- ,* ,/ ,^ ,( ,) ,[ ,] ,{ ,}
要求按照正常的数学计算顺序进行计算
比如s:='53+6*[31-(5^3*6)/40]'
求程序.
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中去掉字符串中左右两边的空格。
再问: 问一下 在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中去掉字符串中左右两边的空格。
pascal编写一个程序
pascal语言 编写一个程序
想要编写一个Pascal程序,
编写程序,计算S
编写一个计算个人所得税的程序(用VB编写)
用free pascal编写程序,要具体(用while语句)
软件是指用程序设计语言(如PASCAL ,C,VISUAL BASIC 等)编写的程序,软件开发实际上就是编写程序代码
求高手用Pascal语言编写以下程序
请高手用Pascal语言编写下列程序
scilab程序哪位仁兄能发给我已经编写好的scilab的数学计算程序(如解方程,公式计算等)
汇编语言程序设计编写计算n!的程序(利用循环程序结构编写),谢谢!
编写程序利用数学函数计算 y 值.其中:y = |x| x 为任意实数