質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1547閲覧

c言語のキューの実装について

mtgjp

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/06/18 11:22

編集2020/06/19 05:34

前提・実現したいこと

c言語でキューの実装の課題なのですが、エラーが出てしまいます

発生している問題・エラーメッセージ

学校のテスト用のランダムな入力とチェックで出たエラーです。コンパイルは通ります。
残念!入力
push o
pop
push a
pop
push u
push y
push z
pop
push c
push k
pop
pop
pop
push v
pop
pop
push y
push w
pop
push r
push h
push z
pop
push w
push y

に対して、
[y, r, h, w, y]
oazkcyvuwz
と出力すべきところを、
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
Unknown command.
[]

と出力した

該当のソースコード

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5#define MAX_BUF_SIZE 1024 6 7#define QUEUESIZE 128 8typedef char elementtype; 9 10typedef struct { 11 int front, rear; 12 elementtype elements[QUEUESIZE]; 13} queue; 14 15void initqueue(queue *q) 16{ 17q->front = q->rear = 0; 18} 19 20int queueempty(queue *q) 21{ 22 // ここを埋める。 23return q->front == q->rear; 24} 25 26void printqueue(queue *q) 27{ 28 // ここを埋める。 29 int i; 30 printf("["); 31 for(i = q->front; i < q->rear-1 ; i++){ 32 printf("%c, ",q->elements[i]);} 33 printf("%c",q->elements[q->rear-1]); 34 printf("]"); 35 printf(""); 36 printf("\n") 37} 38 39void putq(queue *q, elementtype x) 40{ 41 // ここを埋める。 42q->elements[q->rear] = x; 43 q->rear++; 44 if(q->rear >= QUEUESIZE){ 45 q->rear = 0; 46} 47 if(q->rear == q->front){ 48 printf("queue overflow"); 49 exit(1); 50 } 51} 52 53elementtype getq(queue *q) 54{ 55 // ここを埋める。 56elementtype x; 57 if(q->front == q->rear){ 58 printf("queue underflow"); 59  exit(1); 60 }else{ 61 x = q->elements[q->front]; 62 q->front++; 63 if(q->front >= QUEUESIZE){ 64 q->front = 0; 65 } 66 return x; 67 } 68} 69 70void test(void) 71{ 72 elementtype x; 73 queue q; 74 char buf[MAX_BUF_SIZE], str[MAX_BUF_SIZE]; 75 int n = 0; 76 77 initqueue(&q); 78 79 while(fgets(buf, MAX_BUF_SIZE, stdin) != NULL){ 80 if (strncmp(buf, "putq ", 5) == 0){ 81 // putq 82 x = buf[5]; // 6文字目が要素 83 putq(&q, x); 84 continue; 85 if (strncmp(buf, "getq", 4) == 0){ 86 // getq 87 x = getq(&q); 88 str[n] = x; 89 n++; 90 continue; 91 } 92 printf("Unknown command.\n"); 93 } 94 95 } 96 97 printqueue(&q); 98 99 for(int i = 0; i < n; i++){ 100 printf("%c", str[i]); 101 } 102 printf("\n"); 103} 104 105int main(void) 106{ 107 test(); 108 109 return 0; 110} 111

試したこと

