
あるテストの結果、40人の得点は次の表のようになりました。得点を、1-10,11-20,…,91-100の10段階に分け、各段階に属する人数を求めるプログラムを作成せよという問題です。
条件として、2重のfor文とif elseの分岐を使わなければいけません。
画像のようにプログラムを書いてみたのですが、すべて属する人数が1人になってしまいます。
ifの条件が間違えているのかなと思っているのですが、分かりません。
教えていただきたいです。
1-10の人数1人
11-20の人数1人
21-30の人数1人
......
......
.....
91-100の人数1人
となってしまいます。
ソースコードです
#include<stdio.h>
int main(void)
{
int score[40] = {10,30,31,45,77,90,31,45,55,70,32,68,90,60,86,46,55,30,70,80,4,14,80,66,45,66,36,59,99,100,50,30,19,90,77,50,90,66,70,49};
int range[10] = {10,20,30,40,50,60,70,80,90,100};
int count[10] = {0};
int i,j;
for(i = 0; i <= 39; ++i){
for(j = 0; j <= 9; j++){
if(score[i] >= range[j]){
break;
}
else{
count[j] += 1;
}
printf("%d - %dの人数 %d人\n", range[j]-9, range[j], count[j] );
}
}
return 0;
}

No.3ベストアンサー
- 回答日時:
以下のようにしてください。
#include<stdio.h>
int main(void)
{
int score[40] =
{ 10, 30, 31, 45, 77, 90, 31, 45, 55, 70, 32, 68, 90, 60, 86, 46,55, 30, 70, 80, 4, 14, 80, 66, 45, 66, 36, 59, 99, 100, 50, 30, 19, 90, 77,50, 90, 66, 70, 49 };
int range[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
int count[10] = { 0 };
int i, j;
for (i = 0; i <= 39; ++i) {
for (j = 0; j <= 9; j++) {
if (score[i] >= range[j]-9 && score[i] <= range[j]) {
count[j] += 1;
break;
}
}
}
for (j = 0; j <= 9; j++){
printf("%d - %dの人数 %d人\n", range[j] - 9, range[j],
count[j]);
}
return 0;
}
実行結果
1 - 10の人数 2人
11 - 20の人数 2人
21 - 30の人数 3人
31 - 40の人数 4人
41 - 50の人数 7人
51 - 60の人数 4人
61 - 70の人数 7人
71 - 80の人数 4人
81 - 90の人数 5人
91 - 100の人数 2人
ご回答ありがとうございます。
条件式が間違っていた事と、ifの部分のみでいいところを、elseのところでcountを数えていたことが間違いでした。もう少し冷静になって考えてみると分かるものでした。今回は本当にありがとうございます。私はまだまだプログラム初心者ですので、また質問を見かけましたらご回答いただけると幸いです。
No.2
- 回答日時:
C言語で書くかどうかに関係なく。
。。プログラムとしては10段階それぞれの人数を格納する変数を10個用意します。各変数の初期値はもちろん0。
40人分のデータを順番に読み込む・・・というのがforループ。
そのforループの中で今読み込んだデータは10段階のどこに入るかをif then elseで判断し、該当する変数をカウントアップ。
それだけのことです。
40人分の点数は1件ずつ標準入力で行うのではなく、プログラム内に配列データとして固定で持つならforループではその配列データを0番目から39番目まで順に参照すればよいだけのお話し。
で、この日本語で書いたことをC言語に翻訳すればOKですね。
参考まで。
No.1
- 回答日時:
こんにちは
C言語は全然知りませんけれど・・
例えば最初に10点の人を評価する際に、内側のループで
score[i] >= range[j]
が成立するので、breakでそのループを抜けて、次の人の評価に移っています。
これがまず、意図するところと違うのではないでしょうか?
ちなみに、10点以下の人の人数を増やしてみれば、結果が変わるのでわかるのではないかと思います。
そうすると、出力の処理がおかしいことにも気づくはずと思います。
さらには、100点の場合にどこにカウントされるかも考えてみた方が宜しそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
intとlongは同じ?
-
条件が多い場合
-
再帰処理をループ処理に変換
-
再起呼び出しの回数をカウント...
-
rand()の乱数は何故良くないの?
-
迷路を脱出する経路探索プログ...
-
プログラミングに関して
-
最早開始時間と最遅完了時刻を...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
数字以外が入力されたらエラー...
-
値差の%計算方法について
-
「Aに対するBの割合」と「Aに対...
-
#defineが使用するメモリ領域に...
-
cout関数を使っているのですが...
-
2÷3などの余りについて
-
構造体の勉強中です 合計点の高...
-
main.c:7:43: warning: implici...
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で簡単なパックマンゲーム...
-
2の補数を計算するプログラム
-
c言語プログラミングについて f...
-
再起呼び出しの回数をカウント...
-
intとlongは同じ?
-
openCVの画像処理について
-
C言語
-
【C#】SQL文の中に変数を埋め込...
-
C言語プログラミング 漸化式に...
-
カードシャッフルのブログラム...
-
C++ Debug Errorについて教えて
-
デバッグビルドとリリースビル...
-
迷路を脱出する経路探索プログ...
-
C++デバックエラーについて詳し...
-
C++ bmp 透過処理
-
複数の共有メモリの作成
-
C言語で%を使わない余りの出し方
-
C言語
-
2次関数プログラムを描写する...
-
16bitで乱数を生成する方法
おすすめ情報