● 配列で大量データ処理

■ 2人分の平均点を計算するプログラム(sample06.cc)

2人の人のテストの平均点を計算するプログラムを作ってみましょう。 各個人の点数はint型の整数ですが、平均値はdouble型の実数となることに 気を付けましょう。

// sample06.cc
#include <stdio.h>

main(void)
{
  int score1, score2;
  double mean;
    
  printf("Input the score of No.1 = ");
  scanf("%d", &score1 );
  printf("Input the score of No.2 = ");
  scanf("%d", &score2 );
    
  mean = (double)( score1 + score2 )/2.0;
    
  printf("The mean score is %lf \n", mean );
}

平均値を計算する所で、ふたつの整数値 score1, score2 の和に 対して (double) が冠されています。これにより、この冠された値は double型の値に変換されます。そして実数の2.0で割られます。
コンピュータの四則演算は同じ型同士で演算する決まりに なっています。この決まりに従わない異なる型での計算をC言語で記述すると それはC compilerによって自動的に型が同じになるように変換されます。 なので例えば先の平均値を計算する所で、

mean = (double)( score1 + score2 )/2;
または
mean = ( score1 + score2 )/2.0;
とすると、上側の例では分母の整数2がdouble型の値2.0に自動的に変換され、 下側の例では分子の整数値がdouble型に自動的に変換されます。 しかし、
mean = ( score1 + score2 )/2;
とすると、分母分子ともに整数なのでdouble型への自動的な変換は 行われません。整数同士の割算はC言語では整数の商を求める演算と 定義されています。つまり (1+2)/2 = 3/2 = 1 のようにです。 meanはdouble型なのにこのような整数値を代入 することになるとcompilerが文句を言いながらも次のように double型へ自動的に変換します。
mean = (double)( ( score1 + score2 )/2 );
値が微妙に異なることを理解しておいてください。


■ 10人分の平均点を計算するプログラム(sample07.cc)

今度は10人分の平均値を計算するプログラムを作ってみましょう。 単純に score1, score2, ... , score10 の変数を用意するは 宣言や平均値の計算式の記述などがかなり面倒です。 10個の変数をうまくまとめて簡潔に扱う方法が必要です。

そうした需要から配列変数というものが登場します。配列変数は 同じタイプのたくさんの変数をひとつの団体にまとめて、 その個々の要素の読み書きは、団体名に番目を表す数字を添えること によって実現されます。
具体例を見ましょう。まず配列変数の宣言は

int score[10];
のようにします。これで int型の変数が10個作られ、それをまとめた団体 名が scoreになります。そしてその団体の中のひとつの変数に値を代入 したり、また値をそこから取り出したりするには例えば
score[2] = 90; // 配列変数の要素への書き込み
a = score[3]; // 配列変数の要素からの読み込み
の様に[ ]の中に数字を入れて配列のどの要素かを指定することによって 実現されます。この数字のことを添え字と呼ぶのですがその数字の範囲は 0からその配列変数を宣言した時の[ ]の中の数字引く1の数字までです。 つまり int score[10] としたら score[0] から score[9] までの変数が できるわけです。くれぐれも score[10] とか score[-1] としないで下さ い。プログラムが暴走することもありますから。

さて、この配列変数を用いて先の10人分のテストの平均点を計算 するプログラムを作ってみます。

#include <stdio.h>
#define N 10

main(void)
{
  int score[N];                        // 配列の宣言
  int n, sum;
  double mean;
    
  for( n=0 ; n<N ; n++ ){           // 配列の各要素に値を入力
    printf("Input the score of No.%d = ", n );
    scanf("%d", &score[n] );
  }

  sum = 0;
  for( n=0 ; n<N ; n++ ){           // 合計点の計算
    sum += score[n];
  }
  mean = (double)sum/N;                // 平均点の計算

  printf("The mean score is %lf\n", mean );
}

プログラム冒頭で #define N 10 としています。これにより compilerは以後の N の部分を自動的に 10 に置き換えてくれます。 なので私達は冒頭のこの部分の数字を100と変えるだけで、100人分 を扱う改造を一瞬にしてできるのです。

for文と配列変数により、非常にすっきりと大量のデータを 扱うことができることがわかります。


■ 配列変数の初期化

配列変数の初期化についても触れておきましょう。このようにします。

int a[10] = {10,50,30,60,90,40,20,40,20,50};

こうするとコンパイルのときに自動的に各要素に値が初期化されます。 ただし、このように ={,,,,}で初期化できるのは配列変数の宣言 のときだけです。宣言後にはそのようにして代入はできません。


  • 次へ
  • 目次
    Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
    This page was modified on Aug 3rd, 1998.
    渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp