質問編集履歴

1

質問の編集

2016/10/16 23:22

投稿

ikuo-biyori
ikuo-biyori

スコア56

test CHANGED
File without changes
test CHANGED
@@ -1,97 +1,15 @@
1
1
  いつもお世話になっています。キューについて質問させていただきます。
2
2
 
3
+ エンキューだけを考えて表示させたいのですが、listqの関数でキューの中身を表示させる方法がわかりません。引数がvoidでもデータを受けとり、キューの中身を表示できるものなのでしょうか?
4
+
3
- 以下が問題です。
5
+ 以下がコードです。```C言語
4
-
5
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
6
-
7
- バス停で並んでいる列を考える。この場合、
8
-
9
- 一番最初に並んだ人が最初にバスに乗る。あとの人は順に前に詰める。
10
-
11
- 一番最後に並んだ人は最後にバスに乗る
12
-
13
- このように最初に入れたデータを最初に取り出す(先入れ、先出し、First In, First Out、FIFO)形式のデータ構造をキュー(queue)と呼び、stackと共にコンピュータの基本的なデータ構造の1つである。
14
-
15
- なお、キューには以下の性質・用語がある。
16
-
17
- 列の最後尾に並ぶ事をキューにデータを追加すると言い、エンキュー(enqueue)と呼ぶ
18
-
19
- 列の最前列の人がバスに乗り込むために列を離れる事を、キューからデータを取り出すと言い、デキュー(dequeue)と呼ぶ。この時残った列の人が順に前に詰めるように、キューの先頭がなくなった分、データは前に詰められる。
20
-
21
- キューの長さは有限である。(バスの列のベンチを想像すると良い)
22
-
23
- キューの長さ一杯に並んでいる状態をキューが満杯(queue full)であると言う。キューが満杯の時、更なるエンキューは出来ない。
24
-
25
- 列に誰も並んでいない状態をキューが空(queue empty)であると言う。キューが空の時、更なるデキューは出来ない。
26
-
27
-
28
-
29
- それではこのキューをシミュレートするプログラムを作成する。なお、プログラムにはenq、deq、listqの3つの関数を作成し、使用する。mainも含んだ関数の仕様は以下の通りである。また、実行例も併せて参照し、出来る限りこの表示に合わせること。
30
-
31
- プログラムの仕様
32
-
33
- キューのデータは正整数とする
34
-
35
- キューデータと(多分必要になるであろう)キューの最後尾を示す変数は各関数から見えるように外部変数とする。
36
-
37
- マクロとして、以下を定義する
38
-
39
- #define QLEN 5 キューの長さ
40
-
41
- #define QEMP -1 キューが空である
42
-
43
- #define QFUL -1 キューが満杯である
44
-
45
- int main()
46
-
47
- 無限ループ構造とし、エンキュー、デキュー、終了の3つの操作を選択させる。
48
-
49
- エンキューの場合はエンキューするデータの入力を行う。
50
-
51
- それぞれの指示に従った関数を呼ぶ(「終了」を選んだ場合は終了する。)
52
-
53
- デキューの場合は得たデータを「deQ data : xx」のように表示する。
54
-
55
- 各関数の戻り値がQFUL、QEMPの場合は、それぞれ「Q full, you should deQ first!」、「Q empty, you should enQ first!」を表示する。
56
-
57
- キューを表示する関数listq()を呼びキューの中身を表示する。
58
-
59
- int enq(int)
60
-
61
- mainで読み込んだ一つの正整数を引数に貰い、それをエンキューする関数である。
62
-
63
- 上ても説明したが、エンキューとはキューの最後尾にデータを一つ追加する事である。(バスの列の最後尾に並ぶ)
64
-
65
- 戻り値は、キューが満杯でエンキュー出来なかった場合はマクロ値QFULを、それ以外の正常終了した場合は0を返す。
66
-
67
- int deq(void)
68
-
69
- データをデキューする関数である。
70
-
71
- デキューとはキューの先頭のデータを取り出し、戻り値とし、更に残りのデータを順に前に詰める事である。(列の先頭の人がバスに乗り込み、列が前にずれる)
72
-
73
- 戻り値は、キューが空でデキュー出来なかった場合はマクロ値QEMPを、それ以外の正常終了した場合はデキューしたデータを返す。
74
-
75
- void listq(void)
76
-
77
- キューの中身を表示する関数である
78
-
79
- 表示は実行例に従う事。
80
-
81
- 表示は左端がキューの先頭、右端がキューの最後尾である。
82
-
83
- キューが空の場合は「Queue empty」の表示を行う。
84
-
85
- キューが満杯の場合はデータを表示した後、「Queue full」の表示を行う。
86
-
87
- 大雑把な処理のテンプレートを以下に示す。
88
-
89
-
90
6
 
91
7
  コード
92
8
 
93
9
  ```
