#include #define MAX_ST_NUM 50 /* 学生数の最大値 */ #define MAX_SCORE 128 /* 元の満点 */ int student_id[MAX_ST_NUM]; /* 学籍番号 */ int abs_score[MAX_ST_NUM]; /* 点数 (補正前) */ char abs_grade[MAX_ST_NUM]; /* 補正前の評価 (A - F) */ int rel_score[MAX_ST_NUM]; /* 点数 (補正後) */ char rel_grade[MAX_ST_NUM]; /* 補正後の評価 (A - F) */ int grade_dist[2][5]; /* 評価の分布 [0]:補正前, [1] 補正後 */ /* 例 grade_dist[0][0] 補正前の Fの人数 */ char cgrade[5]={'F','D','C','B','A'}; /* 評価文字(評価点数と対応している)*/ int num_student; /* 実際に成績を読み込んだ学生の数 */ double abs_ave=0.0; /* 平均点(補正前) */ double rel_ave=0.0; /* 平均点(補正後) */ void adjust_score(void); /* 平均点を求め補正後の点数と評価を配列に書きこむ */ /* また、補正前後の各々の点数に対して評価を決定し、 その分布の処理も行う。*/ void print_grade(void); /* 補正前と後の点数と評価を表示。実行例参照 */ void print_stat(void); /* 統計と評価分布を表示。フォーマットは実行例参照 */ char grade_char(int); /* 点数を評価文字(A-F)に変換 */ int char_index(char); /* 評価文字をインデックスに変換 */ int calib(int); /* 点数の補正用関数*/ int main() { int i; /* 標準入力から学籍番号と点数を読みこむコードをここに書く */ for ( i=0 ; i=0 ; i-- ){ printf("%c %d ", cgrade[i], grade_dist[0][i]); } printf("\n補正後 "); for ( i=4 ; i>=0 ; i-- ){ printf("%c %d ", cgrade[i], grade_dist[1][i]); } printf("\n"); } /* 点数を評価(文字)に変換 */ char grade_char(int score) { if (score>=80) return 'A'; else if (score>=65) return 'B'; else if (score>=50) return 'C'; else if (score>=35) return 'D'; return 'F'; } /* 評価文字をインデックス(0-4)に変換 */ /* 以前使った gradeToPoint関数はGPに変換するが、   これはインデックスに変換している */ int char_index(char c) { if (c=='A') return 4; else if (c=='B') return 3; else if (c=='C') return 2; else if (c=='D') return 1; return 0; /* F */ } /* 点数を補正し、四捨五入 */ int calib(int s) { double cof = (double) 100/MAX_SCORE; int r = (int) (s*cof+0.5); if (r > 100) return 100; return r; }