プロが教える店舗&オフィスのセキュリティ対策術

大学一年で習うプログラミングです。
問題は、「1を入力したらエンキュー、2を入力したらデキュー、3を入力したらキューの中身を表示して終了するプログラムを作成せよ。」です。大体の形はできたのであと少しです。
#include<stdio.h>
int main(void) {
int i, j, k, l, num1, num2;
j = 0;
k = 0;
int num[10] = { 0 };
for (i = 0; i > -1; i++) {
printf("操作を入力してください:1-enqueue,2-dequeue,3-表示");
scanf_s("%d", &num1);
printf("%d\n", num1);
if (num1 == 1) {
printf("enqueueする整数を入力してください:");
scanf_s("%d", &num2);
printf("%d\n", num2);
num[j] = num2; j++;
}
else if (num1 == 2) {
printf("dequeue:%d\n", num[k+1]);
num[k] = 0; k++;
}
else if (num1 == 3) {
printf("キュー数:%d,{", j - k);
for (l = 0; l < j - k; l++) {
printf("%d", num[l+(j-k)]);
}
printf("}\n");
break;
}
}
return 0;
}

num[l+(j-k)]この計算が間違っているそうなので、この部分の訂正をおねがいします。
また、デキューするとkが増えることも考慮して作成しろとのことです。
よろしくお願いします。

A 回答 (3件)

キューが入っていない状態が「0」であるとしてコメントします。

あと、デキューは、一番古いキューの値を出力することだとします。

(1)エンキューに関して
新しいキューを配列のゼロ番目に入れるようにしたほうがいいと思います。つまり、配列の番号が大きいほど古いキューが入るようにします。そのために、キューが入力されたら、先にキューをひとつずつずらしてゼロ番目を空けて、そこに新しいキューを入れるんです。もちろん、配列をズラす向きを逆にして、配列の9番目に新しいキューを入れるようにしてもいいです。

(2)デキューに関して
(1)のような方式でキューを格納したなら、9番目から順番に「0」かどうか見ていきます。「0」でないキューが見つかったらその値を出力(表示)して、そのキューが入っていたところには「0」を入れる。

(3)キューの表示に関して
単に配列に格納されているキュー(数字)を順番に表示すればいいです。新しい順か古い順かは適宜決めましょう。
    • good
    • 0

enqueue を11回以上行う場合の考慮が無い


enqueue より dequeue した回数が多い場合の考慮が無い
dequeue で取り出す値の位置を間違えている
num 配列の中で表示すべき範囲は k 以上 j 未満

プログラムを終える手段が無いのは不便です
重要な変数には他と混同しない名前と付けましょう
コメントで変数に説明をつけると更に良いです
    • good
    • 0

まず本題と関係ないところを突っ込んでおく.


for (i = 0; i > -1; i++)
って何したいの?

本題としては
キューの動作を図にすればわかる話
でしかない. もっとも
for (l = 0; l < j - k; l++) {
printf("%d", num[l+(j-k)]);
}
の部分はちょっと考えれば
何かがおかしい
ことに気付いていいはず.

あと, 全体的に
変数名にはもっと頭を使うべき
だと思うな.

「また、デキューするとkが増えることも考慮して作成しろ」は
具体的にはなにをどう考慮しろ
といっているのかなぁ.
    • good
    • 0
この回答へのお礼

知識不足で申し訳ありません。プログラムを作成していただければあいがたいです。

お礼日時:2019/07/17 02:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!