ショッピングモール  Fiction ( Biblical )  Fiction ( Historical )  Fiction ( Mystery )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5104

キュー
投稿者---城宇都(2005/12/14 20:11:08)


5つの領域があるキューにi or Iで値を入れる、o or Oで
値を取り出す、d or Dでキューの中身を表示させる、e or Eで
終了させるというのを作ってみたんですが、なぜか5つ値を入れる
ことができません・・・
どなたかご教授ください。


作ってみたやつです
   ↓
#include<stdio.h>
#define MAXSIZE 5
int queuein(int n);
int queueout(int *n);
int queue[MAXSIZE];
int head = 0,
    tail = 0;
void main(void)
{
   int c,n,i;
   printf(">");
   while((c=getchar())!=EOF)
   {
     rewind(stdin);
     if(c=='i' || c=='I')
     {
       printf("data--> ");
       scanf("%d",&n);
       rewind(stdin);
       if(queuein(n)==-1)
       {
        printf("待ち行列が一杯です。\n");
       }
     }
     if(c=='o' || c=='O')
     {
        if(queueout(&n)==-1)
          printf("待ち行列は空です。\n");
        else
          printf("queue data --> %d\n",n);
     }
     if(c=='e' || c=='E')
        break;
     if(c=='d' || c=='D')
     {
       if(head != tail)
        {
         printf("<通常>\n");
         for(i=0;i<=4;i++)
          {
          printf("%d:[%d]",i,queue[i]);
          if(i==head)
           {
           printf("<---head\n");
           }
          else
          if(i==tail)
           {
           printf("<---tail\n");
           }
          else
           {
           printf("\n");
           }
          }
        }
       else
        {
         printf("<空>\n");
         printf("待ち行列は空です。\n");
        }
     }
    printf(">");
   }
}

int queuein(int n)
{
     if((tail+1)%MAXSIZE != head)
      {
        queue[tail]=n;
        tail++;
        if(tail==MAXSIZE)
         tail=0;
        return(0);
      }
      else
       return(-1);
}

int queueout(int *n)
{
     if(tail != head)
      {
        *n=queue[head];
        head++;
        if(head==MAXSIZE)
         head=0;
        return(0);
      }
      else
        return(-1);
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:キュー 5105 REE 2005/12/14 21:17:25


No.5105

Re:キュー
投稿者---REE(2005/12/14 21:17:25)


>5つの領域があるキューにi or Iで値を入れる、o or Oで
>値を取り出す、d or Dでキューの中身を表示させる、e or Eで
>終了させるというのを作ってみたんですが、なぜか5つ値を入れる
>ことができません・・・
>どなたかご教授ください。

空の時、1つ入っている時、5つ入れた時の
headとtailの関係を確認してみましょう。



この投稿にコメントする

削除パスワード

No.5106

Re:キュー
投稿者---城宇都(2005/12/14 22:33:54)


>空の時、1つ入っている時、5つ入れた時の
>headとtailの関係を確認してみましょう。

5つ入れた時はheadが0、tailも0になるので
別に待ち行列に何も入ってないわけではないから
if(head != tail)←これが矛盾してるってことに
なるわけでしょうか?
じゃあif文をどういうふうにしたらいいんだろ・・・




この投稿にコメントする

削除パスワード

No.5108

Re:キュー
投稿者---まきじ(2005/12/14 23:53:26)


>rewind(stdin);

の動作は未定義です。
scanf("%c%*c",&c); で改行を読み捨てられます。

>if((tail+1)%MAXSIZE != head)

tail が 4 の時 (tail+1)%MAXSIZE は 0 で head と等しいからです。

最初 head は -1 で tail は 0 にしとき
tail%MAXSIZE != head のとき queue[tail] に値を
追加し head を 0 にして tail を進める。


この投稿にコメントする

削除パスワード

No.5112

Re:キュー
投稿者---REE(2005/12/15 10:21:25)


>>空の時、1つ入っている時、5つ入れた時の
>>headとtailの関係を確認してみましょう。
>
>5つ入れた時はheadが0、tailも0になるので
>別に待ち行列に何も入ってないわけではないから
>if(head != tail)←これが矛盾してるってことに
>なるわけでしょうか?
>じゃあif文をどういうふうにしたらいいんだろ・・・

つまり、head=tailのとき、
データが空なのか5つ入っているのか区別がつかないわけです。

headとtailだけで、全てをあらわそうとせずに、
現在のデータ数を保持する別の変数を用意すれば簡単になります。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity