From 3e6d6b8ff2a1c837589a0e711325c3eaa3d17679 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 19 Nov 2003 14:27:53 +0000 Subject: initial import --- Makefile | 4 +++ pl_calc.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 Makefile create mode 100644 pl_calc.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..294ac2d --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +PROG= pl_calc +NOMAN= noman + +. include diff --git a/pl_calc.c b/pl_calc.c new file mode 100644 index 0000000..9a93ebe --- /dev/null +++ b/pl_calc.c @@ -0,0 +1,101 @@ +/* $Id$ */ +/* Berlin 26.12.2000 */ +#include +#include +#include +#define MAXOP 100 +#define NUMBER '0' +#define MAXVAL 100 +#define BUFSIZE 100 + +int getop(char[]); +void push(double); +double pop(void); + +int sp = 0; +double val[MAXVAL]; +int getch(void); +void ungetch(int); +char buf[BUFSIZE]; +int bufp = 0; + +int main(void) { + int type; + double op2; + char s[MAXOP]; + while ((type = getop(s)) != EOF) { + switch (type) { + case NUMBER: + push(atof(s)); + break; + case '+': + push(pop() + pop()); + break; + case '*': + push(pop() * pop()); + break; + case '-': + op2 = pop(); + push(pop() - op2); + break; + case '/': + op2 = pop(); + if (op2 != 0.0) + push(pop() / op2); + else + printf("Fehler: Teilung durch Null\n"); + break; + case '\n': + printf("\t%.8g\n", pop()); + break; + default: + printf("Fehler: Unbekanter Befehl %s\n", s); + break; + } + } + return 0; +} + +void push(double f) { + if (sp < MAXVAL) + val[sp++] = f; + else + printf("Fehler: Stack ist voll, %g passt nicht rein\n", f); +} + +double pop(void) { + if (sp > 0) + return val[--sp]; + else { + printf("Fehler: Stack ist leer\n"); + return 0.0; + } +} + +int getop(char s[]) { + int i, c; + while((s[0] = c = getch()) == ' ' || c == '\t'); + s[1] = '\0'; + if (!isdigit(c) && c != '.') + return c; + i = 0; + if (isdigit(c)) + while (isdigit(s[++i] = c = getch())); + if (c == '.') + while (isdigit(s[++i] = c = getch())); + s[i] = '\0'; + if (c != EOF) + ungetch(c); + return NUMBER; +} + +int getch(void) { + return(bufp > 0) ? buf[--bufp] : getchar(); +} + +void ungetch(int c) { + if (bufp >= BUFSIZE) + printf("Ungetch: Zu viele Zeichen\n"); + else + buf[bufp++] = c; +} -- cgit v1.2.3