ページ 11

間違っているところを教えてください。

Posted: 2015年11月27日(金) 20:37
by わたるん
ポインタと配列を利用した最大値の出力のプログラムなのですが、
どこかの不具合で最初に入力された数字しか出力されません。
間違いの指摘をお願いします。

コード:

#include<stdio.h>
#define N 5

int datmax(int n, int *dat);

int main(void)
{
	int i, dat[N];
	int ave;
	for (i = 0; i < N; i++)
	{
		printf("%d個目 ", i+1);
		scanf("%d", &dat[i]);
	}
	ave = datmax(N, dat);
	printf("\n最大値は =%d\n", ave);

	return 0;
}

int datmax(int n, int *dat)
{
	int i, j, *max;

	*max = 0;

	for (i = 1; i < n; i++){
		if (*max < *(dat+1)){
			*max = *(dat+1);
		}
	}
	return *max;
}

Re: 間違っているところを教えてください。

Posted: 2015年11月27日(金) 20:58
by みけCAT
●致命的な間違い
  • maxが初期化されていません。
  • 初期値を0に固定してしまうと、負の数しか入力されない場合に正しく最大値を求められません。
  • datの2番目の要素しか見ておらず、iの値が反映されていません。
●致命的ではないが、改善した方がいい点
  • 最大値を変数aveに格納するのは紛らわしいです。
  • 不正な入力を与えた時、未初期化の値がdatmaxに渡される可能性があります。
  • 配列の内容をdatmax内で書き換えないため、constをつけた方がいい気がします。
修正してみました。

コード:

#include<stdio.h>
#define N 5

int datmax(int n, const int *dat);

int main(void)
{
	int i, dat[N] = {0};
	int max;
	for (i = 0; i < N; i++)
	{
		printf("%d個目 ", i+1);
		scanf("%d", &dat[i]);
	}
	max = datmax(N, dat);
	printf("\n最大値は =%d\n", max);

	return 0;
}

int datmax(int n, const int *dat)
{
	int i, j, *max;

	max = &j;
	*max = *dat;

	for (i = 1; i < n; i++){
		if (*max < *(dat+i)){
			*max = *(dat+i);
		}
	}
	return *max;
}

Re: 間違っているところを教えてください。

Posted: 2015年11月27日(金) 21:10
by わたるん
単純なミスばかりだったんですね。
平均を求める場合も作っていたので間際らしくして申し訳ないです。
また何かあればお願いします。