diff options
| author | Sadeep Madurange <smadurange@users.noreply.github.com> | 2021-12-16 17:58:50 +0800 |
|---|---|---|
| committer | Sadeep Madurange <smadurange@users.noreply.github.com> | 2021-12-16 17:58:50 +0800 |
| commit | 32b3878058a646a4cdae979943fd2873acad5922 (patch) | |
| tree | fc231dbe7b1c3a09baa19ee75b6469c2aac98897 /4 | |
| parent | 5ba4e0e4751e69021fb180a859370609ec0f73e2 (diff) | |
| download | k&r-exercises-32b3878058a646a4cdae979943fd2873acad5922.tar.gz | |
4.10
Diffstat (limited to '4')
| -rw-r--r-- | 4/10.c | 117 |
1 files changed, 52 insertions, 65 deletions
@@ -12,14 +12,16 @@ #define FUN '1' #define VAR '2' +#define INDEX(x) (x <= 'Z' ? x - 'A' : x - 71) /* index of the variable */ + int var[52]; -int getop(char[]); void push(double); double peek(); double pop(); void clear(); -double vartoval(char); +int mgetline(); +int getop(char[]); int main(int argc, char *argv[]) { int type, op1, op2; @@ -27,68 +29,51 @@ int main(int argc, char *argv[]) { printf("Press CTRL+C to exit\n"); - while (type == getop(s)) { - switch (type) { - case NUM: - push(atof(s)); - break; - case '+': - op1 = pop(); - op2 = pop(); - if (isalpha(op1)) - op1 = vartoval(op1); - if (isalpha(op2)) - op2 = vartoval(op2); - push(op1 + op2); - break; - case '-': - op1 = pop(); - op2 = pop(); - if (isalpha(op1)) - op1 = vartoval(op1); - if (isalpha(op2)) - op2 = vartoval(op2); - push(op1 - op2); - break; - case '*': - op1 = pop(); - op2 = pop(); - if (isalpha(op1)) - op1 = vartoval(op1); - if (isalpha(op2)) - op2 = vartoval(op2); - push(op1 * op2); - break; - case '/': - op1 = pop(); - op2 = pop(); - if (isalpha(op1)) - op1 = vartoval(op1); - if (isalpha(op2)) - op2 = vartoval(op2); - if (op1 == 0.0) - printf("error: division by zero\n"); - else - push((double)op2 / op1); - break; - case '%': - op1 = pop(); - op2 = pop(); - if (isalpha(op1)) - op1 = vartoval(op1); - if (isalpha(op2)) - op2 = vartoval(op2); - if (op1 == 0.0) - printf("error: division by zero\n"); - else - push((int)op2 % (int)op1); - break; - case '=': - break; - case FUN: - break; - default: - printf("error: unknown command %s\n", s); + while (mgetline()) { + while (type == getop(s) != 0) { + switch (type) { + case NUM: + push(atof(s)); + break; + case '+': + op1 = pop(); + op2 = pop(); + push(op1 + op2); + break; + case '-': + op1 = pop(); + op2 = pop(); + push(op1 - op2); + break; + case '*': + op1 = pop(); + op2 = pop(); + push(op1 * op2); + break; + case '/': + op1 = pop(); + op2 = pop(); + if (op1 == 0.0) + printf("error: division by zero\n"); + else + push((double)op2 / op1); + break; + case '%': + op1 = pop(); + op2 = pop(); + if (op1 == 0.0) + printf("error: division by zero\n"); + else + push((int)op2 % (int)op1); + break; + case '=': + var[INDEX(s[0])] = pop(); + break; + case FUN: + break; + default: + printf("error: unknown command %s\n", s); + } } } @@ -98,14 +83,16 @@ int main(int argc, char *argv[]) { int idx = 0; int line[MAXLINE]; -void mgetline() { +int mgetline() { int i, c; for (i = 0; i < MAXLINE - 1 && (c = getchar()) != '\n' && c != EOF; i++) { line[i] = c; } + line[i] = 0; idx = 0; + return c == EOF ? 0 : 1; } int getop(char s[]) { |
