C言語 配列

C言語

配列

同じ型の複数のデータをひとまとまりにして扱うデータ構造として、配列というものがあります。

配列には、型、配列名、要素数を与えます。この要素数によって、その配列に保存できるデータの数が決まります。

配列を定義すると、指定した型に応じた要素数分のメモリ領域が確保され、各領域には、ゼロから(要素数-1)まで順番に番号が割り振られます。配列名と割り振られた番号を使ってデータをメモリ領域に書き込んだり、読み出したりします。

配列は、要素番号を増減することで各データにアクセスできるので、繰り返し処理を使って配列内のデータの読み書きを容易に行うことができます。この点を踏まえたうえで、単純に複数の変数を使うか、配列を使うかの選択になると思います。

例えば、個別にa0、a1、a2という名前の変数を定義するか、3つの要素を持つ配列a[3]を定義するかという選択です。それぞれのメモリ領域にアクセスすることを考えたとき、個別の変数を使う選択をすると各変数名を書いて操作する必要があります。一方、配列を使う選択をすると繰り返し文と繰り返し回数をカウントする変数を使って操作することできます。繰り返し回数のカウント変数をiとするとa[i]のような形でiを繰り返し文の中で0から順番にカウントアップ、あるいは、2から順番にカウントダウンさせることで配列a[i]のデータにアクセスができます。

この例では、3つのデータでしたが、データの数が多く、そのデータが互いに関連していて順番に処理されるような関係を持っているものに対しては、配列として扱うとプログラムを組みやすくなるかと思います。

配列の書き方

配列は、型と配列名、要素数で宣言します。

この宣言により、型に応じたメモリ領域が自動的に確保されます。(上の図のアドレスの値は例です。)

例のようにchar型で配列名aを要素数4で宣言すると4バイト分の領域が確保され、a[0]、a[1]、a[2]、a[3]をchar型の変数のように扱うことができます。

配列の初期化

配列の初期化方法は2つあります。

一つは、配列の書き方で示したように型、配列名、要素数で配列を宣言し、宣言後、各要素に値を代入する方法です。

main()
{
    int rank[10];
    int i;

    //初期化
    for(i=0;i<10;i++){
        rank[i] = 1;
    }
}

この例では、int型の要素数10の配列rankを宣言し、その後、10個のint型の領域を1で初期化しています。

もう一つの初期化方法として、宣言時に行うやり方があります。

書き方としては、宣言時に各要素に代入する値をカンマ区切りで定義し、それを中括弧で括ります。

main()
{
    int score[10] = {56,25,67,88,100,61,55,67,76,56};

}

この例では、int型の要素数10の配列scoreを宣言時に初期化しています。

上のイメージ図のようにscore配列の各要素にそれぞれ56,25,67,…というように初期値が入ります。

配列を使った例題プログラム

AさんからJさんまで10人のテストの点数が下の図のように与えられたとき、その点数が何位かを答えるプログラムを作ってみます。ここでは、満点を100点とします。

#include <stdio.h>
main()
{
    //得点
    int score[10] = {56,25,67,88,100,61,55,67,76,56};
    //順位
    int rank[10];
    //ループ変数
    int i,j;
    //順位初期化
    for(i=0;i<10;i++){
        rank[i] = 1;
    }
    //順位更新
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(i!=j){
                if(score[i]<score[j]){
                    rank[i]++;
                }
            }
        }
    }
    //結果
    for(i=0;i<10;i++){
        printf("%3d :  %d\n",score[i],rank[i]);
    }
    printf("test end\n");
}
C:\prog>rank
 56 :  7
 25 :  10
 67 :  4
 88 :  2
100 :  1
 61 :  6
 55 :  9
 67 :  4
 76 :  3
 56 :  7
test end

この例では、2つのint型の配列rankとscoreを使っています。

rankは、順位を入れるための配列として使用し、scoreは、得点を入れる配列として使用しています。配列の初期化で示したようにscoreは、宣言時に初期化し、rankは、宣言後、使用時に初期化しています。

プログラムでは、自分の得点(ループ変数 i で取得してるscore[i])が相手の得点(ループ変数 j で取得しているscore[j])より低ければ、自分の順位を下げる(rank[i]を加算)という処理をしています。

これを変数を使って作ると大変なプログラムになると思います。こういった処理の場合、配列と繰り返し文を使ってプログラムを構成するとシンプルに作り上げることができます。

コメント

タイトルとURLをコピーしました