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

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

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

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

解決済

2回答

2332閲覧

キューについて

ikuo-biyori

総合スコア56

C

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

1グッド

0クリップ

投稿2016/10/16 22:43

編集2016/10/16 23:22

いつもお世話になっています。キューについて質問させていただきます。
エンキューだけを考えて表示させたいのですが、listqの関数でキューの中身を表示させる方法がわかりません。引数がvoidでもデータを受けとり、キューの中身を表示できるものなのでしょうか?
以下がコードです。```C言語
コード

#include <stdio.h> #include <stdlib.h> #define QLEN 5 #define QEMP -1 #define QFUL -1 int enq(int); //int deq(void); void listq(void); /* キューに使用する配列、その他外部変数の宣言 */ //int a[QLEN],n,m,r; int main(){ int a[QLEN],n,m,r; int i; while(1){ /* 処理の入力 */ /* 入力に従って関数を呼ぶ */ /* なお、enq()の場合は呼ぶ前に引数入力 */ /* deq()の場合は呼んだ後にデータ出力 */ /* 終了の場合はexit()を呼ぶ */ //scanf("%d",&n); printf("1 = enQ/2 = deQ/else = end ==>"); scanf("%d",&n); if(n==1){/*エンキューをします*/ printf(" Enter enQ data ==>"); scanf("%d",&m); r=enq(m); printf("Queue :"); for(i=0;i<QLEN;i++){ printf("%d",a[i]); } printf("\n"); break; } //else if(n==2){/*デキューします*/ //deq(n); // } listq(); if(n!=1 || n!=2){ exit(0); } } return 0; } void listq(void){ int k,data,j; int a[k]; /* キューが空なら"Queue empty!\n"表示 */ /* 空じゃない場合は並んでいる個数分データ表示 */ if(data==0){ printf("Queue empty!\n"); } else { for(k=0;k<j;k++){ printf("%d",a[k]); } printf("\n"); } } int enq(int data){ int a[QLEN]; static int j=0; //j++; if(j>=QLEN){ return QFUL; } else { a[j]=data; return 0; } j++; } /* キューが満杯ならQFULをreturn*/ /* そうでないならキューの最後尾にdataを追加 */ //} //int deq(void){ /* キューが空ならQEMPをreturn*/ /* そうでないならキューの最前列のdataを変数に入れ */ /* 後続のデータを一つづつ前に移動させ、変数の値をリターンする */ //}
iwamoto_takaaki👍を押しています

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

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

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

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

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

majiponi

2016/10/16 23:05

So what? あなたは何を聞きたいのですか? 正しく動くか? コードが綺麗か? もっといいアルゴリズムがあるか? 質問文読んでも分かりませんでした。
guest

回答2

0

ベストアンサー

たくさん変更してしまいました。
それなりに動くと思いますが、細かい動作は確認が必要です。

他の方の指摘通り、変数のスコープへの理解が足りていないように見受けられます。
以下は参考サイトです。
http://www.isl.ne.jp/pcsp/beginC/C_Language_09.html

スコープ以外にも、変更しているところがありますので、差分比較をとって
変化点を確認ください。

C

1#include <stdio.h> 2#include <stdlib.h> 3#define QLEN 5 4#define QEMP - 1 5#define QFUL - 1 6 7int enq( int ); 8//int deq(void); 9void listq( void ); 10 11/* キューに使用する配列、その他外部変数の宣言 */ 12int a[QLEN],n,m,r,j; 13 14int main() { 15 //int a[ QLEN ], n, m, r; 16 int i; 17 j = 0; 18 while( 1 ) { 19 20 /* 処理の入力 */ 21 /* 入力に従って関数を呼ぶ */ 22 /* なお、enq()の場合は呼ぶ前に引数入力 */ 23 /* deq()の場合は呼んだ後にデータ出力 */ 24 /* 終了の場合はexit()を呼ぶ */ 25 //scanf("%d",&n); 26 printf( "1 = enQ/2 = deQ/else = end ==>" ); 27 scanf( "%d", &n ); 28 if( n == 1 ) {/*エンキューをします*/ 29 printf( " Enter enQ data ==>" ); 30 scanf( "%d", &m ); 31 r = enq( m ); 32 //printf( "Queue :" ); 33 //for( i = 0; i<QLEN; i++ ) { 34 // printf( "%d", a[ i ] ); 35 //} 36 //printf( "\n" ); 37 //break; 38 39 } 40 //else if(n==2){/*デキューします*/ 41 //deq(n); 42 // } 43 listq(); 44 //if( n != 1 || n != 2 ) { 45 if( n != 1 && n != 2 ) { 46 exit( 0 ); 47 } 48 49 } 50 51 return 0; 52} 53 54void listq( void ) { 55 int k;// , data, j; 56 //int a[ k ]; 57 /* キューが空なら"Queue empty!\n"表示 */ 58 /* 空じゃない場合は並んでいる個数分データ表示 */ 59 //if( data == 0 ) { 60 if( j == 0 ) { 61 printf( "Queue empty!\n" ); 62 } 63 else { 64 printf( "Queue : " ); 65 for( k = 0; k<j; k++ ) { 66 printf( "%d ", a[ k ] ); 67 } 68 printf( "\n" ); 69 } 70} 71 72int enq( int data ) { 73 //int a[ QLEN ]; 74 //static int j = 0; 75 //j++; 76 if( j >= QLEN ) { 77 return QFUL; 78 } 79 else { 80 a[ j ] = data; 81 j++; 82 return 0; 83 } 84// j++; 85} 86 87/* キューが満杯ならQFULをreturn*/ 88/* そうでないならキューの最後尾にdataを追加 */ 89 90//} 91 92//int deq(void){ 93 94/* キューが空ならQEMPをreturn*/ 95/* そうでないならキューの最前列のdataを変数に入れ */ 96/* 後続のデータを一つづつ前に移動させ、変数の値をリターンする */ 97//}

投稿2016/10/16 23:53

otaks

総合スコア223

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

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

ikuo-biyori

2016/10/17 11:33

グローバル変数を使えばよかったのですね、ありがとうございます。よく分かりました。
guest

0

引数がvoidでもデータを受けとり、キューの中身を表示できるものなのでしょうか?

結論から言うと、できます。が、このままではできません。
順に説明すると、main関数の前に、変数の定義がありますよね? これはグローバル変数と呼ばれ、どの関数からでもアクセスできます。これに対して、各関数内のみで利用できる変数を自動変数と言います。さて、main関数と他のいくつかの関数で、「同じ名前の自動変数」が定義されていますが、コンパイルエラーにはならないのでしょうか?
結論から言うと、コンパイルエラー「には」なりません。これは「この関数でこの名前は、グローバル変数ではなく、この自動変数を意味するから」という指示です。つまり、関数の中で別の変数を用意して、それを同じ名前で呼ぶことにしたのです。この場合、Cではグローバル変数のほうにアクセスする手段がありません。

要するにこのコードの問題点は、各関数が好き勝手にキューを用意して、お互いを無視して操作しようとしている点なのです。

投稿2016/10/16 23:33

majiponi

総合スコア1720

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問