複数のデータを扱うための配列について説明していきます。
配列
今まで、たくさんの数値などのデータを扱うためには、必要なデータの数だけ変数を用意する必要がありました。
しかし、それが数個程度であればいいのですが、100個や1000個など膨大な数になると、それだけ変数名を変えながら、変数を用意する必要があり、現実的に無理だと言えます。
そこで、たくさんのデータを扱うのに便利な配列を説明します。
配列を使って5人のテストの点数を代入して表示してみます。
#include <stdio.h>
int main(void)
{
int point[5];
point[0] = 56;
point[1] = 75;
point[2] = 82;
point[3] = 63;
point[4] = 10;
printf("一人目の点数: %d\n", point[0]);
printf("二人目の点数: %d\n", point[1]);
printf("三人目の点数: %d\n", point[2]);
printf("四人目の点数: %d\n", point[3]);
printf("五人目の点数: %d\n", point[4]);
return 0;
}
5人の点数として、それぞれ56、75、82、63、10という点数を代入しました。
配列は、「int point[5];」という部分で用意しています。変数を用意するときとは違い、変数名の後に大かっこ([ ])を書き、その大かっこの中に整数を書いています。
この整数は、配列の要素数を表しています。
要素数は、配列に入れることができるデータの数です。
ここでは、5となっているので、要素数は5であり、この配列には5個のデータを入れることができます。
ちなみに、この配列はint型の配列となっているので、整数しか代入することができません。小数を代入したい場合は、「double point[5];」のように、変数の型を変更しましょう。
配列を用意したら、その配列に値を代入していきます。
配列名は「point」です。その配列point に値を代入するには、point[0]やpoint[1]のように、配列名の後に大かっこを書き、その大かっこの中に整数を書きます。この大かっこの中に書く数字のことを添字(そえじ)と言います。
その後に、代入のためのイコールを書いて、値を書きます。
イコールと代入したい値を書くというのは、変数と同じです。
配列の特殊な部分は、添字です。
最初に配列point は要素数が5という説明しました。
そのため、配列に値を代入するときには、その5つのデータが入る場所の内、どこに値を入れるのかを指定する必要があります。
その指定の方法が、大かっこの中の整数である添字です。
今回、要素数は5なので、添字は0から4の五つの数字で指定します。
最初が0から始まるので、最後が4となり、合計で5つの数字を入れることができます。
図として表すとこのようなイメージになります。
これに値を代入したイメージはこのようになります。
代入が終わったら、配列の中身を表示しています。
表示は、代入の時と同じように配列名と添え字を書きます。
配列にはint型のデータが代入されているので、printf関数では、%d を使用しています。
配列の注意として、配列内では、同じ型のデータしか扱うことができません。なので、int型のデータとdouble型のデータの両方を同じ配列で利用するということはできず、その場合は、int型の配列とdouble型の配列の2つを用意する必要があります。
繰り返しと配列
今までの配列を使ったプログラムでは、配列を使いこなしているとは言えません。
配列を使って便利だと感じるのは、for 文や while 文などの繰り返しと組み合わせて使っている時です。
次のソースコードは、入力された10の数字を配列に代入して、配列の値を全て足したものを答えます。
#include <stdio.h>
int main(void)
{
int num[10];
int i;
int sum = 0;
for (i = 0; i < 10; i++) {
scanf("%d", &num[i]);
}
for (i = 0; i < 10; i++) {
sum += num[i];
}
printf("sumの値は%dです\n", sum);
return 0;
}
通常であれば、10個の入力をするのであれば、scanf関数を10個書くか、「scanf("%d %d %d……」のようにたくさんの%d と配列名を書かなければならなかったのが、繰り返しと配列を使うだけで、短く書くことができました。
さらに、足し算においても、ひとつひとつ配列の中の値を参照しなければならなかったのが、繰り返しを使うことで、短く分かりやすくなりました。
このように、配列と繰り返しは相性がよく、頻繁に用いられます。
初期化
配列は、変数と同じように代入や初期化の処理をせずにデータを参照しようとすると、変な値が、表示されることがあります。
そこで、配列の初期化の方法を示しておきます。
#include <stdio.h>
int main(void)
{
int a[5] = {}; // 全て0
int b[] = { 1, 2, 3, 4, 5 }; // 要素数5
int c[5] = { 1, 2, 3 }; // 要素数5 0〜2番目まで指定された値が代入され3,4番目は0が代入
return 0;
}
3つの初期化の方法を説明します。
ひとつめの「int a[5] = {};」は、要素内全てのデータを0として初期化する方法で、イコールの後に、中かっこだけ書きます。
ふたつめの「int b[] = { 1, 2, 3, 4, 5 };」は、指定した値により初期化する方法で、イコールの後に、カンマで区切って値を書きます。この時、要素数は中かっこ内の値の数になるので、大かっこ内に要素数を書く必要はありません。
みっつめの「int c[5] = { 1, 2, 3 }」は、指定した値で初期化する方法ですが、大かっこ内の要素数と中かっこ内の値の数が一致していません。この時は、大かっこの数字が要素数となり、中かっこ内で指定していない場所の要素は、0として初期化されます。
多次元配列
配列には、多次元配列というものがあります。
これは、添字を複数書くことで使うことができません。
次のソースコードは、九九の結果を、二次元配列と呼ばれる、添字をふたつ書いて使う配列に代入して表示します。
#include <stdio.h>
int main(void)
{
int i;
int j;
int a[9][9];
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
a[i - 1][j - 1] = i * j;
}
}
for (i = 0; i < 9; i++) {
for (j = 0; j < 9; j++) {
printf("%3d", a[i][j]);
}
printf("\n");
}
return 0;
}
二次元配列は、「int a[9][9]」のように大かっこを2つかき、そこにそれぞれ要素数を書きます。値の参照も、それぞれの大かっこの中に添字を書きます。
今までの配列は、一次元配列とも呼ばれているもので、用意した画像のように、線でイメージします。
二次元配列は、線でイメージするのは難しく、表やグラフでイメージした方が分かりやすいです。
表でイメージする場合、「a[i][j]」とあった場合に、i の値は表を上から数えて何番目かの値を示します。j の値は表を横から数えて何番目か値を示します。
二次元配列なので、表でイメージしましたが、大かっこを3つ書いて「int a[9][9][9];」のように書いた場合、三次元配列と呼ばれ、立体の図形をイメージすると分かりやすいです。
(三次元配列の場合、ひとつめが縦、ふたつめが横、みっつめが高さを表す立体をイメージします。)
このように、大かっこでかく要素数の数を増やしていくと、二次元、三次元、四次元……、というように呼ばれ、それらを総称して多次元配列と呼ばれます。
次元を増やしていくと、イメージがしにくくなり、扱いにくくなります。考えて使うようにしましょう。
まとめ
配列に関する説明は、他のものに比べて短くなりました。
なぜ短くなったのかというと、今後説明する「ポインタ」や「文字列」でより詳しく説明や使い方を紹介するからです。
ポインタや文字列を理解していく上で重要なので、忘れてしまったら、ここに戻ってきて、見返すようにしましょう。