第14講 フリーストア配列とCLI配列
第10話 配列のまとめ

最後にまとめとして、すべての配列
T ネイティブ配列
 @ 自動メモリに配置される配列
 A フリーストアに配置される配列
U ポインタ
V ベクタ
W CLI配列
が入っているサンプルプログラムを示してこの講を閉じたいと思います。

まとめサンプル
#pragma once
#include<vector>
#include<ctime>
    ・
    ・
    ・
#pragma endregion
    typedef String^ S; //このように定義しておくと、String^を単にSと書くことができる。//
     typedef char C;   //このように定義しておくと、charを単にCと書くことができる。//
    typedef int I;     //このように定義しておくと、intを単にIと書くことができる。//
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          srand(static_cast<unsigned int> (time(0)));
          S w=L""; //String^ w=L""; と書いたのと同じ
          C i;   //char i; と書いたのと同じ
          const I m1=5,m2=6,m3=6,m4=8,m5=7,m6=8,n1=10,n2=20,n3=6,n4=9,n5=12,n6=15,N=100;
          //ベクタ1次元配列の定義
          vector< vector<int> > a;
          a.resize(m1);
          for(i=0;i<m1;i++)(a[i]).resize(n1);
          a=f1(a);
          w=g1(w,a);

          //ポインタ2次元の定義//
          int** b=(int** )malloc(m2*sizeof(int));
          for(i=0;i<m2;i++)b[i]=(int* )malloc(n2*sizeof(int));
          b=f2(b,m2,n2);
          w=g2(w,b,m2,n2);

          //ポインタ1次元の定義(1次元のポインタを実質2次元配列として扱う)//
          int* c=(int* )malloc(m3*n3*sizeof(int));
          c=f3(c,m3,n3);
          w=g3(w,c,m3,n3);

          //ネイティブフリーストア2次元CLI配列配列の定義//
          int** d=new int*[m4];
          for(i=0;i<m4;i++)d[i]=new int[n4];
          f4(d,m4,n4);
          w=g4(w,d,m4,n4);

          //ネイティブ自動メモリタイプ配列の定義//
          int f[m5][n5];
          f5(&(f[0][0]),m5,n5);
          w=g5(w,&(f[0][0]),m5,n5);

          //CLI2次元CLI配列の定義
          array<int,2>^ g=gcnew array<int,2>(m6,n6);
          g=f6(g);
          w=g6(w,g);
 
          label1->Text=w;
          delete[] d;  //フリーストア配列の削除、フリーストア配列場合これがないとメモリの無駄遣いになる。
        }

        //ベクタ1次元配列のデータ作成//
        vector< vector<int> > f1(vector< vector<int> > x){
          C i,j,m,n;
          m=x.size();
          n=(x[0]).size();
          for(i=0;i<m;i++)
            for(j=0;j<n;j++)
              x[i][j]=rand()%1000;

          return(x);
        }

        //ポインタ2次元のデータ作成//
        int** f2(int** x,int m,int n){
          C i,j;

          for(i=0;i<m;i++)
            for(j=0;j<n;j++)
              x[i][j]=rand()%1000;

          return(x);
        }

        //ポインタ1次元のデータ作成=実質2次元データの作成//
        int* f3(int* x,int m,int n){
          C i,j;

          for(i=0;i<m;i++)
            for(j=0;j<n;j++)
              *(x+m*i+j)=rand()%1000;

          return(x);
        }

        //ネイティブフリーストア2次元CLI配列配列のデータ作成
        void f4(int** x,int m,int n){
          C i,j;

          for(i=0;i<m;i++)
            for(j=0;j<n;j++)
              x[i][j]=rand()%1000;

        }

        //ネイティブ自動メモリタイプ配列のデータ作成//
        void f5(int* x,int m,int n){
          C i,j;

          for(i=0;i<m;i++)
            for(j=0;j<n;j++)
               *(x+m*i+j)=rand()%1000;

        }

        //CLI2次元CLI配列のデータ作成//
        array<int,2>^ f6(array<int,2>^ x){
          C i,j,m,n;
          m=x->GetLength(0);
          n=x->GetLength(1);

          for(i=0;i<m;i++)
            for(j=0;j<n;j++)
              x[i,j]=rand()%1000;
          return(x);

       }

       //ベクタ1次元配列のデータ作成//
       vector<int> f7( vector<int> x){
         C i,m;
         m=x.size();
         for(i=0;i<m;i++)
           x[i]=rand()%1000;

         return(x);
       }

       //ベクタ1次元配列のデータ表示//
       S g1(S w,vector< vector<int> > x){
         C i,j,m,n;
         m=x.size();
         n=(x[0]).size();
         for(i=0;i<m;i++){
           for(j=0;j<n;j++)
             if(x[i][j]<10)
               w+=L"000"+(x[i][j]).ToString()+L" ";
             else if(x[i][j]<100)
               w+=L"00"+(x[i][j]).ToString()+L" ";
             else if(x[i][j]<1000)
               w+=L"0"+(x[i][j]).ToString()+L" ";
             else
               w+=(x[i][j]).ToString()+L" ";
           w+=L"\n";
        }
        return(w);
      }

      //ポインタ2次元のデータ表示//
      S g2(S w,int** x,int m,int n){
        C i,j;
        w+=L"\n";

        for(i=0;i<m;i++){
          for(j=0;j<n;j++)
            if(x[i][j]<10)
              w+=L"000"+(x[i][j]).ToString()+L" ";
            else if(x[i][j]<100)
              w+=L"00"+(x[i][j]).ToString()+L" ";
            else if(x[i][j]<1000)
              w+=L"0"+(x[i][j]).ToString()+L" ";
            else
              w+=(x[i][j]).ToString()+L" ";
         w+=L"\n";
       }
       return(w);
     }

     //ポインタ2次元のデータ表示//
     S g3(S w,int* x,int m,int n){
       C i,j;
       w+=L"\n";

       for(i=0;i<m;i++){
         for(j=0;j<n;j++)
           if(*(x+m*i+j)<10)
             w+=L"000"+(*(x+m*i+j)).ToString()+L" ";
           else if(*(x+m*i+j)<100)
             w+=L"00"+(*(x+m*i+j)).ToString()+L" ";
           else if(*(x+m*i+j)<1000)
             w+=L"0"+(*(x+m*i+j)).ToString()+L" ";
           else
             w+=(*(x+m*i+j)).ToString()+L" ";
         w+=L"\n";
       }
       return(w);
     }

     //ポインタ1次元(実質2次元)データの表示//
     S g4(S w,int** x,int m,int n){
       C i,j;
       w+=L"\n";

       for(i=0;i<m;i++){
         for(j=0;j<n;j++)
           if(x[i][j]<10)
             w+=L"000"+(x[i][j]).ToString()+L" ";
           else if(x[i][j]<100)
             w+=L"00"+(x[i][j]).ToString()+L" ";
           else if(x[i][j]<1000)
             w+=L"0"+(x[i][j]).ToString()+L" ";
           else
             w+=(x[i][j]).ToString()+L" ";
         w+=L"\n";
       }
       return(w);
     }


     //ネイティブ自動メモリタイプ配列のデータ表示//
     S g5(S w,int* x,int m,int n){
       C i,j;
       w+=L"\n";

       for(i=0;i<m;i++){
         for(j=0;j<n;j++)
           if(*(x+m*i+j)<10)
             w+=L"000"+(*(x+m*i+j)).ToString()+L" ";
           else if(*(x+m*i+j)<100)
             w+=L"00"+(*(x+m*i+j)).ToString()+L" ";
           else if(*(x+m*i+j)<1000)
             w+=L"0"+(*(x+m*i+j)).ToString()+L" ";
           else
            w+=(*(x+m*i+j)).ToString()+L" ";
         w+=L"\n";
       }
       return(w);
    }

    //CLI2次元CLI配列のデータ表示//
   S g6(S w,array<int,2>^ x){
       C i,j,m,n;
       w+=L"\n";
       m=x->GetLength(0);
       n=x->GetLength(1);

       for(i=0;i<m;i++){
         for(j=0;j<n;j++)
           if(x[i,j]<10)
             w+=L"000"+(x[i,j]).ToString()+L" ";
           else if(x[i,j]<100)
             w+=L"00"+(x[i,j]).ToString()+L" ";
           else if(x[i,j]<1000)
             w+=L"0"+(x[i,j]).ToString()+L" ";
           else
             w+=(x[i,j]).ToString()+L" ";
         w+=L"\n";
       }
       return(w);
    }