94
10
 
11
+
12
+
95
13
  #include <stdio.h>
96
14
 
97
15
  #include <stdlib.h>
@@ -108,7 +26,7 @@
108
26
 
109
27
  int enq(int);
110
28
 
111
- int deq(void);
29
+ //int deq(void);
112
30
 
113
31
  void listq(void);
114
32
 
@@ -116,29 +34,81 @@
116
34
 
117
35
  /* キューに使用する配列、その他外部変数の宣言 */
118
36
 
37
+ //int a[QLEN],n,m,r;
38
+
119
39
 
120
40
 
121
41
  int main(){
122
42
 
123
-
43
+ int a[QLEN],n,m,r;
44
+
45
+ int i;
124
46
 
125
47
  while(1){
126
48
 
127
49
 
128
50
 
129
- /* 処理の入力 */
51
+ /* 処理の入力 */
130
-
52
+
131
- /* 入力に従って関数を呼ぶ */
53
+ /* 入力に従って関数を呼ぶ */
132
-
54
+
133
- /* なお、enq()の場合は呼ぶ前に引数入力 */
55
+ /* なお、enq()の場合は呼ぶ前に引数入力 */
134
-
56
+
135
- /* deq()の場合は呼んだ後にデータ出力 */
57
+ /* deq()の場合は呼んだ後にデータ出力 */
136
-
58
+
137
- /* 終了の場合はexit()を呼ぶ */
59
+ /* 終了の場合はexit()を呼ぶ */
60
+
138
-
61
+ //scanf("%d",&n);
62
+
139
-
63
+ printf("1 = enQ/2 = deQ/else = end ==>");
64
+
140
-
65
+ scanf("%d",&n);
66
+
67
+ if(n==1){/*エンキューをします*/
68
+
69
+ printf(" Enter enQ data ==>");
70
+
71
+ scanf("%d",&m);
72
+
73
+ r=enq(m);
74
+
75
+ printf("Queue :");
76
+
77
+ for(i=0;i<QLEN;i++){
78
+
79
+ printf("%d",a[i]);
80
+
141
- }
81
+ }
82
+
83
+ printf("\n");
84
+
85
+ break;
86
+
87
+
88
+
89
+ }
90
+
91
+ //else if(n==2){/*デキューします*/
92
+
93
+ //deq(n);
94
+
95
+ // }
96
+
97
+ listq();
98
+
99
+ if(n!=1 || n!=2){
100
+
101
+ exit(0);
102
+
103
+ }
104
+
105
+
106
+
107
+
108
+
109
+ }
110
+
111
+
142
112
 
143
113
  return 0;
144
114
 
@@ -148,302 +118,64 @@
148
118
 
