アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
ヒント:配列の中に -1 があればデータの終わりだと判断できる。
ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。


●解答
#include <stdio.h>

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

int main(void)
{
int i = 0,array[10],max,min;

do {
printf("%d 番目の数:",i + 1);
scanf("%d",&array[i]);
i++;
} while (array[i - 1] != -1);

maxmin(array,&max,&min);

printf("最大値 %d : 最小値 %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++;
}
}

A 回答 (4件)

>while (array[i] != -1) {


>if (array[i] > *max) *max = array[i];
>if (array[i] < *min) *min = array[i];
>i++;

手でコードを追いかけていくのが上達への近道だとは思いますが…。

今回は、データの範囲が0~100と決まっていますので、
まずは、仮の最大値として下限の0を、仮の最小値として上限の100を、
それぞれセットしています。
そして、配列の中身を、その時点での最大値や最小値と比べて、
データの方がその時点での最大値よりも大きければ最大値の値を更新し、
データの方がその時点での最小値よりも小さければ最小値の値を更新する、
というアルゴリズムです。

ループを脱出した(つまり、すべてのデータをチェックし終わった)段階で
変数maxやminに入っている値が、(仮ではない)真の最大値や最小値となります。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/07/20 21:13

maxとminを初期化していないと予期しない結果になります。




*max = 101;
*min = -1;

>while (array[i] != -1) {
>if (array[i] > *max) *max = array[i];
>if (array[i] < *min) *min = array[i];
>i++;
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/07/20 21:14

変な値に初期化しても予期しない結果になりますよね>#2.



それにしても, 範囲外の数値を入力したときのチェックをしないのはなぜだろう. ヒントの「最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。」も明らかにおかしいし....
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/07/20 21:14

2です。


初期化の値が逆です。
間違えました。
minが101でmaxが-1です。ごめんなさい。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/07/20 21:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!