ウォーミングアップ 練習問題 1 解答

 まず,最大値を見つけるという目的を達するには,どのような手順を踏む必要があるかを考察する.しかも,その手順に使うことのできる一つひとつの操作は, C言語の基本的な実行および制御文で行えるものでなければならないことに注意する.

 最大要素の添字(インデックス)を見つけるためには, 配列のすべての要素を一つひとつ調べる必要があるのは当然である. これは, for (i = 0; i < N; i++) のように, 調べる要素の添字 i を,for 文で回して行うのが適している. その調査の各段階において,それまでに調べた要素の中で最大であったものの添字を記憶しておくべきであるのも当然である. それを記憶するための変数を maxi (max indexのつもり) としよう.

 その添字が指す配列要素 a[maxi] と,次に調べる配列要素 a[i] とを比較し,もしも a[maxi] の方が大きければなにもすることはないが,a[i] の方が大きいときは変数 maxi の値を i変更する.

 以上の手続きをコーディングすると,次のようになる.

#include <stdio.h>
#define N 10
main()
{
    int data[N] = {4, 3, 6, 9, 1, 3, 4, 5, 8, 7};
    int i, maxi;
    
    maxi = 0;
    for (i = 1; i < N; i++) {
        if (data[maxi] < data[i]) maxi = i;
    }
    printf("index of max value = %d\n", maxi);
}
index of max value = 5

 最初に調べる要素 data[0] は,当然,その時点での最大要素であるから, maxi の初期値は 0 としておいて, i を残りの 1, 2, ..., N-1 で動かして調べば良い.

 for 文において i を動かす範囲を i < N で表している.これは i <= N-1 と書いても同じことであるが, i < N の方がスマートな書き方である(不必要な引き算がないし,何より,コーディングのためにタイプする回数が 3回 も少ない).

 最大要素が複数個あった場合, このプログラムはそれらの添字の中の最小の添字を表示する.なぜなら,次の for 文において,より大きい要素に出会ったときにのみ maxi が書き変わるので,最初に出てくる最大要素の添字が最後まで maxi に保持されるからである.

        if (data[maxi] < data[i]) maxi = i;

 複数個の最大要素のうち最大の添字をもつ要素の添字を表示したいときには,判断に等号を含めて,次のようにすれば良い.

        if (data[maxi] <= data[i]) maxi = i;

Valid HTML 4.01!