#include #include #define MAX_ST_NUM 50 /* 学生数の最大値 */ #define MAX_SCORE 115 /* 元の満点 */ 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); /* 点数の補正用関数*/ void grade_search(char); int main() { int i; FILE *fp; char c; /* ファイルから学籍番号と点数を読みこむコードをここに書く */ fp=fopen("score_data.txt","r"); if (fp==NULL) { printf("file open error\n"); exit(8); } 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; cof=(double)100/MAX_SCORE; s=(int)(s*cof+0.5); if (s>100) return 100; return s; } void grade_search(char c) { int i; for (i=0; i