(コピーペースト用

#pragma once
#include<vector>
#include<ctime>
    ・
    ・
    ・

#pragma endregion
typedef String^ S; //このように書いておくと、Stirng^をSと書くことができる。//
typedef char C; //このように書いておくと、charをCと書くことができる。//
typedef int I; //このように書いておくと、intをIと書くことができる。//
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
srand(static_cast<unsigned int> (time(0)));
S w=L"";
C i;
const I m1=5,m2=6,m3=6,m4=8,m5=7,m6=8,n1=10,n2=20,n3=6,n4=9,n5=12,n6=15,N=100;
//ベクタ1次元配列の定義//
vector< vector<int> > a;
a.resize(m1);
for(i=0;i<m1;i++)(a[i]).resize(n1);
a=f1(a);
w=g1(w,a);

//ポインタ2次元の定義//
int** b=(int** )malloc(m2*sizeof(int));
for(i=0;i<m2;i++)b[i]=(int* )malloc(n2*sizeof(int));
b=f2(b,m2,n2);
w=g2(w,b,m2,n2);

//ポインタ1次元の定義(1次元のポインタを実質2次元配列として扱う)//
int* c=(int* )malloc(m3*n3*sizeof(int));
c=f3(c,m3,n3);
w=g3(w,c,m3,n3);

//ネイティブフリーストア2次元CLI配列配列の定義//
int** d=new int*[m4];
for(i=0;i<m4;i++)d[i]=new int[n4];
f4(d,m4,n4);
w=g4(w,d,m4,n4);

//ネイティブ自動メモリタイプ配列の定義//
int f[m5][n5];
f5(&(f[0][0]),m5,n5);
w=g5(w,&(f[0][0]),m5,n5);

//CLI2次元CLI配列の定義//
array<int,2>^ g=gcnew array<int,2>(m6,n6);
g=f6(g);
w=g6(w,g);


label1->Text=w;
delete[] d;
}

