配列に関する質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
pointaro
記事: 2
登録日時: 6年前

配列に関する質問

#1

投稿記事 by pointaro » 6年前

初めまして、初心者です。某「苦しんで…」本でC言語を勉強しています。ポインタの章の書き取り問題の解答でわからない部分があります。

下記の解答のdo while文の配列の部分(13行目)が「array」となっています。なぜ「array」ではなく「i - 1」となるのかがわかりません。確かにこれを入れないと、データの終わりを意味すると問題で指定されている「−1」を入力しても無限ループから抜けられません。

どなたか、この理由を教えてくださる方はいらっしゃいますか。

問題:
0〜100の範囲で入力された複数の数値の中から、最大値と最小値を求めて表示するプログラムを作成せよ。-1が入力された場合は、入力の終わりと判定する。ただっっし、最大値と最小値はmian関数以外の1つの関数の中で求める。また、入力された数値を記憶する配列の要素数は10とし、それ以上入力された場合はエラーが起きても仕方ないこととする。

解答:

コード:

 
#include <stdio.h>

void maxmin(int array[], int *max, int *min);

int main (void)
{	
	int i = 0, array[10], max, min;
	do {
		printf("%d th number: ", i + 1);
		scanf ("%d", &array[i]);
		i++;
	} while (array[i - 1] != -1);
	
	maxmin(array, &max, &min);
	printf("Max is: %d\n Min is: %d\n", max, min);
	return 0;
}

void maxmin(int array[], int *max, int *min)
{
	int i = 0;
	
	*max = 0;
	*min = 100;
	
	while (array[i] != -1) {
		if (array[i] > *max) *max = array[i];
		if (array[i] < *min) *min = array[i];
		i++;
	}
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列に関する質問

#2

投稿記事 by みけCAT » 6年前

whileの判定の前にi++;でデータを読み込んだ要素の次の要素に注目を移しているので、その1つ前の要素、すなわちデータを読み込んだ要素の値をチェックするようにしています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: 配列に関する質問

#3

投稿記事 by box » 6年前

pointaro さんが書きました: 下記の解答のdo while文の配列の部分(13行目)が「array」となっています。なぜ「array」ではなく「i - 1」となるのかがわかりません。確かにこれを入れないと、データの終わりを意味すると問題で指定されている「−1」を入力しても無限ループから抜けられません。

コード:

		scanf ("%d", &array[i]);
ここで、arrayに値を代入しています。例えばi = 5としましょうか。array[5]に何かが入りました。
pointaro さんが書きました:

コード:

		i++;
ここで、iを1増やしています。iは6になりました。したがって、上で代入したarray[5]の値が-1かどうかを判断するには
pointaro さんが書きました:

コード:

	} while (array[i - 1] != -1);
array[5]の値を判定しなければなりませんので、今のiの値(6)から1引いた場所を参照しなければなりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

pointaro
記事: 2
登録日時: 6年前

Re: 配列に関する質問

#4

投稿記事 by pointaro » 6年前

みけCAT様
box様

なるほどスッキリしました。

とても初歩的な質問に迅速かつ丁寧に回答いただき、ありがとうございました。

pointaro

返信

“C言語何でも質問掲示板” へ戻る