C言語のエンキューの問題の答えと合わない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
鉄火巻

C言語のエンキューの問題の答えと合わない

#1

投稿記事 by 鉄火巻 » 1年前

プログラミング初心者です。

コード:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_QUEUE_LENGTH 11 // キューに用いる配列の⻑さ #define N 50 //乱数の範囲
typedef struct queue {
int array[MAX_QUEUE_LENGTH]; // キューに用いる配列
int front;
int rear;
} Queue;
Queue *init_queue() {
    printf("initialize queue\n");
    Queue *queue = malloc(sizeof(Queue));
    queue->front = 0;
    queue->rear = 0;
    return queue;
}
void print_test(char *line) {
    printf("-------------\n");
    printf("test: %s\n", line);
}
void print_front_and_rear_index(Queue *queue) {
// キューの front と rear を表示する関数
printf("front:%2d, rear:%2d\n", queue->front, queue->rear);
}
void print_queue(Queue *queue) {
}
void enqueue(Queue *queue, int value) { 
}

void enqueue_test_items(Queue *queue, int n) {
    for (int i = 0; i < n; i++) {
        int score = rand() % N;
        enqueue(queue, score);
    }
}
void test_enqueue(Queue *queue) {
    print_test("print empty queue");
    print_queue(queue);
    print_test("enqueue 10 items");
    enqueue_test_items(queue, 10);
    print_test("print queue");
    print_queue(queue);
    print_test("enqueue a item to full queue");
    enqueue(queue, -1);
}
int main(void) {
srand((unsigned)time(NULL)); // 乱数の初期化 Queue *queue = init_queue(); // キューの初期化 
test_enqueue(queue);
}

実行結果

initialize queue
-------------
test: print empty queue
queue is empty
-------------
test: enqueue 10 items
enqueue: 8
enqueue: 44
enqueue: 39
enqueue: 34
enqueue: 33
enqueue: 16
enqueue: 32
enqueue: 49
enqueue: 34
enqueue: 36
-------------
test: print queue
queue[ 0]: 8
queue[ 1]: 44
queue[ 2]: 39
queue[ 3]: 34
queue[ 5]: 16
queue[ 6]: 32
queue[ 7]: 49
queue[ 8]: 34
queue[ 9]: 36
-------------
test: enqueue a item to full queue


上の雛形を用いてリングバッファによるキューに対して,エンキューする関数 enqueue を実装せよ.
との問題なのですが自分が書いたプログラミングだと実行結果のqueueとenqueueの値が同じになりません
色々試してみたのですが理由がわからないのでどうすれば良いかを教えてもらいたいです。
自分が書いたプログラミングは下に置いておきます

コード:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_QUEUE_LENGTH 11
#define N 50 

typedef struct queue {
int array[MAX_QUEUE_LENGTH]; 
int front;
int rear;
} Queue;

Queue *init_queue() { 
    printf("initialize queue\n");
    Queue *queue = malloc(sizeof(Queue));
    queue->front = 0;
    queue->rear = 0;
    return queue;
}
void print_test(char *line) {
    printf("-------------\n");
    printf("test: %s\n", line);
}
void print_front_and_rear_index(Queue *queue) {
printf("front:%2d, rear:%2d\n", queue->front, queue->rear);
}

void print_queue(Queue *queue) {
if (queue->front == queue->rear) {
        printf("queue is empty\n");
    } else {
        for (int i = queue->front; i % MAX_QUEUE_LENGTH != queue->rear; i++) {
 printf("queue[%2d]: %2d\n", i % MAX_QUEUE_LENGTH,queue->array[i % MAX_QUEUE_LENGTH]);
}
  }
  }
void enqueue(Queue *queue, int value) {
  for(int i = 0;i < 10; i++) {
  queue->array[i] = value;
    }
   queue->rear = 10;
}
void enqueue_test_items(Queue *queue, int n) {
    for (int i = 0; i < n; i++) {
      int score = rand() % N;
      printf("enqueue: %d\n", score);
      enqueue(queue, score);
    }
}
void test_enqueue(Queue *queue) {
    print_test("print empty queue");
    print_queue(queue);
    print_test("enqueue 10 items");
    enqueue_test_items(queue, 10);
    print_test("print queue");
    print_queue(queue);
    print_test("enqueue a item to full queue");
    enqueue(queue, -1);
}
int main(void) {
srand((unsigned)time(NULL));
Queue *queue = init_queue();
test_enqueue(queue);
}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語のエンキューの問題の答えと合わない

#2

投稿記事 by みけCAT » 1年前

enqueue 関数で10個の要素を書き換えているので、これまでにエンキューしたデータが破壊されていますね。
enqueue 関数でするべきことは
1. queue->rear が指している要素1個だけを与えられた value に更新する
2. queue->rear の値を更新する
です。
また、38行目に全角スペースがあるため、このままでは実行できない環境があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: C言語のエンキューの問題の答えと合わない

#3

投稿記事 by box » 1年前

https://okwave.jp/qa/q10086024.html
に対する回答にも、適切にレスポンスを返してくださいね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

鉄火巻

Re: C言語のエンキューの問題の答えと合わない

#4

投稿記事 by 鉄火巻 » 1年前

ありがとうございます!
アドバイス通りにやってみます!

naohiro
記事: 8
登録日時: 2年前

Re: C言語のエンキューの問題の答えと合わない

#5

投稿記事 by naohiro » 1年前

あなたが遭遇している問題は、enqueue関数の実装に起因する論理エラーである可能性が高いです。enqueue関数は、キューの末尾に要素を追加することに責任がありますが、現在の実装はキューのrearとfrontポインタを適切に更新していないようです。

enqueue関数を実装する方法の例を以下に示します。

コード:

void enqueue(Queue *queue, int value) {
    if ((queue->rear + 1) % MAX_QUEUE_LENGTH == queue->front) {
        // キューがいっぱいです。
        printf("エラー:キューはいっぱいです\n");
        return;
    }
    queue->array[queue->rear] = value;
    queue->rear = (queue->rear + 1) % MAX_QUEUE_LENGTH;
}
この実装では、enqueue関数は、次のrearインデックス((queue->rear + 1) % MAX_QUEUE_LENGTH)とfrontインデックスを比較してキューがいっぱいかどうかを確認します。キューがいっぱいの場合、関数は終了し、エラーメッセージを表示します。キューがいっぱいでない場合、enqueue関数は値を現在のrearインデックスに追加し、rearインデックスを次の位置に更新します(queue->rear = (queue->rear + 1) % MAX_QUEUE_LENGTH)。

また、print_queueを実装する必要もあります。

コード:

void print_queue(Queue *queue) {
    int i = queue->front;
    while (i != queue->rear) {
        printf("%d ", queue->array[i]);
        i = (i+1) % MAX_QUEUE_LENGTH;
    }
}

返信

“C言語何でも質問掲示板” へ戻る