C プログラミング (C Programming)

[2017/11/06, H.Aman]
[← 演習のページへ戻る]

サンプルプログラム 2 の内容

整数を SIZE 個読み込み,それらを順に配列 a へ格納する.
その後に別の配列 b へ a の内容をコピーする.
なお,SIZE はマクロとして定義する.
 1:   #include <stdio.h>
 2:   
 3:   #define SIZE 5
 4:
 5:   int main(void){
 6:      int a[SIZE], b[SIZE];
 7:      int i;
 8:
 9:      printf("%d 個の整数を入力してください\n", SIZE);
10:      for ( i = 0; i < SIZE; i++ ){
11:         scanf("%d", &a[i]);
12:      }
13:
14:      printf("配列 a を配列 b へコピーします.\n");
15:
16:      for ( i = 0; i < SIZE; i++ ){
17:         b[i] = a[i];
18:      }
19:
20:      printf("  a   b\n");
21:      printf("-------\n");
22:      for ( i = 0; i < SIZE; i++ ){
23:         printf("%3d %3d\n", a[i], b[i]);
24:      }
25:
26:      return 0;
27:   }

3 行目: #define SIZE 5

 1:   #include <stdio.h>
 2:   
 3:   #define SIZE 5
 4:
 5:   int main(void){

既に説明しましたが,配列の大きさは定数でなければなりません.
ここではこの値を 5 にしたいのですが,プログラムの中でもこの配列の大きさ(=5)が何度か登場することになります.

そこであらかじめ,配列の大きさに相当する数SIZE という名前で参照できるように定義しておきます.
それが 3 行目の
   #define SIZE 5
です.
これをマクロといいます.

マクロを使うと,後になって「配列の大きさを 5 から 10 に変更したい」という場合でも
   #define SIZE 5
               ↓
   #define SIZE 10	
という具合いに一箇所だけ変更すればよいことになり便利です.
これだけで,それ以降のすべての SIZE という部分が 5 から 10 に置き換わります.

改めて,マクロの使い方ですが
   #define  マクロ名    定義したい内容
と書きます.
途中に = は書きませんし,行の終わりにセミコロン(;)も書きません

あくまでもマクロは,定義したい内容の「別名」なだけであり,変数ではないのです.

9-12 行目: printf("...."); for ( i = 0; i < SIZE; i++ ){ ... }

 8:
 9:      printf("%d 個の整数を入力してください\n", SIZE);
10:      for ( i = 0; i < SIZE; i++ ){
11:         scanf("%d", &a[i]);
12:      } 
13:   

ここでは for 文を使って繰り返しながら,整数を読み込み,配列 a へ格納しています.
特別なことではないのですが,ここでも配列の大きさに相当する値の部分はマクロである SIZE を指定します.

このサンプルプログラムの場合は SIZE を 5 と定義していますので,SIZE の代わりに直接 5 と書いても動作は変わりません
しかし,それではせっかくマクロを定義したのに台無しになります.

繰り返しになりますが,対応する箇所を SIZE という表記に統一しておくことで, 後から配列の大きさを変えたくなった場合に一発で対処できる(#define SIZE の部分を変えるだけで済む)というメリットがあります.

さらに,マクロに意味のある名前を付けておくことで,単に 5 といった数字と異なり,何を意味する値なのかが明確になります.
これは意外と大事なところであり,他人が見ても理解できる,分かりやすいプログラムを書けるかどうかのポイントの一つです.

16-18 行目: for ( i = 0; i < SIZE; i++ ){ b[i] = a[i]; }

14:      printf("配列 a を配列 b へコピーします.\n");
15:
16:      for ( i = 0; i < SIZE; i++ ){
17:         b[i] = a[i];
18:      }
19:

このサンプルプログラムには,もう一つ大事なところがあります.
それは,配列のコピーです.

配列は,複数の変数が集まったものなのですが,すべての変数をまとめてコピー(代入)することができません

つまり,
   a = b;  
だけで済ませたいのですが,残念ながらこれではうまくいきません
※詳しくは「ポインタ」という概念を扱う回に説明します.

そこで地道ではありますが,確実なのは一つ一つコピーしてあげることでして, for 文を使って順番に a[i] を b[i] に代入してあげています.