#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; }
浙公网安备 33010602011771号