summaryrefslogtreecommitdiffstats
path: root/5
diff options
context:
space:
mode:
authorSadeep Madurange <smadurange@users.noreply.github.com>2022-01-07 20:00:40 +0800
committerSadeep Madurange <smadurange@users.noreply.github.com>2022-01-07 20:00:40 +0800
commitcf00c20f840723584a552bce8a77d6ea6b1311e6 (patch)
treeec7517fd39372a1b74078e4ec7d9172b43dc9bdc /5
parentdf7834390128a1744e45863e8790d748c38582b8 (diff)
downloadk&r-exercises-cf00c20f840723584a552bce8a77d6ea6b1311e6.tar.gz
5.10
Diffstat (limited to '5')
-rw-r--r--5/10.c59
1 files changed, 59 insertions, 0 deletions
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 <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#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;
+}