资源描述:
《《C#高级编程》源代码的进》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、/*程序名称:表达式计算器编译环境:MicrosoftVisualC++6.0时间:200801*//*说明:采用树形结构处理表达式,按优先级运算结果,一个加,减,乘,除或数值为一个节点优先级如下:函数:4括号:3乘除:2加减:1*/#include#include#include#include#includeusingnamespacestd;constcharNUM[]={'0','1','2','3','4','5','6','7','8','9','.'};constchar
2、OPERATION[]={'+','-','*','/'};constdoublePI=3.14159265358979;constdoubleEE=2.71828182818281;classFun//处理系统数学函数的类{public:Fun(stringo,intt,doublel=0.0,doubler=0.0):op(o),type(t),lvalue(l),rvalue(r){}staticstringFUN[];doublecalc();private:inttype;//66601sin9023!33C2stringop;//函数类型doublelvalue
3、;//函数左边的值doublervalue;//函数右边的值staticintFunNum;};intFun::FunNum=10;stringFun::FUN[]={"!","sin","cos","tan","log","ln","C","A","^","-"};/*函数说明:1:log是以10为底的工程对数2:ln是以e为底的自然对数3:C计算组合数输入规则如计算3取2的组合输入表达式3C24:A计算排列数输入规则如计算3取2的排列输入表达式3A25:!计算阶乘6:^x的y次方输入x^y*/intfactorial(intn)//阶乘函数{inti,s=1;for(i
4、=1;i<=n;i++)s*=i;returns;}intC(inta,intb){returnfactorial(a)/(factorial(b)*factorial(a-b));}intA(inta,intb){returnfactorial(a)/factorial(b);}doubleFun::calc()//计算系统函数的值{if(type==0)returnlvalue;else{if(op=="!")returnfactorial(lvalue);if(op=="sin")returnsin(rvalue/180*PI);if(op=="cos")return
5、cos(rvalue/180*PI);if(op=="tan")returntan(rvalue/180*PI);if(op=="log")returnlog10(rvalue);if(op=="ln")returnlog10(rvalue)/log10(EE);if(op=="C")returnC(lvalue,rvalue);if(op=="A")returnA(lvalue,rvalue);if(op=="^")returnpow(lvalue,rvalue);if(op=="-")return-rvalue;else{stringerr="暂时没有函数"+op;Me
6、ssageBox(NULL,err.c_str(),"错误",MB_OK);return0;}}}structUnit//双向链表保存运算单元{Unit(intp,charo,stringc,doublev,intt,Unit*pr=NULL,Unit*n=NULL):PRI(p),Operation(o),Code(c),value(v),Type(t),Pre(pr),Next(n){}intPRI;//优先级charOperation;//操作符stringCode;//原始代码doublevalue;//数据intType;//类型操作符0数据1函数2Unit*Pr
7、e;//构成双向链表Unit*Next;};classNode//表达式树状结构的节点{public:Node(charo,intp,inte=1,doublev=0,Node*ph=NULL,Node*pl=NULL,Node*pr=NULL):Operation(o),PRI(p),Expression(e),value(v),Head(ph),Left(pl),Right(pr){}Node*Head;//节点的根,左树枝,右树枝Node*Left;Node*Right;doubleGetValue();ch