みなためラボ

【C言語課題解説】多次元配列を用いた複数人の学生の成績の表示

文字サイズ

はじめに

どうも! みなため(@MinatameT)です。

この記事では、C言語で多次元配列を用いる課題の解説をしています。

多次元配列とは、2次元以上の配列のことです。例えば……

  • 2次元配列:int a[5][2]
  • 3次元配列:int a[5][4][3]

この2つが代表的ですね。4次元以上も使えるのですが、コードが複雑になるので基本的に使わないほうが良いと思います。

それでは、問題文を見ていきましょう。

問題文

2人の学生が、国語、数学、英語のテストを2回受けました。1回めのテストの点数と、2回めのテストの点数と、それらの合計を表示させるプログラムを作成しましょう。

ただし、次のように表示させてください。

1回めのテストの点数
国語 数学 英語
90   60   72
67   72   53

2回めのテストの点数
国語 数学 英語
43   46   35
82   97   56

2回のテストの合計
国語 数学 英語
133  106  107
149  169  109

解答例

まずは、コードを真面目に記述していきます。

愚直なコードなので、処理の内容はわかりやすいと思います。

#include<stdio.h>

int main(void)
{
  int score[2][3][2]; //左から「各学生」、「各科目」、「各回」
  int sum[2][3]; //左から「各学生」、「各科目の合計点」

  score[0][0][0] = 90; //1人めの学生の国語の1回めの点数
  score[0][0][1] = 43; //1人めの学生の国語の2回めの点数
  score[0][1][0] = 60; //1人めの学生の数学の1回めの点数
  score[0][1][1] = 46; //1人めの学生の数学の2回めの点数
  score[0][2][0] = 72; //1人めの学生の英語の1回めの点数
  score[0][2][1] = 35; //1人めの学生の英語の2回めの点数
  score[1][0][0] = 67; //2人めの学生の国語の1回めの点数
  score[1][0][1] = 82; //2人めの学生の国語の2回めの点数
  score[1][1][0] = 72; //2人めの学生の数学の1回めの点数
  score[1][1][1] = 97; //2人めの学生の数学の2回めの点数
  score[1][2][0] = 53; //2人めの学生の英語の1回めの点数
  score[1][2][1] = 56; //2人めの学生の英語の2回めの点数

  sum[0][0] = score[0][0][0] + score[0][0][1]; //1人めの国語の合計点
  sum[0][1] = score[0][1][0] + score[0][1][1]; //1人めの数学の合計点
  sum[0][2] = score[0][2][0] + score[0][2][1]; //1人めの英語の合計点
  sum[1][0] = score[1][0][0] + score[1][0][1]; //2人めの国語の合計点
  sum[1][1] = score[1][1][0] + score[1][1][1]; //2人めの数学の合計点
  sum[1][2] = score[1][2][0] + score[1][2][1]; //2人めの英語の合計点

  //%-5d:整数値を半角5つ分のスペースに「左詰め」で表示する。
  printf("1回めのテストの点数\n");
  printf("国語 数学 英語\n");
  printf("%-5d%-5d%-5d\n",score[0][0][0],score[0][1][0],score[0][2][0]);
  printf("%-5d%-5d%-5d\n",score[1][0][0],score[1][1][0],score[1][2][0]);
  printf("\n");
  printf("2回めのテストの点数\n");
  printf("国語 数学 英語\n");
  printf("%-5d%-5d%-5d\n",score[0][0][1],score[0][1][1],score[0][2][1]);
  printf("%-5d%-5d%-5d\n",score[1][0][1],score[1][1][1],score[1][2][1]);
  printf("\n");
  printf("2回のテストの合計\n");
  printf("国語 数学 英語\n");
  printf("%-5d%-5d%-5d\n",sum[0][0],sum[0][1],sum[0][2]);
  printf("%-5d%-5d%-5d\n",sum[1][0],sum[1][1],sum[1][2]);

  return(0);
}

処理の内容や配列の中身(意味)については、コード中のコメント文に書いてあります。

さて、このコードなのですが、for文を用いて簡略化できます。それが、次のコードです。

#include<stdio.h>

int main(void)
{
  int score[2][3][2]; //左から「各学生」、「各科目」、「各回」
  int sum[2][3]; //左から「各学生」、「各科目の合計点」
  int x,y; //ループ用

  score[0][0][0] = 90; //1人めの学生の国語の1回めの点数
  score[0][0][1] = 43; //1人めの学生の国語の2回めの点数
  score[0][1][0] = 60; //1人めの学生の数学の1回めの点数
  score[0][1][1] = 46; //1人めの学生の数学の2回めの点数
  score[0][2][0] = 72; //1人めの学生の英語の1回めの点数
  score[0][2][1] = 35; //1人めの学生の英語の2回めの点数
  score[1][0][0] = 67; //2人めの学生の国語の1回めの点数
  score[1][0][1] = 82; //2人めの学生の国語の2回めの点数
  score[1][1][0] = 72; //2人めの学生の数学の1回めの点数
  score[1][1][1] = 97; //2人めの学生の数学の2回めの点数
  score[1][2][0] = 53; //2人めの学生の英語の1回めの点数
  score[1][2][1] = 56; //2人めの学生の英語の2回めの点数

  for(x=0; x<=1; x=x+1) //学生数のループ
  {
    for(y=0; y<=2; y=y+1) //科目数のループ
    {
      sum[x][y] = score[x][y][0] + score[x][y][1]; //1回めと2回めの足し算
    }
  }

  //%-5d:整数値を半角5つ分のスペースに「左詰め」で表示する。
  for(x=0; x<=1; x=x+1) //テストの回数のループ
  {
    printf("%d回めのテストの点数\n",x+1);
    printf("国語 数学 英語\n");
    printf("%-5d%-5d%-5d\n",score[0][0][x],score[0][1][x],score[0][2][x]);
    printf("%-5d%-5d%-5d\n",score[1][0][x],score[1][1][x],score[1][2][x]);
    printf("\n");
  }
	
  printf("2回のテストの合計\n");
  printf("国語 数学 英語\n");
  printf("%-5d%-5d%-5d\n",sum[0][0],sum[0][1],sum[0][2]);
  printf("%-5d%-5d%-5d\n",sum[1][0],sum[1][1],sum[1][2]);

  return(0);
}

まず、2重ループで2回分のテストの合計点を計算しています。次のコードですね。

sum[x][y] = score[x][y][0] + score[x][y][1];

もし、3回分のテストを受けたとしたら……

sum[x][y] = score[x][y][0] + score[x][y][1] + score[x][y][2];

となります。

上記のコードは、もっと簡略化できるかもしれませんが、今回はここまでにしておきます。

上記のコードを参考に、多次元配列の扱いに慣れていければ良いですね。


 

みなためじゃんけん

このコーナーは、私と擬似的にじゃんけんできるコーナーです。

みなためじゃんけん、じゃんけんぽん!

私が出したのは……





パー

パーでした! チョキの勝利です!



この記事をSNSでシェアする

プログラミングカテゴリーの最新記事(5件)

最新記事(10件)

管理人のTwitter

内部リンク集