配列内比較


最大値と最小値の取得

配列内の情報の取得は、プログラムの過程でよく出てくる問題です
とくに、構造的な事務処理プログラムなどには必要ですね

顧客情報や金銭管理など、関連情報は一つの配列または構造体にまとめるのが一般的です
となれば、ユーザーの要求で特定の情報を引き出すのもまた宿命です
配列要素の情報を効率的に引き出す必要がありますね

配列のデータを比較するには、反復プログラムが適しています
配列内の最大値を得るには適当な値を変数 m に格納し
その値と配列の先頭から比較し、mよりも大きい値があればそれをmに格納します

if (ary[0] > m ) m = ary[0];
if (ary[1] > m ) m = ary[1];
if (ary[i]...

最小値を得る場合は、この逆を選択すればよいですね
int getArrayMax(int *ary , int last_index) {
	int count , max;
	max = *ary;
	for (count = 0 ; count < last_index ; count++) {
		if (*(ary + count) > max) max = *(ary + count);
	}
	return max;
}

int getArrayMin(int *ary , int last_index) {
	int count , min;
	min = *ary;
	for (count = 0 ; count < last_index ; count++) {
		if (*(ary + count) < min) min = *(ary + count);
	}
	return min;
}
getArrayMax()関数は、第一引数を配列の先頭とし
第二引数まで配列要素を比較します
その中でもっとも大きかった最大値を戻り値として返します

getArrayMin()関数は、その逆で最も最小値を戻り値として返します
同様の方法で、指定した値が配列内に存在するかどうかも確認できます
int arrayCheck(int *ary , int date , int last_index) {
	int count;
	for (count = 0 ; count < last_index ; count++) {
		if (*(ary + count) == date) return 1;
	}
	return 0;
}
第二引数に指定した値が配列に存在すれば1を
存在しない場合は0を返します


同一値の検出

データベースなどでは、基本的にまったく同じ内容のデータを拒否します
ここでは、配列内に同じデータがないかをチェックするアルゴリズムを考えましょう

同一データの検出の場合、まず配列の先頭の値を変数 x に格納します
次に、xの次の要素から最後の要素まで x と比較します
見つからなかった場合はxに格納した値の次の要素をxに格納し
その次の要素から再び検索します

x = array[0];
if (array[1] == x)...
if (array[2] == x)...
x = array[1];
if (array[2] == x)...

この作業を、同一値が見つかるか最後まで行います
int isArraySame(int *ary , int last_index) {
	int count , n_count , same;
	for (count = 0 ; count < last_index - 1; count++) {
		same = *(ary + count);
		for (n_count = count + 1 ; n_count < last_index ; n_count++) {
			if (*(ary + n_count) == same) return 1;
		}
	}
	return 0;
}
配列内に同じ値が重複している場合は1を
値の重複が見とめられなければ0を返します

かなり余談なのですが
筆者がプログラムをやり始めたころ、憧れたのが掛け算の九九表を
反復ループで作るアルゴリズムでした

もっとも、今思えばこのアルゴリズムはとぉ〜〜〜っても簡単ですけど
ネストした反復ループの基本的な利用法ですので、チェックしておきたいですね
#include <stdio.h>

int main() {
        int i , j;

        for (i = 1 ; i < 10 ; i++) {
                for (j = 1 ; j < 10 ; j++) {
                        printf("%2d " , i * j);
                }
                printf("\n");
        }
        return 0;
}



前のページへ戻る次のページへ