第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; は全く意味がありません。
代入図

ではどうしたらよいのでしょうか。ヒントはもう一つ箱(変数)を用意することです。
第3の箱の用意
皆さん、正しいコーティングを考えてください。解答例は、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();
        }
};
}
実行例
実行結果
うまくいきました。

トレースしてみましょう。
箱
準備
第2
第3から
結果
確かにデータの交換に成功しています。



考えるための材料はすべてそろいました。
第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話へ

025


vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る