表达式四则运算。

实现方法一:用递归来实现。

 

CString CCalculatorDlg::calc(CString str)
{

    CString str1,str2,str3,str4;
    str.Replace(
"+-","-");
    str.Replace(
"--","+");
    
char ch = opera(str);
    str4 
= str;
    
switch( ch )
    
{

    
case '(':
        str1 
= str.Left(str.Find('('));
        str2 
= str.Right(str.GetLength() - str.Find('('- 1);
        str2 
= str2.Left(str2.Find(')'));
        
if (str2.Find('('!= -1)
        
{
            str1 
= str1+'(';
            str2.Delete(str2.Find(
'('), 1);
        }

        str3 
= str.Right(str.GetLength() - str.Find(')'- 1);
        
return calc(str1 + calc(str2) + str3);
        
break;

    
case '+':
        str4.Delete(str.Find(
"+"), 1);
        
if ((opera(str4) == '1'|| (opera(str4) == '-'))
        
{
            str1 
= str.Left(str.Find('+'));
            
float a = atof(str1);
            str3 
= str.Right(str.GetLength() - str.Find('+'- 1);
            
float b = atof(str3);
            
float c = a+b;
            str2 
= "";
            str2.Format(
"%f",c);
            
return str2;
        }

        
else
        
{
            str1 
= str.Left(str.Find('+'));
            str2 
= str.Right(str.GetLength() - str.Find('+'- 1);
            
return calc(calc(str1) + '+' + calc(str2));
        }

        
break;

    
case '-':
        str4.Delete(str.Find(
"-"), 1);
        
if (opera(str4) == '1')
        
{
            str1 
= str.Left(str.Find('-'));
            
float a = atof(str1);
            str3 
= str.Right(str.GetLength() - str.Find('-'- 1);
            
float b = atof(str3);
            
float c = a-b;
            str2 
= "";
            str2.Format(
"%f",c);
            
return str2;
        }
        
        
else if (opera(str4) == '*')
        
{
            str1 
= str4.Left(str4.Find('*'));
            
float a = atof(str1);
            str3 
= str4.Right(str4.GetLength() - str4.Find('*'- 1);
            
float b = atof(str3);
            
float c = a*b;
            str2 
= "";
            str2.Format(
"%f",c);
            
return "-" + str2;
        }

        
else if (opera(str4) == '/')
        
{
            str1 
= str.Left(str4.Find('/'));
            
float a = atof(str1);
            str3 
= str.Right(str4.GetLength() - str4.Find('/'- 1);
            
float b = atof(str3);
            
float c = a/b;
            str2 
= "";
            str2.Format(
"%f",c);
            
return "-" + str2;
        }

        
else
        
{
            str1 
= str.Left(str.Find('-'));
            str2 
= str.Right(str.GetLength() - str.Find('-'- 1);
            
if (str1 != "")
            
{
                
return calc(calc(str1) + '-' + calc(str2));
            }

            
else
            
{
                
return calc('-' + calc(str2));
            }

        }

        
break;

    
case '*':
        str4.Delete(str.Find(
"*"), 1);
        
if (opera(str4) == '1')
        
{
            str1 
= str.Left(str.Find('*'));
            
float a = atof(str1);
            str3 
= str.Right(str.GetLength() - str.Find('*'- 1);
            
float b = atof(str3);
            
float c = a*b;
            str2 
= "";
            str2.Format(
"%f",c);
            
return str2;
        }


        
else
        
{
            str1 
= str.Left(str.Find('*'));
            str2 
= str.Right(str.GetLength() - str.Find('*'- 1);
            
return calc(calc(str1) + '*' + calc(str2));
        }

        
break;

    
case '/':
        str4.Delete(str.Find(
"/"), 1);
        
if (opera(str4) == '1')
        
{
            str1 
= str.Left(str.Find('/'));
            
float a = atof(str1);
            str3 
= str.Right(str.GetLength() - str.Find('/'- 1);
            
float b = atof(str3);
            
float c = a/b;
            str2 
= "";
            str2.Format(
"%f",c);
            
return str2;
        }

        
else
        
{
            str1 
= str.Left(str.Find('/'));
            str2 
= str.Right(str.GetLength() - str.Find('/'- 1);
            
return calc(calc(str1) + '/' + calc(str2));
        }

        
break;


    
default:
        
return str;
    }

}


char CCalculatorDlg::opera(CString str)
{
    
if (str.Find("("!= -1)
    
{
        
return '(';
    }

    
if (str.Find("+"!= -1)
    
{
        
return '+';
    }
 
    
if (str.Find("-"!= -1)
    
{
        
return '-';
    }


    
if (str.Find("*"!= -1)
    
{
        
return '*';
    }

    
if (str.Find("/"!= -1)
    
{
        
return '/';
    }


    
return '1';//字符串中不包含以上几种符号。
}

 

 

实现方法二:用堆栈来实现。

此程序只能实现1-9的四则运算。在表达式最后加一个‘#’表示表达式结束进行运算。

#include<stdio.h> 
#include
<stdlib.h> 
#define stack_init_size 100 
#define increment 10 

typedef 
struct

    
char *base
    
char *top; 
    
int stacksize; 
}
sqstack; 

typedef 
struct

    
int *base
    
int *top; 
    
int stacksize; 
}
sqstackint; 

void initstack(sqstack &s)/*构造char空栈*/ 

    s.
base=(char *)malloc(stack_init_size*sizeof(char)); 
    
if(!s.base) printf("申请栈失败!!! "); 
    s.top
=s.base
    s.stacksize
=stack_init_size; 
}
 

void initstackint(sqstackint &s) /*构造int空栈*/ 
{
    s.
base=(int *)malloc(stack_init_size*sizeof(int)); 
    
if(!s.base) printf("申请栈失败!!! "); 
    s.top
=s.base
    s.stacksize
=stack_init_size; 
}
 

char gettop(sqstack s) /*取char栈顶元素*/ 
{
    
if(s.top==s.base) printf("错误!!! "); 
    s.top
=s.top-1
    
return(*(s.top)); 
}
 
int gettopint(sqstackint s)/*取int栈顶元素*/ 

    
if(s.top==s.base) printf("错误!!! "); 
    s.top
=s.top-1
    
return(*(s.top)); 
}
 

void push(sqstack &s,char e)/*将e压入栈*/ 

    
if(s.top-s.base>=s.stacksize)
        s.
base=(char *)realloc(s.base,(s.stacksize+increment)*sizeof(char)); 
        
if(!s.base) printf("额外申请空间失败!!! "); 
        s.top
=s.base+s.stacksize; 
        s.stacksize
+=increment; 
    }
 
    
*(s.top)=e; 
    s.top
=s.top+1
}
 
void pushint(sqstackint &s,int e) /*将e压入栈*/ 
{
    
if(s.top-s.base>=s.stacksize)
        s.
base=(int *)realloc(s.base,(s.stacksize+increment)*sizeof(int)); 
        
if(!s.base) printf("额外申请空间失败!!! "); 
        s.top
=s.base+s.stacksize; 
        s.stacksize
+=increment; 
    }
 
    
*(s.top)=e; 
    s.top
=s.top+1
}
 

void pop(sqstack &s,char &e)/*将栈顶元素出栈*/ 
{
    
if(s.top==s.base) printf("错误!!! "); 
    s.top
=s.top-1
    e
=*(s.top); 
}
 

void popint(sqstackint &s,int &e)/*将栈顶元素出栈*/ 
{
    
if(s.top==s.base) printf("错误!!! "); 
    s.top
=s.top-1
    e
=*(s.top); 
}
 

int compare(char c) /*比较c是否为数字,是则返回1,否则返回0*/ 
{
    
if((c!='+')&&(c!='-')&&(c!='*')&&(c!='/')&&(c!='(')&&(c!=')')&&(c!='#')) 
        
return 1
    
return 0
}
 

char precede(char c1,char c2)/*比较算符的优先级*/ 
{
    
if(c1=='+')
    

        
switch(c2)
        

        
case'+':return('>');break
        
case'-':return('>');break
        
case'*':return('<');break
        
case'/':return('<');break
        
case'(':return('<');break
        
case')':return('>');break
        
case'#':return('>');break
        
default:printf("比较出错! ");break
        }
 
    }
 
    
else if(c1=='-')
    

        
switch(c2)
        

        
case'+':return('>');break
        
case'-':return('>');break
        
case'*':return('<');break
        
case'/':return('<');break
        
case'(':return('<');break
        
case')':return('>');break
        
case'#':return('>');break
        
default:printf("比较出错! ");break
        }
 
    }
 
    
else if(c1=='*')
    

        
switch(c2)
        

        
case'+':return('>');break
        
case'-':return('>');break
        
case'*':return('>');break
        
case'/':return('>');break
        
case'(':return('<');break
        
case')':return('>');break
        
case'#':return('>');break
        
default:printf("比较出错! ");break
        }
 
    }
 
    
else if(c1=='/')
    

        
switch(c2)
        

        
case'+':return('>');break
        
case'-':return('>');break
        
case'*':return('>');break
        
case'/':return('>');break
        
case'(':return('<');break
        
case')':return('>');break
        
case'#':return('>');break
        
default:printf("比较出错! ");break
        }
 
    }
 
    
else if(c1=='(')
    

        
switch(c2)
        

        
case'+':return('<');break
        
case'-':return('<');break
        
case'*':return('<');break
        
case'/':return('<');break
        
case'(':return('<');break
        
case')':return('=');break
        
default:printf("比较出错! ");break
        }
 
    }
 
    
else if(c1==')')
    

        
switch(c2)
        

        
case'+':return('>');break
        
case'-':return('>');break
        
case'*':return('>');break
        
case'/':return('>');break
        
case')':return('>');break
        
case'#':return('>');break
        
default:printf("比较出错! ");break
        }
 
    }
 
    
else if(c1=='#')
    

        
switch(c2)
        

        
case'+':return('<');break
        
case'-':return('<');break
        
case'*':return('<');break
        
case'/':return('<');break
        
case'(':return('<');break
        
case'#':return('=');break
        
default:printf("比较出错! ");break
        }
 
    }
 
    
