回答編集履歴

1

追記

2021/10/27 10:35

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -93,3 +93,105 @@
93
93
 
94
94
 
95
95
  ポインタも構造体もないから、むずかしくないと思うんですが、どうでしょうか?
96
+
97
+
98
+
99
+ **追記**
100
+
101
+ 逆ポーランド記法に変換してから計算するやり方です。
102
+
103
+ ```C
104
+
105
+ #include <stdio.h> // puts, printf
106
+
107
+
108
+
109
+ const char *a; char b[1000]; int i, j, c; void expr(void);
110
+
111
+
112
+
113
+ void factor(void)
114
+
115
+ {
116
+
117
+ c = a[i++];
118
+
119
+ if (c == '(') expr(), c = c == ')' ? a[i++] : 1;
120
+
121
+ else if (c - '0' <= 9u) b[j++] = c, c = a[i++];
122
+
123
+ else c = 1;
124
+
125
+ }
126
+
127
+
128
+
129
+ void term(void) { for (factor(); c == '*'; b[j++] = '*') factor(); }
130
+
131
+
132
+
133
+ void expr(void) { for (term(); c == '+'; b[j++] = '+') term(); }
134
+
135
+
136
+
137
+ int calc(void)
138
+
139
+ {
140
+
141
+ int s[100], p = 0; // s: stack, p: stack pointer
142
+
143
+ for (int k = 0; k < j; k++)
144
+
145
+ if (b[k] == '+') p--, s[p-1] += s[p];
146
+
147
+ else if (b[k] == '*') p--, s[p-1] *= s[p];
148
+
149
+ else s[p++] = b[k] - '0';
150
+
151
+ return s[0];
152
+
153
+ }
154
+
155
+
156
+
157
+ void test(const char *s)
158
+
159
+ {
160
+
161
+ puts(a = s);
162
+
163
+ i = j = 0;
164
+
165
+ expr();
166
+
167
+ if (c) puts(" error");
168
+
169
+ else {
170
+
171
+ for (int k = 0; k < j; k++) printf(" %c", b[k]);
172
+
173
+ printf(" : %d\n", calc());
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ int main(void)
182
+
183
+ {
184
+
185
+ test("1+2");
186
+
187
+ test("2*3");
188
+
189
+ test("1+2*3");
190
+
191
+ test("(1+2)*3");
192
+
193
+ test("1+3*(2+4)");
194
+
195
+ }
196
+
197
+ ```