第3講 for文の学習
第9話 合計・平均のプログラムと解説
前話問題解答例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,j,w;
//6行追加
for(i=0;i<6;i++)dataGridView1->Rows->Add();
//縦表題
dataGridView1[3,0]->Value =L"合計 ";
dataGridView1[4,0]->Value =L"平均 ";
//横表題
dataGridView1[0,4]->Value =L"合計 ";
dataGridView1[0,5]->Value =L"平均 ";
//2次元データ作成
for(i=1;i<4;i++){
for(j=1;j<3;j++){
dataGridView1[j,i]->Value =2*i+j+1;
}
}
//行合計・行平均の計算
for(i=1;i<4;i++){
w=0;
for(j=1;j<3;j++){
w=w+(int)(dataGridView1[j,i]->Value);
}
dataGridView1[3,i]->Value=w;
dataGridView1[4,i]->Value=w/2;
}
//縦合計・縦平均の計算
for(i=1;i<3;i++){
w=0;
for(j=1;j<4;j++){
w=w+(int)(dataGridView1[i,j]->Value);
}
dataGridView1[i,4]->Value=w;
dataGridView1[i,5]->Value=w/3;
}
}
};
}
プログラム解説
行合計・行平均について解説しますので、縦合計・縦平均についてはご自分でトレースして下さい。
//行合計・行平均の計算
for(i=1;i<4;i++){
w=0;
for(j=1;j<3;j++){
w=w+(int)(dataGridView1[j,i]->Value);
}
dataGridView1[3,i]->Value=w;
dataGridView1[4,i]->Value=w/2;
}
iは、行数(といっても0からはじめっているのでi=1は2行目を意味しています。)で、
jは列数(こちらも同じでj=1なら、2列目です。)に対応します。
注意しなければならないのは、
//行合計・行平均の計算
w=0;
for(i=1;i<4;i++){
for(j=1;j<3;j++){
w=w+(int)(dataGridView1[j,i]->Value);
}
dataGridView1[3,i]->Value=w;
dataGridView1[4,i]->Value=w/2;
}
ではだめだということです。プログラミング歴20年の私でも時々このミスをしてしまいます。
1行計算する度に、もう一度wを0に戻さないとすべて積算されてしまいます。
逆にすべての表の中の数字を足したいときは、このようにします。
トレースしてみましょう。
T i=1の場合(2行目の行合計の計算)
w=0;からwは0となります。
@ j=1のとき、
w=w+(int)(dataGridView1[1,1]->Value);
によって、w←0+4;でw=4となりました。
A j=2のとき、
w=w+(int)(dataGridView1[2,1]->Value);
によって、w←4+5;でw=9となりました。
そして、
dataGridView1[3,1]->Value=w;
dataGridView1[4,1]->Value=w/2;
より、合計と平均に値が入ります。
これで、iの方の1回目のループが終了します。
U i=2の場合(3行目の行合計の計算)
w=0;からwは0となります。
@ j=1のとき、
w=w+(int)(dataGridView1[1,2]->Value);
によって、w←0+6;でw=6となりました。
A j=2のとき、
w=w+(int)(dataGridView1[2,2]->Value);
によって、w←6+7;でw=13となりました。
そして、
dataGridView1[3,2]->Value=w;
dataGridView1[4,2]->Value=w/2;
より、合計と平均に値が入ります。
これで、iの方の2回目のループが終了します。
(再掲)
V i=3の場合(3行目の行合計の計算)
w=0;からwは0となります。
@ j=1のとき、
w=w+(int)(dataGridView1[1,3]->Value);
によって、w←0+8;でw=8となりました。
A j=2のとき、
w=w+(int)(dataGridView1[2,3]->Value);
によって、w←8+9;でw=16となりました。
そして、
dataGridView1[3,3]->Value=w;
dataGridView1[4,3]->Value=w/2;
より、合計と平均に値が入ります。
これで、iの方の3回目のループが終了します、すべての行が合計されfor文が終了となります。
それでは、皆さん課題を出してこの話を閉じます。
Form1[デザイン]とコードを変更して、
ビルドして実行ボタンを押すと、
になるようにしてください。
第8話へ 第10話へ
vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る