C++计算数学计算式内附源码及附件_第1页
C++计算数学计算式内附源码及附件_第2页
C++计算数学计算式内附源码及附件_第3页
C++计算数学计算式内附源码及附件_第4页
C++计算数学计算式内附源码及附件_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

温馨提示程序语言:C、C++、C*、Python〔红色字体表示本课设使用的程序设计语言〕图形功能选项:Win32控制台程序〔黑框、文本界面〕、Win32程序、MFC、WinForm、Direct*10〔黑体标明表示本课设的程序图形类别,默认为非图形界面Win32控制台程序〕数据构造:根底类型、数组、链表、双向链表、搜索树〔非平衡二叉树〕、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图〔黑体标明表示本课设使用的数据构造〕C++语言项:STL库〔黑体标明表示使用C++的STL库〕编译环境:Windows764位旗舰版〔Linu*及其他环境请慎重下载〕集成开发环境:VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015均可通过编译。〔浅蓝色字体表示无法通过编译〕分多头文件编译:否〔所有代码根本都包含在一个文件,如需试验头文件功能,请自行参考相关文献〕容说明:1、课设题目及预览容将在第二页开场展示。2、代码行数:175行3、目录所示容,本文根本涵盖,如无容,会在本页进展说明。4、附录绝对包含用户使用手册及程序完整源代码和详细注释。5、如需下载其他头文件〔例如Direct*需另行配置〕,本文会在此进展说明。6、本文撰写容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,恳请各位教师或同学批评指正。题目:输入一个算式,并计算结果表1整体思路首先,从屏幕读入一个字符串存储到str,比方1/20-5+((2-10*5)+5-10*2)开场将中缀表达式添加到字符串队列:stringQueueMiddle第一,检索str里的字符,如果是数字就添加到strNumber字符串的末尾第二,检索str里的字符,如果遇到+-*/,就将strNumber数字进队,strSymbol运算符进队循环进展,直到到达str的末尾。其次,将中缀表达式转换成后缀表达式,将其添加到字符串队列stringQueueBack第一,遇到数字就直接将数字字符串添加到队列第二,如果stringStack栈为空,则将运算符字符进栈第三,如果stringStack栈不为空,假设第一个运算符的优先级小于等于栈顶的运算符的优先级,则先把栈的所有高于等于第一个运算符添加到队列〔然后出栈〕,再把低或等的运算符压入栈第四,如果遇到左括号,则直接压栈第五,遇到右括号,则直接把左括号右边的所有运算符出栈,添加到队列表2中缀表达式转后缀表达式例子例如1/20-5+((2-10*5)+5-10*2)stringQueueMiddle(中缀表达式队列)stringStack(栈)stringQueueBack(后缀表达式队列)1/20-5+((2-10*5)+5-10*2)/20-5+((2-10*5)+5-10*2)1遇到数字直接入队20-5+((2-10*5)+5-10*2)/1栈空,运算符入栈-5+((2-10*5)+5-10*2)120遇到数字直接入队5+((2-10*5)+5-10*2)-120/-的优先级低于/+((2-10*5)+5-10*2)120/5-遇到数字直接入队((2-10*5)+5-10*2)+120/5--与+运算符的优先级一样,则先出栈,在入栈(2-10*5)+5-10*2)+(120/5-遇到(,直接入栈2-10*5)+5-10*2)+((120/5-同上-10*5)+5-10*2)+((120/5-210*5)+5-10*2)+((-120/5-2因为(在栈里,(的优先级最低*5)+5-10*2)+((-120/5-2105)+5-10*2)+((-*120/5-210*的优先级高于-,入栈)+5-10*2)+((-*120/5-2105+5-10*2)+(120/5-2105*-遇到),则把第一个(之前的所有运算符弹出入队,并出栈(5-10*2)+(+120/5-2105*--10*2)+(+120/5-2105*-510*2)+(-120/5-2105*-5+优先级相等的运算符弹出入队,-入栈*2)+(-120/5-2105*-5+102)+(-*120/5-2105*-5+10*优先级高于-,入栈)+(-*120/5-2105*-5+102120/5-2105*-5+102*-+遇到),弹出所有运算符,并且中缀表达式到达结尾,弹出所有运算符表3后缀表达式计算例子120/5-2105*-5+102*-+后缀表达式计算遇到数字就压栈,只要遇到运算符就把栈中的两个数字拿出来运算,把运算结果再压到栈中stringQueueBack(后缀表达式队列)stringStack(栈)120/5-2105*-5+102*-+20/5-2105*-5+102*-+1数字则入栈/5-2105*-5+102*-+120遇到运算符,则把栈顶的两个数字弹出来运算,将运算结果压栈,1/20=00.55-2105*-5+102*-+0.05-2105*-5+102*-+0.055先弹出来的作为右运算数〔0.05-5〕2105*-5+102*-+-4.95105*-5+102*-+-4.9525*-5+102*-+-4.95210*-5+102*-+-4.952105弹出10*5,计算结果50入栈-5+102*-+-4.95250弹出2-50,计算结果-48入栈5+102*-+-4.95-48+102*-+-4.95-485102*-+-4.95-432*-+-4.95-4310*-+-4.95-43102-+-4.95-4320+-4.95-63-67.95注:空白处步骤类似,不再赘述运行结果如下列图所示:附录用户使用手册1、根据提示,输入一条计算式即可。2、开头无法输入负数,否则程序会崩溃。3、输入的计算式需正确,否则会崩溃程序源代码*include<iostream>*include<stack>*include<queue>*include<string>*include<cctype>*include<stdio.h>*include<stdlib.h>*pragmawarning(disable:4996)usingnamespacestd;classE*pression{public:voidsetE*pression(); //从屏幕获取一行计算式子voidcalculationResult(); //计算出结果,并输出private:voidtransformation(); //将中缀表达式转换成后缀表达式stack<string>stringStack; //栈queue<string>stringQueueMiddle; //存储中缀表达式的队列queue<string>stringQueueBack; //存储后缀表达式的队列};voidE*pression::setE*pression(){charch[200];stringstr; //获取屏幕的表达式stringstrNumber; //暂时存储数字stringstrSymbol; //暂时存储运算符inti=0; cout<<"请输入一个表达式〔不需要输入=,请不要输入无谓的字符隔开,比方空格〕:"<<endl; cout<<"\t"; cin.getline(ch,200); str=ch;for(i=0;i<str.size();i++){if(str[i]>='0'&&str[i]<='9'||'.'==str[i]){ strNumber+=str[i]; }else{ stringQueueMiddle.push(strNumber); //将数字添加到队列 strNumber.clear(); //清空字符串 strSymbol+=str[i]; stringQueueMiddle.push(strSymbol); //将符号添加到队列 strSymbol.clear(); //清空字符串 } }//将最后一个数字添加到队列 stringQueueMiddle.push(strNumber); //将数字添加到队列 strNumber.clear(); //清空字符串 transformation();}voidE*pression::transformation(){inti=0;for(;!stringQueueMiddle.empty();stringQueueMiddle.pop()){if(isdigit(stringQueueMiddle.front()[0])) //判断该字符串的第一个字符是否为数字 stringQueueBack.push(stringQueueMiddle.front()); //纯数字则将该字符串添加到后缀表达式队列elseif(stringStack.empty()||'('==stringQueueMiddle.front()[0]) stringStack.push(stringQueueMiddle.front()); //如果栈空或者遇到(,则直接进栈elseif('+'==stringQueueMiddle.front()[0]||'-'==stringQueueMiddle.front()[0]){if(!stringStack.empty()&&'*'==stringStack.top()[0]||'/'==stringStack.top()[0]){ //栈不空,则栈中有*/则出栈//栈中只要有连续的+-*/就出栈,且栈不能为空,遇到(也不出栈for(;!stringStack.empty()&&'('!=stringStack.top()[0];stringStack.pop()) stringQueueBack.push(stringStack.top()); //*/进入后缀表达式队列 }elseif(!stringStack.empty()&&'+'==stringStack.top()[0]||'-'==stringStack.top()[0]){ //如果遇到同等级的运算符,则先出栈再进栈 stringQueueBack.push(stringStack.top()); stringStack.pop(); //栈顶出栈 } stringStack.push(stringQueueMiddle.front()); //+-优先级低,直接进栈 }elseif('*'==stringQueueMiddle.front()[0]||'/'==stringQueueMiddle.front()[0]){if(!stringStack.empty()&&'*'==stringStack.top()[0]||'/'==stringStack.top()[0]){ //栈不空,则栈中有*/则出栈 stringQueueBack.push(stringStack.top()); //进后缀表达式的队 stringStack.pop(); } stringStack.push(stringQueueMiddle.front()); //进栈 }elseif(')'==stringQueueMiddle.front()[0]){ //遇到右括号,则左括号之前的运算符都弹出for(;'('!=stringStack.top()[0];stringStack.pop()) stringQueueBack.push(stringStack.top()); //运算符依次进入后缀表达式队列 stringStack.pop(); //弹出( } }for(;!stringStack.empty();stringStack.pop()){ //中缀表达式扫描完毕,则栈中的所有运算符弹出if('('!=stringStack.top()[0]) stringQueueBack.push(stringStack.top()); //将栈中的运算符添加到后缀表达式队列 }}voidE*pression::calculationResult(){doubleback=0.0; //记录第一个从栈顶弹出来的元素doublefront=0.0; //记录第二个从栈顶弹出来的元素doubleresult=0.0; //记录运算结果charch[100];stringstr;for(;!stringQueueBack.empty();stringQueueBack.pop()){if(isdigit(stringQueueBack.front()[0])) //判断该字符串的第一个字符是否为数字 stringStack.push(stringQueueBack.front()); //纯数字则将该字符串进栈else{ //遇到运算符switch(stringQueueBack.front()[0]) {case'+': back=atof(stringStack.top().c_str()); //弹出第一个栈顶元素 stringStack.pop(); front=atof(stringStack.top().c_str()); //弹出第二个栈顶元素 stringStack.pop(); result=front+back; sprintf(ch,"%lf",result); //将浮点数转换成字符串 str=ch; stringStack.push(str);break;case'-': back=atof(stringStack.top().c_str()); //弹出第一个栈顶元素 stringStack.pop(); front=atof(stringStack.top().c_str()); //弹出第二个栈顶元素 stringStack.pop(); result=front-back; sprintf(ch,"%lf",result); //将浮点数转换成字符串 str=ch; stringStack.push(str);break;case

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论