模拟计算器(MFC)实现

原创 2006年05月31日 13:17:00

忙了一天终于搞定了。

 

 

 

 

以下为算法类封装

 

// calDlg.cpp : implementation file
//
//author: baker
//email:baker1203@sina.com
//course designing for data structures and program design in c++
//time:16/5/2006
/**//*
                         a simulant calculator
description: requiring design a simulant calculator ,which could take operations such as +,-,*,/ ,( ),or functon SQR ,ABS
condition:inputted expression can limit into int type.therefore ,you must check the expression for exactness.if the errors
take place ,the program would give an alarm.


*/


class compute
...{
public:
 
void init(string &);
 
void error(int);
 
void cal(string &);
    
bool is_optr(char);
 
double operat(double,char,double);
 
char precede(char,char);
 
char* get_value(string);

private:
 CString str;
 
char value[50];

 
}
;
void  compute::init(string& s)     //³õʼ»¯ÊäÈë±í´ïʽ. 
  ...{
  
  s
+="#";                      //SÒÔ#½áÊø 
  }
 
 

void compute::error(int tag)    //±¨´íº¯Êý 
...
 
     
switch(tag)
     
...{
                
case 1:
        str
="ÊäÈë´íÎóµÄ×Ö·û£¡ÇëÖØÐÂÊäÈë";
    
                     
break;
                
case 2:
                     str
="ÊäÈë´íÎóµÄ²Ù×÷Êý£¡ÇëÖØÐÂÊäÈ룡";
     
                     
break;

                     
     }

  strcpy(value,(
char *)(const char*)str);

   
     
}
  
    
bool compute::is_optr(char c)     //¼ì²éÊäÈëÊÇ·ñΪ ÔËËã·û 
  ...{  
 
  
string   optr_string("+-*/()AS#");   
  
for(int   i=0;i<optr_string.size();i++)   
  
if(c==optr_string[i])   
  
return   true;   
  
return   false;   
  }
   
    
char compute:: precede(char   op1,   char   op2)   
  
...{   
  
string   tab[9];   
  tab[
0]=">><<<><<>";   
  tab[
1]=">><<<><<>";   
  tab[
2]=">>>><><<>";   
  tab[
3]=">>>><><<>";   
  tab[
4]="<<<<<=<<E";   
  tab[
5]=">>>>E>>>>";   
  tab[
6]=">>>><>>>>";
  tab[
7]=">>>><>>>>"
  tab[
8]="<<<<<E<<=";
  
string optr_string("+-*/()AS#");   
    
  
int op1_loc,op2_loc;   
    
  
for(op1_loc=0;op1_loc<optr_string.size();op1_loc++)   
        
if(optr_string[op1_loc]==op1)break;   
  
for(op2_loc=0;op2_loc<optr_string.size();op2_loc++)
        
if(optr_string[op2_loc]==op2)break;   
    
  
return   tab[op1_loc][op2_loc];   
  }
   
    
double compute::operat(double x,char op,double y)   
  
...{   
  
switch(op)  
   
...{   
  
case   '+':   return   x+y;   break;   
  
case   '-':   return   x-y;   break;   
  
case   '*':   return   x*y;   break;   
  
case   '/':   return   x/y;   break;  
  
case   'A':   return  fabs(y);break;
  
case   'S':   return  sqrt(y);break
  }
   
  
return   -1;   
  }
   
    
    
    
    
    
void   compute::cal(string&   s)   
  
