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

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

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

#1

投稿記事 by わたるん » 9年前

ポインタと配列を利用した最大値の出力のプログラムなのですが、
どこかの不具合で最初に入力された数字しか出力されません。
間違いの指摘をお願いします。

コード:

#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;
}

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

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

#2

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

●致命的な間違い
  • 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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

わたるん

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

#3

投稿記事 by わたるん » 9年前

単純なミスばかりだったんですね。
平均を求める場合も作っていたので間際らしくして申し訳ないです。
また何かあればお願いします。

閉鎖

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