C++简单的计算器设计
需求分析::
用你熟悉的一种可视化编程语言实现如下图所示的计算器。该计算器需要实现基础的数学运算,如加,减,乘,除。
程序执行的结果:
12*4.5=54
1.2 概要设计:
程序是用mfc制作,在进入mfc时选择基本对话框来建立工程,然后根据题目图形的需求,在工作区的Resourceview中的Dialog进行框架的设计,如上图所示的图形进行按钮的拖放,当按钮都拖放完毕后就进行按钮函数的设计
1.3 详细设计与编码:
程序清单已上传。
1.4 调试分析:
本程序的设计过程是根据学校所给的范例程序仿制而成,当将程序写进去后,在调试时出现的主要问题就是不能显示点击的数字和结果,在循环过程中,一定要注意所求的是第几项,然后根据分析算出所要循环的次数,这样程序才不会出错。
1.5 用户使用说明:
解压文件,打开Debug文件夹,然后双击打开Calculator.exe可执行文件,之后便可以运行了。在使用时只需用户用鼠标点击所要进行操作的按钮皆可。
1.6 设计心得:
由于初次接触mfc制作程序,难免在技术和信心方面有些不足,但是在老师和同学们的知道下,我最后还是完成了本次实验,这为我做好下一个实验打下了基础,它的成功给我增加了许多信心。让我能坚持完成下面的实验。
#include<iostream>
using namespace std;
class Caculate
{
private:
char *expression;//原表达式
char *suffix;//后缀式
char *operate;//操作符栈
int ex_length;//表达式的长度
int su_length;//后缀式的长度
int op_length;//操作符长度
int ex_size;//表达式空间大小
int su_size;//后缀式空间大小
int op_size;//操作栈空间大小
public:
Caculate();//构造函数
void input(Caculate &c);//输入
int judge(Caculate &c);//判断输入正确性
void change(Caculate &c);//转换为后缀式
void caculate(Caculate &c);//计算结果并输出
void su_push(Caculate &c,char x);//将x压入suffix
void op_push(Caculate &c,char x);//将x压入operate
void op_pop(Caculate &c);//删除operate栈顶元素
char op_gettop(Caculate &c);//获得operate栈顶元素
char su_gettop(Caculate &c);//获得suffix栈顶元素
};
//构造函数
Caculate::Caculate()
{
expression=(char*)malloc(5*sizeof(char));
suffix=(char*)malloc(5*sizeof(char));
operate=(char*)malloc(5*sizeof(char));
su_length=op_length=ex_length=0;
ex_size=su_size=op_size=5;
operate=NULL;
}//Caculate
//输入表达式
void Caculate::input(Caculate &c)
{
cout<<"请输入算式:"<<endl;
char x;
do
{
if(c.ex_length>=c.ex_size)
{
c.expression=(char*)realloc(c.expression,(c.ex_size+5)*sizeof(char));
c.ex_size+=5;
}//加长
x=getchar();
if(x=='=') break;//遇到回车跳出
*(c.expression+c.ex_length)=x;
++c.ex_length;
}while(1);
//最后加#
if(c.ex_length>=c.ex_size)
{
c.expression=(char*)realloc(c.expression,(c.ex_size+5)*sizeof(char));
c.ex_size+=5;
}//加长
*(c.expression+c.ex_length)='#';
c.ex_length++;
}//input
//判断是否正确:
int Caculate::judge(Caculate &c)
{
int f=1;
int i=0;//循环变量
if(*c.expression=='('||(*c.expression>='0'&&*(c.expression)<='9'))
f=1;
else f=0;
if(*(c.expression+c.ex_length-1)=')'||(*(c.expression+c.ex_length-1)>='0'&&*(c.expression+c.ex_length-1)<='9'))
f=1;
else f=0;
//头尾正确
if(f)
{
for(i=0;i<c.ex_length-2;i++)
{
switch (*(c.expression+i))
{
case '(':if(*(c.expression+i+1)!='(' && (*(c.expression+i+1)>'9'||*(c.expression+i+1)<'0'))
{f=0;break;}
case '+':if(*(c.expression+i+1)!='(' && (*(c.expression+i+1)>'9'||*(c.expression+i+1)<'0'))
{f=0;break;}
case '-':if(*(c.expression+i+1)!='(' && (*(c.expression+i+1)>'9'||*(c.expression+i+1)<'0'))
{f=0;break;}
case '*':if(*(c.expression+i+1)!='(' && (*(c.expression+i+1)>'9'||*(c.expression+i+1)<'0'))
{f=0;break;}
case '/':if(*(c.expression+i+1)!='(' && (*(c.expression+i+1)>'9'||*(c.expression+i+1)<'1'))
{f=0;break;}
}//switch
if(f==0) break;
}//for
}//if
//判断中间
if(f)
{
int k=0;
for(i=0;i<c.ex_length;i++)
{
if(*(c.expression+i)=='(')
k++;
if(*(c.expression+i)==')')
k--;
}
if(k!=0)
f=0;
}//判断括号匹配
return f;
}//judge
//求后缀式
void Caculate::change(Caculate &c)
{
int i=0;
for(i=0;i<c.ex_length;i++)
{
if(*(c.expression+i)>='0'&&*(c.expression+i)<='9')
c.su_push(c,*(c.expression+i));
else
switch(*(c.expression+i))
{
case '(':while(c.op_gettop(c)==')')
c.op_pop(c);
c.op_push(c,'(');
break;
case '*':while(c.op_gettop(c)=='*'||c.op_gettop(c)=='/'||c.op_gettop(c)==')')
{
if(c.op_gettop(c)!=')')
c.su_push(c,c.op_gettop(c));
c.op_pop(c);
}
c.op_push(c,'*');
break;
case '/':while(c.op_gettop(c)=='*'||c.op_gettop(c)=='/'||c.op_gettop(c)==')')
{
if(c.op_gettop(c)!=')')
c.su_push(c,c.op_gettop(c));
c.op_pop(c);
}
c.op_push(c,'/');
break;
case '+':while(c.op_gettop(c)=='*'||c.op_gettop(c)=='/'||c.op_gettop(c)==')'||c.op_gettop(c)=='+'||c.op_gettop(c)=='-')
{
if(c.op_gettop(c)!=')')
c.su_push(c,c.op_gettop(c));
c.op_pop(c);}
c.op_push(c,'+');
break;
case '-':while(c.op_gettop(c)=='*'||c.op_gettop(c)=='/'||c.op_gettop(c)==')'||c.op_gettop(c)=='+'||c.op_gettop(c)=='-')
{
if(c.op_gettop(c)!=')')
c.su_push(c,c.op_gettop(c));
c.op_pop(c);}
c.op_push(c,'-');
break;
case ')':while(c.op_gettop(c)!=NULL)
{
if(c.op_gettop(c)!=')'||c.op_gettop(c)!='(')
c.su_push(c,c.op_gettop(c));
c.op_pop(c);
}
c.op_push(c,')');
break;
case'#':while(c.op_gettop!=NULL)
{
if(c.op_gettop(c)!=')'||c.op_gettop(c)!='(')
c.su_push(c,c.op_gettop(c));
c.op_pop(c);
}
break;
}//switch
}//for
}//change
//计算
void Caculate::caculate(Caculate &c)
{
int i;
int f=1;
for(i=0;i<c.su_length;i++)
if(*(c.suffix+i)>='0'&&*(c.suffix+i)<='9')
*(c.suffix+i)=*(c.suffix+i)-48;//转换数据
for(i=2;c.su_length>1;i++)
{
switch(*(c.suffix+i))
{
case'*':*(c.suffix+i)=*(c.suffix+i-1) * *(c.suffix+i-2);
c.suffix=(c.suffix+i);
c.su_length=c.su_length-2;
i=2;
break;
case'+':*(c.suffix+i)=*(c.suffix+i-1) + *(c.suffix+i-2);
c.suffix=(c.suffix+i);
c.su_length=c.su_length-2;
i=2;
break;
case'-':*(c.suffix+i)=*(c.suffix+i-1) - *(c.suffix+i-2);
c.suffix=(c.suffix+i);
c.su_length=c.su_length-2;
i=2;
break;
case'/':if(*(c.suffix+i-2)==0)
{ f=0;//分母为零
break;
}
else
{*(c.suffix+i)=*(c.suffix+i-1) / *(c.suffix+i-2);
c.suffix=(c.suffix+i);
c.su_length=c.su_length-2;
i=2;
break;}
}//switch
if(f==0)
{cout<<"错误,分母为零!"<<endl;
break;
}
}//for
if(f)
cout<<"结果是:"<<*(c.suffix)<<endl;
}//caculate
//弹出操作符栈
void Caculate::op_pop(Caculate &c)
{
c.op_length--;
}
//压入操作符栈
void Caculate::op_push(Caculate &c,char x)
{
if(c.op_length>=c.op_size)
{
c.operate=(char*)realloc(c.operate,(c.op_size+5)*sizeof(char));
c.op_size+=5;
}
c.op_length++;
*(c.operate+c.op_length-1)=x;
}
//压入后缀栈
void Caculate::su_push(Caculate &c,char x)
{
if(c.su_length>=c.su_size)
{
c.suffix=(char*)realloc(c.suffix,(c.su_size+5)*sizeof(char));
c.su_size+=5;
原文请找腾讯752018766辣,文-论'文.网http://www.751com.cn
char Caculate::su_gettop(Caculate &c)
{
return *(c.suffix+c.su_length-1);
}
void main()
{
Caculate ca;
ca.input(ca);
if(ca.judge(ca))
{
ca.change(ca);
for(int i=0;i<3;i++)
cout<<ca.su_gettop(ca);
}
else
cout<<"输入有误";1861