From cf00c20f840723584a552bce8a77d6ea6b1311e6 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Fri, 7 Jan 2022 20:00:40 +0800 Subject: 5.10 --- 5/10.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 5/10.c diff --git a/5/10.c b/5/10.c new file mode 100644 index 0000000..febd4c1 --- /dev/null +++ b/5/10.c @@ -0,0 +1,59 @@ +#include +#include +#include + +#define MAXLEN 1000 + +int main(int argc, char *argv[]) { + char op[MAXLEN], *s; + int val[MAXLEN], i, j, k, op1, op2; + + if (argc == 1) { + printf("Usage: expr 2 3 4 + *\n"); + return 1; + } + + for(i = 0, j = 0, ++argv; --argc > 0 && i < MAXLEN - 1 && j < MAXLEN - 1; argv++) { + s = *argv; + if (isdigit(*s)) + val[i++] = atoi(s); + else if (s[0] == '+' || s[0] == '-' || s[0] == '*' || s[0] == '/' || s[0] == '%') + op[j++] = s[0]; + else { + printf("error: %s not supported\n", s); + return -1; + } + } + + k = j; + j = 0; + + while (j < k && i > 1) { + op2 = val[--i]; + op1 = val[--i]; + switch (op[j++]) { + case '+': + val[++i] = op1 + op2; + break; + case '-': + val[++i] = op1 - op2; + break; + case '*': + val[++i] = op1 * op2; + break; + case '/': + val[++i] = op1 / op2; + break; + case '%': + val[++i] = op1 % op2; + break; + default: + printf("error: unkknown op\n"); + return 1; + } + } + + printf("\t%d\n", val[0]); + + return 0; +} -- cgit v1.2.3