易码技术论坛

 找回密码
 加入易码
搜索
查看: 327685|回复: 8

[原创]一个简单的计算器代码(LAVAX3.1)

[复制链接]
发表于 2005-8-5 21:33:00 | 显示全部楼层
不错,最好加上图像
能编一个分解因式(式子形式可以不是最终化简的)的吗,我想学一学。
 楼主| 发表于 2005-8-5 15:31:00 | 显示全部楼层

long GetValue(addr str,float &value)
{
     char buf[EXPLEN+1];
     char tmp[EXPLEN+1];
     float fstk[STKLEN];
     char  cstk[STKLEN];
     float a,b,tvalue;
     long length;
     long pbuf;
     int  sign,k,i,j,t;
     int  findex,cindex;        //pointer for stk
     char match,ope;
     length=strlen(str);
     memcpy(buf,str,length);
     buf[length]='@';
     buf[length+1]=0;
     findex=0;
     cindex=0;
     cstk[cindex++]='@';        //push '@' in cstk
     sign=1;
     pbuf=buf;
     t=ReadExpr(pbuf,tmp,&length,sign);
     while(cstk[cindex-1]!='@'||*pbuf!='@'){
          if(t<0)     return -1;        //something error
          else if(t==MsgConst){
              GetConstValue(tmp,&tvalue);
              fstk[findex++]=tvalue;
              sign=0;
          }
          else if(t==MsgOper){
              if(strcmp(tmp,"(")==0) sign=1;
              else                   sign=0;
              match=precede(&cstk[cindex-1],&tmp[0]);
              if(match=='<')
                    cstk[cindex++]=tmp[0];
              else if(match=='=')
                    cindex--;
              else{
                    ope=cstk[--cindex];
                    b=fstk[--findex];
                    a=fstk[--findex];
                    if(operate(a,b,ope,&tvalue)<0) return -1;
                    fstk[findex++]=tvalue;
                    continue;
                   }
          }
          pbuf=pbuf+length;
          t=ReadExpr(pbuf,tmp,&length,sign);
     }
          value=fstk[0];
          return 1;
}
//***************************************************        
long ReadExpr(addr exp,addr buf,long& length,int sign)
{
           
           int dot;
           addr expr;
           expr=exp;
           length=0;
           if(*exp=='('||*exp==')'||*exp=='*'||*exp=='/'||*exp=='@'){
                   length=1;
                   *buf=*exp;
                   *(buf+1)=0;
                   return MsgOper;
           }
           if((*exp=='+'||*exp=='-')&&sign==0){
                   length=1;
                   *buf=*exp;
                   *(buf+1)=0;
                   return MsgOper;
           }
           while(*exp=='+'||*exp=='-'){
                   exp++;
                   length++;
           }
           if(isdigit(*exp)||*exp=='.'){
                   dot=0;
                   while(isdigit(*exp)||*exp=='.'){
                         if(*exp=='.') dot++;
                         exp++;
                         length++;
                   }
                   if(dot>1){
                         ErrMsg=ErrIllegalDot;
                         return -1;
                   }
                   memcpy(buf,expr,length);
                   *(buf+length)=0;
                   return MsgConst;
           }
}
////////////////////////////////////////////////////////////////////////////////////////////
//******************************************************
long GetConstValue(addr str,float& value)
{         
           float t;
           int sign;
           value=0;
           sign=1;
           while(*str=='-'||*str=='+'){
               if(*str=='-') sign=sign*-1;
               str++;
           }
           while(*str!='.'&&*str!=0){
               value=value*10.0;
               value=value+(float)(*str-'0');
               str++;
           }
           if(*str==0){
               value=value*(float)sign;;
               return 1;
           }
           t=1;
           str++;
           while(*str){
               t=t*0.1;
               value=value+t*(float)(*str-'0');
               str++;
           }
           value=value*(float)sign;
           return 1;
}
char precede(char &op1,char &op2)
{
          int i,j;
          if(op1=='+')      i=0;
          else if(op1=='-') i=1;
          else if(op1=='*') i=2;
          else if(op1=='/') i=3;
          else if(op1=='(') i=4;
          else if(op1==')') i=5;
          else              i=6;
          if(op2=='+')      j=0;
          else if(op2=='-') j=1;
          else if(op2=='*') j=2;
          else if(op2=='/') j=3;
          else if(op2=='(') j=4;
          else if(op2==')') j=5;
          else              j=6;
          return cede[i*7+j];
}
long operate(float a,float b,char ope,float& value)
{
          if(ope=='+'){
                  value=a+b;
                  return 1;
          }
          if(ope=='-'){
                  value=a-b;
                  return 1;
          }
          if(ope=='*'){
                  value=a*b;
                  return 1;
          }
          if(ope=='/'){
                  if(b==0.0){
                       ErrMsg=ErrDivideZero;
                       return -1;
                  }
                  value=a/b;
                  return 1;
          }
}                             
//**********************************************
void OutPutErrMsg()
{
         char _ErrMsgTxt[22];
         printf("something error!");
}

