キューのプログラムのif文の動きがわからない

このQ&Aのポイント
  • キューのプログラムのif文でわからないところがあります。if文に入った場合、Frontをインクリメントして、その値がMAX_BUF_NUMと同じになったらFrontに0を入れることを目指しています。
  • 現在のプログラムでは、if文に入った場合にFrontをインクリメントし、その後にMAX_BUF_NUMの大小を判定しています。MAX_BUF_NUMが24の場合、FrontがMAX_BUF_NUMより大きくなるとFrontに0が代入されます。
  • ただし、現在のプログラムではMAX_BUF_NUMに等しい場合にFrontに0が代入されることはありません。したがって、目的に合わせてif文の条件を修正する必要があります。
回答を見る
  • ベストアンサー

キューのプログラムのif文でわからないところが

いま、キューのプログラムを見ていてわからないところがあるのですが、 void IncBuf() { if(++Front >= MAX_BUF_NUM){Front = 0;} } このif文の場合、どのような動きをするのかが正直わかりません。 MAX_BUF_NUMは24なのですが、 この場合、if文に入るとFrontをインクリメントして、そのあとにMAX_BUF_NUMの大小を判定するという感じでしょうか? ・私がやりたいのは、if文に入ったら、Frontをまずインクリメントして、その値がMAX_BUF_NUMと同じになったら、Frontに0を入れたい という感じでつくってみたのですが、これであっているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • 6yemon
  • ベストアンサー率69% (25/36)
回答No.1

あってます。

techhouse
質問者

お礼

回答頂きありがとうございました。 大変申し訳ありません。MAX_BUF_NUMが”24”ではなく”32”にしていたから変な動きをしたことがわかりました。 超勘違い。重ねて申し訳ありません。

