質問編集履歴
6
解決したバグの反映
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,106 +6,32 @@
|
|
6
6
|
|
7
7
|
###発生している問題・エラーメッセージ
|
8
8
|
|
9
|
-
|
9
|
+
中置記法の順に代入文の文字列を入力してください:A=B
|
10
|
+
|
10
|
-
|
11
|
+
s[0]:A
|
12
|
+
|
13
|
+
s[1]:=
|
14
|
+
|
15
|
+
s[2]:B
|
16
|
+
|
17
|
+
prior(s[0]):5
|
18
|
+
|
19
|
+
prior(s[1]):0
|
20
|
+
|
21
|
+
prior(s[2]):5
|
22
|
+
|
23
|
+
p[0]:B
|
24
|
+
|
25
|
+
p[1]:B
|
26
|
+
|
27
|
+
p[2]:B
|
28
|
+
|
11
|
-
|
29
|
+
p[]にうまく文字がはいらない
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
30
|
+
|
31
|
+
|
16
32
|
|
17
33
|
'''
|
18
34
|
|
19
|
-
gcc revp.c
|
20
|
-
|
21
|
-
revp.c: In function ‘last_node’:
|
22
|
-
|
23
|
-
revp.c:74: 警告: assignment from incompatible pointer type
|
24
|
-
|
25
|
-
revp.c:75: 警告: assignment from incompatible pointer type
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
./a.out
|
30
|
-
|
31
|
-
中置記法で入力する文字列の文字個数を指定してください:13
|
32
|
-
|
33
|
-
中置記法の順に代入文の文字列を一文字ずつ入力してください:A=B-(C/D+E)*F
|
34
|
-
|
35
|
-
s[0]:A
|
36
|
-
|
37
|
-
s[1]:=
|
38
|
-
|
39
|
-
s[2]:B
|
40
|
-
|
41
|
-
s[3]:-
|
42
|
-
|
43
|
-
s[4]:(
|
44
|
-
|
45
|
-
s[5]:C
|
46
|
-
|
47
|
-
s[6]:/
|
48
|
-
|
49
|
-
s[7]:D
|
50
|
-
|
51
|
-
s[8]:+
|
52
|
-
|
53
|
-
s[9]:E
|
54
|
-
|
55
|
-
s[10]:)
|
56
|
-
|
57
|
-
s[11]:*
|
58
|
-
|
59
|
-
s[12]:F
|
60
|
-
|
61
|
-
prior(s[0]):5
|
62
|
-
|
63
|
-
prior(s[1]):5
|
64
|
-
|
65
|
-
prior(s[2]):5
|
66
|
-
|
67
|
-
prior(s[3]):5
|
68
|
-
|
69
|
-
prior(s[4]):5
|
70
|
-
|
71
|
-
prior(s[5]):5
|
72
|
-
|
73
|
-
prior(s[6]):5
|
74
|
-
|
75
|
-
prior(s[7]):5
|
76
|
-
|
77
|
-
prior(s[8]):5
|
78
|
-
|
79
|
-
prior(s[9]):5
|
80
|
-
|
81
|
-
prior(s[10]):5
|
82
|
-
|
83
|
-
prior(s[11]):5
|
84
|
-
|
85
|
-
prior(s[12]):5
|
86
|
-
|
87
|
-
p[0]:
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
'''
|
92
|
-
|
93
|
-
本来ならp[12]までで逆ポーランドの順に並び換えて出力してくれるはずなのだがそうなっていない。そもそもなぜp[0]までしか出力されていないのだろうか。また、prior関数の優先順位がなぜかずべて5になってしまいます。なぜでしょうか。
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
###該当のソースコード
|
98
|
-
|
99
|
-
C
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
```
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
35
|
|
110
36
|
|
111
37
|
#include<stdio.h>
|
@@ -158,7 +84,7 @@
|
|
158
84
|
|
159
85
|
void initialize(node_type **pp) /* スタックの初期化 */
|
160
86
|
|
161
|
-
{
|
87
|
+
{
|
162
88
|
|
163
89
|
*pp = NULL; /* スタックは空(先頭ノードなし) */
|
164
90
|
|
@@ -222,16 +148,20 @@
|
|
222
148
|
|
223
149
|
node_type *temp=*pp;
|
224
150
|
|
151
|
+
if (*pp == NULL) return 0;
|
152
|
+
|
225
|
-
while (
|
153
|
+
while (1) {
|
226
|
-
|
154
|
+
|
227
|
-
temp =
|
155
|
+
if (temp->next == NULL) {
|
156
|
+
|
228
|
-
|
157
|
+
break;
|
158
|
+
|
159
|
+
}
|
160
|
+
|
229
|
-
p
|
161
|
+
temp = temp->next;
|
230
162
|
|
231
163
|
}
|
232
164
|
|
233
|
-
|
234
|
-
|
235
165
|
return(temp->data);
|
236
166
|
|
237
167
|
}
|
@@ -312,34 +242,30 @@
|
|
312
242
|
|
313
243
|
int prior(data_type s){
|
314
244
|
|
315
|
-
|
316
|
-
|
317
|
-
if(s='A' ||s= 'B' ||s= 'C' ||s= 'D' ||s= 'E' ||s= 'F' ||s='G')
|
245
|
+
if(s=='A' || s== 'B' ||s== 'C' ||s== 'D' ||s== 'E' ||s== 'F' || s=='G')
|
318
246
|
|
319
247
|
return 5;
|
320
248
|
|
321
|
-
if(s='=')
|
249
|
+
if(s=='=')
|
322
250
|
|
323
251
|
return 0;
|
324
252
|
|
325
|
-
if(s='(')
|
253
|
+
if(s=='(')
|
326
254
|
|
327
255
|
return 4;
|
328
256
|
|
329
|
-
if(s=')')
|
257
|
+
if(s==')')
|
330
258
|
|
331
259
|
return 1;
|
332
260
|
|
333
|
-
if(s='+'||'-')
|
261
|
+
if(s=='+'||'-')
|
334
262
|
|
335
263
|
return 2;
|
336
264
|
|
337
|
-
if (s='*'||'/')
|
265
|
+
if (s=='*'||s=='/')
|
338
266
|
|
339
267
|
return 3;
|
340
268
|
|
341
|
-
|
342
|
-
|
343
269
|
}
|
344
270
|
|
345
271
|
|
@@ -376,88 +302,78 @@
|
|
376
302
|
|
377
303
|
data_type s[50],p[50];
|
378
304
|
|
379
|
-
|
305
|
+
|
380
|
-
|
381
|
-
|
306
|
+
|
382
|
-
|
383
|
-
printf("中置記法の順に代入文の文字列を
|
307
|
+
printf("中置記法の順に代入文の文字列を入力してください:");
|
384
|
-
|
308
|
+
|
385
|
-
scanf("%
|
309
|
+
scanf("%s",s);
|
310
|
+
|
311
|
+
n = strlen(s);
|
312
|
+
|
313
|
+
|
386
314
|
|
387
315
|
for(i=0;i<n;i++){
|
388
316
|
|
389
|
-
|
317
|
+
printf("s[%d]:%c\n",i,s[i]);
|
390
318
|
|
391
319
|
}
|
392
320
|
|
393
|
-
|
321
|
+
initialize(&head);
|
322
|
+
|
323
|
+
//優先順位の出力(優先順位がついているかの確認用)
|
394
324
|
|
395
325
|
for(i=0;i<n;i++){
|
396
326
|
|
327
|
+
new_node(s[i],&head);
|
328
|
+
|
397
|
-
printf("s[%d]:%
|
329
|
+
printf("prior(s[%d]):%d\n",i,prior(s[i]));
|
330
|
+
|
331
|
+
}
|
332
|
+
|
333
|
+
|
334
|
+
|
335
|
+
for(i=1;i<n;i++){
|
336
|
+
|
337
|
+
while(prior(last_node(&head))>=prior(s[i]) && is_empty(head)==FAILURE){
|
338
|
+
|
339
|
+
//新たに読み取った文字の方が、スタック最上部の文字より優先度が低ければ、スタックをポップしてそれを読み取る。
|
340
|
+
|
341
|
+
p[j]=last_node(&head);
|
342
|
+
|
343
|
+
pop(&head);
|
344
|
+
|
345
|
+
j++;
|
346
|
+
|
347
|
+
}
|
348
|
+
|
349
|
+
|
350
|
+
|
351
|
+
//スタックの最上部の文字より新たに読み取った文字の優先順位が高ければ、スタックに積む
|
352
|
+
|
353
|
+
if(prior(last_node(&head))<prior(s[i])){
|
354
|
+
|
355
|
+
push(&head,s[i]);
|
356
|
+
|
357
|
+
}
|
398
358
|
|
399
359
|
}
|
400
360
|
|
361
|
+
|
362
|
+
|
363
|
+
//逆ポーランド記法の順に出力する
|
364
|
+
|
365
|
+
for(i=0;i<j;i++){
|
366
|
+
|
367
|
+
printf("p[%d]:%c\n",i,p[i]);
|
368
|
+
|
369
|
+
}
|
370
|
+
|
371
|
+
|
372
|
+
|
373
|
+
|
374
|
+
|
401
375
|
|
402
376
|
|
403
|
-
initialize(&head);
|
404
|
-
|
405
|
-
new_node(s[0],&head);
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
//優先順位の出力(優先順位がついているかの確認用)
|
410
|
-
|
411
|
-
for(i=0;i<n;i++){
|
412
|
-
|
413
|
-
printf("prior(s[%d]):%d\n",i,prior(s[i]));
|
414
|
-
|
415
|
-
}
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
for(i=1;i<n;i++){
|
420
|
-
|
421
|
-
while(prior(last_node(&head))>=prior(s[i]) && is_empty(head)==FAILURE){
|
422
|
-
|
423
|
-
//新たに読み取った文字の方が、スタック最上部の文字より優先度が低ければ、スタックをポップしてそれを読み取る。
|
424
|
-
|
425
|
-
p[j]=last_node(&head);
|
426
|
-
|
427
|
-
pop(&head);
|
428
|
-
|
429
|
-
j++;
|
430
|
-
|
431
|
-
}
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
//スタックの最上部の文字より新たに読み取った文字の優先順位が高ければ、スタックに積む
|
436
|
-
|
437
|
-
if(prior(last_node(&head))<prior(s[i])){
|
438
|
-
|
439
|
-
push(&head,s[i]);
|
440
|
-
|
441
|
-
}
|
442
|
-
|
443
|
-
}
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
//逆ポーランド記法の順に出力する
|
448
|
-
|
449
|
-
for(i=0;i<j;i++){
|
450
|
-
|
451
|
-
printf("p[%d]:%c\n",i,p[i]);
|
452
|
-
|
453
|
-
}
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
377
|
return 0;
|
462
378
|
|
463
379
|
|
@@ -466,6 +382,4 @@
|
|
466
382
|
|
467
383
|
|
468
384
|
|
469
|
-
|
470
|
-
|
471
385
|
```
|
5
書き換えたコードに変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -26,45 +26,71 @@
|
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
./a.out
|
29
|
+
./a.out
|
30
30
|
|
31
31
|
中置記法で入力する文字列の文字個数を指定してください:13
|
32
32
|
|
33
|
-
中置記法の順に代入文の文字列を一文字ずつ入力してください:A=
|
33
|
+
中置記法の順に代入文の文字列を一文字ずつ入力してください:A=B-(C/D+E)*F
|
34
34
|
|
35
35
|
s[0]:A
|
36
36
|
|
37
37
|
s[1]:=
|
38
38
|
|
39
|
-
s[2]:
|
39
|
+
s[2]:B
|
40
|
-
|
40
|
+
|
41
|
-
s[3]:
|
41
|
+
s[3]:-
|
42
|
-
|
42
|
+
|
43
|
-
s[4]:
|
43
|
+
s[4]:(
|
44
44
|
|
45
45
|
s[5]:C
|
46
46
|
|
47
|
-
s[6]:)
|
48
|
-
|
49
|
-
s[
|
47
|
+
s[6]:/
|
50
|
-
|
48
|
+
|
51
|
-
s[
|
49
|
+
s[7]:D
|
52
|
-
|
50
|
+
|
53
|
-
s[
|
51
|
+
s[8]:+
|
52
|
+
|
54
|
-
|
53
|
+
s[9]:E
|
54
|
+
|
55
|
-
s[10]:
|
55
|
+
s[10]:)
|
56
56
|
|
57
57
|
s[11]:*
|
58
58
|
|
59
59
|
s[12]:F
|
60
60
|
|
61
|
+
prior(s[0]):5
|
62
|
+
|
63
|
+
prior(s[1]):5
|
64
|
+
|
65
|
+
prior(s[2]):5
|
66
|
+
|
67
|
+
prior(s[3]):5
|
68
|
+
|
69
|
+
prior(s[4]):5
|
70
|
+
|
71
|
+
prior(s[5]):5
|
72
|
+
|
73
|
+
prior(s[6]):5
|
74
|
+
|
75
|
+
prior(s[7]):5
|
76
|
+
|
77
|
+
prior(s[8]):5
|
78
|
+
|
79
|
+
prior(s[9]):5
|
80
|
+
|
81
|
+
prior(s[10]):5
|
82
|
+
|
83
|
+
prior(s[11]):5
|
84
|
+
|
85
|
+
prior(s[12]):5
|
86
|
+
|
61
87
|
p[0]:
|
62
88
|
|
63
89
|
|
64
90
|
|
65
91
|
'''
|
66
92
|
|
67
|
-
本来ならp[12]までで逆ポーランドの順に並び換えて出力してくれるはずなのだがそうなっていない。そもそもなぜp[0]までしか出力されていないのだろうか。
|
93
|
+
本来ならp[12]までで逆ポーランドの順に並び換えて出力してくれるはずなのだがそうなっていない。そもそもなぜp[0]までしか出力されていないのだろうか。また、prior関数の優先順位がなぜかずべて5になってしまいます。なぜでしょうか。
|
68
94
|
|
69
95
|
|
70
96
|
|
@@ -76,6 +102,12 @@
|
|
76
102
|
|
77
103
|
```
|
78
104
|
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
79
111
|
#include<stdio.h>
|
80
112
|
|
81
113
|
#include<stdlib.h>
|
@@ -92,6 +124,10 @@
|
|
92
124
|
|
93
125
|
|
94
126
|
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
95
131
|
typedef char data_type; /*char型をdata_type型に置き換える */
|
96
132
|
|
97
133
|
|
@@ -100,7 +136,7 @@
|
|
100
136
|
|
101
137
|
typedef struct node_tag {
|
102
138
|
|
103
|
-
data_type data;
|
139
|
+
data_type data;
|
104
140
|
|
105
141
|
struct node_tag *next; /* 後続ノードへのポインタ */
|
106
142
|
|
@@ -130,6 +166,8 @@
|
|
130
166
|
|
131
167
|
|
132
168
|
|
169
|
+
|
170
|
+
|
133
171
|
/* ノードを後ろに付け加える*/
|
134
172
|
|
135
173
|
|
@@ -172,6 +210,10 @@
|
|
172
210
|
|
173
211
|
}
|
174
212
|
|
213
|
+
|
214
|
+
|
215
|
+
|
216
|
+
|
175
217
|
//末尾のノードの文字を出力する
|
176
218
|
|
177
219
|
data_type last_node(node_type **pp)
|
@@ -182,125 +224,137 @@
|
|
182
224
|
|
183
225
|
while (pp != NULL) {
|
184
226
|
|
185
|
-
temp = pp;
|
227
|
+
temp = pp;
|
186
|
-
|
228
|
+
|
187
|
-
pp = temp->next;
|
229
|
+
pp = temp->next;
|
230
|
+
|
231
|
+
}
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
return(temp->data);
|
236
|
+
|
237
|
+
}
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
|
244
|
+
|
245
|
+
int is_empty(node_type *p) { /* 空スタックのとき真、 そうでないならば偽を返す */
|
246
|
+
|
247
|
+
if (p == NULL) return TRUE; /* 空スタックのとき */
|
248
|
+
|
249
|
+
else return FALSE; /* 空スタックでないとき */
|
250
|
+
|
251
|
+
}
|
252
|
+
|
253
|
+
|
254
|
+
|
255
|
+
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
|
260
|
+
|
261
|
+
//スタックの先頭ノードの削除
|
262
|
+
|
263
|
+
int pop(node_type **pp)
|
264
|
+
|
265
|
+
{
|
266
|
+
|
267
|
+
node_type *temp;
|
268
|
+
|
269
|
+
if (*pp != NULL) {
|
270
|
+
|
271
|
+
temp = (*pp)->next;
|
272
|
+
|
273
|
+
free(*pp); /* メモリの解放 */
|
274
|
+
|
275
|
+
*pp = temp;
|
276
|
+
|
277
|
+
return SUCCESS;
|
188
278
|
|
189
279
|
}
|
190
280
|
|
191
|
-
|
192
|
-
|
193
|
-
return
|
281
|
+
else return FAILURE;
|
194
|
-
|
282
|
+
|
195
|
-
}
|
283
|
+
}
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
284
|
+
|
204
|
-
|
205
|
-
|
285
|
+
|
206
|
-
|
207
|
-
|
286
|
+
|
208
|
-
|
209
|
-
|
287
|
+
|
210
|
-
|
211
|
-
|
212
|
-
|
288
|
+
|
213
|
-
//スタックの先頭ノードの
|
289
|
+
//スタックの先頭へのノードの挿入
|
214
|
-
|
290
|
+
|
215
|
-
int p
|
291
|
+
int push(node_type **pp, data_type x)
|
216
292
|
|
217
293
|
{
|
218
294
|
|
219
|
-
node_type *temp;
|
295
|
+
node_type *temp;
|
220
|
-
|
221
|
-
|
296
|
+
|
222
|
-
|
223
|
-
temp = (
|
297
|
+
temp = new_node(x, pp);
|
224
|
-
|
298
|
+
|
225
|
-
f
|
299
|
+
if (temp == NULL) return FAILURE;
|
226
|
-
|
300
|
+
|
227
|
-
*pp = temp;
|
301
|
+
*pp = temp;
|
228
|
-
|
302
|
+
|
229
|
-
return SUCCESS;
|
303
|
+
return SUCCESS;
|
230
|
-
|
304
|
+
|
231
|
-
|
305
|
+
}
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
|
310
|
+
|
232
|
-
|
311
|
+
//文字の優先順位を出力する
|
312
|
+
|
313
|
+
int prior(data_type s){
|
314
|
+
|
315
|
+
|
316
|
+
|
317
|
+
if(s='A' ||s= 'B' ||s= 'C' ||s= 'D' ||s= 'E' ||s= 'F' ||s='G')
|
318
|
+
|
233
|
-
|
319
|
+
return 5;
|
320
|
+
|
234
|
-
|
321
|
+
if(s='=')
|
322
|
+
|
323
|
+
return 0;
|
324
|
+
|
325
|
+
if(s='(')
|
326
|
+
|
327
|
+
return 4;
|
328
|
+
|
329
|
+
if(s=')')
|
330
|
+
|
331
|
+
return 1;
|
332
|
+
|
333
|
+
if(s='+'||'-')
|
334
|
+
|
335
|
+
return 2;
|
336
|
+
|
337
|
+
if (s='*'||'/')
|
338
|
+
|
339
|
+
return 3;
|
340
|
+
|
341
|
+
|
342
|
+
|
235
|
-
}
|
343
|
+
}
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
344
|
+
|
345
|
+
|
346
|
+
|
347
|
+
|
348
|
+
|
241
|
-
//スタックの先頭
|
349
|
+
//スタックの先頭のデータの取得
|
242
|
-
|
350
|
+
|
243
|
-
|
351
|
+
data_type top(node_type *p)
|
244
352
|
|
245
353
|
{
|
246
354
|
|
247
|
-
node_type *temp;
|
248
|
-
|
249
|
-
temp = new_node(x, pp);
|
250
|
-
|
251
|
-
if (temp == NULL) return FAILURE;
|
252
|
-
|
253
|
-
*pp = temp;
|
254
|
-
|
255
|
-
return SUCCESS;
|
256
|
-
|
257
|
-
}
|
258
|
-
|
259
|
-
//文字の優先順位を出力する
|
260
|
-
|
261
|
-
int prior(data_type s){
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
if(s=('A' || 'B' || 'C' || 'D' || 'E' || 'F' ||'G'))
|
266
|
-
|
267
|
-
return 5;
|
268
|
-
|
269
|
-
if(s='=')
|
270
|
-
|
271
|
-
return 0;
|
272
|
-
|
273
|
-
if(s='(')
|
274
|
-
|
275
|
-
return 4;
|
276
|
-
|
277
|
-
if(s=')')
|
278
|
-
|
279
|
-
return 1;
|
280
|
-
|
281
|
-
if(s='+'||'-')
|
282
|
-
|
283
|
-
return 2;
|
284
|
-
|
285
|
-
if (s='*'||'/')
|
286
|
-
|
287
|
-
return 3;
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
}
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
//スタックの先頭のデータの取得
|
296
|
-
|
297
|
-
data_type top(node_type *p)
|
298
|
-
|
299
|
-
{
|
300
|
-
|
301
355
|
if (p == NULL) /* 空スタックのとき */
|
302
356
|
|
303
|
-
return ('\0');
|
357
|
+
return ('\0');
|
304
358
|
|
305
359
|
else /* 空スタックでないとき */
|
306
360
|
|
@@ -310,6 +364,12 @@
|
|
310
364
|
|
311
365
|
|
312
366
|
|
367
|
+
|
368
|
+
|
369
|
+
|
370
|
+
|
371
|
+
|
372
|
+
|
313
373
|
int main(void){
|
314
374
|
|
315
375
|
int n=0,i=0,j=0;
|
@@ -330,7 +390,7 @@
|
|
330
390
|
|
331
391
|
}
|
332
392
|
|
333
|
-
|
393
|
+
|
334
394
|
|
335
395
|
for(i=0;i<n;i++){
|
336
396
|
|
@@ -338,12 +398,24 @@
|
|
338
398
|
|
339
399
|
}
|
340
400
|
|
401
|
+
|
402
|
+
|
341
|
-
initialize(&head);
|
403
|
+
initialize(&head);
|
342
404
|
|
343
405
|
new_node(s[0],&head);
|
344
406
|
|
345
407
|
|
346
408
|
|
409
|
+
//優先順位の出力(優先順位がついているかの確認用)
|
410
|
+
|
411
|
+
for(i=0;i<n;i++){
|
412
|
+
|
413
|
+
printf("prior(s[%d]):%d\n",i,prior(s[i]));
|
414
|
+
|
415
|
+
}
|
416
|
+
|
417
|
+
|
418
|
+
|
347
419
|
for(i=1;i<n;i++){
|
348
420
|
|
349
421
|
while(prior(last_node(&head))>=prior(s[i]) && is_empty(head)==FAILURE){
|
@@ -354,38 +426,46 @@
|
|
354
426
|
|
355
427
|
pop(&head);
|
356
428
|
|
357
|
-
j++;
|
429
|
+
j++;
|
430
|
+
|
358
|
-
|
431
|
+
}
|
432
|
+
|
433
|
+
|
434
|
+
|
359
|
-
|
435
|
+
//スタックの最上部の文字より新たに読み取った文字の優先順位が高ければ、スタックに積む
|
436
|
+
|
437
|
+
if(prior(last_node(&head))<prior(s[i])){
|
438
|
+
|
439
|
+
push(&head,s[i]);
|
360
440
|
|
361
441
|
}
|
362
442
|
|
363
|
-
|
443
|
+
}
|
364
|
-
|
444
|
+
|
445
|
+
|
446
|
+
|
365
|
-
|
447
|
+
//逆ポーランド記法の順に出力する
|
448
|
+
|
366
|
-
|
449
|
+
for(i=0;i<j;i++){
|
450
|
+
|
367
|
-
|
451
|
+
printf("p[%d]:%c\n",i,p[i]);
|
368
|
-
|
369
|
-
push(&head,s[i]);
|
370
452
|
|
371
453
|
}
|
372
454
|
|
373
|
-
|
455
|
+
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
456
|
+
|
378
|
-
|
379
|
-
|
457
|
+
|
380
|
-
|
381
|
-
|
458
|
+
|
382
|
-
|
383
|
-
|
459
|
+
|
384
|
-
|
385
|
-
|
386
460
|
|
387
461
|
return 0;
|
388
462
|
|
463
|
+
|
464
|
+
|
389
|
-
}
|
465
|
+
}
|
466
|
+
|
467
|
+
|
468
|
+
|
469
|
+
|
390
470
|
|
391
471
|
```
|
4
実行結果の追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
###発生している問題・エラーメッセージ
|
8
8
|
|
9
|
-
main関数の下の方に該当する箇所にバグあり。
|
9
|
+
main関数の下の方に該当する箇所にfor文が回らないバグあり。
|
10
10
|
|
11
11
|
どうすれば解消できるでほうか…
|
12
12
|
|
@@ -14,23 +14,19 @@
|
|
14
14
|
|
15
15
|
エラーメッセージ
|
16
16
|
|
17
|
+
'''
|
18
|
+
|
17
|
-
|
19
|
+
gcc revp.c
|
18
|
-
|
20
|
+
|
19
|
-
revp.c:
|
21
|
+
revp.c: In function ‘last_node’:
|
20
|
-
|
22
|
+
|
21
|
-
revp.c:74:
|
23
|
+
revp.c:74: 警告: assignment from incompatible pointer type
|
22
|
-
|
23
|
-
|
24
|
+
|
24
|
-
|
25
|
-
^
|
26
|
-
|
27
|
-
revp.c:75:
|
25
|
+
revp.c:75: 警告: assignment from incompatible pointer type
|
28
|
-
|
29
|
-
|
26
|
+
|
30
|
-
|
31
|
-
|
27
|
+
|
32
|
-
|
28
|
+
|
33
|
-
|
29
|
+
./a.out
|
34
30
|
|
35
31
|
中置記法で入力する文字列の文字個数を指定してください:13
|
36
32
|
|
@@ -62,9 +58,11 @@
|
|
62
58
|
|
63
59
|
s[12]:F
|
64
60
|
|
65
|
-
p[0]:
|
61
|
+
p[0]:
|
62
|
+
|
63
|
+
|
64
|
+
|
66
|
-
|
65
|
+
'''
|
67
|
-
|
68
66
|
|
69
67
|
本来ならp[12]までで逆ポーランドの順に並び換えて出力してくれるはずなのだがそうなっていない。そもそもなぜp[0]までしか出力されていないのだろうか。
|
70
68
|
|
3
コードブロックの追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -74,9 +74,9 @@
|
|
74
74
|
|
75
75
|
C
|
76
76
|
|
77
|
+
|
78
|
+
|
77
|
-
|
79
|
+
```
|
78
|
-
|
79
|
-
|
80
80
|
|
81
81
|
#include<stdio.h>
|
82
82
|
|
@@ -390,4 +390,4 @@
|
|
390
390
|
|
391
391
|
}
|
392
392
|
|
393
|
-
|
393
|
+
```
|
2
コードブロックの追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -74,7 +74,7 @@
|
|
74
74
|
|
75
75
|
C
|
76
76
|
|
77
|
-
|
77
|
+
'''
|
78
78
|
|
79
79
|
|
80
80
|
|
@@ -389,3 +389,5 @@
|
|
389
389
|
return 0;
|
390
390
|
|
391
391
|
}
|
392
|
+
|
393
|
+
'''
|
1
質問内容をやや見やすく改変
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,25 +1,17 @@
|
|
1
1
|
###前提・実現したいこと
|
2
2
|
|
3
|
-
被演算数(1文字分の英字
|
3
|
+
被演算数(1文字分の英字)、演算子、および括弧(左括弧「(」と右括弧「)」) のトークンで構成された中置記法の算術式を読み込み、 スタックを用いて逆ポーランド記法の式を出力する Cのプログラムを作成する。
|
4
|
-
|
5
|
-
み、 スタックを用いて逆ポーランド記法の式を出力する Cのプログラムを作成する。それから、 次の(1)~(3)の中置記法の算術式に対する実行結果を求める。
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
(1) A=(B-C)/D+E*F
|
10
|
-
|
11
|
-
(2) A = B - ( C / D + E ) * F
|
12
|
-
|
13
|
-
(3) A = B - C / ( D + E * F )
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
ただし、プログラム中で使用する演算子は、 二項演算子の加算「+」、減算「-」、乗算「*」、除算「/」、 および代入「=」だけに限定する。
|
18
4
|
|
19
5
|
|
20
6
|
|
21
7
|
###発生している問題・エラーメッセージ
|
22
8
|
|
9
|
+
main関数の下の方に該当する箇所にバグあり。
|
10
|
+
|
11
|
+
どうすれば解消できるでほうか…
|
12
|
+
|
13
|
+
|
14
|
+
|
23
15
|
エラーメッセージ
|
24
16
|
|
25
17
|
$ gcc revp.c
|
@@ -84,30 +76,6 @@
|
|
84
76
|
|
85
77
|
/*
|
86
78
|
|
87
|
-
プログラミング言語実験
|
88
|
-
|
89
|
-
課題3
|
90
|
-
|
91
|
-
被演算数(1文字分の英字でよい)、演算子、および括弧(左括弧「(」と右括弧「)」) のトークンで構成された中置記法の算術式を読み込み、 スタ\\
|
92
|
-
|
93
|
-
ックを用いて逆ポーランド記法の式を出力する Cのプログラムを作成しなさい。それから、 次の(1)~(3)の中置記法の算術式に対する実行結果\\
|
94
|
-
|
95
|
-
を求めなさい。
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
(1) A=(B-C)/D+E*F
|
100
|
-
|
101
|
-
(2) A = B - ( C / D + E ) * F
|
102
|
-
|
103
|
-
(3) A = B - C / ( D + E * F )
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
ただし、プログラム中で使用する演算子は、 二項演算子の加算「+」、減算「-」、乗算「*」、除算「/」、 および代入「=」だけに限定することにする
|
108
|
-
|
109
|
-
*/
|
110
|
-
|
111
79
|
|
112
80
|
|
113
81
|
#include<stdio.h>
|