这个我前几天才搞过,可以处理+-*/()和整数,不支持小数 #include #include #include char* next; double opd[1000]; int opt; double *popd = opd; #define PUSH(n) { *popd++ = n; } #define POP() (*--popd) #define TOP() (*(popd-1)) #define EMPTY() (popd == opd) #define SIZE() (popd - opd) void fail(char* s) { printf("match '%s' failed near '%c'.\n", s, *--next); exit(0); } #define lbr() { if(*next++ == '(') ; else fail("("); } #define rbr() { if(*next++ == ')') ; else fail(")"); } void term(); void lv1(); void lv2(); void cal(char); void expr() { term(); lv1(); } void term() { double num = 0; if(isdigit(*next)) { do { num = num * 10 + (*next - '0'); } while(isdigit(*++next)); /*printf("%g", num);*/ PUSH(num); } else if(*next == '(') { lbr(); expr(); rbr(); } else { fail("term"); } } void lv1() { while(1) { char c = *next; if(c == '+' || c == '-') { ++next; lv2(); /*putchar(c);*/ ++opt; cal(c); } else if(*next == '*' || *next == '/') { lv2(); } else { break; } } } void lv2() { while(1) { char c = *next; if(c == '*' || c == '/') { ++next; term(); /*putchar(c);*/ ++opt; cal(c); } else if(isdigit(*next)) { term(); } else { break; } } } double eval(char* s) { next = s; expr(); if(*next || opt != 0) { puts("invalid expression."); exit(0); } return TOP(); } void cal(char c) { double lhs, rhs, r; if(SIZE() > 1) { rhs = POP(); lhs = POP(); switch(c) { case '+': r = lhs + rhs; break; case '-': r = lhs - rhs; break; case '*': r = lhs * rhs; break; case '/': r = lhs / rhs; break; } PUSH(r); --opt; } } int main() { printf("%g\n", eval("(20+2)*(6/2)")); getchar(); return 0; } 第二个太简单了 #include #include int main() { char a[] = "Hello, World!"; char* p = a; for(; *p; ++p) if(isalpha(*p) && islower(*p)) *p = toupper(*p); puts(a); getchar(); }
作业帮用户
2016-11-29
举报