質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

Q&A

解決済

1回答

1239閲覧

C言語:乱数の式の場所について

r0_.-

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

0グッド

0クリップ

投稿2020/10/25 05:35

#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int main(){ int i,sum,t,max; float average; int a[N]; printf("input number of students in Class="); scanf("%d",&t); max=a[0]; for(i=0;i<t;i++){ printf("input point of Student%d=",i+1); scanf("%d",&a[i]); } for(i=0;i<t;i++){ if(max<a[i]){ max=a[i]; } } printf("maximum point=%d\n",max); sum=0; for(i=0;i<t;i++){ sum=sum+a[i]; } average=(float)sum/(float)t; printf("average point=%f\n",average); return 0; } 問題点:乱数を発生させてa[i]=rand()%Nの式を入れようとしたが、どこに式を入れても     上手くいかなかった。 やってみたこと:とにかくいろいろな位置にa[i]=rand()%N_1を入れてみた

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

archiver

2020/10/25 05:41

上手くいかなかったとは、どうなっているのでしょうか?期待する動作と現状発生している現象を明記してください。
r0_.-

2020/10/25 05:49

乱数を入れているのに、自分で値を入力して平均・最高点数を求めるようになってしまうんです。
dodox86

2020/10/25 05:51

Cygwin上で実行しているのでしょうが、問題はCygwinに関することではないので、「Cygwin」タグは必要ないです。
r0_.-

2020/10/25 05:53

わかりました
r0_.-

2020/10/25 05:54

今度から気をつけます。
episteme

2020/10/25 05:57

> 乱数を入れているのに、自分で値を入力して平均・最高点数を求めるようになってしまうんです。 scanf("%d",&a[i]); を a[i]=rand()%N に差し替えてもそうなるんですか?
r0_.-

2020/10/25 06:00

はい
episteme

2020/10/25 06:01

修正の後コンパイルしてないとか?
r0_.-

2020/10/25 06:05

しました
episteme

2020/10/25 06:09

scanf("%d",&a[i]); を a[i]=rand()%N に差し替えたのなら、 コード中に scanf("%d",&a[i]); は存在しないのだから 「自分で値を入力して平均・最高点数を求めるようになってしまう」わけがないのだが。
r0_.-

2020/10/25 06:18

すみません。乱数にはなっていました。正しい値は出ませんでした。
episteme

2020/10/25 09:27

「自分で値を入力して平均・最高点数を求めるようになってしまう」ではなかったのか...
guest

回答1

0

ベストアンサー

  • max=a[0];は、a[0]に値を設定してから実行しないと、(どんな値が入っているかわからない)a[0]の初期値をmaxに設定するため、偶然大きな値が入っていると想定外の結果になる。
  • おそらく、「一人一人の点数をキー入力している部分」の代わりに、疑似乱数で点数を設定したいのであろうから、疑似乱数の式を書く場所は最初のforループの中。
  • 疑似乱数のシードをそれより前に一度実行する。わざわざtime.hをincludeしているから、time(NULL)を使うつもりだろう。
  • しかし、Nは最大人数の値であって、最大点数ではないので% Nで「0以上N未満の疑似乱数」にするのはおかしいだろう。最大点数を示す定数か何かを追加すべきだ。
  • maxsumの計算は並行して行なえる。
  • こうした計算にfloatをわざわざ使う必要はないので、doubleを使うべき。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#define MAX_STUDENTS 1000 5#define MAX_POINT 100 6 7int main(void) 8{ 9 srand(time(NULL)); 10 11 int total; 12 printf("input number of students in Class="); 13 scanf("%d", &total); 14 if (total > MAX_STUDENTS) { 15 printf("%d exceeds maximum number %d\n", total, MAX_STUDENTS); 16 return 1; 17 } 18 19 int a[MAX_STUDENTS]; 20 for (int i = 0; i < total; i++) { 21 /* 22 printf("input point of Student%d=", i + 1); 23 scanf("%d", &a[i]); 24 */ 25 a[i] = rand() % (MAX_POINT + 1); 26 printf("point of Student%d=%d\n", i + 1, a[i]); 27 } 28 29 int max = a[0]; 30 int sum = 0; 31 for (int i = 0; i < total; i++) { 32 sum += a[i]; 33 if (max < a[i]) { 34 max = a[i]; 35 } 36 } 37 38 double average = (double)sum / total; 39 printf("maximum point=%d\n", max); 40 printf("average point=%.2lf\n", average); 41 42 return 0; 43}

投稿2020/10/25 06:06

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

r0_.-

2020/10/25 06:17

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問