计算器程序编程实习报告范本.docx
《计算器程序编程实习报告范本.docx》由会员分享,可在线阅读,更多相关《计算器程序编程实习报告范本.docx(11页珍藏版)》请在冰豆网上搜索。
计算器程序编程实习报告范本
程序实习报告
一、需求分析:
编写简易计算器程序,主要实现四则运算,运算符号包括“—”,“+”,“/”,“*”,“(”,“)”,按照“先乘除后加减,先算括号后算括号外,从左到右”的原则的原则进行计算。
考虑到程序的编写困难度,暂时不予考虑多位数的四则运算,也不考虑平方、阶乘、三角函数的运算。
只进行一位数的四则运算,所需要的存空间不会很大,也就放弃空间不足自动添加空间的情况。
输入:
输入一个只含一位数的四则运算式,以#结束,运算符只包括“—”,“+”,“*”,“/”,“(”,“)”。
输出:
直接输出结果“结果是:
”。
测试数据:
例如9—(3—2)*3—1#
二、概要设计:
JI
三、详细设计:
1、主函数首先定义两个栈,分别取名是OPTR,OPND,其中OPTR存放字符,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;break;返回a的值
case'*':
a=a*c;break;
case'/':
a=a/c;break;}
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,intm
m=c—48,即‘c'-48,得到真实的数值。
5、取栈顶元素的函数定义错误,使得程序无法进行,由于gettop函数定义错误,在optr中一直重复取#的循环运算,导致“error
Underflow”刷屏出现。
源代码;#include
#include
#include
#defineMAXSIZE100
#definetrue1
#definefalse0
typedefstruct{//定义堆栈数据类型
intstack[MAXSIZE];
inttop;
}SqStack;
typedefstruct{//定义堆栈数据类型
charstack[MAXSIZE];
inttop;
}sqstack;
voidInitStack(SqStack*s)
{//初始化栈,栈顶指针为0
s->top=0;
}
voidInitStack2(sqstack*s)
{//初始化栈,栈顶指针为0
s->top=0;
}
intPush1(SqStack*s,intx)
{//入栈
if(s->top>=MAXSIZE)
printf("ERROR,Overflow!
\n");
else
{
s->stack[s->top]=x;s->top++;
}
return1;}
intGettop1(SqStack*s,int*x)
//取栈顶元素
{
if(s->top==0)
{
printf("error,gettop1");
return0;}
else
{
*x=s->stack[s->top];
return1;}
}
intPop1(SqStack*s,int*x){//出栈
if(s->top==0)
printf("ERROR,pop1!
\n");
else
{
s->top--;
*x=s->stack[s->top];
}
return1;}
charPush2(sqstack*s,charx)
{//入栈
if(s->top==MAXSIZE+1)
printf("ERROR,push2!
\n");
else
{
s->stack[s->top]=x;
s->top++;
}
return1;
}
charGettop2(sqstack*s,char*ch){//取栈顶元素
if(s->top>0)
{*ch=s->stack[s->top-1];return*ch;}
else
return0;
}
charPop2(sqstack*s,char*x){//出栈
if(s->top==0)
printf("ERROR,pop2!
\n");else
s->top--;
*x=s->stack[s->top];
return1;}
charprocede(charc1,charc2)
{
inti=0,j=0;
charstr[7][7]={
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',0,
'>','>','>','>',0,'>','>',
'<','<','<','<','<',0,'=',};
switch(c1)
{
case'+':
i=0;break;
case'-':
i=1;break;
case'*':
i=2;break;
case'/':
i=3;break;
case'(':
i=4;break;
case')':
i=5;break;
case'#':
i=6;break;
}
switch(c2)
{
case'+':
j=0;break;
case'-':
j=1;break;
case'*':
j=2;break;
case'/':
j=3;break;
case'(':
j=4;break;
case')':
j=5;break;
case'#':
j=6;break;
}
return(str[i][j]);
}//返回优先级判断结果
intoperate(inta,charb,intc)
{
switch(b)
{case'+':
a=a+c;break;
case'-':
a=a-c;break;
case'*':
a=a*c;break;
case'/':
a=a/c;break;}
returna;
}
main()
{
sqstackOPTR;
SqStackOPND;
chartheta,c,x;
inta,b,m;
InitStack2(&OPTR);
Push2(&OPTR,'#');
InitStack(&OPND);
printf("请输入一个计算式,以#结束\n");
c=getchar();
{while(c!
='#'||OPTR.stack[OPTR.top-1]!
='#')
if(c>='0'&&c<='9')
{
m=c-48;
Push1(&OPND,m);
c=getchar();
}
else
{
switch(procede(OPTR.stack[OPTR.top-1],c))
{
case'<':
Push2(&OPTR,c);
c=getchar();
break;
case'=':
Pop2(&OPTR,&x);
c=getchar();
break;
case'>':
Pop2(&OPTR,&theta);//退栈并将运算结果入栈
Pop1(&OPND,&b);
Pop1(&OPND,&a);
Push1(&OPND,operate(a,theta,b));
break;
}
}
}
printf("结果:
%d\n",OPND.stack[OPND