资源描述:
《计算器程序编程实习报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、程序实习报告一、需求分析:编写简易计算器程序,主要实现四则运算,运算符号包括“—”,“+”,“/”,“*”,“(”,“)”,按照“先乘除后加减,先算括号内后算括号外,从左到右”的原则的原则进行计算。考虑到程序的编写困难度,暂时不予考虑多位数的四则运算,也不考虑平方、阶乘、三角函数的运算。只进行一位数的四则运算,所需要的内存空间不会很大,也就放弃空间不足自动添加空间的情况。输入:输入一个只含一位数的四则运算式,以#结束,运算符只包括“—”,“+”,“*”,“/”,“(”,“)”。输出:直接输出结果“结果是:”。测
2、试数据:例如9—(3—2)*3—1#二、概要设计:开始从键盘上获取键入字符c是C!=#或Gettop!='#"?否获取栈顶元素否是字符否栈顶元素比C的优先级是将字符压入OPTR输出结果小于大于等于出栈执行operate,压栈将字符压入栈OPTRJI脱括号结束返回三、详细设计:1、主函数首先定义两个栈,分别取名是OPTR,OPND,其中OPTR存放字符,OPND存放数字。将optr中压入#作为栈底元素,然后从键盘上获取表达式的字符如果是数字,将该字符转化为数字,压入到栈opnd中。如果是字符,和optr的栈顶元素
3、比较优先级1,、栈顶元素优先级<键入的元素,该调用push()函数,将字符压入到optr栈中2、如果栈顶元素的优先级等于键入元素,则得知此符号为括号,调用pop()函数,将该字符栈中的栈顶元素退出,即为脱括号。3、如果栈顶元素的优先级高于键入元素,调用pop()函数,分别将取两次数字栈的栈顶元素,pop(opnd,b),pop(opnd,a),,同时将optr中的栈顶元素去取出,pop(optr,theta),调用operate()函数,进行计算。将operate(a,theta,b)压入到opnd栈中,继续进
4、行循环。直到#结束。模块1、定义2中栈,定义栈,区分两种数据类型typedefstruct{intstack[MAXSIZE];inttop;}SqStack;模块2、定义两种出栈入栈函数,以便后来调用不同数据类型的pop(*s,x),.push(*s,*x);intPush1(SqStack*s,intx){if(s->top>=MAXSIZE)printf("ERROR,Overflow!");else{s->stack[s->top]=x;s->top++;}return1;}模块3、Operate函
5、数定义:operate函数,利用switch()语句来operate(inta,charb,intc)写定义3个实参,inta,bchartheta;{theta代表运算符,依次判断运算符的+—switch(b)*,/,情况,进行运算,{case'+':a=a+c;break;令a=a+c,a=a-c,a=a*c,a=a/c,case'-':a=a-c;break;返回a的值case'*':a=a*c;break;case'/':a=a/c;break;}returna;}模4、优先级判断将+—*/()#的优先
6、级做成如下的图+'>',>','>','<','<','<','>','>',—'>','>','<','<','<','>','>',*'>','>','>','>','<','>','>',/'>','>','>','>','<','>','>',('<','<','<','<','<','=',0,)'>','>','>','>',0,'>','>',#'<','<','<','<','<',0,'=',寻找优先级即将左表中的对应坐标用程序语言找到即可,设计一个二维数组,str[7[,[7],将字符进行定
7、位,i,j分别代表横纵坐标,利用switch,语句进行选择,对应的str[i][j]即为优先级符号,所以将str[i][j],作为函数的返回值调试中的问题:1、最初只定义了一种数据类型的栈,出栈入栈函数也只有一种int数据类型,导致之后的函数调用数据类型不匹配,无法识别。2、在定义入栈函数时,未能将push(*s,*x)中的x定义成指针类型,在pop(*s,x)中误将x定义成指针类型。3、在调用函数时对栈的调用中数据类型不一致。4、对主函数,从键盘键入的C为字符型,没有能够将字符型转化成整型进行计算,使得在计算
8、中是用的0~9的ASCII码值进行的计算,在ASCII码表中0~9的ASCII码表依次为48~57,intm,m=c—48,即‘c'-48,得到真实的数值。5、取栈顶元素的函数定义错误,使得程序无法进行,由于gettop函数定义错误,在optr中一直重复取#的循环运算,导致“errorUnderflow”刷屏出现。源代码;#include#include