Tips

【C言語で】# 二次元配列【ビンゴを作ろう】

【C言語で】# 二次元配列【ビンゴを作ろう】

C言語でBINGOを作ろう #10 二次元配列

C言語でBINGOを作ろう!

C言語でBINGOを作ろう!

CUI上で動くビンゴゲームの完成目指してひっそりとプログラムの勉強を始めました。前回は配列の使い方を紹介しました。今回は配列を使ってみます。

気が付けば NATSUYASUMI NO OWARI だYO!!

サンプルがほしい方は#11から読んでください。

開発環境

開発環境はこちらをご覧ください。

また、C言語の開発環境を構築したい場合は以下を参考にしてください。

C言語環境構築前編

C言語環境構築後編

コマンドプロンプトからサクラエディタを起動できるようにしてみた前編

コマンドプロンプトからサクラエディタを起動できるようにしてみた後編

本記事は以上の設定を行っている前提で説明を行います。

 

BINGOの記事一覧はこちら

 

二次元配列とは

二次元配列とは

二次元配列とは、配列の要素が配列になっているものです。

↓こんな感じ

multi_dim_array

見方を変えると表のように行と列があるようなイメージです。人によってはこちらの方がイメージしやすいかもしれません。

↓こんな感じ

multi_dim_array2

 

ただし実際には、C言語の場合、二次元配列はメモリ上に一直線に並んでいます。

↓こんな感じ

multi_dim_array3

 

ちなみに普通の配列(一次元配列)はこうでした↓

nums2

見た目はよく似てますね。

一次元配列と二次元配列の大きな違いは、要素の指定の方法です。二次元配列の場合は2つのインデックスを指定しないと要素を特定できません。

普通の配列は下のように使えばOKでした。

int num[3];

num[2] = 10;

要素数3の配列を作り、num[2]に10を代入しています。

これが二次元配列になった場合、以下のようになります。

int num[3][3];

num[0][1] = 7;

要素数が3×3=9の二次元配列を作り、num[0][1]に7を代入していることになります。インデックスを2つ指定しないといけないので要注意です。

こんな感じ↓

multi_dim_array_example

二次元配列の作り方

二次元配列を使うには、配列と同じように宣言してやる必要があります。宣言方法は何通りかあります。

注意しなければならない点として、第二次元(num[x][y]のy)は必ず指定しなければいけません。二次元配列の場合もメモリ上の配置は通常の配列と変わらないため、2つ目以降の[]を指定しない場合、どこが配列同士の境目になるのかわからなくなってしまうためです。

例えば、↓のような、全要素数が6の二次元配列があった場合

no_border

要素数を指定しなければ、要素2の配列が3個入っているのか(上)、それとも要素数3の配列が2個入っているのか(真ん中)、はたまた要素数1の配列が6個入っているのか(下)わかりません。

no_border2x3

no_border3x2

no_border1x6

第一次元(num[x][y]のxの部分)は、省略できることもあります。(全体の要素数と他の要素数がすべてわかる場合は自動的に判明するため。)

 

二次元配列の代表的な宣言方法は以下の通りです。

方法1 配列の中身(要素)まで決める

普通の配列のように初期化子{}を利用して宣言と同時に初期化します。

配列の中に配列が入っている形なので、{ {配列0の要素},{配列1の要素},{配列2の要素} }といった形で、配列の中に配列が入っているように記述します。

データ型 配列名[][n] = { {値1,値2,・・・,値n}, {値1,値2,・・・,値n}, ・・・, {値1,値2,・・・,値n} };
int num[][3] = { {0, 1, 2}, {3, 4, 5} };

この方法はでは第一次元は指定しなくても自動的にわかるので大丈夫です。(環境によっては警告やエラーが出る可能性はあります。)

2つ目の[]を指定しないとコンパイルエラーになります。また、第二次元で、実際の要素数よりも小さい数字を指定するとコンパイルエラーが発生します。

int num[][2] = { {0, 1, 2}, {3, 4, 5} }; //コンパイルエラー

 

方法2 配列の要素数だけ決める

こちらは普通の配列の時とほとんど同じです。

データ型 配列名[要素数][要素数];
int num[3][4];

初期化子を使用する場合と異なり、第一次元も指定しないといけないので注意してください。

 

二次元配列を使ってみる

二次元配列を使ってみる

では早速二次元配列を使ってみましょう。

なお、何度も何度も書きますが、C言語では変数は初期化しないと何が入っているのかわりません。必ず初期化してから利用してください。これは配列でも二次元配列でも同様です。

