====== 関数と値のスワップ ====== [[https://replit.com/@youetsusato/Zhi-noJiao-Huan-yokuaruyatu?v=1|授業で使ったreplitのソース(実行可能)]] #include using std::cout; using std::cin; using std::endl; //2つの値を表示する関数 void printAB(double _a, double _b) { cout << "(a, b) = (" << _a << ", " << _b << ")" << endl; } //2つの変数の値を入れ替える関数(交換できない(´;ω;`)) //changeAB(0.0, 128.7); _a <- 0.0 _b <- 128.7 void changeAB(double _a, double _b) { double tmp; tmp = _a; //tmpにaを保存 _a = _b; _b = tmp; }//<-仮引数_a, _bの生存範囲 //値の交換、参照渡しバージョン //アドレスの中身を書き換えてね & void changeAB_ref(double &_a, double &_b) { double tmp; tmp = _a; //tmpにaを保存 _a = _b; //_a = は、_aに引数で渡されたアドレスの中身に代入される _b = tmp; //_b = は、_bに引数で渡されたアドレスの中身に代入される } //値の交換、ポインタ渡しバージョン(アドレス渡し) void changeAB_addr(double* _a, double* _b) { // _a, _b :実引数のアドレス // *_a, *_b:実引数があるアドレスの中身の値 double tmp; tmp = *_a; *_a = *_b; *_b = tmp; } //実引数に何を代入して関数に渡しても、必ず5に変更しやがる関数 void change5(double &_var) { _var = 5.0; } int main() { double a,b; a = 0.0; b = 128.7; printAB(a, b); //double tmp; //tmp = a; //tmpにaを保存 //a = b; //b = tmp; //changeAB(a, b); // changeAB(0.0, 128.7); //changeAB_ref(a, b);//参照私の呼び方 //変数のアドレスを取り出す演算子 & //ちゃんと変数がある場所のアドレスを渡さないとエラーになるよ(大変だよ) changeAB_addr(&a, &b); printAB(a, b); change5(a); change5(b); printAB(a, b); //値の交換はstd::swap(a,b)を使うと楽(同じ型同士だけだよ) a = 0.0; b = 5.2; std::swap(a,b); printAB(a, b); int iarr[5] = {1, 3, 2, 4, 5}; cout << "スワップ前:" << endl; for(int i=0;i<5;i++) cout << "iarr[" << i << "]=" << iarr[i] << endl; std::swap(iarr[1],iarr[2]); cout << "スワップ後:" << endl; for(int i=0;i<5;i++) cout << "iarr[" << i << "]=" << iarr[i] << endl; //夏休み中に教科書の、 //①3つのソート(選択、バブル、挿入)のアルゴリズムを疑似言語で書く //②疑似言語を見ながら、C++で配列のソートをするプログラムを3つ作ってみる //③3つのアルゴリズムのひどさを体感する。(配列数増やすといいよ) //配列の値の初期化は乱数とか使うとらくちんかな。 return 0; }