★データ構造(配列4)★
まず下のプログラムを見てください。
#include <stdio.h>
int main( void )
{
int data[5];
int i;
for( i=0; i<5; i++ ) {
scanf( "%d", &data[i] );
}
for( i=0; i<5; i++ ) {
printf( "data[%d] = %d\n", i, data[i] );
}
return 0;
}
|
<実行結果 VC++ Express Edition>
5
8
4
3
7
data2[0] = 5
data2[1] = 8
data2[2] = 4
data2[3] = 3
data2[4] = 7
続行するには何かキーを押してください・・・
5個の配列を用意し、それぞれの要素にscanfでデータを入力した後、printfで表示しています。
では、このプログラムの配列の要素を10個に増やして実行したい場合、どこを変更すればよいでしょうか。
上のプログラムを実際に変更して、試してください。
解答例です。
<sample program 064-02>
#include <stdio.h>
int main( void )
{
int data[10];
int i;
for( i=0; i<10; i++ ) {
scanf( "%d", &data[i] );
}
for( i=0; i<10; i++ ) {
printf( "data[%d] = %d\n", i, data[i] );
}
return 0;
}
|
<実行結果 VC++ Express Edition>
5
8
4
3
7
1
9
2
6
10
data2[0] = 5
data2[1] = 8
data2[2] = 4
data2[3] = 3
data2[4] = 7
data2[0] = 1
data2[1] = 9
data2[2] = 2
data2[3] = 6
data2[4] = 10
続行するには何かキーを押してください・・・
プログラム中に書いてあった「5」という数字を「10」に変えれば良いです。
全部で3箇所ありましたね。
簡単だと思うかもしれませんが、実際に色々なプログラムを組むことになった場合、プログラムの行数はこんなに少なくありません。
何千行ものプログラムを組むこともあり得ますが、その際に途中で仕様変更が入って「5」を「10」に変えなければならないこともあり得ます。
となると、「5」という数字が出てくる箇所も数箇所ではなく、何十箇所、何百箇所と出てくる可能性もあるわけです。
これを手直ししようとすると膨大な時間がかかります。
そこで、後々のメンテナンス等がし易いように作ることが重要になってきます。
このような時に使える命令を紹介します。
先頭のプログラム<sample program 064-01>を書き換える形で実際のプログラムを書いてみます。
<sample program 064-03>
#include <stdio.h>
#define COUNT 5
int main( void )
{
int data[COUNT];
int i;
for( i=0; i<COUNT; i++ ) {
scanf( "%d", &data[i] );
}
for( i=0; i<COUNT; i++ ) {
printf( "data[%d] = %d\n", i, data[i] );
}
return 0;
}
|
<実行結果 VC++ Express Edition>
5
8
4
3
7
data2[0] = 5
data2[1] = 8
data2[2] = 4
data2[3] = 3
data2[4] = 7
続行するには何かキーを押してください・・・
mainの前に、
#define COUNT 5
と書いてあります。
そして、プログラム中に直接「5」と書いてあった箇所はすべて「COUNT」という名前に変えています。
defineには「定義する」という意味がありますが、「置き換える」と考えたほうがわかりやすい気がします。
例えば、
数字の5をCOUNTという名前として定義する。
というより
COUNTと書いてある箇所は数字の5に置き換わる。
と考えた方が分かりやすいと思います。
「COUNTと書いてある箇所は数字の5に置き換わる」のですから、プログラム中のCOUNTの箇所は5と書いてあるのと同じことです。
なぜ、これがメンテナンス等がしやすいのかというと、仕様変更があり「5」を「10」に変更しなければならなくなった時に1箇所だけ変更すれば済むからです。
<sample program 064-04>
#include <stdio.h>
#define COUNT 10
int main( void )
{
int data[COUNT];
int i;
for( i=0; i<COUNT; i++ ) {
scanf( "%d", &data[i] );
}
for( i=0; i<COUNT; i++ ) {
printf( "data[%d] = %d\n", i, data[i] );
}
return 0;
}
|
<実行結果 VC++ Express Edition>
5
8
4
3
7
1
9
2
6
10
data2[0] = 5
data2[1] = 8
data2[2] = 4
data2[3] = 3
data2[4] = 7
data2[0] = 1
data2[1] = 9
data2[2] = 2
data2[3] = 6
data2[4] = 10
続行するには何かキーを押してください・・・
#define COUNT 5
と書いてあった箇所を
#define COUNT 10
に変えました。
これで、「COUNTと書いてある箇所は数字の10に置き換わる」訳ですから非常に楽ですね。
さて、この#defineですが、先頭に「#(シャープ)」が付いている命令はその上にもありますね。
#includeです。
どちらも末尾に「;(セミコロン)」が無いことに注目してください。
試しに「;」を付けてコンパイルしてみてください・・・エラーが出ますね。
先頭に「#」がついた命令は「;」は不要です。
気をつけておいてください。
また、COUNTという名前は大文字で書いています。
C言語は基本的にアルファベット小文字で書きますが、#defineで定義する名前は慣例的に大文字を使います。
別にCOUNTという文字でなくても構いませんが、その数字が表していることに相応しい名前を付けるよう心がけましょう。
次回からは配列を扱う際には、#defineを使っていきます。
余裕のある方は「#defineの罠」について読んでおいてください。