第13講 ベクタの学習
第5話 2次元ベクタを関数に渡す(その1)

解答例
      void g3(vector<int>::iterator j){
        int i;
        String^ w;
        for(i=-4;i<0;i++){
          w+=(*(j+i)).ToString()+L" ";
        }
        label3->Text=w;
      }

では、次に第10話のプログラムを2次元に変更して、
実行すると次のように表示されるプログラミングに挑戦してましょう。

ただし、には配列を、にはポインタを、にはベクタを利用しましょう。
3行3列のベクタの宣言は、
vector< vector<int> > c(3);
int i;
for(i=0;i<3;i++)c[i].resize(3);
のように行います。
3で3行、3で3列を指定しています。
c[i].resize(3);はc[i]を3列のサイズにするという意味です。
また、
vector< vector<int> > c(3);は
vector< vector<int> > c;
c.resize(3);
としてもよいのです。最初が行でその次が列であるからです。
例によって解答例を20行下に示します。




























private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         int a[3][3];
         int* b=(int* )malloc(9*sizeof(int));
         vector< vector<int> > c(3);
         int i;
         for(i=0;i<3;i++)c[i].resize(3);
           f1(&a[0][0]);
           f2(b);
           vector< vector<int> >::iterator j;
           j=c.begin();
           f3(j);
           g1(&a[0][0]);
           g2(b);
           g3(j);

        }
        void f1(int* x){
          int i,j;
          for(i=0;i<3;i++){
             for(j=0;j<3;j++){
               *(x+3*i+j)=(i+j)%3+1;
             }
          }
        }
        void f2(int* y){
          int i,j;
          for(i=0;i<3;i++){
             for(j=0;j<3;j++){
               *(y+3*i+j)=(i+j+1)%3+1;
             }
          }
        }
        void f3(vector< vector<int> >::iterator z){
          int i,j;
          for(i=0;i<3;i++){
             for(j=0;j<3;j++){
                z[i][j]=(i+j+2)%3+1;
             }
          }
        }
        void g1(int* x){
          int i,j;
          String^ w;
          for(i=0;i<3;i++){
             for(j=0;j<3;j++){
               w+=(*(x+3*i+j)).ToString()+L" ";
             }
             w+=L"\n";
          }
          label1->Text=w;
        }
        void g2(int* y){
          int i,j;
          String^ w;
          for(i=0;i<3;i++){
             for(j=0;j<3;j++){
               w+=(*(y+3*i+j)).ToString()+L" ";
            }
            w+=L"\n";
          }
          label2->Text=w;
        }
        void g3(vector< vector<int> >::iterator z){
          int i,j;
          String^ w;
          for(i=0;i<3;i++){
             for(j=0;j<3;j++){
               w+=z[i][j].ToString()+L" ";
            }
            w+=L"\n";
          }
          label3->Text=w;
        }

vector< vector<int> >::iterator zのzは、2次元ベクタの反復子です。
反復子なのにz[i][j]のように配列と同様に使えることに注目してください。


では、皆さん問題です。
問題1
と表示させるには、
コードをどのように変更したらよいでしょうか。

問題2
このプログラムでは、表示のための関数g1、g2、g3を用意してそこで表示させていますが、
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         int a[3][3];
         int* b=(int* )malloc(9*sizeof(int));
         vector< vector<int> > c(3);
         int i;
         for(i=0;i<3;i++)c[i].resize(3);
           f1(&a[0][0]);
           f2(b);
           vector< vector<int> >::iterator j;
           j=c.begin();
           f3(j);
           g1(&a[0][0]);
           g2(b);
           g3(j);

        }
の部分でString^ wを定義して、各関数f1、f2、f3に渡して戻すことによって、
この部分で表示させるようにしてください。
つまり、表示させるための関数g1、g2、g3は不要になるようにしてください。
当然f1などの関数は、f1(&a[0][0],w)のように引数を2つ持ったものになります。
そして、wを返すので、void型ではなくString^型の関数となります。



第11講第6話へ
 第12講第1話へ 第13講第4話へ 第13講第6話へ



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