else return('0'); 
}
 
int operate(int c1,char theta,int c2)/*进行二元运算*/ 
{
    
if(theta=='+')
    

        
return(c1+c2); 
    }
 
    
if(theta=='-')
    

        
return(c1-c2); 
    }
 
    
if(theta=='*')
    

        
return(c1*c2); 
    }
 
    
if(theta=='/')
    

        
return(c1/c2); 
    }
 
    
return(0); 
}
 
/*此实验仅能实现[-9~9]之间数据的运算*/ 
void main()

    
char c,theta,x; 
    
int m,c1,c2,y; 
    printf(
"此程序仅能实现[-9~9]之间数据的运算,#号为结束运算的标志。 "); 
    printf(
"请输入计算表达式: "); 
    sqstack optr; 
    sqstackint opnd; 
    initstack(optr); 
    push(optr,
'#'); 
    initstackint(opnd); 
    
while(1)
    

        c
=getchar(); 
        
while(c!='#'||gettop(optr)!='#')
        

            
if(compare(c)){m=c-'0';pushint(opnd,m);c=getchar();} 
            
else 
                
switch(precede(gettop(optr),c))
                

                
case'<'
                    push(optr,c);c
=getchar();break
                
case'='
                    pop(optr,x);c
=getchar();break
                
case'>'
                    pop(optr,theta);popint(opnd,c2); 
                    popint(opnd,c1); 
                    pushint(opnd,operate(c1,theta,c2));
break
                }
 
        }
 
        y
=gettopint(opnd); 
        printf(
"运算结果为:%d ",y);getchar(); 
    }
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值