SkipTest 2018
From Prog0
2018年度スキップテスト
問題
GPA(Grade Point Average)は大学における成績評価の世界標準的な方法であり、以下の計算式で算出される。
GPA= (4 x 評価がAの科目の単位数(以下同様) + 3 x Bの単位数 + 2 x Cの単位数) / 総履修科目単位数(※評価がD、F、履修放棄の単位数を含む)
なお、単位数の係数となる値(A: 4など)をGrade Pointと呼ぶ。また、AからF、および放棄の評価と評点との関係は以下の通りである。
- A: 80-100点,B: 65-79点,C: 50-64点,D: 35-49点,F: 34点以下,履修放棄: 0点
以下の仕様に基づいて、学生の成績管理とGPA(Grade Point Average)の算出を行うプログラムを作成せよ。
- 全部で4つの科目があるものとし,それぞれの科目の単位数は,
科目1: 4単位, 科目2: 4単位, 科目3: 3単位, 科目4: 4単位
とする
- int型の配列courseに上記の各科目の単位数を格納すること
- int型の二次元配列studentに学生の学籍番号と各科目の評点(0-100点)を保存すること
- 評点を引数とし,Grade Pointを戻り値とする関数gradeを作成し,使用すること
- プログラム実行後,学籍番号と評点はキーボードから入力され,その後各学生のGPAが表示されること
- 学生の人数は最大で50名とする.マクロMAXSTUDENTSで人数を定義し,プログラム中で使用すること
- 学籍番号と評点の入力時に,Control+Dを入力することで,最大人数より少ない人数で入力を終えるようにできること
- 表示のフォーマット等は実行例と厳密に合っていなくてもよい
[実行例]
学生の学籍番号と各科目の評点を入力してください 1260401 98 100 80 77 1260402 75 63 50 72 1260403 49 0 30 60 1260404 82 64 51 55 1260405 79 71 88 62 (ここでControl+Dを入力) 各学生のGPAは以下の通りです ID: 1260401, GPA: 3.733333 ID: 1260402, GPA: 2.533333 ID: 1260403, GPA: 0.533333 ID: 1260404, GPA: 2.533333 ID: 1260405, GPA: 2.933333
解答例
#include <stdio.h> #define MAXSTUDENTS 50 #define COURSES 4 int grade (int); int main () { int course[4] ={4, 4, 3, 4}; int total = 0; int student[MAXSTUDENTS][5]; int i, j, k; double gpa; /* 総履修科目単位数を求める */ for(i = 0; i < COURSES; i++) total+=course[i]; /* メッセージ表示 */ printf("学生の学籍番号と各科目の評点を入力してください\n"); /* 学籍番号・評点入力 */ for (k = 0; k < MAXSTUDENTS; k++) { if(scanf("%d%d%d%d%d", &student[k][0], &student[k][1], &student[k][2], &student[k][3], &student[k][4]) == EOF) break; } /* 結果表示 */ printf("各学生のGPAは以下の通りです\n"); for(i = 0; i < k; i++) { gpa = 0; for(j = 0; j < COURSES; j++) { gpa += grade(student[i][j+1])* course[j]; } printf("ID: %d, GPA: %.6f\n", student[i][0], gpa/total); } return 0; } int grade (int score) { if (score >= 80 && score <= 100) { return 4; } else if (score >= 65 && score <= 79) { return 3; } else if (score >= 50 && score <= 65) { return 2; } else { return 0; } }