さて、基本制御文も一通り終わりましたので、次は新しいデータ構造「配列」について書いていきます。
データ構造とは、簡単に言うとデータをどのように格納(保管)しておくかということです。
これまで、データを格納するために、「変数」を使ってきましたが、「変数」だけでは限界があります。
例えば、5個のデータを格納しておくためには5個の変数が必要です。
5個のデータを入力し、合計を求めるプログラムを考えたとしましょう。
この時に、合計計算した後も入力した5個のデータをすべて残しておくこととした場合、次のようなプログラムになります。
<sample program 061-01>
#include <stdio.h> int main(void) { int data1; int data2; int data3; int data4; int data5; int sum; scanf("%d", &data1); scanf("%d", &data2); scanf("%d", &data3); scanf("%d", &data4); scanf("%d", &data5); sum = data1 + data2 + data3 + data4 + data5; printf("sum = %d\n", sum); return 0; } |
<実行結果>
5 2 4 3 7 21 続行するには何かキーを押してください・・・
入力した5個のデータを残しておくために「data1〜data5」という5個の「変数」を用意しています。
すべての変数を加算すると合計が求められますが、このプログラムを次のように改良するにはどうすれば良いでしょうか。
100個のデータを入力し、合計を求める。 ただし、100個のデータは残しておくこと。
今のままでは「data1〜data100」までの変数を準備し、それらすべてを加算するしか方法がありません。
そこで、新しいデータ構造「配列」が必要となります。
「配列」とは同じ型のデータを複数格納できる構造です。
int型の変数を5個分準備するならば、次のように準備します。
int data[5]; |
「変数」の後ろに括弧を付けて、その中に準備したいデータの個数を書きます。
これで、int型の変数5個分の領域が確保できました。
「data」というのは変数名と同じく、配列の名前ですので、こちらである程度自由に決められます。
※命名の規則については「変数について」を見てください。
また、「変数」と同じく準備した時点での中身は「不定」となっています。
次は使い方についてですが、データを格納する場所は5個ありますが、名前が1つ(data)しかありません。
そのため、各要素(各変数)にアクセス(代入や表示)するためには「添え字(インデックス)」というものが必要になります。
まず、「配列」のイメージを書きます。
図1(配列のイメージ)
図1のように「変数」はデータを格納する場所が1個しかありませんが、「配列」は複数用意できます。
図中の「添え字」という部分を見てください。
「配列」には「0」から始まる「添え字」が存在し、この「添え字」によって場所を指定できます。
では、1つプログラム例を書きます。
<sample program 061-02>
#include <stdio.h> int main(void) { int data[5]; data[0] = 5; printf("data[0] = %d\n", data[0]); return 0; } |
<実行結果>
data[0] = 5 続行するには何かキーを押してください・・・
「配列」の最初(0番目)の要素へ「5」を代入し、表示しています。
配列の要素1つ1つは変数と同じように使えますので、「添え字」で区別すればよいのです。
上のプログラムの[0]の部分を他の数値に変えてみて実行してください。
色々と試した方は、あれ?と思ったかもしれません。
5個のデータを格納する配列の「添え字」は「0〜4」までです。
「添え字」の部分にこれ以外の数値を書いた場合、次のようなエラーが表示されることがあります。
<sample program 061-03>
#include <stdio.h> int main(void) { int data[5]; data[5] = 12; printf("data[5] = %d\n", data[5]); return 0; } |
<実行結果>
これは、範囲外の「添え字」を使っているため、エラーになっているのです。
ちなみに、コンパイル時にエラーは出ません。
「表示されることがある」と書いたのは、出ないときもあるからです。
ただし、エラーが表示されないからといって正しく動作している訳ではありません。
「添え字」は必ず範囲内に収まるようにしてください。
さて、次はこの「添え字」を使ってすべての要素にデータを代入することを考えてみます。
次のプログラムを見てください。
データ5個分の配列を用意し、すべてに0を代入するプログラムです。
<sample program 061-04>
#include <stdio.h> int main(void) { int data[5]; data[0] = 0; data[1] = 0; data[2] = 0; data[3] = 0; data[4] = 0; return 0; } |
<実行結果>
続行するには何かキーを押してください・・・
※代入しているだけなので、何も表示されません。
data[0]からdata[4]までそれぞれ0を代入しています。
ただ、このような書き方だと、変数を使った場合と同じく、100個のデータに0を代入するとなると、100行のプログラムが必要になります。
これを解消するために、配列には「添え字」があります。
実は「添え字」の部分には「変数や式」も書けます。
「添え字」を変数にすることにより、もっと簡単にプログラムが書けるのです。
上のプログラムの「添え字」の部分を見てください。
0から始まり、1ずつ増えて4まで変化しています。
反復構造でさんざん書いた、カウンタが使えそうです。
では、書き換えてみましょう。
<sample program 061-05>
#include <stdio.h> int main(void) { int data[5]; int i; for (i = 0; i < 5; i++) { data[i] = 0; } return 0; } |
<実行結果>
続行するには何かキーを押してください・・・
※代入しているだけなので、何も表示されません。
0から4まで「5回」繰り返していますので、繰り返し回数の決まっている場合に使うfor文を使いました。
変数iをカウンタとして準備し、0から始まり5より小さい間1ずつ増やすことで、配列の要素「data[0]からdata[4]」へ0を代入しています。
配列の「添え字」は0から始まる連続した番号が付けられていますので、while文やfor文と組み合わせることで効率よくプログラムを組むことができるのです。
ただし、このままでは本当に0が入っているのかどうか確かめられませんので、中身を表示するプログラムを付け加えましょう。
<sample program 061-06>
#include <stdio.h> int main(void) { int data[5]; int i; for (i = 0; i < 5; i++) { data[i] = 0; } for (i = 0; i < 5; i++) { printf("%d\n", data[i]); } return 0; } |
<実行結果>
0 0 0 0 0 続行するには何かキーを押してください・・・
表示にもfor文を使い、「data[0]からdata[4]」まで表示しています。
もうちょっと分かりやすく表示するため、表示部分を次のように変えてみます。
<sample program 061-07>
#include <stdio.h> int main(void) { int data[5]; int i; for (i = 0; i < 5; i++) { data[i] = 0; } for (i = 0; i < 5; i++) { printf("data[%d] = %d\n", i, data[i]); } return 0; } |
<実行結果>
data[0] = 0 data[1] = 0 data[2] = 0 data[3] = 0 data[4] = 0 続行するには何かキーを押してください・・・
カウンタ「i」が添え字を表していますので、少し工夫するとこのように表示することができます。
これから配列について色々と書いていきますが、配列と繰り返し処理は切っても切れない関係ですので、しっかりと身につけていきましょう。