最小値が出力できない、(ド素人質問です)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たろ

最小値が出力できない、(ド素人質問です)

#1

投稿記事 by たろ » 1年前

C言語を始めたてのド素人の質問です。
10回数値を入力して平均・最大値・最小値を出力するというプログラムで最小値の値が最大値になってしまいます、、、
どなたかお助けいただけますと幸いです。

コード:

int n, average, max, min;
    int total = 0;
    int times = 0;
    while (1)
    {
        printf("数字を入力して下さい(0で終了)");
        scanf("%d", &n);
        if (n == 0)
            break;
        else
        {
            min = n;
            max = n;
        }
        if (n < min)
            min = n;

        printf("最小値は%dです\n", min);

        if (max < n)
            max = n;

        printf("最大値は%dです\n", max);


        total += n;
        times += 1;
    }

    printf("合計値=%d\n", total);
    printf("%d回繰り返しました\n", times);
    printf("平均は%fです\n", (float)total / times);
    printf("最小値は%dです\n", min);
    printf("最大値は%dです\n", max);
    
出力結果

数字を入力して下さい(0で終了)1
最小値は1です
最大値は1です
数字を入力して下さい(0で終了)2
最小値は2です
最大値は2です
数字を入力して下さい(0で終了)3
最小値は3です
最大値は3です
数字を入力して下さい(0で終了)
0
合計値=6
3回繰り返しました
平均は2.000000です
最小値は3です
最大値は3です
最大値は3です

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

Re: 最小値が出力できない、(ド素人質問です)

#2

投稿記事 by box » 1年前

仕様の確認です。
10回数値を入力して
数字を入力して下さい(0で終了)
10回という回数が決まっているのか、0を入力するまでずっと
入力し続けるのか、どちらですか?
本質とはあまり関係ないかもしれませんが、コードを書く上ではずいぶん違ってくると思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 最小値が出力できない、(ド素人質問です)

#3

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

コード:

        if (n == 0)
            break;
        else
        {
            min = n;
            max = n;
        }
の部分で、0でない値が入力された場合常にminおよびmaxをnに設定してしまいますね。
ここでは、最初の入力でのみminおよびmaxを設定するようにするとよいでしょう。
例えば

コード:

int n, average, max, min;
int isFirst = 1; /* 最初の入力かを表す変数を追加 */
    int total = 0;
    int times = 0;
    while (1)
    {
        printf("数字を入力して下さい(0で終了)");
        scanf("%d", &n);
        if (n == 0)
            break;
        else
        {
            /* 最初の入力でのみminおよびmaxを設定する */
            if (isFirst)
            {
                min = n;
                max = n;
                isFirst = 0;
            }
        }
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 最小値が出力できない、(ド素人質問です)

#4

投稿記事 by box » 1年前

いきなりゼロを入力したときにゼロ割りが起きそうなので、
こんな風にするのがよいでしょう。フラグ変数は使いませんでした。

コード:

#include <stdio.h>

int main(void)
{
    int n, max, min, total = 0, times = 0;

    while (1) {
        printf("input number(if you inout 0, this program will end) ");
        scanf("%d", &n);
        if (n == 0) {
            break;
        }
        if (times == 0) {
            max = min = n;
        }
        else {
            if (n > max) {
                max = n;
            }
            if (n < min) {
                min = n;
            }
        }
        times++;
        total += n;
    }
    if (times != 0) {
        printf("iteration is %d\n", times);
        printf("average is %f\n", (double) total / times);
        printf("max is %d\n", max);
        printf("min is %d\n", min);
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 最小値が出力できない、(ド素人質問です)

#5

投稿記事 by box » 1年前

typoその他があったので一部手を加えました。よかったら適当に使ってください。

コード:

#include <stdio.h>

int main(void)
{
    int n, max, min, total = 0, times = 0;

    while (1) {
        printf("input integer(if you input 0, this program will end) ");
        scanf("%d", &n);
        if (n == 0) {
            break;
        }
        if (times == 0) {
            max = min = n;
        }
        else {
            if (n > max) {
                max = n;
            }
            if (n < min) {
                min = n;
            }
        }
        printf("current max is %d\n", max);
        printf("current min is %d\n", min);
        times++;
        total += n;
    }
    if (times != 0) {
        printf("total is %d\n", total);
        printf("iteration is %d\n", times);
        printf("average is %f\n", (double) total / times);
        printf("max is %d\n", max);
        printf("min is %d\n", min);
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 最小値が出力できない、(ド素人質問です)

#6

投稿記事 by usao » 1年前

maxやminの「初期値」を決めるのに苦労しているのであれば,
INT_MIN,INT_MAX で初期化しとく形の方が楽に感じられるかもしれない.

返信

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