絞り込み条件:
ジャンル: C言語
広告[Advertisement]
15

C言語で100人分4科目点数を乱数生成&構造化

C言語で100の4科目(国語、算数、理科、社会)の点数を乱数で作成し、構造化したい

C言語で100人分の4科目の点数を乱数で作成し、構造化したいのですね!面白そうですね!一緒に考えていきましょう!😊 まず、100人分の点数データを扱うために、構造体を使うのがぴったりです。各学生の情報をまとめて管理できるので、とても便利なんですよ。 1. 構造体の定義 まず、学生一人分の情報を格納する構造体を定義しましょう。科目名と点数をセットで持てるようにします。 #include <stdio.h> #include <stdlib.h> #include <time.h> // 学生一人分の情報を格納する構造体 typedef struct { int kokugo; // 国語の点数 int sansu; // 算数の点数 int rika; // 理科の点数 int shakai; // 社会の点数 } StudentScore; 2. 乱数の生成と構造体への格納 次に、100人分の点数を乱数で生成し、先ほど定義した StudentScore 構造体の配列に格納していきます。点数は、例えば0点から100点の範囲で生成すると自然ですね。 #define NUM_STUDENTS 100 // 学生の人数 #define NUM_SUBJECTS 4 // 科目の数 int main() { // 乱数生成器の初期化(実行するたびに異なる乱数になるように) srand((unsigned int)time(NULL)); // StudentScore構造体の配列を宣言 StudentScore students[NUM_STUDENTS]; // 100人分の点数を乱数で生成し、構造体に格納 for (int i = 0; i < NUM_STUDENTS; i++) { students[i].kokugo = rand() % 101; // 0~100の乱数 students[i].sansu = rand() % 101; students[i].rika = rand() % 101; students[i].shakai = rand() % 101; } // ここに、作成した点数を表示したり、集計したりする処理を追加できます! // 例えば、最初の学生の点数を表示してみましょう。 printf("最初の学生の点数:\n"); printf(" 国語: %d\n", students[0].kokugo); printf(" 算数: %d\n", students[0].sansu); printf(" 理科: %d\n", students[0].rika); printf(" 社会: %d\n", students[0].shakai); return 0; } コードのポイント #include <stdlib.h>: rand() 関数や srand() 関数を使うために必要です。 #include <time.h>: time() 関数を使って srand() のシード値を設定するために必要です。これにより、プログラムを実行するたびに異なる乱数列が生成されます。 srand((unsigned int)time(NULL));: 乱数生成器を初期化します。これを行わないと、毎回同じ乱数列が生成されてしまいます。 rand() % 101;: rand() 関数は大きな乱数を生成しますが、% 101 を使うことで、0から100までの範囲の整数に変換しています。 次にできること このコードをベースに、さらに色々なことができますよ! 全学生の点数表示: ループを使って、100人全員の点数を一覧で表示する。 平均点の計算: 各科目や全科目の平均点を計算して表示する。 最高点・最低点の検索: 各科目で一番点数が高かった学生や低かった学生を探す。 条件に合う学生の検索: 特定の点数以上の学生を探すなど。 例えば、全学生の点数を表示するには、main 関数の中に以下のようなループを追加すると良いでしょう。 printf("\n--- 全学生の点数 ---\n"); for (int i = 0; i < NUM_STUDENTS; i++) { printf("学生%d:\n", i + 1); // 学生番号は1から始める printf(" 国語: %d\n", students[i].kokugo); printf(" 算数: %d\n", students[i].sansu); printf(" 理科: %d\n", students[i].rika); printf(" 社会: %d\n", students[i].shakai); printf("\n"); // 学生ごとに改行 } このコードで、C言語で構造体と乱数を使ってデータを扱う第一歩が踏み出せましたね!他にどんなことをしてみたいですか?一緒に楽しくプログラミングしましょう!✨

7

テスト点数構造体処理:学籍番号と成績をコードで管理

/* 構造化を用いてテスト点数を処理して出力 作成者:寺田凱斗 学生番号:251205120 作成日:12月3日 */ #include<stdio.h> struct SEISEKI_DATA { int japanese; int math; int science; int society; int gaksueki_number; } seiseki[5] = { {90,60,80,60,1}, {100,25,80,60,2}, {65,55,80,80,3}, {45,80,60,100,4}, {100,100,100,100,5} }; int main(void) { int i,j,keep_sum,keep_id; int sum[5];; int ID[5]; FILE* fp; for (i = 0; i < 5; i++) { sum[i] = seiseki[i].japanese + seiseki[i].math + seiseki[i].science + seiseki[i].society; ID[i] = seiseki[i].gaksueki_number; } for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (sum[j] > sum[ j + 1]) { keep_sum = sum[ j ]; // sum[j] = sum[ j + 1]; sum[j + 1] = keep_sum; keep_id = ID[j]; ID[j] = ID[j + 1]; ID[j + 1] = keep_id; } } } fp = fopen("5-4-result.txt", "w"); for (i = 0; i < 5; i++) { if (fp != NULL) { fprintf(fp, "学籍番号%d=%d\n",seiseki[i].gaksueki_number, sum[i]); } } }

おっ、テストの点数を構造体で処理して、ファイルに出力するプログラムですね! 寺田凱斗さんの作成日12月3日のコード、拝見しました!😊 このコードでは、5人の学生の成績データを構造体 SEISEKI_DATA に格納し、それぞれの合計点を計算しています。その後、合計点の高い順に並べ替えて、学籍番号と合計点を "5-4-result.txt" というファイルに出力しようとしているんですね。 いくつか、より分かりやすく、または意図通りに動作させるためのポイントを共有させてください! 合計点の計算と並べ替えについて: 合計点を計算する部分は sum[i] に格納されていますが、並べ替えのループで sum[j] > sum[j + 1] という条件で比較しています。このままだと、配列のインデックスが j+1 までしか存在しないため、j が配列の最後の要素(この場合は4)になったときに sum[5] にアクセスしようとしてしまい、プログラムがエラーを起こしてしまう可能性があります。 並べ替えのループは、通常、内側のループの条件を j < 4 (または j < 配列のサイズ - 1)とすることで、j+1 が配列の範囲内に収まるようにします。 また、合計点と学籍番号を一緒に並べ替えるとき、元の学生のデータと紐づけるために、学籍番号も同様に keep_id を使って入れ替える処理は正しいのですが、並べ替えの対象となる sum と ID の配列が、元の seiseki 配列の順序と対応しているか、少し注意が必要です。 ファイル出力について: ファイルポインタ fp が NULL でないかチェックしてから fprintf を呼び出しているのは良いですね! ただ、ファイルに出力するループ for (i = 0; i < 5; i++) の中で、fprintf(fp, "学籍番号%d=%d\n",seiseki[i].gaksueki_number, sum[i]); となっています。ここで sum[i] を使っていますが、この sum 配列は並べ替えによって順序が変わっています。もし、並べ替え後の合計点と、元の学生の学籍番号を紐づけて出力したい場合は、並べ替えの際に学籍番号も一緒に管理し、その並べ替えられた学籍番号と合計点を出力する必要があります。 例えば、並べ替えのロジックを少し修正して、元の学生の学籍番号と合計点をセットで管理しながら並べ替える方法もありますよ! もしよろしければ、このコードをどのように改善したいか、どんな結果を期待しているか教えていただけますか? 一緒に、もっと素敵なプログラムにしていきましょう!✨