二次元配列を使う際も、配列と同じような手順で使います。

1.二次元配列を作る

2.二次元配列を初期化する

3.二次元配列を使う

int型のnumという変数名の二次元配列を作成して中身を初期化、値を代入、表示してみます。

やり方その1~配列を作るのと同時に初期化~
#include <stdio.h>
int main(void){
  /* 二次元配列を作る&初期化 */
  int num[3][3] = { {0, 1, 2}, {10, 11, 12}, {20, 21, 22} }; //配列の初期化子の中に配列の初期化子が入っている形になっている。
  /* 配列を表示 */
  printf("num[0][1] = %d", num[0][1]);
  return 0;
}
やり方その2~配列を作った後で初期化~
//今日の宿題(^O^)/

前回同様、配列を作った後で初期化することも可能です。ということで、今日の宿題はこれw

※アドバイス:とりあえずlengthは使わなくてOKです。どうしても使いたい人はlengthだけでは難しいので、頑張って行数rowと列数colを計算してくださいねwww

配列の注意事項

二次元配列を使う場合も、インデックスには注意しなければいけません。

二次元配列の各インデックスも0から始まります。要素数3×3であれば、次の図のようなインデックスとなります。

multi_dim_array3

配列が3個あり、それぞれの配列は0から始まって3個なので、インデックスは[0][0]、[0][1]、[0][2]、[1][0]、・・・、[2][1]、[2][2]の9個です。要素数は3×3ですが、インデックスには3は使用しません。

また、各配列の要素数が3の場合、4番目の要素やインデックス5の要素はありません。しかし、プログラム上はこれらを指定することができてしまいます。

もしも存在しないはずの配列の要素に触ってしまった場合、何が起こるかわかりません。例えば、上記の3×3の二次元配列の場合、num[0][4]と指定すると、実際にはnum[1][1]に触ってしまいます。また、num[2][2]よりも後ろの領域を触ってしまうと何が起こるかわかりません※。十分注意してください。

※配列の時も紹介しましたが、悪用しようとすれば意図的に利用することもできます。

おまけ

前回は

sizeof(大きさを調べたいもの)

で、大きさを調べました。

今回の場合も下のように書くと二次元配列全体でどのぐらいの大きさになっているのかわかります。

sizeof(num);

また、二次元配列の要素1個分の大きさは下のようにすれば求まります。

sizeof(num[0][0])

もし、各配列の大きさがわかればrowやcolが計算できるかも・・・?

 

おまけ:多次元配列

おまけ:多次元配列

多次元配列とは読んで字のごとく、2次元以上配列のことです。

例えば

int num[3][4][5]; //三次元配列の例

という感じ。基本的な注意事項は二次元配列と似ています。

※今回は使用する予定が無いので紹介だけにしておきます(^^

ちなみに、やる気と気合と根性があれば100次元配列とかも作れます。が、実際に作っても紛らわしすぎて使うのが大変です。ご利用は計画的にw

 

宿題コーナー

毎回恒例、みなさんお楽しみの宿題のコーナーです。

前回の宿題と解答例

前回の宿題は、「要素数5のint型の配列numを準備して値を0で初期化してください。その後、numの要素に好きな値を代入してください。最後に、numの要素をすべて表示してください。」でした。な、長い・・・w

そのため解答は以下の通りです。

解答例

#include <stdio.h>

int main(void){
  int num[5];
  int length = sizeof(num) / sizeof(num[0]);
  int i = 0;
  for(i = 0; i < length; i++){
    num[i] = 0;
  }
  //int num[5] = {0,0,0,0,0}; //で初期化してもOK
  for(i = 0; i < length; i++){
    num[i] = i * 2; // numの要素が0,2,4,6,8になる。
  }
  for(i = 0; i < length; i++){
    printf("num[%d] = %d\n", i, num[i]);
  }
  return 0;
}

実行結果※表示される数値は自分が作ったプログラム通りのものであれば下の通りである必要はありません。

num[0] = 0
num[1] = 2
num[2] = 4
num[3] = 6
num[4] = 8
今日の宿題

要素数3×4のint型の配列numを準備してください。
その後、一度各要素の値を0で初期化してください。
その後、numの要素に好きな値を代入してください。
最後に、numの要素をすべて表示してください。

 

次回はいよいよビンゴマシーンの作成を始めます。お勉強ばっかりじゃつまらないもんね!(^^

 

BINGOの記事一覧はこちら

 

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search