收藏 分销(赏)

数学表达式计算(c语言实现).doc

上传人:精*** 文档编号:2145754 上传时间:2024-05-20 格式:DOC 页数:15 大小:278KB
下载 相关 举报
数学表达式计算(c语言实现).doc_第1页
第1页 / 共15页
数学表达式计算(c语言实现).doc_第2页
第2页 / 共15页
数学表达式计算(c语言实现).doc_第3页
第3页 / 共15页
数学表达式计算(c语言实现).doc_第4页
第4页 / 共15页
数学表达式计算(c语言实现).doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、_一、 设计思想计算算术表达式可以用两种方法实现: 1.中缀转后缀算法 此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下:(1) 中缀转后缀 需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。首先,得到用户输入的中缀表达式,将其存入str数组中。对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组

2、中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。然后继续扫描下一个字符,直到遇到str中的结束符号0,扫描结束。结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空。到此在exp数组最后加结束字符0。我们就得到了后缀表达式。 (2) 后缀表达式计算此时需要一个数值栈od来存放数值。对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。继续扫描,知道扫描结束,此时值栈中的数值就

3、是计算的结果,取出返回计算结果。2.两个栈实现算法 此算法需要两个栈,一个值栈od,一个操作符栈op。将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中;当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入

4、值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op栈。继续扫描直到遇到str中的结束字符0,扫描结束。此时看操作符栈是否为空,若不为空,出栈,再从值栈中取出两个数值进行计算,将其结果存入值栈,一直进行此操作,直到操作符栈为空。此时把值栈中的数值取出,即为所得的最终计算结果。二、算法流程图第一种算法:中缀转后缀算法其主函数流程图为:图1 主函数算法流程图中缀转后缀算法流程图如下:图2 中缀转后缀算法流程图计算后缀表达式流程图如下: 图3 后缀表达式计算流程图第二种算法:两个栈算法其主函数流程图为:图4 主函数算法流程图直接计算数学表达式流程图如下:图5 直接计算表达式

5、流程图三、源代码下面给出的是用中缀转后缀算法实现的程序的源代码:#include#include#include#include#define MAXSIZE 100 /定义宏,数组最大长度为100/函数实现中缀转后缀,将存储数学表达式的数组str传参进来,exp存储后缀表达式void trans(char str,char exp) struct char dataMAXSIZE;/用来存放操作符int top;/数组下标 op;/用结构体创建操作符栈 char ch; int i=0,j=0,tempi=0; op.top=-1;/给操作符栈初始化,令下标为-1 while(ch!=0)

