哇,它太长了.建议做成后置表达式并且提用栈, 以前我做过一个.功能挺强的:有逻辑,算术,比较及串操作

解决方案 »

  1.   

    你的程序确实太长太长了.
    yong
    #include <math.h>
    #include <algorithm>
    #include <iostream.h>
    #include <ctype.h>using namespace std;
    struct symbol
    {
    int m_n;
    char m_c;
    symbol(char c):m_c(c),m_n(0){}
    bool operator() (char s)
    {
    switch(s)
    {
    case '(' : ++m_n;break;
    case ')' : --m_n;break;
    default : break;
    }
    if(m_n<0) throw 0;
    return m_n==0 && s==m_c;
    }
    };const char* match_fun(const char*f,const char*l,const char*name)
    {
    int n = mismatch(f,l,name).first - f;
    if( strlen(name) != n )
    return 0;
    return f[n]=='(' ? f+n+1 : 0;
    }double interpret(const char *first,const char *last)
    {
    const char *mid = 0;
    if(first==last)
    return 0; //下面是计算 + - * / ^ 运算符
    if( last != (mid=find_if( first,last,symbol('+') )) )
    return interpret(first,mid)+interpret(mid+1,last); if( last != (mid=find_if( first,last,symbol('-') )) )
    return interpret(first,mid)-interpret(mid+1,last); if( last != (mid=find_if( first,last,symbol('*') )) )
    return interpret(first,mid)*interpret(mid+1,last); if( last != (mid=find_if( first,last,symbol('/') )) )
    return interpret(first,mid)/interpret(mid+1,last); if( last != (mid=find_if( first,last,symbol('^') )) )
    return pow(interpret(first,mid),interpret(mid+1,last)); //是数字
    if( isdigit(*first) )
    {
    if( count_if(first,last,isdigit) != last-first )
    throw 0; //
    return atof(first);
    } if( *(--last) != ')' )
    throw 0; //下面计算函数
    if( 0 != (mid=match_fun(first,last,"sin")) )
    return sin( interpret(mid,last) );
    if( 0 != (mid=match_fun(first,last,"cos")) )
    return cos( interpret(mid,last) );
    if( 0 != (mid=match_fun(first,last,"sqrt")) )
    return sqrt( interpret(mid,last) ); //……添加你所需要处理的函数,非常遗憾的是不能处理2员函数如pow等 if( *first != '(' )
    throw 0; return interpret(first+1,last);
    }double interpret(const char* str)
    {
    try{
    return interpret( str,str+strlen(str) );
    }
    catch(...){
    return 0;
    }
    }void main()
    {
    char *str = "((3+2)*5-6*(1+1))/(8-3)";
    cout<<interpret(str)<<endl;
    }