ID非公開

2021/4/20 10:25

33回答

こんにちは現在c言語学習中の初学者ですが、この問題がどうしても解けません。 何方かお力添えお願いいたします。 (以下問題文)

プログラミング | C言語関連32閲覧xmlns="http://www.w3.org/2000/svg">50

ベストアンサー

0

ID非公開

質問者2021/4/20 11:02

ご回答くださりありがとうございます。平均値より大きい数までは表示できたのですが、その先の平均値より小さい数がたまに表示されないときがあります、例えば実行例が                  6817 6                  合計値 28                 平均値 5            平均より大きい数: 6 8            平均より小さい数:(表示されません) だと上のようにた本来表示される1が表示されません。 なにか漏れているのでしょうか。 長文失礼致します。

ThanksImg質問者からのお礼コメント

ありがとうございます。双方とても分かりやすい補足付きで回答くださり悩みましたが、先に回答していただいたこちらのかたにベストアンサーを決めさせていただきます。 大変ありがとうございました。

お礼日時:4/20 11:30

その他の回答(2件)

0

まず、『それぞれ個別にやって』ください。 まとめられるのならまとめてもいいですが、今回は例外です。 やってみましょうか。 ------------------------------------------------ 質問にあるコードを説明できますか? (日本語でもいいし英語でもいいので) まず、プログラミングっていうのは『こう書けばこう動く』……じゃないです。 『プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一指示されながら処理しているだけの代物である』です。 つまり、言い換えると、『現実世界でならどうするかを考える』です。 ということでまずはC言語とかそういうのは置いといて、現実世界でならどうするかを考えましょう。 最初は『仕様の確認』。 (1)長さ5のint型の配列を作成する。 (2)(1)の各要素に、1から10までの乱数を代入する。 (3)配列の内容をすべて表示する。 (4)配列の値の合計値と、平均値を表示する。 (5)平均値よりも大きい数を表示する (6)平均値よりも小さい数を表示する。 次に、それぞれ規則性 等を見付ける。 (1) は 単純に『配列』がわかればいいので一旦スルー。 (2) は 言い換えると、 [言い換えQ] ホワイトボードに 5つの乱数を書け みたいなものです。 乱数は『C言語 乱数』とかで検索すればわかるはずです。 なので一旦スルー。 (3) は単純に printf関数かなんかで表示していけばいいってことで一旦スルー。 (4)からが厄介ですね。 (4) は先ほど用意したであろう、乱数の列( 配列にあるデータ ) を数列と見なして合計値と平均値を出すことが求められている。 では、『合計値』とはなんでしょうか。 ちょっと難しい言葉でいえば『総和』ですね。 簡単に言えば、『すべて足した数』です。 たとえば 配列に入っている数字が an = { 3, 4, 7, 2, 1, 9, 5, 8 } だとします。( N = 8 ) (注意: あえて数を多くしています) そうすると、 3 + 4 + 7 + 2 + 1 + ... + 8 = ????? という計算式になるはずです。 ではこの式をどのように計算しますか? 私ならとりあえず、3 + 4 をする。そしてその結果を ホワイトボードの余白かどこかに記録しておく。これを以降、単に『記録』とする。 そして、次は 記録 = 記録 + 7 をやる。そしてその結果を記録としてホワイトボードの余白かなんかの記録を更新する。 さらに 記録 = 記録 + 2 をやる。また更新する。 …… という風に、記録 = 記録 + 8 までやる。 そうすると最終的に記録は 総和、つまり合計値になっている。 そして『平均値』。 平均値とは何でしょうか。平均には種類があるようですが、ここでは単純に小学校で習う方だと思います。(それ以外だと別の名称になっているから) ということは、 平均値 = 合計値 ÷ 個数 だったはずです。(わからないなら定義を確認しましょう) ということは、合計値が求められた後じゃないときついですね。 個数は N = 8 なので、個数 = 8。 合計値は 『記録』に入っていますから、 平均 = 記録 ÷ 8 で計算できます。 (5) や (6) は平均が分からないと出来ません。 だって、これが基準値になっているから。基準が無いなら出来ないでしょ。 比較は。 ということで、(4) の後に行う。 (5) は 平均値より大きいものをすべてリストアップ。 上記での {an} を例にとると、 an = { 3, 4, 7, 2, 1, 9, 5, 8 } なので、 3 + 4 + 7 + 2 + 1 + 9 + 5 + 8 = 39 よって、合計値は 39。 で、平均は 平均 = 39 ÷ 8 = 4.875。 で、ここでは簡単にするために int型、つまり整数とします。 それで四捨五入しているとしたら、平均 = 5 になっているはずです。 (今回のものだとどうなるかわかりません) なので、『5より大きい数字を列挙していく』のです。 そういう場合って、現実世界でならどうしますか? 私なら、ひとつずつ見ていって、大きいもの( 対象 > 5 ) になっているものを表示する。ですね。表示したものを○、表示しなかったものを×とします。 an = { 3, 4, 7, 2, 1, 9, 5, 8 } → 3 > 5 を満たさないのでスルー an = { ×, 4, 7, 2, 1, 9, 5, 8 } → 4 >5 を満たさないのでスルー an = { ×, ×, 7, 2, 1, 9, 5, 8 } → 7 >5 を満たすので表示 an = { ×, ×, ○, 2, 1, 9, 5, 8 } → 2 >5 を満たさないのでスルー an = { ×, ×, ○, ×, 1, 9, 5, 8 } → 1 >5 を満たさないのでスルー an = { ×, ×, ○, ×, ×, 9, 5, 8 } → 4 >5 を満たさないのでスルー an = { ×, ×, ○, ×, ×, 9, 5, 8 } → 9 >5 を満たすので表示 an = { ×, ×, ○, ×, ×, ○, 5, 8 } → 5 >5 を満たさないのでスルー。(※ 定義によっては変わってくる) an = { ×, ×, ○, ×, ×, ○, ×, 8 } → 8 >5 を満たすので表示 an = { ×, ×, ○, ×, ×, ○, ×, ○ } 終了。……と言う具合に。 ただし、平均値である 5 と a7 (= 5) は同値なので、 対象 ≧ 平均 っていう定義なら満たすので○になるが。 (定義次第。日本語だとここがブレブレだから。『以上』は、 『○○を含む場合』と『含まない場合』の両方があるため) (6) も発想自体は(5) と同じです。単に条件式での不等号の向きが違うだけです。 (1), (2) は初期設定。 (3) は(2)がちゃんとできているかの確認。 (4) は合計値と平均の算出。 (5), (6) は(4)で割り出した平均値を基準値として比較する。 それぞれ別々の内容なので、 #include<stdio.h> ...// 必要があれば他のヘッダファイルもインクルード int main( void ){ ____// 1. 初期設定 ____// 2. (forを使って) (1)の確認 ____// 3. 合計値を算出( with for ) ____// 4. (3)を使って平均値を算出 ____// 5. (4)を使って平均値より大きい値を表示 ____// 6. (5)と同様に平均値より小さい値を表示 return 0; } のようなフローになっているはずです。 もちろん関数化したりとかは良いと思いますが。

0

まとめてやろうとするからよくわからなくなるのでは? 順番にそこに書いてあるとおりに書けばいいのです。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {     int data[5]; // (1)     srand(time(NULL));     for (int i = 0; i < 5; i++) {         data[i] = rand() % 10 + 1; // (2)     }     for (int i = 0; i < 5; i++) {         printf("%d ", data[i]); // (3)     }     putchar('\n');     putchar('\n');     int sum = 0;     for (int i = 0; i < 5; i++) {         sum += data[i];     }     double avg = sum / 5.0;     printf("合計値:%d\n", sum);     printf("平均値:%.0f\n", avg); // (4)     putchar('\n');     printf("平均値より大きい数:");     for (int i = 0; i < 5; i++) {         if (data[i] > avg) {             printf("%d ", data[i]); // (5)         }     }     putchar('\n');     printf("平均値より小さい数:");     for (int i = 0; i < 5; i++) {         if (data[i] < avg) {             printf("%d ", data[i]); // (6)         }     }     putchar('\n'); }

ID非公開

質問者2021/4/20 11:04

ありがとうございます。大変恐縮ではございますが平均値より大きい数は表示できるようになりましたがその先の小さい数がたまに(10回中2回程)表示されません。