ページ 11

入力した数値を入れ替えるプログラム

Posted: 2012年4月01日(日) 19:52
by 水翔
いつもお世話になります。

「入力した数値を入れ替えるプログラム」をうっているのですが上手くいきません。
改善方法について教えて下さい。初心者です。

mainの上で関数を宣言をしてます。

コード:


#include<iostream>

using namespace std;


int swap(int a, int b)
{
	int c;

	c = b; //bの値をcに代入
	b = a; //aの値をbに代入
	a = c; //cの値をaに代入

	return;
}

int main()

{
	int a, b;
	a = 10;
	b = 20;

	swap(a,b);

	cout << " a = "<< a << ", b = " << b <<endl;

	return;

}


Re: 入力した数値を入れ替えるプログラム

Posted: 2012年4月01日(日) 20:11
by tk-xleader
関数の値は値渡しなので、関数内で引数を書き換えても元の変数が書き換わることはありません。

この場合、参照かポインタを使えば解決します。

コード:

int swap(int& a, int& b)
{
    int c;
 
    c = b; //bの値をcに代入
    b = a; //aの値をbに代入
    a = c; //cの値をaに代入
 
    return;
}
呼び出し方法は元のコードと同じです。

Re: 入力した数値を入れ替えるプログラム

Posted: 2012年4月01日(日) 20:19
by beatle
「数字を入れ替える」という本題からは外れるのですが、swap関数の戻り値をintにしているのに、return文で戻り値を指定しないのは良くありません。
void swapにするか、return文で値を返すかしてください。

Re: 入力した数値を入れ替えるプログラム

Posted: 2012年4月01日(日) 20:19
by ぱにしん
returnの値がありませんがこれはどうなんでしょう。
VisualC++以外だったらコンパイル通るんでしょうか・・・?

まぁそれはとりあえず置いときまして、
main関数で宣言されているa,bとswapの引数のa,bは異なるものです。
swap関数のa,bを変更してもmain関数のa,bは変更されません。

この書き方で意図されている動きをさせるなら参照渡しを使うのがいいと思います。

Programing Place C++編(言語解説) 第15章 参照

しかしこの程度ならわざわざswap関数を作らなくても直接main関数の中に書けば良いのではないのかと思いますが・・・

Re: 入力した数値を入れ替えるプログラム

Posted: 2012年4月02日(月) 01:17
by 水翔
アドバイスをくれた方々、ありがとうございました。
プログラム勉強中で参考書に書いてる問題に取り組んでいたのですがいまいち理解が・・・

とりあえずポインタを使って問題解決しました。

コード:


#include<iostream>

using namespace std;

void swap(int *x , int *y)

{
	int z;

	z =*y; //bの値をcに代入
	*y=*x; //aの値をbに代入
	*x= z; //cの値をaに代入

		return;
}

int main()

{
	int a, b;
	a = 10;
	b = 20;

	swap(&a , &b);

	cout << " a = "<< a << ", b = " << b <<endl;

	return 0;

}
なら成立するのですが、

コード:


void swap(int *x , int *y)

{
	int z;

	z =*y; //bの値をcに代入
	*y=*x; //aの値をbに代入
	*x= z; //cの値をaに代入

		return 0;
}
と、returnを返そうとするとエラーがでます。

なんでですか・・・。

Re: 入力した数値を入れ替えるプログラム

Posted: 2012年4月02日(月) 02:11
by nil
void 型関数に戻り値はありません
int swapであれば正常に動作しますが、
void型なのでエラーとなります

あとvoid型であれば関数末のreturnは不要ですよ