第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;

  より、合計と平均に値が入ります。
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話へ

025


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

数学研究室に戻る