#include<stdio.h> 
char s[1000], *p;
int main(){
    bool fs(void);
    void ps(void); 
    double ff(void);  
    while( fs() ){
        ps();
        p = s;
        printf("%s", s);
        printf("%lf\n",ff());
    }
    return 0;
}
bool fs(void){
    int n = 0;
    while( 1 ){
        scanf("%c",&s[n++]);
        if(s[n-1] == ' '||s[n-1] == '\n')
            n--;
        else if(s[n-1] == '=')
            break;
        else if(0)//yuliu
            return 0;
    } 
    s[n] = 0;
    return 1;
}
void ps(void){
    int strlen(char *);
    int i,x=0,y=0,l;
    l = strlen(s);
    for(i = 0; i < l; i++){
        if(s[i] == '(') x++;
        else if(s[i] == ')') y++;
    }
    if(x > y){
        for(int z = x-y; z > 0; z--){
            s[l-1] = ')';
            l++;
        }
        s[l-1] = '=';
        s[l] = 0;
    }
    else if(x < y){
        int z = y-x,t = l-z;
        for(l = l+z; l >= z; l--,t++){
            s[l]=s[t];
        }
        for(;z-->0;){
            s[z] = '(';
        }
    }
    return;
} 
double ff(void){
    double fr(void);
    char fc(void);
    double sum = 0.0;
    double r_now, r_left;
    char c_now, c_left = '+';
    if(*p == '('){
        p++;
        r_left = ff();
    }
    else {
        r_left = fr();
    }
    while( 1 ){
        c_now = fc();// 
        if(c_now == ')'||c_now == '='){
            if(c_left == '+'){
                sum += r_left;
            }
            else{
                sum -= r_left;
            }
            break;
        } 
        if(*p == '('){
            p++;
            r_now = ff();
        }
        else{
            r_now = fr();
        }
        if(c_now == '+'||c_now == '-'){
            if(c_left == '+'){
                sum += r_left ;
            }
            else{
                sum -= r_left ;
            }
            r_left = r_now ;
            c_left = c_now ;
        }
        else{
            if(c_now == '*'){
                r_left *= r_now ;
            }
            else{
                r_left /= r_now ;
            }
        }
    }
    return sum;
}
double fr(void){
    double  pow(double, int) ;
    if(*p == '-'){
        return 0.0 ;
    }
    double sum = 0.0 ;
    int able=10;
    if(*p == '0'){
        able = 8;
        p++;
    }
    if(*p == 'x'){
        able *= 2;
        p++;
    }
    while(*p >= 0x30  &&  *p <= 0x39){
        sum = able*sum + *p-0x30 ;
        p++ ;
    }
    if(*p == '^'){
        p++;
        return pow(sum,(int)fr());
    }
    if(*p == '.'){
        double temp = 1.0 ;
        p++ ;
        while(*p >= 0x30  &&  *p <= 0x39){
            sum += (temp /= 10.0)*(*p-0x30) ;
            p++ ;
        }
    }
    if(*p == 'e'||*p == 'E'){
        p++ ;
        sum *= pow(10, (int)fr()) ;
    }
    return sum ;
}
char fc(void){
    p++ ;
    return *(p - 1) ;
}
int strlen(char *t){
    int i;
    for(i = 0; t[i]; i++);
    return i;
}
double pow(double x, int y){
    if(y == 1) return x ;
    double z = pow(x,y/2);
    if(y&1) return x*z*z;
    else return z*z;
}

 

 

 

 

posted on 2013-01-02 00:09  sut_zhuyue  阅读(870)  评论(0)    收藏  举报