関連するQ&A

  • 6バイトを1フレームとして4つまで格納するキューでは25バイトキューは必要?

    いま、PICマイコンの12F683のためにこれを作っているのですが、使い方としては6バイトのデータを1つのフレームとして受信できたら、それをキューに入れていこうと思っているのですが、最大4フレームまでストックできるようにしたいと思っていて、いっぱいになったらUARTで1フレームずつ出力するつもりです。 6バイトを4フレームなのでMAX_BUF_NUMは”24”に設定したのですが、これをやると今のプログラムは4フレーム目を格納しようとした時に、最後のバイトが格納できなくなってしまうことがわかり”25”としているのですが、24 + 1としなければいけないのでしょうか? int CountQueue() { if(Head <= Tail) return(Tail - Head); else return((MAX_BUF_NUM - 1) - Head + Tail); } void enqueue(BYTE x) { Tail=(Tail+1)%MAX_BUF_NUM; /*添え字の循環*/ if(Tail==Head){ QueueState = QSTATE_FULL; return; } UartSendBuf[Tail]=x; if(CountQueue()==(MAX_BUF_NUM-1)){ QueueState = QSTATE_FULL; } return; } BYTE dequeue(void) { BYTE x; if(Head==Tail){ QueueState = QSTATE_EMPTY; return; } Head=(Head+1)%MAX_BUF_NUM; x=UartSendBuf[Head]; UartSendBuf[Head]=0x00; //出力し終わったら0x00でクリアしておく。 return x; }

  • エンキューとデキューの操作関数

    エンキューとデキューの操作関数なのですが、 どのような考え方なのかがいまいちわからず困っています。 どなたか解説お願いします。 int QueueEnque(Queue *q, int x) { if(q->num >= q->max){ return (-1); }else{ q->num++; q->que[q->front++] = x; if(q->front == q->max){ q->front =0; } if(q->num ==1){ q->rear--; if(q->rear == -1){ q->rear = q->max-1; } } return (0); } } int QueueDeque(Queue *q, int *x) { if(q->num <= 0){ return (-1); }else{ q->num--; q->rear++; if(q->rear == q->max){ q->rear =0; } *x = q->que[q->rear]; if(q->num ==0){ q->front =q->rear; } return (0); } } キューを実現する構造体がこのようになっています。 typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ int *que; /* キュー(の先頭要素へのポインタ) */ } Queue;

  • コンパイルエラー

    前に質問したものですが、ちょっとソースをいじりました。 ファイルから読み込んだデータ文字列をキゅーにエンキゅーしたりできゆーしたりするプログラムを作っています。 コンパイルできて実行できました。 でもエンキューとデキューが実行されてません。 次のソースのうちどこを変えたらいいか教えてください #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMBER 100 /*--- キューを実現する構造体 ---*/ typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ char (*que)[NUMBER]; /* キュー(の先頭要素へのポインタ) */ } Queue; /*--- キューの初期化 ---*/ int QueueAlloc(Queue *q, int max) { q->num = q->front = q->rear = 0; if ((q->que = calloc(max*20, sizeof(char))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return (-1); } q->max = max; return (0); } //--- キューの後始末 --- void QueueFree(Queue *q) { if (q->que != NULL) { free(q->que); // 配列を解放 q->max = q->num = q->front = q->rear = 0; } } /*--- キューにデータをエンキュー ---*/ int QueueEnque(Queue *q, char *buffer) { if (q->num >= q->max) return (-1); /* キューは満杯 */ else { q->num++; strcpy(q->que[q->rear++] ,&buffer[0]); if (q->rear == q->max) q->rear = 0; return (0); } } /*--- キューからデータをデキュー ---*/ int QueueDeque(Queue *q, char *buffer) { if (q->num <= 0) /* キューは空 */ return (-1); else { q->num--; strcpy(&buffer[0],q->que[q->front++]); if (q->front == q->max) q->front = 0; return (0); } } /*--- キューの大きさ ---*/ int QueueSize(const Queue *q) { return (q->max); } /*--- キューに蓄えられているデータ数 ---*/ int QueueNo(const Queue *q) { return (q->num); } /*--- キューは空か ---*/ int QueueIsEmpty(const Queue *q) { return (q->num <= 0); } /*--- キューは満杯か ---*/ int QueueIsFull(const Queue *q) { return (q->num >= q->max); } int main(void) { int i=0,j=0,ret; char buffer[20]; FILE *fpin; Queue que; double ab,ac; char aa[10]; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く if (QueueAlloc(&que, 100) == -1) { puts("キューの確保に失敗しました。"); return (1); } while (1) { int m, x; printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que)); printf("(1) エンキュー (2) デキュー (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: if(fgets(&buffer[0],sizeof(buffer),fpin) ==NULL) { puts("もう読み込むデータがありません"); goto END; } printf("データ:%s",&buffer[0]); if (QueueEnque(&que, buffer) == -1) puts("データのエンキューに失敗しました。"); break; case 2: if (QueueDeque(&que, buffer) == -1) puts("デキューできません。"); else { printf("デキューしたデータは%d。\n", &buffer[0]); break; } } } END: QueueFree(&que); fclose(fpin); return (0); }

  • キゅー

    ファイルから読み込んだデータ文字列をキゅーにエンキゅーしたりできゆーしたりするプログラムを作っています。 もう少しで完成なんですがちょっとエラーでます。 次のソースのうちどこを変えたらいいか教えてください プラグラム #include <stdio.h> #include <stdlib.h> #include <string.h> /*--- キューを実現する構造体 ---*/ typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ char (*que)[100]; /* キュー(の先頭要素へのポインタ) */ } Queue; /*--- キューの初期化 ---*/ int QueueAlloc(Queue *q, int max) { q->num = q->front = q->rear = 0; if ((q->que = calloc(max*20, sizeof(char))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return (-1); } q->max = max; return (0); } //--- キューの後始末 --- void QueueFree(Queue *q) { if (q->que != NULL) { free(q->que); // 配列を解放 q->max = q->num = q->front = q->rear = 0; } } /*--- キューにデータをエンキュー ---*/ int QueueEnque(Queue *q, char *buffer)) { if (q->num >= q->max) return (-1); /* キューは満杯 */ else { q->num++; strcpy(q->que[q->rear++] ,&buffer[0]); if (q->rear == q->max) q->rear = 0; return (0); } } /*--- キューからデータをデキュー ---*/ int QueueDeque(Queue *q, char *buffer)) { if (q->num <= 0) /* キューは空 */ return (-1); else { q->num--; strcpy(&buffer[0],que[q->front++); if (q->front == q->max) q->front = 0; return (0); } } /*--- キューの大きさ ---*/ int QueueSize(const Queue *q) { return (q->max); } /*--- キューに蓄えられているデータ数 ---*/ int QueueNo(const Queue *q) { return (q->num); } /*--- キューは空か ---*/ int QueueIsEmpty(const Queue *q) { return (q->num <= 0); } /*--- キューは満杯か ---*/ int QueueIsFull(const Queue *q) { return (q->num >= q->max); } int main(void) { int i=0,j=0,ret; char buffer[20]; FILE *fpin; Queue que; double ab,ac; char aa[10]; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く if (QueueAlloc(&que, 100) == -1) { puts("キューの確保に失敗しました。"); return (1); } while (1) { int m, x; printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que)); printf("(1) エンキュー (2) デキュー (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: if(fgets(&buffer[0],sizeof(buffer),fpin) ==NULL) { puts("もう読み込むデータがありません"); goto END; } if(j>=NUMBER)//読み込む人数がNUMBERを超えてる時の処理 { puts("人数が100人を超えています"); goto END; } j++; printf("データ:%s",&buffer[0]); if (QueueEnque(&que, buffer) == -1) puts("データのエンキューに失敗しました。"); break; case 2: if (QueueDeque(&que, buffer) == -1) puts("デキューできません。"); else { printf("デキューしたデータは%d。\n", &buffer[0]); break; } } } END: QueueFree(&que); fclose(fpin); return (0); } 多分int QueueEnque(Queue *q, char *buffer))と int QueueDeque(Queue *q, char *buffer))の()の中が適切じゃないかも。宣言構文のエラーと出るので。

  • javaプログラムについて

    コマンドライン引数から複数の値を受け取り、それらの最大と最小を表示する、というプログラムなのですが。 class Maxmin{   public static void main (String[] args) {    int max=Integer.MIN_VALUE;    int min=Integer.MAX_VALUE;    for (int i=0; i<args.length; i++){     int num= Integer.parseInt(args[i]);     if(num>max)     max=num;     if(num<min)     min=num;    }    System.out.println("最大値は" + max + "です。");    System.out.println("最小値は" + min + "です。");  } } このプログラムでも問題なく表示されるのですが、MIN_VALUEとMAX_VALUEを使用せずに表示する事、と指摘を受けました。自分の中でぱっと思いついたのがこれだったのですが、他にはどのような方法があるのでしょうか?

    • ベストアンサー
    • Java
  • このプログラムの問題点を教えてください。

    //数独 #include <iostream.h> const int num_Max = 100; //一辺のマス最高値 void input_data( int a, int [num_Max][num_Max] ); //入力関数 void yoko_data( int a, const int [100][100], int & ); //判定 void tate_data( int a, const int [100][100], int & ); void block_data( int a, int b, const int [100][100], int & ); main() { int num; //一辺のマスの数 int m; //一ブロックの一辺にあるマスの数 int okey; //numが正常か判別 int dx, dy, dz; int masu[num_Max][num_Max]; //全部のマス cout << "\n埋められた数独が正しいかどうか判断するプログラムです。\n"; while(1){ cout << "横何マスありますか? (4-100)>>" ; cin >> num ; if( num > num_Max || num < 4){ cout <<"範囲外です。再入力して下さい。" ; }else{ m = sqrt( num ); okey = num - m * m; if(okey != 0) cout << "その数字は数独として成り立ちません。再入力して下さい。"; } } //マスの入力 input_data( num, masu ); //横判定 yoko_data( num, masu, dx ); if(dx = 0){ //縦判定 tate_data( num, masu, dy ); if(dy = 0){ //マス判定 block_data( num, m, masu, dz ); } } if(dx == dy == dz == 0) cout <<"\n大正解♪ おめでっとー。\n"; return 0; } //入力 void input_data( int kazu, const int matrix[num_Max][num_Max]) { cout <<"\nマスの数字の入力を左上から順に、右へと行って下さい。"; for(int i = 0; i < kazu; i++){ for(int j = 0; j < kazu; j++){ cout << i+1 << "行目の" << j+1 << "列目 >>"; cin >> matrix[i][j] ; } } } //横列(行)を順に判定 void yoko_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vx = 0; //かぶっていたと判定されたかどうかを見る用 for(int i = 0; i < kazu; i++){ //横一列取り出しました。 for(int j = 0; j < kazu; j++){ for( int k = 1; j+k < kazu; k++){ kaburi = matrix[i][j] - matrix[i][j+k]; if(kaburi == 0){ //かぶってたらループから抜け出す vx++; break; } } } } if(vx > 0) cout << "\n横列(行)検索時に不適切な部分を発見しました。\n"; return vx; } //縦列(列)を順に判定 void tate_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vy = 0; //かぶっていたと判定されたかどうかを見る用 for(int j = 0; j < kazu; j++){ //縦一列取り出しました。 for(int i = 0; i < kazu; i++){ for( int k = 1; k < kazu-1; k++){ kaburi = matrix[i][j] - matrix[i+k][j]; if(kaburi == 0){ //かぶってたらループから抜け出す vy++; break; } } } } if(vy > 0) cout << "\n縦列(列)検索時に不適切な部分を発見しました。\n"; return vy; } //1ブロックごとに判定 void block_data( int kazu, int ruto, int matrix[num_Max][num_Max]) { int hantei[num_Max][num_Max] ; //判定する部分を切り出す用 int kaburi; int vz; //まずブロックごとに切り出してみる for(int i = 0; i < ruto-1; i++){ for(int j = 0; j < ruto-1; j++){ int h = 0; //何ブロック目か int g = 0; //そのブロックの何個目か (h-1)++; for(int l = 0; l < ruto-1; l++){ for(int k = 0; k < ruto-1; k++){ hantei[h][g++] = matrix[i * m + k][j * m + l]; } } } } //かぶっているか判定する for(int x = 0; x < kazu; x++){ for(int y = 0; y < kazu; y++){ for( int z = 1; z < kazu-1; z++){ kaburi = hantei[x][y] - matrix[x+z][y]; if(kaburi == 0){ //かぶってたらループから抜け出す vz++; break; } } } } return vz; } C++で作成したものです。 コンパイルエラーが出てしまうのですが、原因を教えていただけませんか?

  • while文とif文

    #include <stdio.h> void main() { char str[2][6] = {"hello","lop"}; int i = 0; while(i < 2){ printf("%s\n", str[i++]); } } 上のプログラムの条件判定の部分にif文を つかうとhelloという文字列しか出力されず while文を使うとhelloとlop 二つ出力され ます。上の条件判定のif文にした時ととwhile 文にした時の違いはどこなのでしょうか?? どなたかご教授よろしくお願いしますm(_ _)m

  • if文で困っています。

    define A 5 void main(void) int i; scanf("%d", &i); if (i <= A){ このような形をつくったのですが、if文のところで質問があります。 「数字をいくつか入力し、その入力したデータ数が5つより少ないときに・・・」というようなプログラムにしたいのですが、この場合、「入力した数値が5.0以下であるときに・・・」というプログラムになっているのではないかと、困っています。どちらが正しいのでしょうか?

  • if文を条件演算子に書き換えについて・・・

    /* 読み込んだ三つの整数値の最大値を求めて表示 */ #include <stdio.h> int main(void) { int n1, n2, n3, max; puts("三つの整数を入力してください。"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); printf("整数3:"); scanf("%d", &n3); max = n1; if (n2 > max) max = n2; if (n3 > max) max = n3; printf("最大値は%dです。\n", max); return (0); } 上記のソースコードを、条件演算子を用いた形にするという問題なのですが、初心者で理解しずらいところもありどうやっても同じ結果を出すことが出来ないため質問させていただきました。 ご教授お願いしますm(_)m

  • VC2005においてif文が正しく評価されない

    環境: WindowsXP SP2 VC2005 下記ソースをデバッグしています(F10によるステップ実行)。 if文の直前で変数aの値を-1など、0未満へ変更し、 そのままステップ実行しても、なぜかif文の中に入りません。 本来であれば、-1は0未満であるため、if文の判定は真と判定 されるべきであると思います。 個人的に「a = b - c」の式が悪さをしているのではないかなと 考えています。 なぜこのような現象が起こるのでしょうか? int main(void) { long a = 0; long b = 2; long c = 1; a = b - c; if( a < 0 ){ return 0; } }

専門家に質問してみよう