149
119
  void listq(void){
150
120
 
151
-
121
+ int k,data,j;
122
+
123
+ int a[k];
152
124
 
153
125
  /* キューが空なら"Queue empty!\n"表示 */
154
126
 
155
127
  /* 空じゃない場合は並んでいる個数分データ表示 */
156
128
 
129
+ if(data==0){
130
+
131
+ printf("Queue empty!\n");
132
+
133
+ }
134
+
135
+ else {
136
+
137
+ for(k=0;k<j;k++){
138
+
139
+ printf("%d",a[k]);
140
+
141
+ }
142
+
143
+ printf("\n");
144
+
145
+ }
146
+
157
147
  }
158
148
 
159
149
 
160
150
 
161
151
  int enq(int data){
162
152
 
163
-
153
+ int a[QLEN];
154
+
164
-
155
+ static int j=0;
156
+
165
- /* キューが満杯ならQFULをreturn*/
157
+ //j++;
158
+
166
-
159
+ if(j>=QLEN){
160
+
161
+ return QFUL;
162
+
163
+ }
164
+
165
+ else {
166
+
167
- /* そうでないならキューの最後尾にdataを追加 */
167
+ a[j]=data;
168
+
169
+ return 0;
170
+
171
+ }
172
+
173
+ j++;
168
174
 
169
175
  }
170
176
 
171
-
172
-
173
- int deq(void){
174
-
175
-
176
-
177
- /* キューが空ならQEMPをreturn*/
178
-
179
- /* そうでないならキューの最前列のdataを変数に入れ */
180
-
181
- /* 後続のデータを一つづつ前に移動させ、変数の値をリターンする */
182
-
183
- }
184
-
185
-
186
-
187
- 注:各関数の変数宣言は省略してある
188
-
189
- (提出ファイル名:prog04.c)
190
-
191
- 実行例
192
-
193
- % a.out (右側の注意書きは実際には表示されない)
194
-
195
- 1 = enQ/2 = deQ/else = end ==> 1 ←エンキューをします
196
-
197
- Enter enQ data ==> 1 ←エンキューデータは「1」です
198
-
199
- Queue : 1 ←キューには今エンキューした1のみが入っています
200
-
201
- 1 = enQ/2 = deQ/else = end ==> 1
202
-
203
- Enter enQ data ==> 2 ←エンキューデータは「2」
204
-
205
- Queue : 1 2 ←キューには今エンキューした2が最後尾に入りました
206
-
207
- 1 = enQ/2 = deQ/else = end ==> 1
208
-
209
- Enter enQ data ==> 3
210
-
211
- Queue : 1 2 3
212
-
213
- 1 = enQ/2 = deQ/else = end ==> 1
214
-
215
- Enter enQ data ==> 4
216
-
217
- Queue : 1 2 3 4
218
-
219
- 1 = enQ/2 = deQ/else = end ==> 1
220
-
221
- Enter enQ data ==> 5
222
-
223
- Queue : 1 2 3 4 5 Queue full! ←キューが満杯になりました
224
-
225
- 1 = enQ/2 = deQ/else = end ==> 1
226
-
227
- Enter enQ data ==> 6
228
-
229
- Q full, you should deQ first! ←キューが満杯になった状態で更にエンキューしようとするとメッセージが出ます
230
-
231
- Queue : 1 2 3 4 5 Queue full!
232
-
233
- 1 = enQ/2 = deQ/else = end ==> 2 ←デキューします
234
-
235
- deQ data : 1 ←キューの先頭にいた1が取り出されました
236
-
237
- Queue : 2 3 4 5
238
-
239
- 1 = enQ/2 = deQ/else = end ==> 2
240
-
241
- deQ data : 2
242
-
243
- Queue : 3 4 5
244
-
245
- 1 = enQ/2 = deQ/else = end ==> 2
246
-
247
- deQ data : 3
248
-
249
- Queue : 4 5
250
-
251
- 1 = enQ/2 = deQ/else = end ==> 2
252
-
253
- deQ data : 4
254
-
255
- Queue : 5
256
-
257
- 1 = enQ/2 = deQ/else = end ==> 2
258
-
259
- deQ data : 5 ←5を取り出した時点でキューは空になりました
260
-
261
- Queue empty!
262
-
263
- 1 = enQ/2 = deQ/else = end ==> 2
264
-
265
- Q empty, you should enQ first! ←更にデキューしようとするとメッセージが出ます。
266
-
267
- Queue empty!
268
-
269
- 1 = enQ/2 = deQ/else = end ==> 3 ←終了します。
270
-
271
- %
272
-
273
-
274
-
275
-
276
-
277
- エンキューだけを考えて表示させたいのですが、引数を必要としないvoidの関数で、データを表示することができません。データはenqの関数に入っているのはわかるのですが、それを使ってデータを表示するにはどうすればいいですか?以下が自分のコードです。
278
-
279
- コード
280
-
281
- ```#include <stdio.h>
282
-
283
- #include <stdlib.h>
284
-
285
-
286
-
287
- #define QLEN 5
288
-
289
- #define QEMP -1
290
-
291
- #define QFUL -1
292
-
293
-
294
-
295
- int enq(int);
296
-
297
- //int deq(void);
298
-
299
- void listq(void);
300
-
301
-
302
-
303
- /* キューに使用する配列、その他外部変数の宣言 */
304
-
305
- //int a[QLEN],n,m,r;
306
-
307
-
308
-
309
- int main(){
310
-
311
- int a[QLEN],n,m,r;
312
-
313
- int i;
314
-
315
- while(1){
316
-
317
-
318
-
319
- /* 処理の入力 */
320
-
321
- /* 入力に従って関数を呼ぶ */
322
-
323
- /* なお、enq()の場合は呼ぶ前に引数入力 */
324
-
325
- /* deq()の場合は呼んだ後にデータ出力 */
326
-
327
- /* 終了の場合はexit()を呼ぶ */
328
-
329
- //scanf("%d",&n);
330
-
331
- printf("1 = enQ/2 = deQ/else = end ==>");
332
-
333
- scanf("%d",&n);
334
-
335
- if(n==1){/*エンキューをします*/
336
-
337
- printf(" Enter enQ data ==>");
338
-
339
- scanf("%d",&m);
340
-
341
- r=enq(m);
342
-
343
- printf("Queue :");
344
-
345
- for(i=0;i<QLEN;i++){
346
-
347
- printf("%d",a[i]);
348
-
349
- }
350
-
351
- printf("\n");
352
-
353
- break;
354
-
355
-
356
-
357
- }
358
-
359
- //else if(n==2){/*デキューします*/
360
-
361
- //deq(n);
362
-
363
- // }
364
-
365
- listq();
366
-
367
- if(n!=1 || n!=2){
368
-
369
- exit(0);
370
-
371
- }
372
-
373
177
 
374
178
 
375
-
376
-
377
- }
378
-
379
-
380
-
381
- return 0;
382
-
383
- }
384
-
385
-
386
-
387
- void listq(void){
388
-
389
- int k,data,j;
390
-
391
- int a[k];
392
-
393
- /* キューが空なら"Queue empty!\n"表示 */
394
-
395
- /* 空じゃない場合は並んでいる個数分データ表示 */
396
-
397
- if(data==0){
398
-
399
- printf("Queue empty!\n");
400
-
401
- }
402
-
403
- else {
404
-
405
- for(k=0;k<j;k++){
406
-
407
- printf("%d",a[k]);
408
-
409
- }
410
-
411
- printf("\n");
412
-
413
- }
414
-
415
- }
416
-
417
-
418
-
419
- int enq(int data){
420
-
421
- int a[QLEN];
422
-
423
- static int j=0;
424
-
425
- //j++;
426
-
427
- if(j>=QLEN){
428
-
429
- return QFUL;
430
-
431
- }
432
-
433
- else {
434
-
435
- a[j]=data;
436
-
437
- return 0;
438
-
439
- }
440
-
441
- j++;
442
-
443
- }
444
-
445
-
446
-
447
179
 
448
180
 
449
181