c语言版计算器实验报告_c简单计算器实验报告
c语言版计算器实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c简单计算器实验报告”。
计算器实验报告
班级: 07计本(1)班
姓名: 王林
学号: 20706031047
指导老师: 韩静
一、需求分析
(1)制作一个计算器界面工程,有数字运算符等键,输入表达式后,按等号键输入结
束,并显示出正确的结果。
(2)程序能根据运算符的高低进行运算
(3)可以输入括号
二、设计思路
(1)用工程建立一个字符串的类结构,并用编辑框输入相应的数字和字符,并且
输入的字符用字符串逐个接受,当输入为’=’的时候,用‘#‘做最后一个输入。
(2)开始对所输入的字符串进行运算和操作,显示在工程中的编辑框内。
(3)如果结束则关闭,如果再次进行运算则进行清零。
三、主程序段
char Precede(char a,char b)//判断优先级的函数 {
switch(a)
{
case'+':{if(b=='*'||b=='/'||b=='(')return('
else return('>');
}
case'-':{if(b=='*'||b=='/'||b=='(')return('
else return('>');
}
case'*':{if(b=='(')return('
else return('>');
}
case'/':{if(b=='(')return('
else return('>');
}
case'(':{if(b==')')return('=');
else if(b=='#')return('0');
else return('
}
case')':{if(b=='(')return('0');
else return('>');
}
case'#':{if(b==')')return('0');
else if(b=='#')return('=');
else return('
}
}
}
float Operate(float a,char theta,float b)//计算两个数的结果的函数 {
float z;
switch(theta){
case '+':z=a+b;break;
case '-':z=a-b;break;
case '*':z=a*b;break;
case '/':z=a/b;break;
}
return(z);
}
float Shuhe(SqStack1 &OP,int k,int j)
{
int i,e,n=k;
float sum=0,fe;
while(j!=0)
{
Pop1(OP,e);
fe=float(e);
for(i=1;i
fe=fe/10;
sum=sum+fe;
j--;
}
while(k!=0)
{
Pop1(OP,e);
for(i=0;i
e=e*10;
sum=sum+e;
k--;
}
return(sum);
}
void CMyDlg::OnButton12()
{
UpdateData(TRUE);
m_=m_+'#';
SqStack OPTR;
SqStack1 OP;//输入的字符转化为数字的函数//字符型栈的定义//整型型栈的定义
SqStack2 OPND;//浮点型栈的定义int i=0,flag=0,k=0,tag=0,j=0;
float sum,a,b;
char c,x,theta;
InitStack(OPTR);Push(OPTR,'#');
InitStack2(OPND);InitStack1(OP);
c=m_[i++];
while(c!='#'||GetTop(OPTR)!='#')
{
if(c=='.')
{
tag=1;c=m_[i++];
}
else if(c>='0'&&c
{
Push1(OP,int(c)-48);
c=m_[i++];
if(tag==0)k++;
else j++;
flag=1;
}
else
{
if(flag==1)
{
sum=Shuhe(OP,k,j);
Push2(OPND,sum);
OP.top=OP.base;
k=0;flag=0;j=0;tag=0;
}
switch(Precede(GetTop(OPTR),c))
{
case'
{
Push(OPTR,c);c=m_[i++];
break;}
case'='://脱括号并接收下一个字符
{Pop(OPTR,x);c=m_[i++];
break;}
case'>'://退栈并将运算结果入栈
{Pop(OPTR,theta);
Pop2(OPND,b);Pop2(OPND,a);
Push2(OPND,Operate(a,theta,b));
break;}
}
}
}
sum=GetTop2(OPND);
m_.Format(“%f”,sum);
UpdateData(FALSE);
}
四、调试分析
(1)当输入“1+2-3=”时,显示结果为“0.000000”,结果正确,置清零。
(2)当输入“2.96*1.85/6.741=”时,显示结果为“0.812342”,结果正确,置清零。
(3)当输入“2.69-19.145=”时,显示结果为“-16.455000”,结果正确,置清零。
(4)当输入“5-7*(5+1.8)=”时,显示结果为“-42.600002”,结果正确,置清零。
(5)当输入“2-/65=”时,显示结果为“1.969231”,结果错误,置清零。
(6)当输入“-6+9=”时,显示结果为“-107374176.000000”,结果错误,置清零。
(7)当输入“0-6+9=”时,显示结果为“3.000000”,结果正确,置清零。
(8)当输入“(2+3)*5-8=”时,显示结果为“17.000000”,结果正确,置清零。
(9)当输入“6*(-3+1)=”时,显示结果为“12.000000”,结果错误,置清零。
(10)当输入“6*(0-3+1)=”时,显示结果为“-12.000000”,结果正确,置清零。
(11)当输入“6*(1-3)=”时,显示结果为“-12.000000”,结果正确,结束。
调试说明以及分析:
1、当输入为正确的格式时,能算出正确的结果,其中包括:小数、整数以及个位以上的数字,且运算符包括:加、减、乘、除运算,还有就是可以加括号等。
2、当输入为错误的格式是,显示的是错误的结果,如(5)中的运算结果就是错误的。
3、若某个数字是负数,如果直接输入,结果是错误的,但如果变为零减去该数字的绝对值的话或者把两数的顺序更改一下,显示的是正确的结果,如
(6)、(7)、(9)、(10)、(11)做的结果。
4、有时候会出现一些不精确的显示结果,如(4)中显示多的是0.000002,这是由于在C语言的定义时,系统所产生的结果,与算法无关。
2008.12.25