怎么用C++编译一个简单的计算器?

如题所述

我借鉴了别人的某计算器,因为你没有说多简易...我就找了个差不多的...\x0d\x0a/*\x0d\x0a程序名称:表达式计算器\x0d\x0a编译环境:Microsoft Visual C++ 6.0\x0d\x0a作者:吉林大学 计算机科学与技术学院 2006 罗泗勇\x0d\x0a时间:200801\x0d\x0a*/\x0d\x0a\x0d\x0a/*\x0d\x0a说明:\x0d\x0a采用树形结构处理表达式,按优先级运算结果,一个加,减,乘,除或数值为一个节点\x0d\x0a优先级如下:\x0d\x0a函数:4\x0d\x0a括号:3\x0d\x0a乘除:2\x0d\x0a加减:1\x0d\x0a*/\x0d\x0a\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aconst char NUM[]={'0','1','2','3','4','5','6','7','8','9','.'};\x0d\x0aconst char OPERATION[]={'+','-','*','/'};\x0d\x0aconst double PI=3.14159265358979;\x0d\x0aconst double EE=2.71828182818281;\x0d\x0a\x0d\x0aclass Fun //处理系统数学函数的类\x0d\x0a{\x0d\x0apublic:\x0d\x0aFun(string o,int t,double l=0.0,double r=0.0):op(o),type(t),lvalue(l),rvalue(r){}\x0d\x0astatic string FUN[];\x0d\x0adouble calc();\x0d\x0aprivate:\x0d\x0aint type; //666 0 1 sin90 2 3! 3 3C2 \x0d\x0astring op; //函数类型\x0d\x0adouble lvalue; //函数左边的值\x0d\x0adouble rvalue; //函数右边的值\x0d\x0astatic int FunNum;\x0d\x0a};\x0d\x0a\x0d\x0aint Fun::FunNum=8;\x0d\x0astring Fun::FUN[]={"!","sin","cos","tan","log","ln","C","A","^"};\x0d\x0a/*\x0d\x0a函数说明:\x0d\x0a1:log是以10为底的工程对数\x0d\x0a2:ln 是以e为底的自然对数\x0d\x0a3:C 计算组合数 输入规则 如计算 3取2的组合 输入表达式 3C2\x0d\x0a4:A 计算排列数 输入规则 如计算 3取2的排列 输入表达式 3A2\x0d\x0a5:! 计算阶乘\x0d\x0a6:^ x的y次方 输入 x^y\x0d\x0a*/\x0d\x0a\x0d\x0aint factorial(int n) //阶乘函数\x0d\x0a{\x0d\x0aint i,s=1;\x0d\x0afor(i=1;i<=n;i++)\x0d\x0a s*=i;\x0d\x0areturn s;\x0d\x0a}\x0d\x0a\x0d\x0aint C(int a,int b)\x0d\x0a{\x0d\x0areturn factorial(a)/(factorial(b)*factorial(a-b));\x0d\x0a}\x0d\x0a\x0d\x0aint A(int a,int b)\x0d\x0a{\x0d\x0areturn factorial(a)/factorial(b);\x0d\x0a}\x0d\x0a\x0d\x0adouble Fun::calc() //计算系统函数的值\x0d\x0a{\x0d\x0aif(type==0)\x0d\x0a return lvalue;\x0d\x0aelse\x0d\x0a{\x0d\x0a if(op=="!")\x0d\x0a return factorial(lvalue);\x0d\x0a if(op=="sin")\x0d\x0a return sin(rvalue/180*PI);\x0d\x0a if(op=="cos")\x0d\x0a return cos(rvalue/180*PI);\x0d\x0a if(op=="tan")\x0d\x0a return tan(rvalue/180*PI);\x0d\x0a if(op=="log")\x0d\x0a return log10(rvalue);\x0d\x0a if(op=="ln")\x0d\x0a return log10(rvalue)/log10(EE);\x0d\x0a if(op=="C")\x0d\x0a return C(lvalue,rvalue);\x0d\x0a if(op=="A")\x0d\x0a return A(lvalue,rvalue);\x0d\x0a if(op=="^")\x0d\x0a return pow(lvalue,rvalue);\x0d\x0a else\x0d\x0a {\x0d\x0a string err="暂时没有函数"+op;\x0d\x0a MessageBox(NULL,err.c_str(),"错误",MB_OK);\x0d\x0a return 0;\x0d\x0a }\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0astruct Unit //双向链表保存运算单元\x0d\x0a{\x0d\x0aUnit(int p,char o,string c,double v,int t,Unit * pr=NULL,Unit * n=NULL)\x0d\x0a :PRI(p),Operation(o),Code(c),value(v),Type(t),Pre(pr),Next(n){}\x0d\x0aint PRI; //优先级\x0d\x0a\x0d\x0achar Operation; //操作符\x0d\x0astring Code; //原始代码\x0d\x0adouble value; //数据\x0d\x0a\x0d\x0aint Type; //类型 操作符0 数据1 函数2\x0d\x0aUnit * Pre; //构成双向链表\x0d\x0aUnit * Next;\x0d\x0a};\x0d\x0a\x0d\x0aclass Node //表达式树状结构的节点\x0d\x0a{\x0d\x0apublic:\x0d\x0aNode(char o,int p,int e=1,double v=0,Node * ph=NULL,Node * pl=NULL,Node * pr=NULL)\x0d\x0a :Operation(o),PRI(p),Expression(e),value(v),Head(ph),Left(pl),Right(pr){}\x0d\x0aNode * Head; //节点的根,左树枝,右树枝\x0d\x0aNode * Left;\x0d\x0aNode * Right;\x0d\x0adouble GetValue();\x0d\x0achar GetOperation() const {return Operation;}\x0d\x0aint GetPri() const {return PRI;}\x0d\x0aint IsExp() const {return Expression;}\x0d\x0aprivate:\x0d\x0achar Operation; //操作符\x0d\x0aint PRI; //优先级\x0d\x0aint Expression; //记录该节点是否是表达式0 1\x0d\x0adouble value; //该节点的值\x0d\x0a};\x0d\x0a\x0d\x0adouble Node::GetValue() //运算该节点的值\x0d\x0a{\x0d\x0aif(IsExp()) //该节点的值还未算出来\x0d\x0a{\x0d\x0a double lvalue,rvalue;\x0d\x0a lvalue=Left->GetValue();\x0d\x0a rvalue=Right->GetValue();\x0d\x0a Expression=0;\x0d\x0a char op=GetOperation();\x0d\x0a switch(op)\x0d\x0a {\x0d\x0a case '+':\x0d\x0a return lvalue+rvalue;\x0d\x0a case '-':\x0d\x0a return lvalue-rvalue;\x0d\x0a case '*':\x0d\x0a return lvalue*rvalue;\x0d\x0a case '/':\x0d\x0a return lvalue/rvalue;\x0d\x0a default:\x0d\x0a return 0;\x0d\x0a }\x0d\x0a}\x0d\x0aelse\x0d\x0a return value;\x0d\x0a}\x0d\x0a\x0d\x0abool Isnum(char c)\x0d\x0a{\x0d\x0afor(int i=0;iNext=new Unit(pri+add_pri,c," ",0,0);\x0d\x0a p=p->Next;\x0d\x0a p->Pre=temp;\x0d\x0a }\x0d\x0a else //其他的当做函数处理\x0d\x0a {\x0d\x0a string function="";\x0d\x0a while(iNext=new Unit(pri,' ',function,0,2);\x0d\x0a p=p->Next;\x0d\x0a p->Pre=temp;\x0d\x0a }\x0d\x0a }\x0d\x0a}\x0d\x0areturn head;\x0d\x0a}\x0d\x0a\x0d\x0aUnit * Calc(Unit * head) //计算双向链表基本单元的值\x0d\x0a{\x0d\x0aUnit * p=head;\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0a if(p->Type!=0) //非操作符\x0d\x0a {\x0d\x0a string temp=p->Code;\x0d\x0a string op;\x0d\x0a double lvalue=0,rvalue=0;\x0d\x0a int l_point=0,r_point=0;\x0d\x0a int i=0,type=0;\x0d\x0a char ch;\x0d\x0a while(ivalue=f->calc();\x0d\x0a }\x0d\x0a p=p->Next;\x0d\x0a}\x0d\x0areturn head;\x0d\x0a}\x0d\x0a\x0d\x0aNode * Tree(Unit * head) //生成表达式树\x0d\x0a{\x0d\x0aNode * root=NULL,* proot=NULL,* pbranch=NULL;\x0d\x0aUnit * p=head;\x0d\x0aint now_pri; //当前优先级\x0d\x0abool hadop=false;\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0a if(p->Type==0) //如果是一个操作符\x0d\x0a {\x0d\x0a hadop=true;\x0d\x0a if(root==NULL)\x0d\x0a {\x0d\x0a proot=new Node(p->Operation,p->PRI,1);\x0d\x0a root=proot;\x0d\x0a pbranch=root;\x0d\x0a now_pri=p->PRI;\x0d\x0a proot->Left=new Node(' ',0,0,p->Pre->value);\x0d\x0a proot->Right=new Node(' ',0,0,p->Next->value);\x0d\x0a }\x0d\x0a else\x0d\x0a {\x0d\x0a if(p->PRI<=now_pri) //优先级低于当前优先级,树根方向 //最初写的 if(p->PRIOperation,p->PRI,1); //新的树根\x0d\x0a proot->Left=root; //根的变换\x0d\x0a proot->Right=new Node(' ',0,0,p->Next->value);\x0d\x0a root=proot;\x0d\x0a\x0d\x0a pbranch=proot; //右树枝的变换\x0d\x0a //pbranch->Right=new Node(' ',0,0,p->Pre->value); //树枝右边取值\x0d\x0a }\x0d\x0a else\x0d\x0a {\x0d\x0a Node * temp;\x0d\x0a temp=new Node(p->Operation,p->PRI,1);\x0d\x0a\x0d\x0a pbranch->Right=temp;\x0d\x0a temp->Head=pbranch;\x0d\x0a\x0d\x0a pbranch=pbranch->Right;\x0d\x0a pbranch->Left=new Node(' ',0,0,p->Pre->value);\x0d\x0a pbranch->Right=new Node(' ',0,0,p->Next->value);\x0d\x0a }\x0d\x0a now_pri=p->PRI;\x0d\x0a }\x0d\x0a }\x0d\x0a p=p->Next;\x0d\x0a}\x0d\x0aif(! hadop)\x0d\x0a root=new Node(' ',0,0,head->value);\x0d\x0areturn root;\x0d\x0a}\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0astring exp;\x0d\x0a\x0d\x0a//ifstream infile("test.txt",ios::in);\x0d\x0awhile(! getline(cin,exp).eof())\x0d\x0a{\x0d\x0a if(exp=="")\x0d\x0a continue;\x0d\x0a Unit * h=Analyse(exp);\x0d\x0a h=Calc(h);\x0d\x0a Node * root=Tree(h);\x0d\x0a cout<GetValue()<
温馨提示:答案为网友推荐,仅供参考
相似回答