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

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

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

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1011閲覧

c言語を実行すると無限ループしてしまいます。

K.M.PEANUTS

総合スコア40

C

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/08/06 23:44

c言語

1#include <stdio.h> 2#define NUMBER 80 /*人数の上限*/ 3int main(void) { 4 int num, i, tensu[NUMBER], bunpu[11], j; 5printf("人数を入力してください:"); 6do { 7 scanf("%d", &num); 8 if(num<0 || num>NUMBER) { 9printf("1〜%dで入力してください:", NUMBER); 10 } 11} while (num<0 || num>80); 12printf("%d人の点数を入力してください\n", num); 13for(i=0; i<num; i++) { 14 printf("%d番:", i+1); 15 do { 16 scanf("%d", &tensu[i]); 17 if(tensu[i]<0 || tensu[i]>100) { 18 printf("\a1〜100で入力してください:"); 19 } 20 } while(tensu[i]<0 || tensu[i]>100); 21 bunpu[tensu[i]/10]++; 22} 23printf("\n"); 24printf("---分布グラフ---\n"); 25for(i=0; i<=9; i++) { 26 printf("%d〜%d:", i*10, i*10+9); 27 for(j=0; j<bunpu[i]; j++) { 28 putchar('*'); 29 } 30 printf("\n"); 31} 32if(bunpu[10]) { 33 printf(" 100:"); 34 for(j=1; j<=bunpu[10]; j++) { 35 putchar('*'); 36 } 37} 38printf("\n"); 39 return 0; 40}

①上記のコードを実行すると、分布グラフで『0~9:*****・・・・・』のように無限ループしてしまいます。理由を教えてください。
②tensu[NUMBER]の部分ですが、[]の中は配列の要素数であると認識しております。NUMBERは人数の上限であり、変数tensuの要素数ではないと思うのですが、どうしてここにNUMBERを入れるのですか?要素数ならもう一つの変数numを入れるのが適切だと思います。ちなみにnumを入れるとエラーが出たので、おそらく[]の中に変数を入れるのはダメなんですよね。

二つ質問してしまってすみません。回答お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー


bunpuが初期化されていません。

C

1for(j=0; j<bunpu[i]; j++) { 2 putchar('*'); 3}

が大量にループするというところからbunpuが怪しいな、という疑い方をします。

おそらく[]の中に変数を入れるのはダメなんですよね。

Cのバージョンによってはnumを要素数にしても通ります。

C

1int main(void) { 2 int num, i, bunpu[11], j; 3 printf("人数を入力してください:"); 4 do { 5 scanf("%d", &num); 6 if(num<0 || num>NUMBER) { 7 printf("1〜%dで入力してください:", NUMBER); 8 } 9 } while (num<0 || num>80); 10 11 int tensu[num]; 12

Cのバージョンによっては変数を要素数にできないので、
代わりに十分な領域を確保して、実際使うのはnum個としているだけです。

投稿2020/08/07 00:04

ozwk

総合スコア13512

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

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

K.M.PEANUTS

2020/08/07 02:13

モヤモヤが一気に解決しました、ありがとうございます。もう一つ質問になってしまうのですが、tensu[NUMBER]は初期化しなくていいのですか?読んでいる本ではbunpuだけしか初期化を行っていません。
ozwk

2020/08/07 02:21

scanfで値を入れているので、使う分(num個)は初期化しています。
K.M.PEANUTS

2020/08/07 02:26

なるほど!全部理解できました!本当にありがとうございます????‍♂️
guest

0

bunpu配列を初期化していません。

C言語の場合、ローカル変数を初期化せずに使った場合、結果は未定義です(何が起きるか保証されません)。

投稿2020/08/06 23:49

maisumakun

総合スコア145123

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問