最大値・最小値の求め方を教えてください。

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

最大値・最小値の求め方を教えてください。

#1

投稿記事 by やまさん » 10年前

こんにちは^^
「四聖龍神録」楽しくPLAYさせて頂きました^^v
以前からこちらのサイトを拝見させて頂いており、
将来的には自分もシューティングゲームを作りたいと思っています><
「シューティングゲームの館」では、
あまり前提知識を要さなくともゲームを作る楽しさを教えて下さるとの事ですが、
元々C言語には興味があり(プログラムと言えばCしか聞いたことなかっただけですがf^^;)
今はC言語の基礎を少しずつ勉強しています。
そんな中、分からない事がでてきましたのでご教授頂ければ幸いですm(__)m

Windows XP
Visual Studio 2005 を使用しています。

問題は、
0~100の範囲で入力された複数の数値の中から、最大値と最小値を求めて表示するプログラムの作成です。
条件として、
・-1が入力された時点で数値の入力は終了する。
・最大値と最小値はmain関数以外の関数で求める。
・入力された数値を記憶する配列は10とする。
・数値の範囲を0~100としているが、それ以外の数値が入力された場合の事は考えて無くても良い。

#include<stdio.h>

int sub(int suuti[/url],int *max,int *min);

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

	for(i=0;i<10;i++){
		printf("%d番目の数値を入力して下さい。",i+1);
		scanf("%d",&suuti);
		if(suuti == -1)
			break;
	}

	sub(suuti,&max,&min);

	printf("最大値は%d 最小値は%d",max,min);


	fflush(stdin);
	getchar();
	return 0;
}



int sub(int suuti[/url],int *max,int *min)
{
	int i;
	
	for(i=0;i<10;i++){
		if(*max < suuti){
			*max = suuti;
		}
		if(*min > suuti){
			*min = suuti;
		}
		if(suuti == -1){
			break;
		}
	}	
	return 0;
}


上記のプログラムでは自分の期待する結果が得られます。
が、これは問題が解けず、解答を見て自分のソースを改善したプログラムです。
ポインタについてまだ全然理解していないですが、このプログラムについては、
sub関数で変数 max と min のアドレスに数値を代入し、main関数でそのアドレスから数値を取り出してる?
と自分では理解しています。(間違っていれば指摘お願いします><ポインタ難しいです;;)
が、なぜそうしなければならないのかが分かりません。
下記のプログラムは解答を見る前に自分が書いたものです。

#include<stdio.h>

int sub(int suuti[/url],int max,int min);

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

	for(i=0;i<10;i++){
		printf("%d番目の数値を入力して下さい。",i+1);
		scanf("%d",&suuti);
		if(suuti == -1)
			break;
	}


	sub(suuti,max,min);

	printf("最大値は%d 最小値は%d",max,min);


	fflush(stdin);
	getchar();
	return 0;
}



int sub(int suuti[/url],int max,int min)
{
	int i;
	
	for(i=0;i<10;i++){
		if(suuti == -1){
			break;
		}
		if(max < suuti[i]){
			max = suuti[i];
		}
		if(min > suuti[i]){
			min = suuti[i];
		}

	}	
	return 0;
}


自分としてはこれで問題ないと思っていたのですがf^^;
「main関数で宣言しているmaxとmin」と「sub関数内のmaxとmin」は別の物なんでしょうか?
maxとminをグローバル変数で宣言したらいいのかとも思いましたが、結果に変化なかったですf^^;
話が横道にもそれ、長くなりましたが、
何故このプログラムで最大・最小を求められないのか教えて頂きたいです。
宜しくお願いします。

ibis

Re:最大値・最小値の求め方を教えてください。

#2

投稿記事 by ibis » 10年前

mainのmaxとsubのmaxは別物ですよ。
引数として渡すときにmainのmaxの複製物が作られます。
その複製物がsubのmaxなわけです。
複製物(subのmax)を書き換えてもオリジナル(mainのmax)には影響は無いですから、
それに影響を与えようとするとポインタが必要になるわけです。


グローバル変数にしたというのは多分、宣言箇所を変えただけですよね?
宣言箇所をグローバルスコープにすればmainからもsubからも扱えますが、
引数として渡せばやはり複製されますよ。
そうするとsubは複製物(subのmax)もオリジナル(グローバルのmax)も両方扱えそうに思えますが、
実際には複製物が優先されます。
グローバルスコープで宣言すれば引数でなくても扱えます。
引数にしなければ複製物が作られることはなく、その場合はオリジナルを扱えます。

やまさん

Re:最大値・最小値の求め方を教えてください。

#3

投稿記事 by やまさん » 10年前

ありがとうございます^^

引数として渡すときにmainのmaxの複製物が作られるんですか><
それは知らなかったですf^^;
試しに、sub関数内にprintfで出力すると上手くいっていたので、
subの方のmax,minが複製された物でmainの方に影響しないと言うのが実感でしました^^v

ポインタも理解できなく、必要あるのか?と疑問でしたが・・・あぁ~必要かな?と思えてきましたf^^;
ただ、現在、何かプログラムを作ろうとする時、
自力で「ポインタを使おう」と言う考えが出てこないですね;;
ま、そこは経験を積んで身に付けるしかないですかねf^^;頑張ります><b

おかげさまで、自分のプログラムでは失敗した理由・ポインタが必要だった理由が分かりました^^
また、グローバルスコープで宣言すれば引数でなくても扱えると言うアドバイスのおかげで、
ポインタを使わない組み方でも成功する事ができました^^(引数として渡す事に拘ってましたねf^^;)

ありがとうございましたm(_ _)m

閉鎖

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