この問題、昨日の帰りの電車内でずーっと考えていたのですが、決定的な原因は分からずじまいでした。
が、私がC言語を6年以上やってきて、
こんなプログラム初めて見ました。
特に繰り返し処理のところです。
for文内にwhile文を置くなんてことは私は
しないのですが、実行されているということはコンパイルが通っているので、
文法的には正しいのですね。
また、間違いの元として、データ入力と、
そのデータの処理を同時に行っている。
というのが、問題だと思います。
私だったらまず、
必要数のデータを配列に格納しておいて、
それから処理判別を行うと思います。
でも、0,100だけおかしくなるのは、
自分もプログラム眺めてみても、
分かりませんでした。
もし、また気づいたらコメントさせて頂きます。
疑似的な表記で書きますと、
点数を入れる配列を定義する。
→繰り返し処理を用いて配列にデータを入力する。
配列に格納した値から
最大値、平均値などを求める。
この処理のほうが自然と思います。
また、i++の件は私も詳しくは分からないのですが、動作は同じです。
ただ、i++はインクリメントと言って処理の優先順位が高いです。
(掛け算と足し算のある計算の中で掛け算が優先的に演算されるのと同じ現象です)
C言語はデータを扱うなら配列。
また、処理が複雑になってきたら関数。
これらの技を習うとよりスマートなプログラムが組めますよ。
詳しくありがとうございます。
先生の解答を見て理解することはできても、本当に簡単なプログラムしか私は作ることができません。なのでこのプログラムのように自分でデータの個数を決めて値が範囲外であればエラーと表示させ、もう一度繰り返し入力できるようにするなどを自分ではどれを組み合わせて使えばいいか分からないです。
先生の解答がこれだったので、もっとよいプログラムはどんな感じですればいいのかもわかりません。
文がごちゃごちゃしててわかりにくい部分もあるかもしれませんが、なにかアドバイスがあればお願いします。
本来、プログラムは誰が見てもわかりやすいように作るのが鉄則です。なぜなら後で誰かが編集したり機能を追加することが、できるようにするためです。
一番最初にあったプログラムは、私が今まで見たプログラムの中で難しい、一時間かけても理解出来ないプログラムでしたね。
そういうのを作って楽しむのもまあいいんですけど。
提案として、この程度でしたら私がC言語で今日中に組みますよ。
もしよかったら参考にしてみて下さい。コロナ禍で暇してるので。
また、資料が少ないのでしたら、
例題がたくさん載ってる本がありますので、一冊買ってみるのも手だと思います。
22時00分までにサンプルプログラムをコメントで貼り付けておきますね。
すみません、ほんとうにありがとうございます😭
#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;
}
やっと正しく動作しました。
こういうの、コンパイルして実行を100回くらい繰り返して正解に近づけました。
さすがに、コンピュータで繰り返し実験してみないとわからないですね。
これを、そのまま、コピーして貼り付けて実行すると動くと思います。
本当にありがとうございます!!
すみません、必要数のデータを配列に格納するというのはどういうことですか?
forのカッコの中のi++という部分をi=i+1にしたら0や100を打っても実行できました。この2つは同じ意味ではないのですか?
お願いします。