C言語 入門 小学生でもわかるC言語

十二日目 配列(はいれつ)

「わかりやすく!」がテーマです!

HOME/小学生でもわかるC言語 目次/十二日目 配列(はいれつ)/

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

?と思ったら

わからなそうな用語集

配列(はいれつ)

(1)上から順番に
(2)条件で分かれ道
(3)くり返し

基本的なプログラムの仕組みは学びました。次にそれを使いこなす上で便利な機能「配列(はいれつ)」を紹介します。

たくさんの変数

今までは簡単なプログラムばかりだったので、変数も1つか2つぐらいしか使いませんでした。

でも変数が100個や200個に増えた時に全て別々に名前を付けるのは、けっこう大変ですよね!

そんな時に使うのが「配列」です!

使ってみよう!

/*プログラム35*/
#include <stdio.h>

int main(){
	int hairetu[5] = {2,4,1,0,3};
	
	printf("hairetu[0] = %d\n",hairetu[0]);
	printf("hairetu[1] = %d\n",hairetu[1]);
	printf("hairetu[2] = %d\n",hairetu[2]);
	printf("hairetu[3] = %d\n",hairetu[3]);
	printf("hairetu[4] = %d\n",hairetu[4]);

	return 0;
}

■実行結果■

実行結果(b-12-1)

■説明■

配列は変数に番号をつけて使いやすくしたものです。

まずは宣言ですね!

int hairetu[5] = {2,4,1,0,3};

「int」タイプの変数「hairetu」を5個使います!という事で「hairetu[5]」とします。

初期化は{}カッコの中に「,」コンマで区切って書くことができます。

使う時は

hairetu[0];

このように[ ]カッコの中に番号を書いて使います。この番号の事を添え字(そえじ)といいます。

表示する時は「%d」でお尻に「hairetu[0]」というようにすれば大丈夫です。

注意

さきほどのプログラムを見ると

printf("hairetu[0] = %d\n",hairetu[0]);

添え字(そえじ)に注目してください。番号が「hairetu[0]」から始まってます。

そうです!

配列の番号は「0」から始まります!なので最後は「hairetu[4]」となりますのでご注意ください。

ここで鋭い方は気づいたかもしれませんがこの「hairetu[4]」の隣の「hairetu[5]」の内容も実は調べたり変更したりする事ができます。

が!これは

バッファオーバーフロー

というもっともやってはいけないエラーが発生するので絶対にやめましょう!

これはコンピューターは限られたメモリをムダにしないように再利用しながら動いております。

なのでプログラム上でコンピューターに「このメモリ使いますよ!」と宣言した場所以外のメモリはコンピューターを動かす上で超大事な数字が保存されていたりするのです!

やりようによってはコンピューターが壊れてしまうかもしれませんので絶対にやめておきましょう。

上手に使ってみよう!

ただ分けるだけなら「a1,a2,a3,a4,a5」でもいいんですけど、配列にする事によってa[ ]カッコの中の数字を変数にできます!

さきほどのプログラムをもっと簡単に書きましょう!

/*プログラム36*/
#include <stdio.h>

int main(){
	int hairetu[5] = {2,4,1,0,3};
	int suji;

	for(suji = 0;suji < 5;suji++){
		printf("hairetu[%d] = %d\n",suji,hairetu[suji]);
	}

	return 0;
}

■実行結果■

実行結果(b-12-2)

■説明■

配列と「for」命令のよく使われるカタチです!

for(suji = 0;suji < 5;suji++){
	printf("hairetu[%d] = %d\n",suji,hairetu[suji]);
}

「hairetu[suji]」で配列の内容を順番に表示してる所がポイントですね!

表示させたい所に「%d」、お尻の表示させる変数の順番にも注意しましょう!

配列のテクニック!番兵(ばんぺい)

たくさんのデータの中から目的のデータを探し出したい時ってありますよね!

でもそこにデータがあるかどうかはわからない。

しかもすごいたくさんのデータなので全部調べるのは大変。

そこで登場!番兵!

これはわざと目的のデータを途中に入れておく事によって、プログラムのムダをなくすテクニックです。

/*プログラム37*/
#include <stdio.h>

int main(){
	int hairetu[10] = {2,5,1,8,3,0,7,6,9,4};
	int suji = 0;

	while(hairetu[suji]){
		printf("hairetu[%d] = %d\n",suji,hairetu[suji]);
		suji++;
	}

	return 0;
}

■実行結果■

実行結果(b-12-3)

■説明■

まず「while」命令の条件に注目ですね!

while(hairetu[suji]);

これも「if」命令の時に学んだ条件「1」合っている。「0」合っていない。のカタチの一つですね。

「「0」合っていない」がくればくり返しが終わる事を利用してます。もちろんそれ以外はくり返します。

なれないウチは変に感じるかと思いますが、そのまま覚えましょう!

このように条件「0」でくり返しをぬける方法や、他にも「while」命令の中に

if(hairetu[suji] == 9)break;

のように「if」命令でくり返し終了の条件を入れる方法もありますので合わせて覚えておきましょう!

