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;
}
}
