第4講 if文の学習
第10話 データ交換ソフト
さて、行ごとの交換を考えるために、
新しいプロジェクトから次のようなForm1作り、
キーボードから入力されたデータ1とデータ2を交換するということを考えてみましょう。
実行をダブルクリックして、コーティングを考えます。
一見すると次のコーティングで、うまくいくような気がします。
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a,b;
//データをtextBox1、textBox2から取得
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
//データ交換
a=b;
b=a;
//交換後のデータ表示
textBox3->Text=a.ToString();
textBox4->Text=b.ToString();
}
};
}
ところがビルドして、入力してから実行ボタンを押すと、
でうまくいきません。どうしてでしょうか。
動きをトレースしてみましょう。
まず、
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
の2行で、変数aと変数bにデータが収容されます。
次の行のa=b; によって、
28がaの箱に入ってきます。
箱には1個のデータしか入りませんから、
12は箱から出ていきます。
そうです。
データは箱の中でしか生きられませんから、
箱から出た瞬間に12は消滅してしまうのです。
尚、28は箱bから出ていくのではなく、
箱bの内容がコピーされ、コピーされた28が箱aに入って行くのです。
図では、その違いを移動とコピーペースト
(俗に言うコピペです。データを記憶装置=メモリーに複写することをコピーといい、
そのメモリーに複写されたデータを該当の場所に貼り付けることをペーストといいます。)
という言葉で比喩的に表しています。
さて、この瞬間に実は、
となってしまっています。
ですから、次の行のb=a; は全く意味がありません。
ではどうしたらよいのでしょうか。ヒントはもう一つ箱(変数)を用意することです。
皆さん、正しいコーティングを考えてください。解答例は、30行下。
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a,b,w1;
//データをtextBox1、textBox2から取得
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
//データ交換
w1=a;
a=b;
b=w1;
//交換後のデータ表示
textBox3->Text=a.ToString();
textBox4->Text=b.ToString();
}
};
}
実行例
うまくいきました。
トレースしてみましょう。
確かにデータの交換に成功しています。
考えるための材料はすべてそろいました。
第9話と第10話を熟読の上、
並び替えに挑戦しましょう。
もし、あなたが本日(2011/04/28)より前に第6〜9話をお読みになっていたら、
本日(2011/04/28)に第6〜9を話を一部書き換えましたので、もう一度熟読して下さい。
尚、一時データをためる箱w1は、
Object^ w1;
と宣言して下さい。
こうすれば、
w1=dataGridView1[5,6]->Value;
のようにキャストしなくても直接代入できます。
前に整数型変数に代入するとき、
a=(int)(dataGridView1[5,6]->Value);
とキャストしなければならない理由は、わかりませんと書きましたが、
その理由が今日わかりました。
dataGridViewの中のデータは、Object^型だったのです。
また、dataGridViewの中のデータ同士の代入も
dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
キャストせず直接代入できます。
Object^型同士なので、型変換が必要ないのです。
でもよく考えてみたら、 dataGridView1[j,i]->Value =rand()%101;
等については疑問が残りますね。
右辺がObject^型で、左辺はint型です。
こちらは自動的にキャスト(変換)してくれるということだと思います。
Visual Basicには型変換のような問題は一切なく単純です。
DataGridView1(j, i).Value = 10 * (i - 1) + j
w = DataGridView1(j, i).Value
(以上Visual Basicです。w=(int)(dataGridView1[i,j]->Value); のようなキャストは必要ない)
やはり、Visual Basicの方が初心者向きといえそうです。
第9話へ 第11話へ
vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る