質問するログイン新規登録

回答編集履歴

1

追記

2021/10/27 10:35

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -45,4 +45,55 @@
45
45
  }
46
46
  ```
47
47
 
48
- ポインタも構造体もないから、むずかしくないと思うんですが、どうでしょうか?
48
+ ポインタも構造体もないから、むずかしくないと思うんですが、どうでしょうか?
49
+
50
+ **追記**
51
+ 逆ポーランド記法に変換してから計算するやり方です。
52
+ ```C
53
+ #include <stdio.h> // puts, printf
54
+
55
+ const char *a; char b[1000]; int i, j, c; void expr(void);
56
+
57
+ void factor(void)
58
+ {
59
+ c = a[i++];
60
+ if (c == '(') expr(), c = c == ')' ? a[i++] : 1;
61
+ else if (c - '0' <= 9u) b[j++] = c, c = a[i++];
62
+ else c = 1;
63
+ }
64
+
65
+ void term(void) { for (factor(); c == '*'; b[j++] = '*') factor(); }
66
+
67
+ void expr(void) { for (term(); c == '+'; b[j++] = '+') term(); }
68
+
69
+ int calc(void)
70
+ {
71
+ int s[100], p = 0; // s: stack, p: stack pointer
72
+ for (int k = 0; k < j; k++)
73
+ if (b[k] == '+') p--, s[p-1] += s[p];
74
+ else if (b[k] == '*') p--, s[p-1] *= s[p];
75
+ else s[p++] = b[k] - '0';
76
+ return s[0];
77
+ }
78
+
79
+ void test(const char *s)
80
+ {
81
+ puts(a = s);
82
+ i = j = 0;
83
+ expr();
84
+ if (c) puts(" error");
85
+ else {
86
+ for (int k = 0; k < j; k++) printf(" %c", b[k]);
87
+ printf(" : %d\n", calc());
88
+ }
89
+ }
90
+
91
+ int main(void)
92
+ {
93
+ test("1+2");
94
+ test("2*3");
95
+ test("1+2*3");
96
+ test("(1+2)*3");
97
+ test("1+3*(2+4)");
98
+ }
99
+ ```