...{   
  stack
<char>optr;   
  optr.push(
'#');   
  stack
<double>opnd;  
  
  s
=s+"#";
    
  
char   c=s[0];
  s.erase(
0,1);   
    
  
while(c!='#'||optr.top()!='#')   
  
...{   
  
if(!is_optr(c)) 
    
...{  
      
if(c>='0'&&c<='9')
      
...
      
string   num;   
    
      num.insert(num.begin(),c);   
      
int loc=0;   
      
while(!is_optr(s[loc]))   
      loc
++;   
    
      
string num2(s,0,loc);   
      num
+=num2;   
      s.erase(
0,loc);   
    
     
double   x=atof(num.c_str());   
     opnd.push(x);   
     c
=s[0];   
     s.erase(
0,1);
     }

     
else ...{ error(2); return; }   
   }
   
  
else  
  
...{   
       
switch(precede(optr.top(),c))  
        
...{   
    
case   '<':   optr.push(c);   c=s[0];   s.erase(0,1);    break;   
    
case   '=':   optr.pop();    c=s[0];    s.erase(0,1);   break;   
    
case   '>':   
           
char   op;   
           op
=optr.top();  
           optr.pop();   
           
double   a,b;   
           a
=opnd.top();   
           opnd.pop();   
          
if(op!='S'&&op!='A')
          
...{
           b
=opnd.top();   
           opnd.pop();
           }
   
    
           
double   res;   
           res
=operat(b,op,a);   
           opnd.push(res);   
           
break;  
     
case  'E':
           error(
1);
     
return ;
           
        }
   
   }
   
  }
   
    

  sprintf(value,  
"%f", opnd.top()); 
}
   
    
char*  compute::get_value(string va)
...{
   
    cal(va);  
 
 
return value;
    loc
=0;
}

mfc基于对话框计算器程序

计算器程序有一个难点便是用户不同的使用习惯,这也是我们开始写程序之前需要想清楚的。 举个例子: 4+3-1=?...
  • qq_36009116
  • qq_36009116
  • 2016年12月01日 03:46
  • 6165

VS2012中使用MFC制作简单的计算器

用MFC来制作一个简单的计算器,来加深对MFC学习的理解,这个计算器是建立在对话框的基础上,下面来简单介绍下如何制作属于你自己的计算器 1.首先,点击VS2012,启动VS软件,然后建立如下图所示的...
  • shuimanting520
  • shuimanting520
  • 2016年04月29日 00:07
  • 5310

小程序之计算器 【C++ STL栈实现】 + 【C 数组模拟栈实现】 【适用VC, DEV, codeblack】

自己写的小程序,记录一下:     #include #include #include #include #include using namespace std; int in = 0,...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年06月13日 21:19
  • 1479

MFC简单计算器

由于要接触MFC这个神物,先做个计算器练手,本以为有c#的底子做起来应该不算难,结果两天啊…… 正文: 1.建立mfc工程 选择mfc应用程序,下一步中选择“基于对话框” 2.拖控件,这个都会...
  • zhou_yujia
  • zhou_yujia
  • 2016年04月20日 11:17
  • 1509

【基于VS2010的MFC编程】四则运算计算器

平台/工具:VS2010 目的:利用VS2010平台创建一个MFC工程,实现四则运算计算器的程序编写和界面设计 项目分析:实现 “+”“-”“”“/” 四则运算,需要几个要素:运算符“+”“-”“...
  • gfy571127
  • gfy571127
  • 2015年05月12日 10:41
  • 4518

简单工厂模式——MFC计算器实现(连续操作)

设计模式是重s
  • greenapple_shan
  • greenapple_shan
  • 2014年08月10日 11:01
  • 1558

视频教程:计算器制作--MFC

计算器制作MFC   最近,很多同学都问我系统自带的计算器用C++怎么写,要求用MFC做,我现在就给大家制作个简单的计算器。严格的说,我并不是MFC工程,而是Windows API编程,而不是用M...
  • gemgin
  • gemgin
  • 2013年06月13日 14:28
  • 1820

MFC简易计算器实现

因为接触MFC没有多长时间,所以需要写一些小程序来熟悉基本操作,这次写的是一个简易计算器。 外观: 程序下载链接: MFC简易计算器 写作思路: 这里感谢 逆风微光 博主的博文,...
  • King_HAW
  • King_HAW
  • 2017年02月07日 12:43
  • 408

MFC 编写计算器功能实现

               呵呵,这是我自己写的一个小程序!                        共享一下,分享一下乐趣!!!                可惜我不会上传文件!!!!...
  • wanilyfe
  • wanilyfe
  • 2008年12月08日 21:20
  • 268

MFC一个简单的计算器程序

1,简介 某个晚上帮人做的一个MFC课程设计的作业。大概花了两三个小时。 效果: 就和平常使用的计算器用法差不多。 2,源码下载 MFC一个简单的计算器程序源码 3,...
  • dpsying
  • dpsying
  • 2014年02月10日 20:54
  • 47040
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模拟计算器(MFC)实现
举报原因:
原因补充:

(最多只允许输入30个字)