//ベクタ1次元配列のデータ作成//
vector< vector<int> > f1(vector< vector<int> > x){
C i,j,m,n;
m=x.size();
n=(x[0]).size();
for(i=0;i<m;i++)
for(j=0;j<n;j++)
x[i][j]=rand()%1000;

return(x);
}

//ポインタ2次元のデータ作成//
int** f2(int** x,int m,int n){
C i,j;

for(i=0;i<m;i++)
for(j=0;j<n;j++)
x[i][j]=rand()%1000;

return(x);
}

//ポインタ1次元のデータ作成=実質2次元データの作成//
int* f3(int* x,int m,int n){
C i,j;

for(i=0;i<m;i++)
for(j=0;j<n;j++)
*(x+m*i+j)=rand()%1000;

return(x);
}

//ネイティブフリーストア2次元CLI配列配列のデータ作成//
void f4(int** x,int m,int n){
C i,j;

for(i=0;i<m;i++)
for(j=0;j<n;j++)
x[i][j]=rand()%1000;

}

//ネイティブ自動メモリタイプ配列のデータ作成//
void f5(int* x,int m,int n){
C i,j;

for(i=0;i<m;i++)
for(j=0;j<n;j++)
*(x+m*i+j)=rand()%1000;

}

//CLI2次元CLI配列のデータ作成//
array<int,2>^ f6(array<int,2>^ x){
C i,j,m,n;
m=x->GetLength(0);
n=x->GetLength(1);

for(i=0;i<m;i++)
for(j=0;j<n;j++)
x[i,j]=rand()%1000;
return(x);

}

//ベクタ1次元配列のデータ作成//
vector<int> f7( vector<int> x){
C i,m;
m=x.size();
for(i=0;i<m;i++)
x[i]=rand()%1000;

return(x);
}