試したことではないですが、テスト用の関数(test(void))の`while文の条件に引っかかってしまっているような気がします

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/06/18 13:02

そのテスト用データは本当に「キュー用」なのでしょうか。LIFOなスタック用のデータに見えます。 提示されているプログラム(おそらく、途中までは先生が書いたもの)では、enqueue用のトークンに「putq」(「putq a」のように使用)、dequeue用のトークンに「getq」を使うように書かれていますね。すると、テスト用データも、 ---------- putq o getq putq a getq ------------ みたいなのが、スタック用とは別に用意されているはずなのですが。
退会済みユーザー

退会済みユーザー

2020/06/18 22:32

C# は関係ない C の話ですよね? であれば C# のタグは外してください。
gentaro

2020/06/19 02:33

学校の課題の質問は非推奨事項です。 https://teratail.com/help/avoid-asking 「何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。」 先生に聞きましょう。
guest

回答1

0

ベストアンサー

貼ってあるコードは先生が提示したテンプレートがベースになってますね?まずは私が直したコードを貼っておきます。

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5#define MAX_BUF_SIZE 1024 6 7#define QUEUESIZE 128 8typedef char elementtype; 9 10typedef struct { 11 int front, rear; 12 elementtype elements[QUEUESIZE]; 13} queue; 14 15void initqueue(queue *q) 16{ 17q->front = q->rear = 0; 18} 19 20int queueempty(queue *q) 21{ 22 // ここを埋める。 23return q->front == q->rear; 24} 25 26void printqueue(queue *q) 27{ 28 // ここを埋める。 29 int i; 30 printf("["); 31 for(i = q->front; i < q->rear-1 ; i++){ 32 printf("%c, ",q->elements[i]);} 33 printf("%c",q->elements[q->rear-1]); 34 printf("]"); 35 //printf(""); 36 printf("\n"); 37} 38 39void putq(queue *q, elementtype x) 40{ 41 // ここを埋める。 42q->elements[q->rear] = x; 43 q->rear++; 44 if(q->rear >= QUEUESIZE){ 45 q->rear = 0; 46} 47 if(q->rear == q->front){ 48 printf("queue overflow"); 49 exit(1); 50 } 51} 52 53elementtype getq(queue *q) 54{ 55 // ここを埋める。 56elementtype x; 57 if(q->front == q->rear){ 58 printf("queue underflow"); 59 exit(1); 60 }else{ 61 x = q->elements[q->front]; 62 q->front++; 63 if(q->front >= QUEUESIZE){ 64 q->front = 0; 65 } 66 return x; 67 } 68} 69 70void test(void) 71{ 72 elementtype x; 73 queue q; 74 char buf[MAX_BUF_SIZE], str[MAX_BUF_SIZE]; 75 int n = 0; 76 77 initqueue(&q); 78 79 while(fgets(buf, MAX_BUF_SIZE, stdin) != NULL){ 80 if (strncmp(buf, "push ", 5) == 0){ 81 // putq 82 x = buf[5]; // 6文字目が要素 83 putq(&q, x); 84 continue; 85 if (strncmp(buf, "pop", 3) == 0){ 86 // getq 87 x = getq(&q); 88 str[n] = x; 89 n++; 90 continue; 91 } 92 printf("Unknown command.\n"); 93 } 94 95 } 96 97 printqueue(&q); 98 99 for(int i = 0; i < n; i++){ 100 printf("%c", str[i]); 101 } 102 printf("\n"); 103} 104 105int main(void) 106{ 107 test(); 108 109 return 0; 110}

test関数の中にgetq, putqと文字列比較するところがあったのでpush, popに直しました。セミコロンがない行があったので足しておきました。全角スペースがあったので半角スペースに直しておきました。

さて、ここからです。

私が直したプログラムは動きましたか?それでは本題です。プログラムを動かすとカーソルが止まったままになります。ここでCtrl + Dを押すとプログラムが終了します。

次に、push aを入力してエンター、Ctrl + Dを押します。すると[a]と表示されます。どうやらpushは正しいみたいですね。

では次にpush aを入力してエンター、popを入力してエンター、Ctrl + Dを押します。すると[a]と表示されます。popはまだ正しく動作しないみたいですね。

最後にもうひとつ。プログラムを起動した後にpopを入力します。このとき何が起きると思いますか?空のキューをポップするのでエラーが発生するはずです。

このようなことに気をつけてデバッグをがんばってみてください。私からは以上です。

投稿2020/06/18 11:43

anndonut

総合スコア667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mtgjp

2020/06/18 12:28

修正とヒントありがとうございます!頑張ります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問