このプログラムでは、20人分の5教科(国語、英語、数学、理科、社会)の点数を乱数を用いて生成し、各個人の合計、平均、標準偏差、また教科別の平均を求める方法について解説します。問題の中で特に教科別に成績を表示する部分について詳しく見ていきます。
プログラムの流れ
まず、このプログラムでは`rand()`関数を用いて、30点から100点の間で乱数を生成し、それぞれの教科の点数をシミュレートします。次に、個人別の合計点数、平均、標準偏差を求め、最後に教科別の平均を計算します。
教科別の成績を扱うための構造
教科別に成績を管理するためには、まず各教科ごとの点数を2次元配列などで管理することが効果的です。例えば、20人の生徒に対して5教科の点数を扱う場合、以下のように2次元配列を定義することができます。
int scores[20][5];
このように、`scores[i][j]`で、i番目の生徒のj番目の教科の点数を格納します。
プログラムコードの改良
元のコードを改良して、教科別の成績を計算する部分を追加する方法を紹介します。
#include
#include
#include
#define N 20 // 生徒数
#define SUBJECTS 5 // 教科数
int main() {
int i, j;
float sum = 0.0, ave, var = 0.0, sd, maxi, mini;
float scores[N][SUBJECTS]; // 生徒数×教科数の2次元配列
srand(time(NULL));
// 点数の乱数生成
for(i = 0; i < N; i++) {
for(j = 0; j < SUBJECTS; j++) {
scores[i][j] = (float)(rand() % 71 + 30); // 30~100の乱数
}
}
// 個人別合計、平均、標準偏差の計算
for(i = 0; i < N; i++) {
float individual_sum = 0.0;
for(j = 0; j < SUBJECTS; j++) {
individual_sum += scores[i][j];
}
ave = individual_sum / (float)SUBJECTS;
sum += individual_sum;
var += individual_sum * individual_sum;
}
ave = sum / (float)(N * SUBJECTS);
var = var / (float)(N * SUBJECTS) - ave * ave;
sd = sqrt(var);
printf("全体の平均: %.2f\n", ave);
printf("全体の標準偏差: %.2f\n", sd);
// 教科別平均の計算
for(j = 0; j < SUBJECTS; j++) {
float subject_sum = 0.0;
for(i = 0; i < N; i++) {
subject_sum += scores[i][j];
}
float subject_ave = subject_sum / N;
printf("教科%dの平均: %.2f\n", j+1, subject_ave);
}
return 0;
}
このプログラムでは、最初に生徒数(N)と教科数(SUBJECTS)を定義し、`scores`という2次元配列で各生徒の教科ごとの点数を管理します。次に、個人別の合計点数を求め、それに基づいて平均と標準偏差を計算します。
教科別の平均点の計算
教科別の平均を求めるために、各教科ごとに生徒の点数を合計し、その合計を生徒数で割ります。この部分のコードでは、各教科に対して、全生徒の点数を足し合わせて平均を計算しています。
まとめ
このプログラムを使用することで、20人分の5教科の乱数による点数を生成し、個人別の合計、平均、標準偏差を計算することができます。また、教科ごとの平均も計算して、各教科の成績傾向を把握することができます。乱数を使用したシミュレーションにより、プログラムを使って簡単にデータの解析や確認を行うことが可能です。


コメント