PS:代码一起贴上去显示的时候就少了很多,晕S。
    害的我修改了N次
    N+3次了,不管了

已更新,可以下载了


[此贴子已经被作者于2005-8-10 12:52:10编辑过]

发表于 2005-8-5 15:32:00 | 显示全部楼层
支持声明了.可以把main写在前面了^_^
嘿嘿.顶一个~~
发表于 2005-8-5 15:41:00 | 显示全部楼层
最后把代码作为附件上传。直接帖出来会走样。
发表于 2005-8-6 19:59:00 | 显示全部楼层
强大..佩服..
发表于 2005-8-7 13:33:00 | 显示全部楼层
用了逆波兰式(运算符后置)。很有意义的帖子,加精推荐~

PS:下载2楼的附件,不要看帖子原文。由于DVBBS的Bug,帖子内容有错。
发表于 2005-8-9 19:06:00 | 显示全部楼层
下载地址失效了..


我把源代码转贴到dging去了..那里贴的代码不会走样..
发表于 2005-8-17 17:07:00 | 显示全部楼层
太强了!!!!!!!!
 楼主| 发表于 2005-8-5 15:18:13 | 显示全部楼层 |阅读模式
刚刚装了下LavaXide3.1,试了试功能还比较强大。
写了个简单的用于计算表达式的代码,这段代码移植于我原来用C++写的一个计算器程序中的一部分。原程序支持 自定义变量,自定义函数(支持嵌套定义),以及常用的运算符和出错处理。
如果有时间,也许会写个LAVAX3。1的数学软件。
//*******************宏定义******************************
#define   EXPLEN     100               //表达式最大长度
#define   STKLEN     20                //栈长度
#define   ErrMissBracket     -1        //少括号
#define   ErrMatchBracket    -2        //括号匹配失败
#define   ErrUndefineVari    -3        //没有定义的变量
#define   ErrUndefineFunc    -4
#define   ErrIllegalVariName -5        //非法变量名
#define   ErrDivideZero      -6
#define   ErrIllegalDot      -7        //数字中有多余的.
#define   MsgVari             1
#define   MsgFunc             2
#define   MsgConst            3
#define   MsgOper             4           
//*******************全局变量区**************************
char cede[]=">><<<>>>><<<>>>>>><>>>>>><>><<<<<= >>>> >><<<<< =";
int  ErrMsg;                                              //错误号
//*******************************************************
//******************函数声明区***************************
char precede(char &op1,char &op2);            //比较两运算符的优先级
long GetConstValue(addr str,float &value);     //求常数值
void OutPutErrMsg();                           
long operate(float a,float b,char ope,float& value);
long GetValue(addr str,float &value);          //求str的值,合法返回1
long ReadExpr(addr exp,addr buf,long& length,int sign);
//*******************************************************
void main()
{
     char expr[100];
     float f;
     strcpy(expr,"-1.234+((10.5+3.5)*(11-1)+(20+100)/10)");
     if(GetValue(expr,&f)<0) OutPutErrMsg();
     else printf("%s=%f",expr,f);
     getchar();
}   
     
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-19 13:23 , Processed in 0.010696 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表