多次元配列

配列の要素が二方向に連続して並んでいるものを2次元配列と呼びます(二方向に連続したインデックスによってアクセスできるということであり、実際のメモリ領域では二方向にはなりません)。「配列の配列」と表現することができ、1次元配列の各要素が1次元配列を持っているような構造になります。下図は2次元配列の概念図です:

多次元配列

多次元配列の宣言

2次元配列変数は次のように宣言します。

型 配列変数名[縦方向のサイズ][横方向のサイズ];

サイズには、各方向の配列の要素の数を示し、[   ] の中に整数値の定数を指定します。例えば、縦方向のサイズが 5、横方向のサイズが 7 の2次元配列は以下のように宣言します:

int month[5][7];

1つ目の方向の1要素について、2 つ目の方向のサイズ分だけ要素があります。month[5][7]では、合計 5 × 7 = 35 の要素が確保されます。

多次元配列へのアクセス

上記2次元配列変数 month において、縦方向のインデックスが 3、横方向のインデックスが 1 である要素にアクセスするには month[3][1] と記述します。例:

int month[5][7], value;
month[1][5] = 3;
month[3][1] = 7;
month[4][6] = 0;
value = month[3][1]; // value の値は7

文字の扱いについて

この問題では、文字を入力で扱うため、文字の変数や入力について簡単に補足をします。文字や文字列の詳細についてはITP1_8以降で詳しく解説します。

文字はchar型の変数で管理し、scanfで読み込む場合は変換指定子として"%c"を用います。例えば、空白で区切られた文字と整数の組を入力するコードは以下のようになります。

char ch;
int x;
scanf("%c %d", &ch, &x);

scanfの"%c"は、空白文字や改行も読み込んでしまうため、文字と整数の組を連続して読み込む場合には注意が必要です。例えば、最初に回数nを読み込み、文字と整数の組をn回連続で変数に読み込むコードは以下のように書くことができます。

scanf("%d", &n);
for(i = 1; i <= n; i++){
  scanf("%c", &ch); /* 前の行の改行を1つ読み込む*/
  scanf("%c %d", &ch, &x); /* i行目の、文字と整数の組を読み込む*/
  /* ... */
}

C++の場合は、cin を用いて以下のように書くことができます。

cin >> n;
for(i = 1; i <= n; i++){
  cin >> ch >> x; // cin は空白改行を読み飛ばします
  // ...
}

文字をコードにそのまま記述する場合は、' ' (シングルコーテーション)でくくります。例えば、文字変数 ch の内容が文字'S'であるかどうかを判定するコードは次のようになります。

if ( ch == 'S' ){
  printf("This is Spade.\n");
}

Reference

 

オンラインジャッジではじめるC/C++プログラミング入門 (マイナビ)

AIZU ONLINE JUDGE のコース問題を題材にした解説書です。各トピックごとに C/C++ 言語の基礎的な内容を学習し、Introduction to Programming の演習問題にチャレンジしていきます。内容は敷居の高いものではなく、プログラミング初学者が取り組む例題からスタートしています。