计算器程序编程实习报告Word文档格式.docx
《计算器程序编程实习报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算器程序编程实习报告Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
?
尣否栈顶元素比C的优先级等于脱括号
否是字符小于将字符压入OPTR
栈
将字OPTR
入
顶栈获取元素
大于
输出结果
栈出operate栈
行执压,
结束
返回
三、详细设计:
OPTROPTR,OPND首先定义两个栈,分别取名是,其中、主函数1
OPND存放字符,存放数字。
将optr中压入#作为栈底元素,然后从键盘上获取表达式的字符
如果是数字,将该字符转化为数字,压入到栈opnd中。
如果是字符,和optr的栈顶元素比较优先级
1,、栈顶元素优先级<
键入的元素,该调用push()函数,将字符压入到optr栈中
2、如果栈顶元素的优先级等于键入元素,则得知此符号为括号,调用pop()函数,将该字符栈中的栈顶元素退出,即为脱括号。
3、如果栈顶元素的优先级高于键入元素,调用pop()函数,分别将取两次数字栈的栈顶元素,pop(opnd,b),pop(opnd,a),,同时将optr中的栈顶元素去取出,pop(optr,theta),调用operate()函数,进行计算。
将operate(a,theta,b)压入到opnd栈中,继续进行循环。
直到#结束。
模块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!
\n);
else
{s->
stack[s->
top]=x;
s->
top++;
}
return1;
模块3、Operate函数定义:
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;
返回a的值
*'
a=a*c;
/'
a=a/c;
}
returna;
模4、优先级判断
将+—*/()#的优先级做成如下的图
+>
'
>
<
'
—'
*'
/
='
0,(
)'
0,'
寻找优先级即将左表中的对应坐标用程,'
0#'
序语言找到即可,设计一个二维数组,str[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为字符型,没有能够将字符型转化成整型进行计算,使得在计算中是用的0~9的ASCII码值进行的计算,在ASCII码表中0~9的ASCII码表依次为48~57,int
m
m=c—48,即‘c'
-48,得到真实的数值。
5、取栈顶元素的函数定义错误,使得程序无法进行,由于gettop函数定义错误,在optr中一直重复取#的循环运算,导致“error
Underflow”刷屏出现。
源代码;
#include<
stdio.h>
string.h>
ctype.h>
#defineMAXSIZE100
#definetrue1
#definefalse0
typedefstruct{//定义堆栈数据类型
typedefstruct{//定义堆栈数据类型
charstack[MAXSIZE];
}sqstack;
voidInitStack(SqStack*s)
{//初始化栈,栈顶指针为0
s->
top=0;
voidInitStack2(sqstack*s)
0初始化栈,栈顶指针为//{
intPush1(SqStack*s,intx)
{//入栈
if(s->
{
intGettop1(SqStack*s,int*x)
取栈顶元素//
if(s->
top==0)
printf(error,gettop1);
return0;
{
*x=s->
stack[s->
top];
return1;
intPop1(SqStack*s,int*x){//出栈
top==0)
printf(ERROR,pop1!
top--;
*x=s->
charPush2(sqstack*s,charx)
top==MAXSIZE+1)
printf(ERROR,push2!
else
charGettop2(sqstack*s,char*ch){//取栈顶元素
0)
{*ch=s->
top-1];
return*ch;
return0;
出栈//charPop2(sqstack*s,char*x){
printf(ERROR,pop2!
charprocede(charc1,charc2)
inti=0,j=0;
charstr[7][7]={
'
0,
0,'
};
switch(c1)
case'
i=0;
i=1;
i=2;
i=3;
('
i=4;
)'
i=5;
#'
i=6;
switch(c2)
j=0;
j=1;
j=2;
j=3;
j=4;
j=5;
j=6;
return(str[i][j]);
}//返回优先级判断结果
intoperate(inta,charb,intc)
switch(b)
{case'
main()
sqstackOPTR;
SqStackOPND;
chartheta,c,x;
inta,b,m;
InitStack2(&
OPTR);
Push2(&
OPTR,'
);
InitStack(&
OPND);
牰湩晴尨请输入一个计算式,以#结束\n);
c=getchar();
{while(c!
||OPTR.stack[OPTR.top-1]!
)
if(c>
0'
&
c<
9'
)
m=c-48;
Push1(&
OPND,m);
switch(procede(OPTR.stack[OPTR.top-1],c))
Push2(&
OPTR,c);
break;
Pop2(&
OPTR,&
x);
theta);
//退栈并将运算结果入栈
Pop1(&
OPND,&
b);
a);
Push1(&
OPND,operate(a,theta,b));
牰湩晴尨结果:
%d\n,OPND.stack[OPND