//ベクタ1次元配列のデータ表示//
S g1(S w,vector< vector<int> > x){
C i,j,m,n;
m=x.size();
n=(x[0]).size();
for(i=0;i<m;i++){
for(j=0;j<n;j++)
if(x[i][j]<10)
w+=L"000"+(x[i][j]).ToString()+L" ";
else if(x[i][j]<100)
w+=L"00"+(x[i][j]).ToString()+L" ";
else if(x[i][j]<1000)
w+=L"0"+(x[i][j]).ToString()+L" ";
else
w+=(x[i][j]).ToString()+L" ";
w+=L"\n";
}
return(w);
}

//ポインタ2次元のデータ表示//
S g2(S w,int** x,int m,int n){
C i,j;
w+=L"\n";

for(i=0;i<m;i++){
for(j=0;j<n;j++)
if(x[i][j]<10)
w+=L"000"+(x[i][j]).ToString()+L" ";
else if(x[i][j]<100)
w+=L"00"+(x[i][j]).ToString()+L" ";
else if(x[i][j]<1000)
w+=L"0"+(x[i][j]).ToString()+L" ";
else
w+=(x[i][j]).ToString()+L" ";
w+=L"\n";
}
return(w);
}

//ポインタ2次元のデータ表示//
S g3(S w,int* x,int m,int n){
C i,j;
w+=L"\n";

for(i=0;i<m;i++){
for(j=0;j<n;j++)
if(*(x+m*i+j)<10)
w+=L"000"+(*(x+m*i+j)).ToString()+L" ";
else if(*(x+m*i+j)<100)
w+=L"00"+(*(x+m*i+j)).ToString()+L" ";
else if(*(x+m*i+j)<1000)
w+=L"0"+(*(x+m*i+j)).ToString()+L" ";
else
w+=(*(x+m*i+j)).ToString()+L" ";
w+=L"\n";
}
return(w);
}

//ポインタ1次元(実質2次元)データの表示//
S g4(S w,int** x,int m,int n){
C i,j;
w+=L"\n";

for(i=0;i<m;i++){
for(j=0;j<n;j++)
if(x[i][j]<10)
w+=L"000"+(x[i][j]).ToString()+L" ";
else if(x[i][j]<100)
w+=L"00"+(x[i][j]).ToString()+L" ";
else if(x[i][j]<1000)
w+=L"0"+(x[i][j]).ToString()+L" ";
else
w+=(x[i][j]).ToString()+L" ";
w+=L"\n";
}
return(w);
}


//ネイティブ自動メモリタイプ配列のデータ表示//
S g5(S w,int* x,int m,int n){
C i,j;
w+=L"\n";

for(i=0;i<m;i++){
for(j=0;j<n;j++)
if(*(x+m*i+j)<10)
w+=L"000"+(*(x+m*i+j)).ToString()+L" ";
else if(*(x+m*i+j)<100)
w+=L"00"+(*(x+m*i+j)).ToString()+L" ";
else if(*(x+m*i+j)<1000)
w+=L"0"+(*(x+m*i+j)).ToString()+L" ";
else
w+=(*(x+m*i+j)).ToString()+L" ";
w+=L"\n";
}
return(w);
}

//CLI2次元CLI配列のデータ表示//
S g6(S w,array<int,2>^ x){
C i,j,m,n;
w+=L"\n";
m=x->GetLength(0);
n=x->GetLength(1);

for(i=0;i<m;i++){
for(j=0;j<n;j++)
if(x[i,j]<10)
w+=L"000"+(x[i,j]).ToString()+L" ";
else if(x[i,j]<100)
w+=L"00"+(x[i,j]).ToString()+L" ";
else if(x[i,j]<1000)
w+=L"0"+(x[i,j]).ToString()+L" ";
else
w+=(x[i,j]).ToString()+L" ";
w+=L"\n";
}
return(w);
}





実行結果

皆さんも総復習としてサンプルプログラムを作ってみましょう。



第11講第6話へ
 第12講第1話へ 第13講第10話へ 第14講第9話へ 第15講第1話へ



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