第8回 配列と繰り返し文 (6/17)


第7回の演習:解答例



今回は,配列について学びます.

「配列」は,同じ型のデータを一つの名前で表し,まとめて扱うために用意されたデータ構造である.
配列のデータを扱う場合は,通常繰り返し文 (for, while) と組み合わせて用いられる.
何故か?・・・配列すべての要素,あるいは各要素に順次アクセスして計算や値の変更をするので,「繰り返し」処理が必要となる.


例えば,int 型一つ分の数値を入れることのできる箱を 8_1.pngで表す.

ここで4つの int 型変数を用意するには,例えば

int a, b, c, d;

と宣言すればよいが,

8_2.png

この図のように,まったく無関係の箱が4つ用意される.
これでは変数の数だけ名前が必要となるので,変数の個数が増えると把握が難しくなる.

そこで,複数の変数(ここでは a, b, c, d )が同じ型である場合,これらをまとめて扱うために「配列」を用いると便利な場合がある.

例えば4つの int 型変数を配列 a として用意するには,


    int a[4];

さらに,100個の float 型変数を配列 data として用意するには,


    float data[100];

と宣言する.

配列の型の種類や名前の付け方(命名規則)は,一般の変数と同じ.


8_3.png

配列はメモリー上で図のようなイメージとなり,これら複数の変数をまとめて配列 a として扱うことができる.

ここで,配列の中身 a[0] から a[3] (0番目~3番目の 4 個であることに注意)を配列 a の要素とよび,
要素の番号(例えば a[2] ならば 2 のこと)を,添字またはインデックスと呼ぶ.

配列の添字は常に0から始まる事に注意!



配列の要素への代入と参照

配列の各要素への代入や要素の値の参照は,普通の変数と同じである.


    int a[4];         /* aという配列を宣言.要素数は4,a[0], ... , a[3] が利用可能になる. */

    a[0] = 1;           /* 配列aの最初の要素 a[0] に 1 を代入 */
    a[3] = -10;         /* 要素a[3]に -10 を代入 */

    printf("%d ¥n", a[0]);        /* 配列 a の最初の要素 a[0] の値を画面に表示 */

注意1:添字は,「0」 から 「要素数 - 1」 の範囲.
この範囲外の要素を参照しようとすると,プログラムが不正終了する(しない場合もある).

注意2:一般の変数と同じく,配列も宣言しただけでは中身は不定(=ゴミが入っている).

配列の添字には,変数も使うことができる(これが重要).つまり,forやwhile文のカウンタ変数を添字に指定することができる.

例1:


    int a[10];
    int n;

    n = 1;
    printf("%d¥n", a[n]);

例2:


    int a[10];
    int i;

    for(i=0; i<10; i++) {          /* 添字に使う場合は範囲に注意! */
        a[i] = i * i;                /* i 番目の要素に i * i を代入 */
        printf("%d¥n", a[i]);
    }

配列の宣言と初期化を同時に行う方法

配列は宣言と同時に初期化することができる.{ } を使って値を列挙する.


    int a[4] = { 1, 2, 3, 4 };

ただし,宣言と同時に初期化を行う場合のみ可能である.

即ち,以下のようにプログラムの途中では出来ない.


    a[4] = { 1, 2, 3, 4 };    /* これは不可 */

例:10個の整数の和を求めるプログラム(配列版)


#include <stdio.h>

void main()
{
    int a[10] = {5,2,3,4,9,6,7,8,1,10};         /* 宣言と同時に初期化 */
    int i, sum;

    sum = 0;

    for(i=0; i<10; i++){
        sum += a[i];        /* 配列の参照 */
    }

    printf("合計 = %d ¥n", sum);
}

練習1

整数型配列に初期値として,{10,20,30,40,50}を設定する.

キーボードから配列の「要素番号」を入力すると,その配列要素の「値」を表示するプログラム.


#include <stdio.h>

void main()
{
    int a[5] = {10, 20, 30, 40, 50};
    int num;

    printf("添字の番号を入力してください(0 から 4 まで):");
    scanf("%d", &num);
    
    if (0 <= num && num <= 4) {          /* 添字の範囲をチェック.0から4まではO.K. */
        printf("Data  = %d¥n", a[num]);
    } else {
        printf("入力エラー:添字は配列の範囲を超えています.¥n");
    }
}

演習課題

(1)要素数 12 個の整数型配列 {9, 8, 7, -6, -7, 5, 3, 10, 0, 7, -3, 1}の中から数字の 5 を探し,
   5が存在「する」または「しない」を表示するプログラムを作成せよ.

ヒント: 配列から 5 を探すには,配列の各要素を順番に 5 かどうか調べて,5 が存在すれば「する」,しないなら「しない」を表示する

(2)(1)の配列で,最大値を探し,最大値を表示するプログラムを作成せよ.

(3)(1)の配列で,7 がいくつあるかを数え,配列の何番目の要素かを表示するプログラムを作成せよ.

(4)実数型配列に,数値 10.2, 9.8, 3.3, 8.4, 11.9  をscanfを用いてキーボード入力し,
   全ての要素の合計と平均を表示するプログラムを作成せよ.

(5)整数型配列に成績データである得点を入力し,偏差値を計算し,それぞれの番号の得点と偏差値を全て表示するプログラムを作成せよ.
   成績データは以下に示す表を使用せよ.

偏差値は,以下の式から求めることが出来る.

上に示す表の偏差値とプログラミングによる計算結果とを比較し,
プログラムが正しいかを確認しなさい.

授業終了時までのプログラムと完成した提出用プログラムをoh-meijiシステムを使って提出すること
授業終了時に送るのは出席の確認用である.完成した課題は提出用の回に送ること
(提出期限を厳守し,提出用の回に提出しないと採点を行わない)