ページ 11

2整数の大小比較

Posted: 2007年4月30日(月) 16:27
by
こんにちは!!!!!!!『☆』です!!!!(笑)
またまた質問にきました♪♪お願いいします。

問題は、「2つの整数 a,b を入力し、大きい方の値を出力するプログラムを作成せよ」っていう問題なんです。
そして+αで、
1. int max(int a, int b); /* a と b のうち大きい方の値を返す関数 */
2. void asc_swap(int *a, int *b); /* *a < *b となるように swap する関数 */

という2つ関数を使うように指定されているんですよ。
それで、私が作ったプログラムは・・・・・


#include <stdio.h>

int max(int a,int b){

if(a>b){
printf("関数 max を使った場合:大きい方は%dです.\n",a);
}
else{
printf("関数 max を使った場合:大きい方は%dです.\n",b);
}
return 0;
}

void asc_swap(int *a,int *b){
int t;

if(a<b){
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",b);
}
else if(a>b){
t=*b;
*b=*a;
*a=t;
}
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",t);
}

int main(void){
int a,b;
printf("a :");
scanf("%d",&a);
printf("b :");
scanf("%d",&b);

max(a,b);
asc_swap(&a,&b);

return 0;
}

っというものなんですが。。。。上手く行きません・・・・
bよりもaが大きいとき、asc_swap関数が上手く働いていないんですが・・どこが違うのでしょうか??
教えてください☆お願いします。

Re:2整数の大小比較

Posted: 2007年4月30日(月) 16:36
by box
a, bというポインタの大小ではなく、a, bが指している領域の内容の大小を
比較しなければなりません。

Re:2整数の大小比較

Posted: 2007年4月30日(月) 16:54
by
ということは・・・アドレスってことですか??

Re:2整数の大小比較

Posted: 2007年4月30日(月) 17:01
by
swap関数をこのようになおしてみました。

void asc_swap(int *a,int *b){
int t;

if(*a<*b){
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",*b);
}
else if(*a>*b){
t=*b;
*b=*a;
*a=t;
}
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",*b);
}

『*』をつけてみたんですが・・・
bが大きい時、

『関数 asc_swap を使った場合:大きい方は2です.』
こおん文章が2回表示されてしまいます。。

Re:2整数の大小比較

Posted: 2007年4月30日(月) 17:04
by
何回もすみません。。。。

このように変えてみました☆

void asc_swap(int *a,int *b){
int t;

if(a<b){
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",b);
}
else if(*a>*b){
t=*b;
*b=*a;
*a=t;
}
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",*b);
}

一応、実行結果は合っているんですが、内容的に合ってますか??

Re:2整数の大小比較

Posted: 2007年4月30日(月) 17:16
by box
17:04のコードは、
if(a<b){
と、ポインタどうしを比べているので正しくありません。
比較の仕方は、17:01の方が正しいです。

17:01のコードで、後の方のprintf()の内容と書いている場所が正しくありません。
else if のすぐ後に、
「*aの方が大きい」という内容のメッセージを出力してから、
*aと*bを入れ替えるとよいでしょう。

Re:2整数の大小比較

Posted: 2007年4月30日(月) 17:22
by box
ところで、2つの整数値が等しい場合は、どうするようになっているのですか?

Re:2整数の大小比較

Posted: 2007年4月30日(月) 17:24
by
ちょっと全然違う質問なんdせすが、、、関数の中で出力するという子とはしないほうがいいですか??
出力はmain関数でした方がいいでかね??

Re:2整数の大小比較

Posted: 2007年4月30日(月) 17:25
by
ちょっと全然違う質問なんですが、、、関数の中で出力するという子とはしないほうがいいですか??
出力はmain関数でした方がいいでかね??

あ!!そうですね!!同値のときは、強制終了するように、変えてみます。

Re:2整数の大小比較

Posted: 2007年4月30日(月) 17:32
by
でも、asc_swap関数は、void型なので、return -1もbreakも使えません。。。

Re:2整数の大小比較

Posted: 2007年4月30日(月) 18:44
by box
> 1. int max(int a, int b); /* a と b のうち大きい方の値を返す関数 */
> 2. void asc_swap(int *a, int *b); /* *a < *b となるように swap する関数 */

2つの整数のうち大きい方を出力するプログラムで、
max()を作成せよという指示はわかりますが、
asc_swap()の方はどうもよくわからないですね。

別に2つの整数を入れ替えなくても、単に大小関係を判定するだけで
よいはずなのですが…。

Re:2整数の大小比較

Posted: 2007年4月30日(月) 18:56
by
ううん。。。私たちもそう思うんですけどねぇー。。。
入れ換える練習みたいなんですよねぇ。。。。
しかも、 *a < *b となるように swap する関数 のようにまた指示されてるんです。。

Re:2整数の大小比較

Posted: 2007年5月01日(火) 01:26
by フリオ
 
 こんなんでいいのかな?。
#include <stdio.h>

int max(int a, int b)
{
	if(a > b) return a;
	return b;
}

void asc_swap(int *a, int *b)
{
	int temp;
	
	if(*a < *b) return;
	temp = *a;
	*a = *b;
	*b = temp;
	return;
}
int main(void)
{
	int a, b;
	
	printf("a = ");
	scanf("%d", &a);
	printf("b = ");
	scanf("%d", &b);
	if(a == b) puts("同じ値です。");
	else {
		printf("%d が大きい\n", max(a, b));
		asc_swap(&a, &b);
		printf("a == %d, b == %d\n", a, b);
	}
	return 0;
}
 

Re:2整数の大小比較

Posted: 2007年5月01日(火) 14:06
by
フリオさん、ありがとうございます。

やはり、関数じゃなくて、main関数でprintfしたほうがいいんですかねぇーー。。

なんか私のとちょっと違ったんで、勉強になりました。

if だけしか使ってないところも、勉強になりました。
確かに、2整数しかないから、私が書いてた見たいにelse if とかはいらないですねぇ。
フリオさんの方がもっと、シンプルなものですねぇ。