プログラミング+α学習ブログ

勉強したことの備忘録です。

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