配列変数を利用した計算 


   配列変数とは?

   例えば、100個もの整数をキーボードから入力し、その合計や平均値を表示するプログラムは、いままでの知識でも作成可能である。しかし、100個の整数のうち、同じ値を除外(すなわち、入力不可)して入力するためには、100種類の整数値を変数に保存して判断する必要がある。この場合、100個の変数にa1,a2,・・・,a100などという名前を付けても、いま入力した値と前に入力済みの値が同じであるかを判断することは困難である(1ケタぐらいなら作成可能だろうが)。
 これを容易にするのが配列変数である。この変数は、複雑な計算を行うほとんどのプログラムで使用される。
配列変数は、数学の行列を思い浮かべればよい。
数学では、行列 A=[a1,a2,a3,a4] などと書くが、
C言語では、配列変数 a を宣言して、a[0] , a[1] , a[2] , a[3] のようにして用いる。ここで、a[2] などを配列の要素と呼び、[ ]内の数字を配列の添字という。また、C言語の場合、添字は常に0から始まるので注意しよう。さらに、配列変数を宣言するときは、
 int a[11];
のように書くが、この場合、使用可能なのは a[0] 〜 a[10] まで(11個)である。すなわち、配列変数を宣言するときに[ ]内に書く数字は、使用可能な個数と考えればよい。
 なお、上のような配列を1次元配列というが、他に2次元配列( a[1][2] などと表す)、3次元配列( b[2][3][4] などと表す)、...、n次元配列が
使用可能である(2次元配列までがよく用いられる)。

 下の例題は、異なる整数を6つ入力してもらい、その合計値を表示するプログラムである。ここでは、プログラムが多少複雑なので最初は配列変数の便利さを体験するに留めてもよい。
 実行したら、合計値が表示されるまで、整数を入力してみよう(故意に同じ値を入力してみるとよい)。

  

   配列変数とは?
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
/*  ary01.c  */
 
#include <stdio.h>
 
int main(void)
{
    int i,c,n,b,x;
    int a[11];
    int s;
 
    n=6;
    c=1;
    do { 
         printf("count=%d\n",c); 
         scanf("%d",&x);
         b=0;
         if (c>1) {
           for (i=0; i<c-1; i++) { 
                if (a[i]==x) { b=1; }
           }
         }
         if (b==0) { a[c-1]=x; c=c+1;} 
    } while (c<=n);
 
    s=0;
    for (i=0; i<n; i++) {
         s=s+a[i];
    }
    printf("sum=%d\n",s); 
 
    return 0;
}
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
-
-
-
-
-
-
-
配列変数の宣言 
-
-
入力上限 
カウントを1にする 
繰り返しの始まり 
   現在のカウントの表示 
   整数xの入力 
   bを0にセット 
       cが2以上ならば 
    同じ数がないか探す 
   添字は0から始まっている 
-
-
 もし、bが0ならカウントアップ 
 カウントが7になったらループをぬける
-
 変数sを0にする(初期化) 
 n個の合計の繰り返し計算 
 C言語では普通 s+=a[i]; と書く
-
合計値の表示 
-
-
-


 
 ● 
配列変数を用いた合計値の計算

 以前に出題した[問題02]に類似する問題を配列変数を用いたプログラムに書き直してみる。

 [問題02’] 6つの数(実数)を配列変数に読み込み、その平均値を求め、表示するプログラムを作りなさい。

 以下がその解答例である。ここでは、入力数が6個のみなので、前のものよりもプログラムが極端に短くなるわけではないが、
数を100個に変更しても変更する行は、08行目と11行目だけである。
   

 

 ● 配列変数を用いた合計値の計算
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
/*  ary02.c  */
 
#include <stdio.h>
 
int main(void)
{
    int i,n;
    double x[11];
    double sum,mean;
 
    n=6;
    for (i=0; i<n; i++)  {
        printf("No.%d : ",i+1);
        scanf("%lf",&x[i]);
    }
    sum=0;
    for (i=0; i<n; i++)  {
        sum=sum+x[i];
    }
    mean=sum/n;
    printf("%f\n",mean); 
 
    return 0;
}
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
-
-
-
-
-
-
-
配列変数の宣言 
-
-
-
入力のループ 
 i+1を表示
 配列の要素に値を代入 
   添字は0から始まっている
-
 合計値の計算ループ 
 C言語では普通 sum+=x[i]; と書く
-
 平均値の計算 
 平均値の表示 
-
-
-


 

 

 
 [問題12] 5つの数(実数)を配列変数に読み込み、それらの値を入力した順とは逆に表示するプログラムを作りなさい。

 例えば、
 1.2
 3.4
 9.1
 6.7
 8.5
 と入力したとき、
 8.5
 6.7
 9.1
 3.4
 1.2
 のようにさかさまに画面に表示されるプログラムを作る。

 
 [問題13] 5つの数(実数)を配列変数に読み込み、最後に入力した数値で、
        それらの数を割った値を表示するプログラムを作りなさい。

 例えば、
 2.5
 1.5
 3.0
 4.5
 0.5
 と入力したとき、
 5.0
 3.0       (1.5÷0.5=3.0)
 6.0       (3.0÷0.5=6.0)
 9.0
 1.0       ここは、必ず1.0となる。
 のように画面に表示されるプログラムを作る。

 
 [問題14] 9つの数(実数)を配列変数に読み込み、最初は偶数番目入力(2,4,6,8番目に入力)の実数、
        次に奇数番目入力(1,3,5,7,9番目に入力)の実数を表示するプログラムを作りなさい。

 例えば、
 2.7 : 1.4 : 3.2 : 4.7 : 0.2 : 9.5 : 7.6 : 5.8 : 8.1  
 と入力(実際に各数字はスペースかリターンキーで区切る)したとき、
 1.4
 4.7
 9.5
 5.8
 2.7
 3.2
 0.2
 7.6
 8.1
 のように画面に表示されるプログラムを作る。


 ● 最大・最小値の求め方

   配列変数を扱えるようになると、その配列変数内の最大値と最小値を得ることが可能となる。
ただし、注意しないと誤ったプログラムを記述してしまう場合も多い。
  以下にプログラム例を示し、注意すべき箇所を明示する。


 ● 配列変数内の最大値と最小値の求め方
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
/*  aminmax.c  */
 
#include <stdio.h>
 
int main(void)
{
    int i,n;
    double x[11];
    double min,max;
 
    n=6;
    for (i=0; i<n; i++)  {
        printf("No.%d : ",i+1);
        scanf("%lf",&x[i]);
    }
 
    min=x[0]; max=x[0];
 
    for (i=1; i<n; i++)  {
        if (min>x[i]) { min=x[i]; }
        if (max<x[i]) { max=x[i]; }
    }
 
    printf("min=%f\n",min); 
    printf("max=%f\n",max); 
 
    return 0;
}
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
-
-
-
-
-
-
-
配列変数の宣言 
-
-
今回は6個
入力のループ 
 i+1を表示
 配列の要素に値を代入 
   添字は0から始まっている
-
ここが極めて重要 初期値
-
0からでもOKであるが、1からでよい。
現時点での最小値が代入される
現時点での最大値が代入される
-
-
最小値の表示
最大値の表示

 

 戻る