Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->Delphi ->正文

计算出用字符串表示的数学表达式的值

来源:Linuxdby.com 作者:Webmaster 时间:2007-06-05 点击: [收藏] [投稿]
 

// built by Liu Yang 2002.1.8

library Expression;

uses Dialogs, Math, SysUtils;

Const
  Symbol_Mod='M';  Symbol_Div='D';
  Symbol_Shl='L';  Symbol_Shr='R';
  Symbol_Or='O';   Symbol_Xor='X';
  Symbol_And='A';

function ConvertExpression(ExpressionString:PChar):PChar; stdcall;
var inputexp:string;
begin
  inputexp:=ExpressionString;
  //convert input expression to recognize expression
  if pos('=',inputexp)=0 then inputexp:=inputexp+'=' else inputexp:=Copy(inputexp,1,Pos('=',inputexp));
  inputexp:=UpperCase(inputexp);
  inputexp:=StringReplace(inputexp,' ','',[rfReplaceAll]);
  inputexp:=StringReplace(inputexp,'MOD',Symbol_Mod,[rfReplaceAll]);
  inputexp:=StringReplace(inputexp,'DIV',Symbol_Div,[rfReplaceAll]);
  inputexp:=StringReplace(inputexp,'AND',Symbol_And,[rfReplaceAll]);
  inputexp:=StringReplace(inputexp,'XOR',Symbol_Xor,[rfReplaceAll]);
  inputexp:=StringReplace(inputexp,'OR',Symbol_Or,[rfReplaceAll]);
  inputexp:=StringReplace(inputexp,'SHL',Symbol_Shl,[rfReplaceAll]);
  inputexp:=StringReplace(inputexp,'SHR',Symbol_Shr,[rfReplaceAll]);
  inputexp:=StringReplace(inputexp,'(-','(0-',[rfReplaceAll]);
  if pos('-',inputexp)=1 then inputexp:='0'+inputexp;
  Result:=PChar(inputexp);
end;

function ParseExpression(ExpressionString:PChar): extended; stdcall;
var
  nextch:char;
  nextchpos,position:word;
  inputexp:string;
procedure expression(var ev:extended);forward;
procedure readnextch;
begin
  repeat
    if inputexp[position]='=' then nextch:='='
            else
                 begin
                   inc(nextchpos);
                   inc(position);
                   nextch:=inputexp[position];
                 end;
  until (nextch<>' ') or eoln;
end;
procedure error(ErrorString:string);
begin
  MessageDlg('Unknown expression  : '+ErrorString,mterror,[mbok],0);
  exit;
end;
procedure number(var nv:extended);
var radix:longint; snv:string;
function BinToInt(value: string): integer;
var i,size:integer;
begin   // convert binary number to integer
  result:=0;
  size:=length(value);
  for i:=size downto 1 do
      if copy(value,i,1)='1'
      then result:=result+(1 shl (size-i));
end;
begin
  nv:=0;
  snv:='';
  while nextch in ['0'..'9','A'..'F'] do
    begin
//      nv:=10*nv+ord(nextch)-ord('0');
      snv:=snv+nextch;
      readnextch;
    end;
  // parse Hex, Bin
  if snv<>'' then
     if snv[Length(snv)]='B'
        then nv:=BinToInt(Copy(snv,1,Length(snv)-1))
        else if nextch='H' then begin nv:=StrToInt('$'+snv); readnextch; end
                           else nv:=StrToInt(snv);
  if nextch='.' then
                     begin
                       radix:=10;
                       readnextch;
                       while nextch in ['0'..'9'] do
                         begin
                           nv:=nv+(ord(nextch)-ord('0'))/radix;
                           radix:=radix*10;
                           readnextch;

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:用Delphi产生一个最小的可执行程序   下一篇:一个计算器的代码,欢迎大家点评

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号