配列の利用
配列とは値を入れる箱(変数)をまとめて棚をつくることです。C言語では、複数の変数をまとめて管理する方法の1つを配列(array)といいます。配列が利用できるのは、同じ種類の変数をまとめて管理するときだけです。
1次元配列
まずは、データを一列に並べて取り扱う方法を次の例で考えてみましょう。
例題:商品が1列に値段順に10個並んでいます。この時、何番目の商品かを入力すれば、値段を表示するようにプログラムを作成します。入力された値が1~10であれば、その番号の値段を表示し、入力に戻ります。それ以外の値ならプログラムを終了します。
上の例をプログラムにすると以下のようになります。
#include <stdio.h>
int main(){
int price[10]; //①
int number;
/*値段の初期設定②*/
price[0]=80; price[1]=100; price[2]=120;
price[3]=140; price[4]=150; price[5]=160;
price[6]=200; price[7]=198; price[8]=220;
price[9]=280;
/*繰り返し処理*/
do{
printf("値段を知りたい番号を入力してください");
printf("[1-10以外なら終了]\n");
scanf("%d", &number);
/*値段表示*/
if((number >= 1) && (number <= 10)){
printf("%d番の棚は、%d円です\n", number, price[number-1]);
}
}while((number>=1) && (number <= 10));
return(0);
}
上のプログラムでは、簡単に記述する方法として配列が用意されています。①と②に注目してみましょう。
配列を使った変数宣言と値の代入(①、②)
配列を使わない変数宣言では、「price0, price1, ‥‥」と変数をそれぞれ別々に記述しますが、ここでは、price[10]と記述しています。このように、
変数の型 変数名[変数の個数(n)];
として変数宣言すると、変数がn個並んでいる配列を用意できます。これを配列の宣言といい、名づけた変数名は配列名となります。配列の宣言をすれば、1行の記述で、n個の値を記憶できる場所を用意できることになります。ひとつひとつの入れ物を配列の要素といい、[ ]で囲んだ番号がつきます。これをインデックス(index)といいます。
②では、配列の1つ1つに商品の値段を代入しています。int price[10];として用意された配列に値を代入するときは以下のようになります。
配列の1番目の要素に値を代入するとき | price[0]=80; |
配列の2番目の要素に値を代入するとき | price[1]=100; |
: | : |
配列の最後の要素に値を代入するとき | price[9]=280; |
配列の要素それぞれには、[0]~[19]までの番号がつきます。ここで注意することは、配列の一番初めの番号は[0]であるということです。20個の値を入れる配列であれば、0~19までの番号がついた箱を並べていることになります。
2次元配列
前項では、変数を並べて管理する1次元配列を扱いましたが、配列にはより拡張した使いかたがあります。次の例題で考えていきましょう。
例題:3人で4種類のゲームを行ったときの得点をゲームごとにそれぞれ入力し、各人の得点と合計得点を次のように表示できるようにしてください。
ゲーム1 | ゲーム2 | ゲーム3 | ゲーム4 | 合計 | |
A | 10 | 40 | 7 | 28 | 85 |
B | 2 | 30 | 13 | 27 | 90 |
C | 5 | 40 | 11 | 29 | 85 |
次に、これをプログラムに記述していきます。
#include <stdio.h>
int main(){
int point[3][4]; //A,B,Cの得点を記憶する配列①
int total[3];
int i, j;
/*得点の入力②*/
for(i=0; i<4; i++){
for(j=0; j<3; j++){
switch(j){
case 0:printf("A"); break;
case 1:printf("B"); break;
case 2:printf("C"); break;
}
printf("のゲーム%dの得点を入力してください\n", i+1);
scanf("%d", &point[j][i]);
}
}
/*合計得点の計算③*/
for(j=0; j < 3; j++){
total[j]=0;
for(i=0; i<4; i++){
total[j] = total[j] + point[j][i];
}
}
/*表の表示④*/
for(j=0; j < 3; j++){
for(i=0; i<4; i++){
printf("%4d", point[j][i]);
}
printf(" :%d\n", total[j]);
}
return(0);
}
上のプログラム①、②、③、④について解説していきます。
2次元配列の用意(①の部分)
①の部分では、
配列の型 配列名[X][Y];
という記述をしています。これは、「配列名[Y]」という1次元配列を、さらに1次元配列のようにまとめて用意するという配列の宣言です。このように1次元配列をさらに1次元配列として記述したものを2次元配列といいます。
2次元配列+繰り返し処理へと書き換え、分岐処理を行う(②の部分)
②では、「変数の並び→1次元配列+繰り返し処理」と同じように「1次元配列の並び→2次元配列+繰り返し処理」という書き方をしています。そのため、繰り返しが2重になっています。
また、switch文によって表示する文字の分岐処理をしています。配列を使えば、変数をまとめて「配列名[番号]」として番号で管理できますが、「A」「B」「C」という文字の並びで管理できません。文字を使いたい場合などは、分岐処理が必要になります。
2次元配列+繰り返し処理への書き換え
③、④の部分でも、「1次元配列の並び→2次元配列+繰り返し処理」という書き方をしています。そのため、繰り返しが2重になっています。
このようにして、1次元配列の並びをさらにまとめて、2次元配列で表現することで、プログラムがすっきり記述できます。
配列の使用方法詳細
ここでは、配列の扱い方について詳細な説明をしていきます。
配列の宣言の記述方法
2つ以上の変数をまとめて、番号をつけて1つの配列名で管理する1次元配列は、次のような配列の宣言で記述することで利用できます。
記憶する値 | 1次元配列の配列宣言の記述 |
整数 | int 配列名[並べて扱う変数の数] |
整数 | long int 配列名[並べて扱う変数の数] |
整数 | short int 配列名[並べて扱う変数の数] |
整数 | unsigned int 配列名[並べて扱う変数の数] |
実数 | float 配列名[並べて扱う変数の数] |
実数 | double 配列名[並べて扱う変数の数] |
文字 | char 配列名[並べて扱う変数の数] |
たとえば、int array[10]と宣言すれば、20個の整数値をまとめて管理することが可能です。2次元配列として宣言する場合は以下のようになります。
1次元配列: int array0[10], array1[10], ……, array50[10]; ↓ 2次元配列: int array[50][10];
1次元配列→2次元配列とまとめたのと同じように、2次元配列→3次元配列とまとめることもできます。このように何重にもまとめた配列を多次元配列と呼びます。
※大きさがばらばらな配列や異なる種類の変数をまとめてひとつの配列にはできません。
配列の扱い方
配列宣言を行い、値を記憶する場所を用意した配列をどのようにしてプログラム内で取り扱うかまとめます。
1次元配列をint array[100];として配列宣言した場合は、
array[0] = 20; array[1] = 100; ‥‥‥ array[99] = 80;
のようにして配列の1つ1つの要素に代入できます。つまり、「配列名[n]」とすることで、これまでに利用してきた変数と同じように1つずつの値を取り扱うことができます。
ここで注意するのは、「配列名[n]」のnの部分の整数は、0から始まります。int array[100];では、array[0]~array[99]の100個の値を記憶できます。
2次元を超える配列の場合も、[整数]を重ねて記述すれば値の代入、取り出しを行えます。