模拟计算器(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下的一个模拟计算器

  • 2009-12-12 23:41
  • 41KB
  • 下载

MFC计算器 用vector实现和计算逆波兰表达式

我用MFC做的计算器是直接用一个General

MFC简易计算器实现

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

MFC实现一个简单的计算器

在VS2013环境下用MFC实现一个简单的计算器,主要是为了熟悉MFC编辑框的使用和消息传递机制。 实现步骤: 1、在工具箱托两个Edit control,一个显示可见,另一个不可见(用于保存操作数)...

MFC 实现 加减乘除,括号,乘方的 计算器

【精华】MFC 实现  可加减乘除,括号,乘方 以及进制转换的 计算器 一、带括号的四则运算以及乘方运算 二、进制转化 提供过程以及源码。

MFC版哈希值计算器的实现(二)

1 开始相关函数 void CHashToolDlg::BeginComputeHashInfo(CString filePath) { CString *tmp = new CString();...

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

设计模式是重s

MFC版哈希值计算器的实现(一)

打算学习下C++方面的编程,先从MFC下手。 http://download.csdn.net/user/fox4it 界面实现 主要控件包括 Tab Control, List Con...

MFC使用双栈实现简单计算器

//2013.5.24 //数据结构,中石大,cakeman //使用操作数栈和操作符栈,计算表达式的值 //运行界面 源文件下载地址:http://download.csdn.net/det...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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