6、ch=stri; /取str数组的第i个元素赋值给ch if(ch=0& ch=0 & chlevel(op.dataop.top) op.top+; op.dataop.top=ch;/进栈操作 else /如果所扫描的操作符优先等级没有栈顶元素高, /一直出栈直到比栈顶元素优先级高 while(level(ch)=level(op.dataop.top) expj=op.dataop.top;/出栈存入exp数组中 op.top-; j+; if(op.top=-1)break;/如果栈为空,跳出循环 op.top+; op.dataop.top=ch;/比栈顶元素优先级高,入栈 i+;/

7、str下标加1,向后扫描 while(op.top!=-1)/扫描结束后如果操作符栈不为空,出栈直至为空 expj=op.dataop.top;/出栈存入exp数组中 op.top-; j+; expj=0;/赋0结束exp字符数组 int level(char op)/判断操作符优先等级if(op = + | op = -)/若为+、-,等级为1return 1; else if(op = * | op = / | op = %)return 2; /若为*、/、%,等级为2 else if(op = ()return -1 ; /若为(,等级为-1 elsereturn -3; /其他等级

8、为-3;double calvalue(double od1,double od2,char tempop)/计算switch(tempop)case +: return od1 + od2; /计算加法case -: return od1 - od2;/计算减法 case *: return od1 * od2;/计算乘法 case /: return od1 / od2;/计算除法case %: return fmod(od1,od2);/求余return 0;double calculate(char exp)/计算后缀表达式struct /用结构体创建值栈double dataMAXS

9、IZE; /存储数值int top;od; double d; /声明d变量存储数值double od1,od2; /存储值栈依次pop出来的操作数char ch;char tempch20; /声明临时数组存储子串int j=0,t;int length=strlen(exp);/计算exp数组的长度od.top=-1; /初始化值栈,令下标为-1while(j=0 & ch=9) |ch=.)tempcht=ch;t+;/依次存放到临时数组中j+;ch=expj;tempcht=0;/结束tempch数组d=atof(tempch);/将子串转化成double类型的数od.top+;od.

10、dataod.top=d;/入值栈else /若为操作符,从值栈中pop出两个数计算 od2=od.dataod.top;od.top-;/先出栈的赋给od2od1=od.dataod.top; /后出栈的赋给od1od.dataod.top=calvalue(od1,od2,ch); /计算出结果后再入栈j+;return od.dataod.top;/将结束后值栈中的数pop出来,即为计算结果 main()char strMAXSIZE,expsMAXSIZE; /定义两个数组printf(请输入算术表达式:n);gets(str); /从控制台输入算数表达式 printf(表达式为: %

11、sn,str);trans(str,exps); /调用trans函数,得到后缀表达式printf(后缀表达式:%sn,exps);printf(结果为:%lfn,calculate(exps);/调用calculate函数,计算结果下面给出的是用两个栈算法实现的程序的源代码:#include#include#include#include#define MAXSIZE 100 /定义宏,数组最大长度为100double calculate(char str)struct /用结构体创建操作符栈 char dataMAXSIZE;/用来存放操作符int top;op; struct /用结构体

12、创建值栈 double dataMAXSIZE;/用来存放操作数int top;od; char ch;char tempch20;/声明临时数组存储子串int j=0,t;double d;double od1,od2;/存储值栈依次pop出来的操作数char tempop;int length=strlen(str);/计算str数组的长度op.top=-1;/初始化操作符栈,令下标为-1od.top=-1;/初始化值栈while(j=0 & ch=0 & chlevel(op.dataop.top)op.top+;op.dataop.top=ch;/进栈操作else /如果所扫描的操作符

13、优先等级没有栈顶元素高,/一直出栈直到比栈顶元素优先级高while(level(ch)=level(op.dataop.top)od2=od.dataod.top;od.top-;od1=od.dataod.top;tempop=op.dataop.top;op.top-;od.dataod.top=calvalue(od1,od2,tempop);/计算结果后入值栈if(op.top=-1)break;/如果栈为空,跳出循环op.top+;op.dataop.top=ch;/比栈顶元素优先级高,入操作符栈j+;/str下标加1,向后扫描 while(op.top!=-1)/扫描结束后如果操作

14、符栈不为空,出栈直至为空 od2=od.dataod.top;od.top-; od1=od.dataod.top; tempop=op.dataop.top;op.top-; od.dataod.top=calvalue(od1,od2,tempop);/计算结果后入值栈 return od.dataod.top;/将结束后值栈中的数pop出来,即为计算结果int level(char op)/判断操作符优先等级if(op = + | op = -)/若为+、-,等级为1return 1; else if(op = * | op = / | op = %)return 2; /若为*、/、%

15、,等级为2 else if(op = ()return -1 ; /若为(,等级为-1 elsereturn -3; /其他等级为-3;double calvalue(double od1,double od2,char tempop)/计算switch(tempop)case +: return od1 + od2;/计算加法case -: return od1 - od2;/计算减法 case *: return od1 * od2;/计算乘法 case /: return od1 / od2;/计算除法case %: return fmod(od1,od2);/求余return 0;vo

16、id main()char strMAXSIZE;/定义str数组存放数学表达式printf(输入算术表达式:n);gets(str); /从控制台输入算数表达式printf(结果是:%lfn,calculate(str);/调用calculate函数,计算结果四、运行结果图6 中缀转后缀算法运行结果图7 两个栈算法运行结果五、 遇到的问题及解决编程的前期工作很重要,需要明确的理清思路,而编写运行的过程中更是会出现很多问题,有因粗心造成的拼写错误,有语法错误,也有逻辑错误。在整个编程过程我主要遇到了如下几个大的问题,其内容与解决方法如下所列:l 将字符表示的数字转化为浮点数Java中有现成的截

17、取子串的方法可以用,而我的c语言基础比较薄弱,所学知 识也不全面。刚开始的思路是先将出现数字的子串计数,得到一共有多少个数字,然后再从子串开始处扫描,依次乘以它的位权,在百位就乘以10的2次方,依次类推。经过很长时间的思考,终于写出了此解决方法,可是却忽略了小数点的存在。又开始用此方法试图解决存在小数点的问题,想了好久也没有解决方法。无奈之下求助于网络,看有没有什么更好的解决办法,一经查询知道了stdlib.h库中有atof的函数可以将字符串类型的数字转换为浮点型。于是我用一个while循环将数值子串截取下来存到一个临时数组中,将其成功的转换成浮点数,小数点的情况也解决了。l 打印后缀表达式时

18、出现“喊烫”情况 情况如下图:图8 “喊烫”出错情况编写完中缀转后缀的trans函数后,想打印后缀表达式检查是否正确时出现了问题,打印出来的全是“烫”。刚开始觉得很奇怪,存的都是数字或操作符,怎么会出现汉字呢?仔细检查程序,发现逻辑没有出错,但为什么打印不出正确结果很是不解。通过和同学讨论,上网查询才知道,如果字符串没有结束符号0就会“喊烫”。再经过检查发现还真是没有给字符串加结束字符。于是在循环的结束给expj=0;解决了问题,得到了正确的结果。l 程序运行时会中止编写完程序后,编译没有错误,但运行总是会中止。刚开始的问题是只打印出中缀表达式,光标停在下一行不动了。也不是死循环,也没有出现语

19、法错误。说明程序进行到某一阶段出现问题不走了。于是我把循环中可以打印出来帮助我分析程序的值都打印出来,包括循环有没有正常执行,有没有进栈,出栈。就这样一点一点分析后,发现自己在循环嵌套中出现了一点逻辑问题,导致没有进行应有的判断,所以没有出正确结果。发现问题后及时改正,程序就正常运行了。 六、心得体会 因为C语言是大一时学的,当时就学了些基础的理论知识,上机的练习很少,敲的也是一些简单的分析素数,比大比小的程序。由于有一年多没有碰过C语言,遗忘了不少。通过这次的编程作业,把C语言的知识又重新温习了一遍。再通过和java语言的比较,大致理解了两种编程思想的不同。在这次的练习中也深刻的体会到了思维严谨,认真的态度十分重要。所以在以后的学习道路中,要养成良好的编程习惯,思考问题要全面、编写时要仔细认真,不出拼写错误。只有养成良好的编程习惯,在以后的工作中才可以更好的胜任职位,写出安全、可靠、稳定的软件,服务于大众。还有一些深刻的体会就是算法很重要,所以学好数据结构,算法等课程,无疑是打好了地基,在以后各个编程的解决中都可以起到至关重要的作用。Welcome ToDownload !欢迎您的下载,资料仅供参考!精品资料

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服