実現したいこと
テストの点数の分布図を作成したいです。
例えば、6人の生徒の点数が30点・50点・55点・59点・75点・79点だったとすれば、
* * * * * *
0 10 20 30 40 50 60 70 80 90 100
このような分布図を作りたいです。
発生している問題・分からないこと
入力する生徒の数が11までは問題なく分布図を作れるのですが、12のときに分布図の上に改行文字が出力され、13を超えると空白を無限に出力する無限ループが起こってしまいます。
エラーメッセージ
error
1エラーメッセージはなしです。
該当のソースコード
c言語
1#include <stdio.h> 2 3int main(void) 4{ 5 int no; 6 7 printf("生徒の数は?:"); scanf("%d", &no); 8 9 int a[no]; // データ全体の数 10 int bunpu[11] = {0}; // 各点数のデータの数 0~9・10~19・…・90~99・100で分ける 11 12 for (int i = 0; i < no; i++) { // データの読込 13 do { 14 printf("%d人目の点数:", i + 1); scanf("%d", &a[i]); 15 if (a[i] < 0 || a[i] > 100) printf("\a正しく点数を入力してください。\n"); 16 } while (a[i] < 0 || a[i] > 100); 17 bunpu[a[i] / 10]++; // 各点数のデータの数を増やす 18 } 19 20 int max = bunpu[0]; 21 22 for (int i = 1; i < no; i++) { // 各点数のデータの数のなかで最大のものを求める 23 if (max < bunpu[i]) max = bunpu[i]; 24 } 25 26 int max2 = max; // for文の制御式に用いるmaxをmax2とする 27 28 for (int i = 1; i <= max2; i++) { // 分布図の行の繰り返し 29 for (int q = 0; q < 11; q++) { // 分布図の列の繰り返し *を打つための繰り返し 30 if (bunpu[q] >= max) printf(" * "); 31 else printf(" "); 32 } 33 putchar('\n'); 34 max--; 35 } 36 37 printf("---------------------------------\n"); // 分布図の目盛の部分 38 printf(" 0 10 20 30 40 50 60 70 80 90 100\n"); 39 40 return 0; 41} 42
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
for文が意図せず無限ループしてしまう理由はネット上で見つけられませんでした。
補足
特になし
配列 bunpu の容量は 11 ですが、
int bunpu[11] = {0}; // 各点数のデータの数 0~9・10~19・…・90~99・100で分ける
最大値を求めるループではインデックス(変数i)の上限を no-1 にしています。
for (int i = 1; i < no; i++) { // 各点数のデータの数のなかで最大のものを求める
if (max < bunpu[i]) max = bunpu[i];
}
本来は、for (int i = 1; i < 11; i++) とすべきではないでしょうか。
コメントありがとうございます!
melianさんの通りに修正したことで問題が解決し、生徒の数が12以上でも問題なく動作するようになりました!
本当にありがとうございます。
プログラムを書いてる途中で生徒の点数a[no]と点数の分布bunpu[11]が混乱してしまったようです。
これから気を付けます!
c と c# は別の言語ですので、 c# のタグは外されたほうが良いと思います。
了解です!
それともう一つのコメントでも、プログラムをきれいに書くコツを教えていただいてありがとうございます!
これからプログラムを書くときに心がけます!
編集ありがとうございます。
9行目のコードですが、malloc関数か、calloc関数を使用するコードにした方がより良いコードになると思いました。
ご検討いただければと思います。
個人的には同意ですが、C言語の規格としてはオプションで認められているので、多くの人は納得できないかと。
(VLAは、GCC/Clangはサポート、Visual Studioは未サポート)
むしろ大多数はmalloc/callocを使う方だと思いますよ。
C99を使えない環境が多いし、互換性を考えたコーディングをしますし、静的解析でサポートしていないこともありますし。
少なくとも仕事で使ってる人はCでVLAは使わないと思います。
ですから、私はrinjintoさんの意見に同意です。
ただ、私もここで何回か同じ指摘をしていますが、毎回スルーされます。
ここはC言語のプロも多いはずなのに残念です。
そういうことですか。頭痛いですねえ。
何度も指摘して理解してもらうしかないんですかね。
gccが幅を利かせる昨今「C99を使えない環境が多い」は本当にそうだろうか、と思いますけれど、現行規格ではVLAはオプションに落ちているので採用には慎重であるべき、というのは言えますね。
回答中に「AIに聞けば教えてくれるっしょ」と書きましたけど、件の場所とともにclaudeにもchatGptにもVLAはちょっと...というツッコミは入れられました。本題ではないので省きましたけれど。
こないだ社内レビューで新人がCortexM0用のものにVLA使ってて、みんな引っかかりはして「他の環境に移植もしなさそうな部分だし、う~ん、どうしようかな」ってな感じでしたね(結局通した)。自分では使わないからこその反応でしょう。
回答3件
あなたの回答
tips
プレビュー