


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+语言编写。#include<iostream>#include<cmath>#include<string>usingnamespacestd;constdoublepi=3.14159265;constdoublee=2.9;constintSIZE=1000;typedefstructnode/为了处理符号而建立的链表(如:1+(-2)chardata;node*next;node;typedefstructstack_num/存储数的栈double*top;double*base;stack_num;typedefstructstack_char/
2、存储运算符号的栈char*top;char*base;stack_char;stack_numS_num;/定义stack_charS_char;/定义charfu18='n',')','+','-','*','/','%',,A,,'Q','L','C','S','T','c','s','t','('intpare1000;/表现出各运算符
3、号的优先级doubleshu1000;/存储"数"的数组doubledai_result;/运算的结果,是为了处理M运算(简介函数里有M的定义)intbiao=0;/和dia_result一样,为了处理M运算charlineSIZE;/输入的所要计算的表达式voidinit()/初始化parefu0=-2;/用数字的大小表现出符号的优先级parefu1=-1;parefu2=2;parefu3=2;parefu4=4;parefu5=4;parefu6=4;parefu7=5;for(inti=8;i<=15;i+)parefui=6;parefu16=7;S_num
4、.base=(double*)malloc(sizeof(double)*SIZE);/为栈开辟空间S_char.base=(char*)malloc(sizeof(char)*SIZE);/同上S_num.top=S_num.base;S_char.top=S_char.base;voidpush_num(doublen)/数字进栈+S_num.top=n;voidpush_char(charc)/运算符号进栈+S_char.top=c;doublepop_num()/数字出栈doublem=*S_num.top;S_num.top-;returnm;charpop_char()/运算符号出
5、栈charcc=*S_char.top;S_char.top-;returncc;charget_top_char()/得到运算符号的栈中最顶端的运算符号return*S_char.top;doubleoperate(doubley,charc,doublex)/对两个数计算(含是双目运算符:如*,/等等)(doubler;if(c='-')r=x-y;elseif(c='+')r=x+y;elseif(c='/'&&y!=0)r=x/y;elseif(c='*')r=x*y;elseif(c=,A,)(r=1;f
6、or(inti=1;i<=y;i+)r*=x;elseif(c='%')(intr0=(int)x%(int)y;r=double(rO);returnr;doubleoperate_one(doubleone,charcc)/对一个数运算(含单目运算符:如log(L),sin(S)等等)(doubler;if(cc='Q')r=sqrt(one);elseif(cc='C')r=cos(one);elseif(cc='S')r=sin(one);elseif(cc='T')r=tan(one);elseif
7、(cc='c')r=acos(one);elseif(cc='s')r=asin(one);elseif(cc='t')r=atan(one);returnr;doubleoperate_L(doublea,doubleb,chardian)/求对数的值(doubler=log(b)/log(a);returnr;doublepute()/对整个表达式的计算(charc;/表示运算符号intp=0;/用于shu+p,先初始化inti,j;init();/进展初始化push_char('n');linestrlen(line)=
8、39;n'linestrlen(line)+1='0'if(biao)push_num(dai_result);/把运算的结果先进栈,在这个结果的根底上继续进展运算biao=0;for(i=0;linei!='0')/把表达式中的数字字符串转化成可计算的数字(intflag=0;intflag1=1;/标记是否是运算符号/intflag2=1;/标记是否出现'_'doubleh=0;intge;/位数intbiao_dian=0;/是否是小数的类型while(1)(flag1=1;for(j=0;j<=16;j+)(if(linei
9、=fuj)(flag1=0;break;if(linei='_')(break;if(linei='.')(i+;ge=0;biao_dian=1;if(linei='P')(shu+p=pi;i+;break;if(linei='E')(shu+p=e;i+;break;if(flag1)(h=h*10+(linei-'0');flag=1;i+;if(biao_dian)ge+;elsebreak;if(flag)(if(biao_dian)(intr=1;for(intk=1;k<=ge;k+)r*=1
10、0;h/=r;shu+p=h;/把转化而来的数字存于数组if(linei='+')shu+p=-1;elseif(linei=shu+p=-2;elseif(linei='*')shu+p=-3;elseif(linei=7')shu+p=-4;elseif(linei='%')shu+p=-5;elseif(linei=,A,)shu+p=-6;elseif(linei='Q')shu+p=-7;elseif(linei='L')shu+p=-8;elseif(linei='C')shu+
11、p=-9;elseif(linei='S')shu+p=-10;elseif(linei='T')shu+p=-11;elseif(linei='c')shu+p=-12;elseif(linei='s')shu+p=-13;elseif(linei='t')shu+p=-14;elseif(linei='(')shu+p=-15;elseif(linei=')')shu+p=-16;elseif(linei='n')shu+p=-17;i+;)i=1;while(s
12、hui!=-17|get_top_char()!='n')doublem=shui;if(m>=0)push_num(m);i+;elseif(m=-c=1)'+';elseif(m=-2)c=11.Jelseif(m=-3)c=elseif(m=-4)c=7';elseif(m=-5)c=elseif(m=-6)c=jelseif(m=-7)c='Q';elseif(m=-8)c='L';elseif(m=-9)c='C;elseif(m=-10)c='S';elseif(m=-11)c=T
13、;elseif(m=-12)c='C;elseif(m=-13)c='s'elseif(m=-14)c=''t';elseif(m=-15)c=1elseif(m=-16)c='elseif(m=-17)c='n'charch=get_top_char();/得到最顶端运算符号if(parech<parec)/运算符号级别的比拟push_char(c);i+;elseif(ch='('&&c=')')(pop_char();i+;elseif(parech>=pa
14、rec&&ch!='('&&ch!='n')(if(ch='Q'|ch='C'|ch='S'|ch='T'|ch='c'|ch='s'|ch='t')(doubleone=pop_num();chardian=pop_char();push_num(operate_one(one,dian);elseif(ch='L')(doubleone_L=pop_num();doubletwo_L=pop_num(
15、);chardian=pop_char();push_num(operate_L(two_L,one_L,dian);else(doublex=pop_num();doubley=pop_num();chardian=pop_char();if(dian='/'&&x=0)/判断是否除了"零"(cout<<"由于您除了零,结果将是错误的"<<endl;push_num(operate(x,dian,y);/把进展一次计算的结果入栈else(push_char(c);i+;doubleresult=p
16、op_num();/得至V结果returnresult;intcheck_kuohao()/检查表达式括号是否匹配inti,f=0;intkuoSIZE,key=1;memset(kuo,0,sizeof(kuo);for(i=0;linei!='0'i+)if(linei='(')kuo+f=1;elseif(linei=')')if(kuof=1)kuof=0;f-;)elsekey=0;break;)if(key&&f=0)return1;elsereturn0;)intcheck_char()/检查运算符号是否合法(如:1
17、+*4)inti,ge;for(i=0;linei!='0')(ge=0;while(linei='+'|linei=|linei=|linei=7'|linei='%'|linei=,A,|linei='Q'|linei='L'|linei='S'|linei='C|linei='T'|linei='s'|linei='c'|linei='t')ge+;i+;i+;if(ge>=3)return0;elseret
18、urn1;voidoutput(doubleresult)/打出结果(printf("所得结果是:");cout<<result<<endl;voidcheck()/检查表达式是否合法(voidintroduce();charcc;/决定计算器按哪种功能进展计算doubleresult;/结果voidinput();/定义if(check_kuohao()&&check_char()/看是否合法,合法那么计算(result=pute();output(result);cout<<”输入一个字符M'或'D
19、39;或'F',决定是否继续:"<<endl;while(cin>>cc)(if(cc='M')(system("cls");introduce();printf("您上次所得结果为:");cout<<result<<endl;cout<<"在上次计算结果的根底上,请继续输入想计算的表达式"<<endl;dai_result=result;biao=1;input();/输入表达式break;elseif(cc='
20、D')system("cls");introduce();cout<<"计算器已清零,请输入您所要计算的表达式"<<endl;input();/输入表达式break;elseif(cc='F')(system("cls");cout<<"计算器关闭,谢谢使用!"<<endl;break;else(cout<<"所输入字符无效,请输入一个字符M'或'D'或'F'!”<<en
21、dl;continue;else/不合法,分两种不合法(if(check_kuohao()=0&&check_char()=1)(cout<<"您所输入的表达式括号不匹配,请重新输入:"<<endl;input();/输入表达式else(cout<<"您所输入的表达式不合法,请重新输入:"<<endl;input();/输入表达式voidtackle_fuhao()/处理负号(node*root,*head,*p,*q,*p1;root=head=newnode;head->next=
22、NULL;inti;for(i=0;linei!='0'i+)/建立链表(p=newnode;p->data=linei;p->next=head->next;head->next=p;head=p;/deletep;q=(node*)malloc(sizeof(node);head=root;if(root->next->data='+'|root->next->data='-')/处理第一个字符p=newnode;p->data='0'p->next=head->
23、;next;head->next=p;if(root->next!=NULL)for(q=root->next;q;q=q->next)if(q->data='('&&(q->next->data='-'|q->next->data='+')p=newnode;p->data='0'p->next=q->next;q->next=p;/deleteq;p1=newnode;intqi=-1;for(p1=root->next;p1;
24、p1=p1->next)line+qi=p1->data;line+qi='0'voidinput()/输入cin>>line;if(biao=0)tackle_fuhao();/处理负号check();/检查表达式是否合法voidintroduce()/对计算器的符号功能的简要介绍(cout<<"计算器简要介绍"<<endl;cout<<"C(cos)S(sin)T(tan)a(arccos)c(arcsin)"<<endl;cout<<"789/ont(arctan)"<<endl;cout<<"456*%L(log)"<<endl;cout<<"123-M(M+)Q(sqrt)"<<endl;cout<<"0.+A(a)F(off)Enter(=)"<<en
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卒中防治需警惕课件
- 河南郑州初中数学试卷
- 健康绘本小班课件
- 广元万达小升初数学试卷
- 杭州市初中数学试卷
- 河南省2024南阳中考数学试卷
- 健康管理师课件资料
- 2021-2026年中国供暖设备行业市场全景调研及投资规划建议报告
- 中国妇科诊查车行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2025年中国传送带行业市场发展现状及投资规划建议报告
- 2024年新版(外研版新交际)二年级英语上册单词带音标
- 江苏省苏州市苏州地区学校2024届七年级英语第二学期期末统考试题含答案
- 电商客服周工作计划
- 数据交换平台设计方案
- DL∕T 1563-2016 中压配电网可靠性评估导则
- Vericut培训教程(可修改)
- 校级课题结题报告会方案
- 基于PLC的冷却系统自整定模糊控制研究
- 栈桥专项施工方案
- 高三英语一轮复习人教版(2019)必修第一至三册一词多义和熟词生义清单
- 高温作业引发的电气事故
评论
0/150
提交评论