2次元配列(にじげんはいれつ)

「にじげん!」って聞いただけでいっきにレベルアップしそうな感じですが、ご安心ください。ただ配列が束(たば)になっただけの話です。

2次元のイメージ

オセロのマスとか将棋のマスのような平面を想像してください。

int hairetu[6][4];

例えば「hairetu[6][4]」という2次元配列だとすると「縦6マス×横4マス」のような平面を想像します。

実行結果(b-12-4)

こんな感じですね。このそれぞれのマスに数字とかを入れていくイメージで考えるとわかりやすいかと思います。

2次元の場合も配列番号の最初は[0][0]から始まりますので、この場合の終わりは[5][3]になります。

ではプログラムを作ってみましょう!

/*プログラム38*/
#include <stdio.h>

int main(){
	int hairetu[3][2];

	hairetu[0][0] = 1;
	hairetu[0][1] = 2;
	hairetu[1][0] = 3;
	hairetu[1][1] = 4;
	hairetu[2][0] = 5;
	hairetu[2][1] = 6;

	printf("[0][0] = %d:[0][1] = %d\n",hairetu[0][0],hairetu[0][1]);
	printf("[1][0] = %d:[1][1] = %d\n",hairetu[1][0],hairetu[1][1]);
	printf("[2][0] = %d:[2][1] = %d\n",hairetu[2][0],hairetu[2][1]);

	return 0;
}

■実行結果■

実行結果(b-12-5)

■説明■

まず2次元配列の宣言ですが、

int hairetu[3][2];

このようになります。配列[縦]×[横]のようなイメージで作りましょう。

次に初期化ですが、ちょっとめんどくさいやり方をしてます。

hairetu[0][1] = 2;

このように場所を一つ一つ選んで数を入れる事ができます。

まとめて初期化する方法もありますので次のプログラムで説明いたします!

配列と「for」命令でプログラムをパワーアップ!

最初の方にやったクリスマスツリーを書くプログラムを配列と「for」命令を使って書き直しましょう!

/*プログラム39*/
#include <stdio.h>

int main(){

	int tree[9][9] = {
			{0,0,0,0,0,0,0,0,0},
			{0,0,0,0,1,0,0,0,0},
			{0,0,0,9,9,9,0,0,0},
			{0,0,9,9,9,9,9,0,0},
			{0,9,9,9,9,9,9,9,0},
			{0,0,0,0,9,0,0,0,0},
			{0,0,9,9,9,9,9,0,0},
			{0,0,0,9,9,9,0,0,0},
			{0,0,0,0,0,0,0,0,0}
	};

	int suji1,suji2;

	for(suji1=0;suji1<9;suji1++){
		for(suji2=0;suji2<9;suji2++){
			if(tree[suji1][suji2] == 9)printf("□");
			else if(tree[suji1][suji2] == 1)printf("☆");
			else printf("■");
		}
		printf("\n");
	}

	return 0;
}

■実行結果■

実行結果(b-12-6)

■説明■

2次元配列をまとめて初期化してます。

int tree[9][9] = {

{0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0},
{0,0,0,9,9,9,0,0,0},
{0,0,9,9,9,9,9,0,0},
{0,9,9,9,9,9,9,9,0},
{0,0,0,0,9,0,0,0,0},
{0,0,9,9,9,9,9,0,0},
{0,0,0,9,9,9,0,0,0},
{0,0,0,0,0,0,0,0,0}

};

このように一列一列を{}カッコで囲む事によって平面のように2次元配列を初期化できます。

初期化の時だけこの書き方はできます!

{}カッコの間を「,」コンマで区切っているのと、最後の列だけは{}カッコの後「,」コンマが付かないので注意してください。

2重ループ

次に2重ループが使われてます。これもなれないと最初はややこしいと思います。

for(suji1=0;suji1<9;suji1++){
	for(suji2=0;suji2<9;suji2++){
		(ループ中の命令);
	}
}	

ループのイメージですが

まず外側のループを通りこして先に内側のループで横一列のラインを作ります。

その1

■■■■■■■■■

一列作った所で一度内側のループを抜けて縦のラインを一つだけ進めてから、再び内側のループに入ります。

その2

■■■■■■■■■
■■■■☆■・・・

後はくり返しですね!

その3

■■■■■■■■■
■■■■☆■■■■
■■■□□□■■■
■■□□□・・・

内側のループが終わったら外側のループを一つ進めるというのを想像しましょう!

「if」命令で条件に合う所を置きかえる

そしてループの最中に条件に合う所の数字を絵柄に置きかえます。

if(tree[suji1][suji2] == 9)printf("□");
else if(tree[suji1][suji2] == 1)printf("☆");
else printf("■");

2次元配列の全ての内容を2重ループで調べる。その内容の条件が合えば置きかえる。これがポイントですね!

配列はプログラムを組む上でスゴイ大事なテクニックです。何回も練習して身につけましょう!

次回

十三日目 配列と文章

□ページの先頭へ□

□目次へ戻る□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本

□ページの先頭へ□

□HOME□