アプリ版:「スタンプのみでお礼する」機能のリリースについて

あるテストの結果、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;
}

「C言語」の質問画像

A 回答 (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人
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
条件式が間違っていた事と、ifの部分のみでいいところを、elseのところでcountを数えていたことが間違いでした。もう少し冷静になって考えてみると分かるものでした。今回は本当にありがとうございます。私はまだまだプログラム初心者ですので、また質問を見かけましたらご回答いただけると幸いです。

お礼日時:2022/11/09 16:39

C言語で書くかどうかに関係なく。

。。

プログラムとしては10段階それぞれの人数を格納する変数を10個用意します。各変数の初期値はもちろん0。
40人分のデータを順番に読み込む・・・というのがforループ。
そのforループの中で今読み込んだデータは10段階のどこに入るかをif then elseで判断し、該当する変数をカウントアップ。

それだけのことです。
40人分の点数は1件ずつ標準入力で行うのではなく、プログラム内に配列データとして固定で持つならforループではその配列データを0番目から39番目まで順に参照すればよいだけのお話し。

で、この日本語で書いたことをC言語に翻訳すればOKですね。

参考まで。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2022/11/09 16:42

こんにちは



C言語は全然知りませんけれど・・

例えば最初に10点の人を評価する際に、内側のループで
 score[i] >= range[j]
が成立するので、breakでそのループを抜けて、次の人の評価に移っています。
これがまず、意図するところと違うのではないでしょうか?

ちなみに、10点以下の人の人数を増やしてみれば、結果が変わるのでわかるのではないかと思います。
そうすると、出力の処理がおかしいことにも気づくはずと思います。

さらには、100点の場合にどこにカウントされるかも考えてみた方が宜しそうです。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます
確かにbreak の位置が重要でした。

お礼日時:2022/11/09 16:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!