ほぷしぃ

納得C言語!

[第10回]配列

配列


1.配列とは

複数のデータを蓄える性質を持ったデータ型であり、同じ型のデータを複数記録することができます。


2.1次元配列

1次元配列は、縦(もしくは横)のみの表をメモリ内に作成します。

(1) 1次元配列の宣言

1次元配列の宣言方法は以下の通りです。

1次元配列の宣言

型名はデータ型を宣言するときと一緒です。
配列名はデータ型の時の変数の事だと思ってください。
さらに1次元配列の宣言には要素数を持ちます。
要素数とは簡単に言うと「配列を作る個数」の事です。

1次元配列の宣言

とすると、「int型の変数iを5個宣言する」と言う意味になります。
但し、要素数として指定できるのは整数値のみで、小数や整数型の変数を指定することはできません。
整数型の変数に限り、初期化と読み出しでは[ ]の中に変数を書くことができます。

(2) 1次元配列の初期化

1次元配列の初期化は変数を初期化する時とは違った方法で初期化を行います。

1次元配列の初期化の方法

このようにして{ }で区切って値を宣言します。 大体書き方は解りましたか? それでは、実際に例題を書いてみて、体験してみましょう。

例題1 第7回の例題5のプログラムを改良し、最後に5番目の数値を表示させてみましょう

#include <stdio.h>

int main()
{
    //変数の宣言と初期化
    int n=0, sum = 0, avg = 0;
    //20個分のint型配列を用意
    int t[20];
    printf("数値を個入力してください\n");
    //nに0を代入、nが20になるまで、nに1を足す
    for(n=0; n<20 ;n++)
    {
        printf("%d個目の数値を入力してください=",n+1);
        scanf("%d",&t[n]);

        sum = sum + t[n];
    }

    avg = sum / 20; //数値20個の平均を求める計算式
    printf("平均値%d\n",avg);

    // 5番目の数値を表示
    printf("5番目の数%d\n",t[4]);
    return 0;
}

結果

配列の中に入れた数値は自由に読み出すことができます


このように、配列の中に入れた数値は自由に読み出すことができます。
ところで、左から要素番号0の値、要素番号1の値、…となっていますが、最初が0だということに気付いたでしょうか?

A「例1のプログラムで5番目の数値を読むならa[5]じゃないの?」
B「いい所に気がついたね。 配列の1番目の数値はどこに格納される?」
A「えーっと・・・a[0]だから0番目だ!!」
B「そこから5番目の数値へ辿っていくと・・・」
A「1, 2, 3, 4...4!! あっ!だからa[4]と書くんだね」
B「仮にa[x]という配列を用意した場合は、[ ]の範囲は0, 1, ..., x-1になるから注意してね」

会話でも言っているとおり、配列の要素番号は0番目から始まります。ここが配列の大きなポイントです。
0番目から始めると言う事なので、最後の番号は(要素数−1)となります。
決して「要素数は5だから、最初の要素番号は1で、最後の要素番号は5だな!」と思わないでくださいね。


ここで、配列を初期化する際のポイントを教えましょう。

ポイント

●初期化する時は要素数を省略できる

要素数の省略

という具合で宣言できます。
この場合は自動的に要素数が5となります。

●要素数を超える数を宣言することはできない

要素数を超えて宣言するとエラー

要素数が5であるにも関わらず、6個も初期化しています。
このような事をすると「初期化子の数が多すぎる」とコンパイルから文句を言われます。
つまり、エラーになります。
●一度に値を代入できるのは宣言の時だけ
宣言の時は{ }でくくって同時に何個も宣言できますが、宣言後で値を代入する時に{ }でくくって同時に宣言することは出来ません。
面倒くさいと思いますが、宣言後では要素を指定して値を代入しましょう。

一度に初期化できるのは宣言したときのみ

配列の数が少ないときは問題ないのですが、配列の数が多いときは面倒くさいですよね。
配列に初期値を代入して使う場合はあらかじめ宣言時に値を入れておくほうが得ですね。

(3) 1次元配列の読み出し方

1次元配列の読み出し方は普通の変数を読み出す方法と全く変わりません。
読み出したい要素番号を[ ]の中に入れて記述してください。

1次元配列の読み出し方

こうすると変数xには配列iの要素番号2の「3」の値が代入されます。
さらに、例題1で5番目の数値を表示させているように、printf( )の引数の値としても使うことができます。


3.2次元配列

2次元配列は縦と横の表をメモリ内に作成します。

(1) 2次元配列の宣言方法

2次元配列の宣言方法は以下の通りです。

2次元配列の宣言方法

要素数の[ ]が縦と横の2つに増えています。
他は1次元配列の時と変わりません。

(2) 2次元配列の初期化

2次元配列の初期化は1次元配列の時より複雑になっています。

2次元配列の初期化方法

{ }が複数あるので、書き忘れなどには十分注意しましょう。 あとは、「,」の付け忘れも忘れないでくださいね。

(3) 2次元配列の読み出し方

2次元配列の読み出しも1次元配列の時と殆ど変わりません。

2次元配列の読み出し方

こうすると変数xには配列iの要素番号1,2の「8」の値が代入されます。


では、2次元配列の例題をやってみましょう。

例題2 九九を表示するプログラム

#include <stdio.h>

int main()
{
    int i=0,f=0;
    //要素数が10×10のint型2次元配列を宣言
    int d[10][10];

    //forの2重ループ
    //i=1のときfを1〜9まで繰り返す
    //i=2のときfを1〜9まで繰り返す
    //i=9になるまで繰り返す
    //2次元配列d[i][f]の各要素の中にi*fの結果を代入
    for(i=0;i<=9;i++){
        for(f=0;f<=9;f++){
            d[i][f]=i*f;
        }
    }

    printf("九九表\n");
    printf("\n 0"); //表示整形
    //1行目表示
    for(i=1;i<=9;i++){
        printf("%3d",i);
    }

    //表示整形
    printf("\n------------------------------\n");

    //forの2重ループ
    for(i=1;i<=9;i++){
        //行番号表示
        printf("%d|",i);
        for(f=1;f<=9;f++){
            //d[i][f]の各要素の内容を3マス文使って表示
            printf("%3d",d[i][f]);
        }
        //改行のみ
        printf("\n");
    }
    return 0;
}

結果

九九の表ができましたね

九九の表ができましたね。
最初の2重ループのとき、

    d[1][1]=1、d[1][2]=2、・・・、d[1][9]=9
    d[2][1]=2、d[2][2]=4、・・・、d[2][9]=18

という具合に、2つの要素番号をかけた値が入っています。
九九の場合は簡単ですが、2次元配列のどこに何が入っているか頭に結果のような表を作るとわかりやすいでしょう。
ちなみに、printf("%3d",i)の部分での%3dとは数値を3マス分使用して表示という意味合いがあります。
もしも[%5d]ならば5マス分使用して表示するという事になります。

    printf("%5d", 15);  →  □□□15

という具合で表示されます。


4.練習問題

配列a[9]に入力した数値を格納し、逆順に表示するプログラムを書いてみよう。

[第9回]変数のスコープ ページのトップ 解答