5人の学生の3教科(国語・数学・英語)の点数について、各科目別の最高点と、各学生の3教科の平均点を求めるプログラム
#include <stdio.h> #define STD_NO 5 // 学生の人数 #define SUB_NO 3 // 科目数 /*--- 点数の一覧表を出力する ---*/ void print_list(int v[][SUB_NO]) { int i, j; puts("No 国語 数学 英語"); puts("---------------"); for (i = 0; i < STD_NO; i++) { printf("%2d ", i + 1); for (j = 0; j < SUB_NO; j++) printf("%4d", v[i][j]); putchar('\n'); } puts("---------------\n"); } /*--- 科目subの最高点と最低点を求める ---*/ int top_sub(int v[][SUB_NO], int sub, int sw) { int i; int tmp = v[0][sub]; for (i = 1; i < STD_NO; i++) if (sw) { // sw = 1:最高点 if (v[i][sub] > tmp) tmp = v[i][sub]; } else { if (v[i][sub] < tmp) tmp = v[i][sub]; } return (tmp); } /*--- 科目subの合計点を求める ---*/ int sum_sub(int v[][SUB_NO], int sub) { int i; int sum = 0; for (i = 0; i < STD_NO; i++) sum += v[i][sub]; return (sum); } /*--- 科目subの平均点を求める ---*/ double ave_sub(int v[][SUB_NO], int sub) { /* 科目別合計点 / 学生の人数 */ return ((double)sum_sub(v, sub) / STD_NO); } /*--- 学生v[no]の合計点を求める ---*/ int sum_std(int v[][SUB_NO], int no) { int i; int sum = 0; for (i = 0; i < SUB_NO; i++) sum += v[no][i]; return (sum); } /*--- 学生v[no]の平均点を求める ---*/ double ave_std(int v[][SUB_NO], int no) { /* 学生別の合計点 / 科目数 */ return ((double)sum_std(v, no) / SUB_NO); } int main(void) { int i; int tensu[STD_NO][SUB_NO]; // tensu[学籍番号 - 1][科目番号] // 学籍番号は1 ~ STD_NO for (i = 0; i < STD_NO; i++) { printf("[%2d番]", i + 1); printf("国語:"); scanf("%d", &tensu[i][0]); // 科目番号0 : 国語 printf(" 数学:"); scanf("%d", &tensu[i][1]); // 科目番号1 : 数学 printf(" 英語:"); scanf("%d", &tensu[i][2]); // 科目番号2 : 英語 } putchar('\n'); /* 点数一覧表出力 */ print_list(tensu); /* 科目の最高点と最低点出力 */ printf("[国語]最高点:%d\n", top_sub(tensu, 0, 1)); printf(" 最低点:%d\n", top_sub(tensu, 0, 0)); printf(" 平均点:%.1f\n", ave_sub(tensu, 0)); printf("[数学]最高点:%d\n", top_sub(tensu, 1, 1)); printf(" 最低点:%d\n", top_sub(tensu, 1, 0)); printf(" 平均点:%.1f\n", ave_sub(tensu, 1)); printf("[英語]最高点:%d\n", top_sub(tensu, 2, 1)); printf(" 最低点:%d\n", top_sub(tensu, 2, 0)); printf(" 平均点:%.1f\n", ave_sub(tensu, 2)); puts("\n各学生の3教科の平均点"); for (i = 0; i < STD_NO; i++) /* 学生ごとの平均点 */ printf("%2d:%.1f\n", i + 1, ave_std(tensu, i)); return (0); }
実行結果
[ 1番]国語:98 数学:81 英語:76 [ 2番]国語:67 数学:72 英語:74 [ 3番]国語:82 数学:92 英語:62 [ 4番]国語:72 数学:65 英語:95 [ 5番]国語:86 数学:83 英語:84 No 国語 数学 英語 --------------- 1 98 81 76 2 67 72 74 3 82 92 62 4 72 65 95 5 86 83 84 --------------- [国語]最高点:98 最低点:67 平均点:81.0 [数学]最高点:92 最低点:65 平均点:78.6 [英語]最高点:95 最低点:62 平均点:78.2 各学生の3教科の平均点 1:85.0 2:71.0 3:78.7 4:77.3 5:84.3