版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数学表达式计算(c语言实现)数学表达式计算(c语言实现)数学表达式计算(c语言实现)数学表达式计算(c语言实现)编制仅供参考审核批准生效日期地址:电话:传真:邮编:设计思想计算算术表达式可以用两种方法实现:1.中缀转后缀算法此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下:中缀转后缀需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。首先,得到用户输入的中缀表达式,将其存入str数组中。对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。然后继续扫描下一个字符,直到遇到str中的结束符号\0,扫描结束。结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空。到此在exp数组最后加结束字符\0。我们就得到了后缀表达式。后缀表达式计算此时需要一个数值栈od来存放数值。对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。继续扫描,知道扫描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。2.两个栈实现算法此算法需要两个栈,一个值栈od,一个操作符栈op。将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中;当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op栈。继续扫描直到遇到str中的结束字符\0,扫描结束。此时看操作符栈是否为空,若不为空,出栈,再从值栈中取出两个数值进行计算,将其结果存入值栈,一直进行此操作,直到操作符栈为空。此时把值栈中的数值取出,即为所得的最终计算结果。二、算法流程图第一种算法:中缀转后缀算法其主函数流程图为:图1主函数算法流程图中缀转后缀算法流程图如下:图2中缀转后缀算法流程图计算后缀表达式流程图如下:图3后缀表达式计算流程图第二种算法:两个栈算法其主函数流程图为:图4主函数算法流程图直接计算数学表达式流程图如下:图5直接计算表达式流程图三、源代码下面给出的是用中缀转后缀算法实现的程序的源代码:#include<>#include<>#include<>#include<>#defineMAXSIZE100 { tempi++; exp[j]=ch; { tempch[t]=ch;t++;//截取子串 { tempch[t]=ch;t++;//赋值给临时数组 j++;ch=str[j]; } tempch[t]='\0'; d=atof(tempch);//将子串转化成double类型的数 ++; []=d;//入值栈 } //对操作符操作 elseif(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='('||ch==')') { if(ch=='(')//如果为(,直接进栈 { ++; []=ch;//进栈操作 } elseif(ch==')')//如果为),一直出栈直到遇到( {intlevel(charop);//声明level函数 while(level[])!=-1)//若栈顶元素不为(,进入while循环 { //声明calvalue函数 doublecalvalue(doubleod1,doubleod2,chartempop); od2=[];; od1=[]; tempop=[];; []=calvalue(od1,od2,tempop);//计算出结果后入值栈 if==-1)break;//如果操作符栈为空,跳出循环 } ;//左括号pop出来 } elseif==-1)//如果栈为空,直接进栈 { ++; []=ch;//进栈操作 } //如果所扫描的操作符优先等级比栈顶元素高,直接进栈 elseif(level(ch)>level[])) { ++; []=ch;//进栈操作 } else { //如果所扫描的操作符优先等级没有栈顶元素高, //一直出栈直到比栈顶元素优先级高 while(level(ch)<=level[])) { od2=[];; od1=[]; tempop=[];; []=calvalue(od1,od2,tempop);//计算结果后入值栈 if==-1)break;//如果栈为空,跳出循环 } ++; []=ch;//比栈顶元素优先级高,入操作符栈 } j++;//str下标加1,向后扫描 } }while!=-1)//扫描结束后如果操作符栈不为空,出栈直至为空 { od2=[];; od1=[]; tempop=[];; []=calvalue(od1,od2,tempop);//计算结果后入值栈 } return[];//将结束后值栈中的数pop出来,即为计算结果}intlevel(charop)//判断操作符优先等级{ if(op=='+'||op=='-')//若为+、-,等级为1 return1; elseif(op=='*'||op=='/'||op=='%') return2;//若为*、/、%,等级为2 elseif(op=='(') return-1;//若为(,等级为-1 else return-3;//其他等级为-3;}doublecalvalue(doubleod1,doubleod2,chartempop)//计算{ switch(tempop){ case'+': returnod1+od2;//计算加法 case'-': returnod1-od2;//计算减法 case'*': returnod1*od2;//计算乘法 case'/': returnod1/od2;//计算除法 case'%': returnfmod(od1,od2);//求余 } return0;}voidmain(){ charstr[MAXSIZE];//定义str数组存放数学表达式 printf("输入算术表达式:\n"); gets(str);//从控制台输入算数表达式 printf("结果是:%lf\n",calculate(str));//调用calculate函数,计算结果}四、运行结果图6中缀转后缀算法运行结果图7两个栈算法运行结果遇到的问题及解决编程的前期工作很重要,需要明确的理清思路,而编写运行的过程中更是会出现很多问题,有因粗心造成的拼写错误,有语法错误,也有逻辑错误。在整个编程过程我主要遇到了如下几个大的问题,其内容与解决方法如下所列:将字符表示的数字转化为浮点数Java中有现成的截取子串的方法可以用,而我的c语言基础比较薄弱,所学知识也不全面。刚开始的思路是先将出现数字的子串计数,得到一共有多少个数字,然后再从子串开始处扫描,依次乘以它的位权,在百位就乘以10的2次方,依次类推。经过很长时间的思考,终于写出了此解决方法,可是却忽略了小数点的存在。又开始用此方法试图解决存在小数点的问题,想了好久也没有解决方法。无奈之下求助于网络,看有没有什么更好的解决办法,一经查询知道了库中有atof的函数可以将字符串类型的数字转换为浮点型。于是我用一个while循环将数值子串截取下来存到一个临时数组中,将其成功的转换成浮点数,小数点的情况也解决了。打印后缀表达式时出现“喊烫”情况情况如下图:图8“喊烫”出错情况编写完中缀转后缀的trans函数后,想打印后缀表达式检查是否正确时出现了问题,打印出来的全是“烫”。刚开始觉得很奇怪,存的都是数字或操作符,怎么会出现汉字呢?仔细检查程序,发现逻辑没有出错,但为什么打印不出正确结果很是不解。通过和同学讨论,上网查询才知道,如果字符串没有结束符号\0就会“喊烫”。再经过检查发现还真是没有给字符串加结束字符。于是在循环的结束给exp[j]='\0';解决了问题,得到了正确的结果。程序运行时会中止编写完程序后,编译没有错误,但运行总是会中止。刚开始的问题是只打印出中缀表达式,光标停在下一行不动了。也不是死循环,也没有出现语法错误。说明程序进行到某一阶段出现问题不走了。于是我把循环中可以打印出来帮助我分析程序的值都打印出来,包括循环有没有正常执行,有没有进栈,出栈。就这样一点一点分析后,发现自己在循环嵌套中出现了一点逻辑问题,导致没有进行应有的判断,所以没有出正确结果。发现问题后及时改正,程序就正常运行了。六、心得体会因为C语言是大一时学的,当时就学了些基础的理论知识,上机的练习很少,敲的也是一些简单的分析素数,比大比小的程序。由于有一年多没有碰过C语言,遗忘了不少。通过这次的编程作业,把C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026北京市平谷区事业单位招聘49人(第二次)模拟试卷带答案详解(培优B卷)
- 2026四川凉山州木里中学招聘高中教师16人考前冲刺试卷附参考答案详解【能力提升】
- 2026河北承德县卫健系统事业单位公开选聘工作人员20名模拟试卷及完整答案详解(网校专用)
- 2026江西南昌市公园事务中心招聘水电工岗位招聘1人考前冲刺试卷及完整答案详解【历年真题】
- 2026本溪市教育系统暑期引进急需紧缺人才3名(本溪市第一中学)模拟试卷含答案详解(模拟题)
- 2026四川凉州普格县就业创业促进中心见习基地招收青年就业见习23人备考题库及完整答案详解1套
- 2026浙江舟山市普陀区渔港建设管理有限公司招聘2人考前冲刺密卷及答案详解【基础+提升】
- 2026江西上饶市信州中等专业学校招聘编外聘用教师8人考前冲刺密卷附答案详解【培优A卷】
- 2026年8月鼎和财产保险股份有限公司社会招聘44人考前冲刺密卷参考答案详解
- 2026上海市嘉定区马陆育才联合中学招聘4名编外教师考前冲刺试卷及参考答案详解(黄金题型)
- 2026年中小学教师(语文)副高级职称评审答辩题库及答案
- 学校管理与教师专业发展手册
- 初中音乐七年级上册《美丽的草原我的家》深度鉴赏与跨文化理解教案
- 2026秋新人教版英语五年级上册单元一Unit 1 Different friends测试卷-提高卷附答案(文档中已插入听力音频)
- 2026广西南宁市青秀区伶俐镇人民政府招聘2人(劳务派遣)笔试参考题库及答案详解
- 2026年餐饮服务食品安全管理员试题及答案
- GB/T 47950-2026资产管理数据资产登记指南
- 2026版《医师外出会诊管理暂行规定》课件
- 影像医学技术操作规程大全
- 2026年河南高考地理考试试卷及答案
- 中国老年抗中性粒细胞胞浆抗体相关肾小球肾炎治疗指南总结2026
评论
0/150
提交评论