ページ 11

アセロラ

Posted: 2015年10月29日(木) 21:42
by 最小値が出てこない
5人の点数を入力して合計と平均、最大値、最小値を出力したいのですが、最小値だけ出てきません。
何が問題なのでしょうか?
恐らく初歩的なミスかもしれませんが、よろしくお願いします。

コード:

#include<stdio.h>
#define num 5
int main(void)
{
	int a[num];
	int i, j, k;
	int sum, max, min, ave;

	sum = 0;
	max = 0;
	min = 0;

	printf("テストの点数を入力\n");
	for (i = 0; i < num; i++){
		scanf("%d", &a[i]);
		sum += a[i];
		ave = sum / 5;

		if (max < a[i]){
			max = a[i];
			if (min > a[i]){
			min = a[i];
		}
		
		}
	
	}
	printf("合計:%d,平均:%d,最大値:%d,最小値:%d\n", sum,ave,max,min);
	return 0;
}

Re: アセロラ

Posted: 2015年10月29日(木) 21:49
by みけCAT
最小値が出てこない さんが書きました:何が問題なのでしょうか?
  • maxおよびminの初期値を0に決め打ちしてしまうのはよくありません。
  • minを更新する処理を含むif文の位置がおかしいです。

Re: アセロラ

Posted: 2015年10月29日(木) 21:59
by アセロラ
何処の部分のif文を入れれば出力されるでしょうか?
いろいろ試しましたが、どうしても出てくれません。

Re: アセロラ

Posted: 2015年10月29日(木) 23:02
by みけCAT
アセロラ さんが書きました:何処の部分のif文を入れれば出力されるでしょうか?
if文を入れる…???
むしろminを更新する部分のif文をmaxを扱うif文から出すべきです。
また、今のコードから全く変えずに適当にテストしたところ、きちんと出力されました。

ところで、せっかくnumを定義しているのにaveの計算で5というマジックナンバーを用いているのもよくないですね。

最小値が出てこない

Posted: 2015年10月29日(木) 23:13
by アセロラ

コード:

#include<stdio.h>
#define num 5
int main(void)
{
	int a[num];
	int i, j, k;
	int sum, max, min, ave;

	sum = 0;
	max = 0;
	min = 0;

	printf("テストの点数を入力\n");
	for (i = 0; i < num; i++){
		scanf("%d", &a[i]);
		sum += a[i];
		ave = sum / num;

		
		if (max < a[i]){
			max = a[i];
		}
		else if (min > a[i]){
			
			min = a[i];
		}
	
	}
	printf("合計:%d,平均:%d,最大値:%d,最小値:%d\n", sum,ave,max,min);
	return 0;
}
出力自体はできるのですが、数字を入力した後に最小値だけどんな数字を入れても0になってしまいます。

Re: 最小値が出てこない

Posted: 2015年10月29日(木) 23:18
by みけCAT
アセロラ さんが書きました:出力自体はできるのですが、数字を入力した後に最小値だけどんな数字を入れても0になってしまいます。
本当ですか?
最小値が0にならない入力が存在すると思うのですが…処理系の不都合でしょうか?

最小値が出てこない

Posted: 2015年10月29日(木) 23:27
by アセロラ
入力しても、

テストの点数を入力
37
45
83
68
45
合計:278,平均:55,最大値:83,最小値:0
続行するには何かキーを押してください...

とでできます。

Re: アセロラ

Posted: 2015年10月29日(木) 23:28
by box
機能別に関数を分ける方が、結果として見通しがよくなると思います。
入力は入力に徹する。
最大値を求めるのはそれに徹する。
最小値を求めるのはそれに徹する。

コード:

#include <stdio.h>

#define N (5)

int getTensuu(int *tensuu)
{
    int goukei, ten, i;

    printf("テストの点数を入力してください\n");
    for (goukei = i = 0; i < N; i++) {
        printf("%d人目:", i + 1), scanf("%d", &ten);
        tensuu[i] = ten, goukei += ten;
    }
    return goukei;
}

int getSaidai(int *tensuu)
{
    int saidai = tensuu[0], i;

    for (i = 1; i < N; i++) {
        if (tensuu[i] > saidai) {
            saidai = tensuu[i];
        }
    }
    return saidai;
}

int getSaishou(int *tensuu)
{
    int saishou = tensuu[0], i;

    for (i = 1; i < N; i++) {
        if (tensuu[i] < saishou) {
            saishou = tensuu[i];
        }
    }
    return saishou;
}

int main(void)
{
    int tensuu[N], goukei;

    goukei = getTensuu(tensuu);
    printf("合計は%d点\n", goukei);
    printf("平均は%f点\n", (double) goukei / N);
    printf("最大は%d点\n", getSaidai(tensuu));
    printf("最小は%d点\n", getSaishou(tensuu));
    return 0;
}

Re: アセロラ

Posted: 2015年10月30日(金) 00:19
by box
最大値と最小値を求める関数を一緒くたにするなら

コード:

#include <stdio.h>

#define N (5)

int getTensuu(int *tensuu)
{
    int goukei, ten, i;

    printf("テストの点数を入力してください\n");
    for (goukei = i = 0; i < N; i++) {
        printf("%d人目:", i + 1), scanf("%d", &ten);
        tensuu[i] = ten, goukei += ten;
    }
    return goukei;
}

void getSaidaiSaishou(int *tensuu, int *saidai, int *saishou)
{
    int i;

    for (*saidai = *saishou = tensuu[0], i = 1; i < N; i++) {
        if (tensuu[i] > *saidai) {
            *saidai = tensuu[i];
        }
        if (tensuu[i] < *saishou) {
            *saishou = tensuu[i];
        }
    }
}

int main(void)
{
    int tensuu[N], goukei, saidai, saishou;

    goukei = getTensuu(tensuu);
    printf("合計は%d点\n", goukei);
    printf("平均は%f点\n", (double) goukei / N);
    getSaidaiSaishou(tensuu, &saidai, &saishou);
    printf("最大は%d点\n", saidai);
    printf("最小は%d点\n", saishou);
    return 0;
}

Re: 最小値が出てこない

Posted: 2015年10月30日(金) 09:41
by かずま
アセロラ さんが書きました:入力しても、

テストの点数を入力
37
45
83
68
45
合計:278,平均:55,最大値:83,最小値:0
続行するには何かキーを押してください...

とでできます。
[ 0 37 45 83 68 45 ] の最大値は 83、
[ 0 37 45 83 68 45 ] の最小値は 0
であっています。
入力は 37 からでも、プログラムが 0 からになっていますよ。