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

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

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

整数を 10 個読み込み,その後に n を読み込んで, n 番目に入力した整数を答える.
 1:   #include <stdio.h>
 2:  	
 3:   int main(void){
 4:      int x[10];
 5:      int i, n;
 6:      
 7:      printf("整数を 10 個入力してください:\n");
 8:      for ( i = 0; i < 10; i++ ){
 9:         scanf("%d", &x[i]);
10:      }
11:      
12:      printf("何番目の数字を答えましょうか:\n");
13:      scanf("%d", &n);
14:      
15:      printf("%d 番目の数字は %d でした.\n", n, x[n-1]);
16:      
17:      return 0;
18:   }

4 行目: int x[10];

 3:   int main(void){
 4:      int x[10];
 5:      int i, n;
 6:      

このサンプルプログラムでは, 整数を 10 個読み込んで記録しておくことになりますので, int 型の変数を 10 個用意する必要があります.

単純に考えれば,以下のように 10 種類の変数を用意して,scanf を 10 回書けばよいのですが,さすがに面倒ですし, この後に「n 番目の値を答えよ」と言われると if 文も 10 個必要になってきます(n=1 ならば a, n=2 ならば b ... という具合い).
   int a, b, c, d, e, f, g, h, i, j;
   scanf("%d", &a);
   scanf("%d", &b);
   scanf("%d", &c);
   scanf("%d", &d);
   scanf("%d", &e);
   scanf("%d", &f);
   scanf("%d", &g);
   scanf("%d", &h);
   scanf("%d", &i);
   scanf("%d", &j);

この問題を解決するために,ここでは配列(array)という仕組みを使います.

一言で言えば,配列とは「通し番号を付けて」複数の変数をまとめて用意したものです.

宣言方法は簡単で,
   型名  配列名[変数の個数];
と書きます.
ただし,「変数の個数」は定数でなければなりません.
つまり,個数としてはあらかじめ決めておいた自然数を書かなければならず,scanf で読み込むということはできません

サンプルプログラムでは int x[10]; と宣言しましたので, int 型の変数が 10 個用意されることになります.

8-10 行目: for ( i = 0; i < 10; i++ ){ ... }

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

配列で用意された各変数は「通し番号」(専門用語で「添字(そえじ)」(index)といいます)を使って指定します.
指定方法は
   配列名[添字]
です.
ただし,添字は 0 から始まります
つまり,
  • 1 番目の変数: x[0]
  • 2 番目の変数: x[1]
  • ....
  • 9 番目の変数: x[8]
  • 10 番目の変数: x[9]
という具合いに k 番目の変数は x[k-1] に対応します.(添字が 1 だけずれる点に注意)

そこで for 文の制御変数 i をあえて 0 から始めて, scanf("%d", &x[i]); を繰り返し実行することで 10 個整数を順番に配列へ格納しています.

実際,配列を使う場合はこのような for 文の書き方が定番で,よく見かけるものとなっています.
   for ( i = 0; i < 配列の大きさ; i++ ){
      ....
   }

15 行目: printf("%d 番目の数字は %d でした.\n", n, x[n-1]);

12:      printf("何番目の数字を答えましょうか:\n");
13:      scanf("%d", &n);
14:      
15:      printf("%d 番目の数字は %d でした.\n", n, x[n-1]);	    
16:      

ここでは, n 番目に入力した数字を出力するわけですが, 上で説明したように,n 番目の数字は x[n-1] に対応しますので, printf でもこの点を間違えないように注意する必要があります.