#include #include #include #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 #define MAXLINE 1000 int getop(char []); int getsop(char [], char []); void push(double); double pop(void); int getch(void); void ungetch(int); int getline(char *, int); int sp = 0; double val[MAXVAL]; int buf[BUFSIZE]; int bufp = 0; double p; float vars[26]; int isnum(char *s) { if (*s == '+' || *s == '-' || *s == '.') s++; if (isdigit(*s)) return 1; return 0; } int main(int argc, char *argv[]) { int type; double op2; char s[MAXOP]; char line[MAXLINE] = "\0"; while (--argc > 0) { argv++; if (isnum(argv[0])) { push(atof(argv[0])); } else switch (*argv[0]) { case '+': push(pop() + pop()); break; case '-': push(pop() - pop()); break; case '*': push(pop() * pop()); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(), op2)); else printf("error zero divisor\n"); break; default: printf("error: unknown shit: %s\n", argv[0]); break; } } printf("\t%.8g\n", pop()); return 0; } void push(double f) { if (sp < MAXVAL) { val[sp++] = f; p = f; } else printf("error: stack full, can't push %g\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } }