情報:IT
高校生

#include <stdio.h>
main()
{
int score,sum,n,i; //score→得点,sum→合計,n→データ数 整数型
float avg; //avg→平均  実数型

printf("データの個数は→");
scanf("%d",&n);

/*合計と平均を求める*/
sum=0; //初期設定

for( i=1; i<=n; i++ ){
do{
printf("%d番目の点数を入力せよ\n",i);
scanf("%d",&score);

if(score<0 || score>100){
printf("エラー!!\n");
}

}while(score<0 || score>100);

sum = sum + score;
}

avg=(float) sum/n;

/*結果の表示*/
printf("合計=%d, 平均=%f \n",sum,avg);

}

1番の点数を入力せよ
24
2番の点数を入力せよ
100
2番の点数を入力せよ
0
2番の点数を入力せよ
789
エラー!!
2番の点数を入力せよ
65
3番の点数を入力せよ
92
合計=181, 平均=60.000000

このプログラムで点数0点や100点を打つとその何番目というのが繰り返されてしまいます。原因を教えて頂きたいです。よろしくお願いします。

回答

この問題、昨日の帰りの電車内でずーっと考えていたのですが、決定的な原因は分からずじまいでした。

が、私がC言語を6年以上やってきて、
こんなプログラム初めて見ました。
特に繰り返し処理のところです。

for文内にwhile文を置くなんてことは私は
しないのですが、実行されているということはコンパイルが通っているので、
文法的には正しいのですね。

また、間違いの元として、データ入力と、
そのデータの処理を同時に行っている。
というのが、問題だと思います。

私だったらまず、
必要数のデータを配列に格納しておいて、
それから処理判別を行うと思います。

でも、0,100だけおかしくなるのは、
自分もプログラム眺めてみても、
分かりませんでした。

もし、また気づいたらコメントさせて頂きます。

すみません、必要数のデータを配列に格納するというのはどういうことですか?

forのカッコの中のi++という部分をi=i+1にしたら0や100を打っても実行できました。この2つは同じ意味ではないのですか?

お願いします。

dio

疑似的な表記で書きますと、
点数を入れる配列を定義する。
→繰り返し処理を用いて配列にデータを入力する。

配列に格納した値から
最大値、平均値などを求める。

この処理のほうが自然と思います。
また、i++の件は私も詳しくは分からないのですが、動作は同じです。
ただ、i++はインクリメントと言って処理の優先順位が高いです。
(掛け算と足し算のある計算の中で掛け算が優先的に演算されるのと同じ現象です)

C言語はデータを扱うなら配列。
また、処理が複雑になってきたら関数。

これらの技を習うとよりスマートなプログラムが組めますよ。

詳しくありがとうございます。

先生の解答を見て理解することはできても、本当に簡単なプログラムしか私は作ることができません。なのでこのプログラムのように自分でデータの個数を決めて値が範囲外であればエラーと表示させ、もう一度繰り返し入力できるようにするなどを自分ではどれを組み合わせて使えばいいか分からないです。
先生の解答がこれだったので、もっとよいプログラムはどんな感じですればいいのかもわかりません。

文がごちゃごちゃしててわかりにくい部分もあるかもしれませんが、なにかアドバイスがあればお願いします。

dio

本来、プログラムは誰が見てもわかりやすいように作るのが鉄則です。なぜなら後で誰かが編集したり機能を追加することが、できるようにするためです。
一番最初にあったプログラムは、私が今まで見たプログラムの中で難しい、一時間かけても理解出来ないプログラムでしたね。
そういうのを作って楽しむのもまあいいんですけど。

提案として、この程度でしたら私がC言語で今日中に組みますよ。
もしよかったら参考にしてみて下さい。コロナ禍で暇してるので。

また、資料が少ないのでしたら、
例題がたくさん載ってる本がありますので、一冊買ってみるのも手だと思います。
22時00分までにサンプルプログラムをコメントで貼り付けておきますね。

すみません、ほんとうにありがとうございます😭

dio

#include <stdio.h>
#define N 100 /*入力数の上限*/
int main()
{
/*初期化*/
int score[N] = {0}; /*得点*/
int sum = 0; /*合計*/
int num = 0; /*データ数*/
int i;
double avg; /*平均*/

int input = 0; /*入力値*/
int flag = 0; /*処理を止めるかどうかの変数*/

/*データを入力する処理*/
printf("入力を終了するには777を押して下さい\n");
for (i = 0; flag == 0; i++)
{
printf("%d番目の点数を入力せよ\n", i+1);
scanf("%d", &input);
if (input == 777) flag = 1;
else if (input >= 0 && input <= 100)
{
score[i] = input;
num++;
}
else {
printf("エラー!!\n");
break;
}
}

/*計算処理のステップ*/
for (i = 0; i < num; i++)
sum += score[i];
printf("合計:%d\n", sum);
avg = sum / num;
printf("平均:%f\n", avg);

return 0;
}

dio

やっと正しく動作しました。
こういうの、コンパイルして実行を100回くらい繰り返して正解に近づけました。
さすがに、コンピュータで繰り返し実験してみないとわからないですね。

これを、そのまま、コピーして貼り付けて実行すると動くと思います。

本当にありがとうございます!!

この回答にコメントする
疑問は解決しましたか?