毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 课程设计 >> 正文

C++简单的计算器设计

更新时间:2011-5-28:  来源:毕业论文

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.youerw.com 
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

C++简单的计算器设计下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。