C言語で配列の使い方は覚えたが、では実際配列をどう応用すればいいのだ?という人も多いかと思います。
今回2次元配列を使って、1つの考え方の例を示します。
今回作った2次元配列のイメージはこんな感じです。データとしては0か1しか入っていません。
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
このイメージでC言語のint型2次元配列に直すとこうなります。
int invader[8][11] = { {0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1}, {1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1}, {0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0}, };
配列名でピンときた人もいるかもしれません。
これをループ処理、if文、printf関数などと組み合わせるとこんな表示になります。
考え方としては
0だったら 空白を表示
1だったら ■を表示
1だったら ■を表示
としています。わたしはこうした考え方は重要だと思っています。
変数や配列に何をさせるか?を考えるのがプログラマの役目とも言えるのではないかと。
要するにプログラマがこのデータはこうする!と自分で決めてしまえば配列が意味を成すということです。
先程のインベーダーが表示されるプログラムはこうなります。
xInvader.c
/*
xInvader.c: 配列の使い道
Copyright 2019 dianxnao.com
*/
#include <stdio.h>
int main(void)
{
int i, j;
int invader[8][11] = {
{0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
{0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1},
{1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1},
{0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0},
};
for(i=0; i<8; i++){
for(j=0; j<11; j++){
if(invader[i][j] == 1){
printf("■");
}
else printf(" ");
}
printf("\n");
}
return 0;
}
ちなみにプログラムを少し変えるとこうすることも出来ます。
わたしの好きなテトリスにこんなブロックがありました。
これを2次元配列で表すとこんな感じだと思います。
int block[2][3] = { {0, 1, 0}, {1, 1, 1}, };
配列に設定した数値(この場合0と1)を別の文字に置き換えて画面に表示させればテトリスのブロックが表示されたように見えるのです。
あくまでそういう風に見えるというのがコンピュータの世界なんだと思います。
コメント