第14講 フリーストア配列とCLI配列
第3話 2次元フリーストア配列を関数に送るその1
第2話問題解答例
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         int** a=new int*[5];
         int i;
         for(i=0;i<5;i++)a[i]=new int[6];
         f(a);
         g(a);
         delete[] a;
      }
      void f(int** x){
        int i,j;
        for(i=0;i<5;i++)
          for(j=0;j<6;j++)
            x[i][j]=6*i+j+1;
      }
      void g(int** x){
        String^ w=L"";
        int i,j;
        for(i=0;i<5;i++){
          for(j=0;j<6;j++)
            if(x[i][j]<10)
              w+=L"0"+x[i][j]+L" ";
            else
             w+=x[i][j]+L" ";
          w+=L"\n";
        }
        label1->Text=w;
      }


(コピーペースト用

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
int** a=new int*[5];
int i;
for(i=0;i<5;i++)a[i]=new int[6];
f(a);
g(a);
delete[] a;
}
void f(int** x){
int i,j;
for(i=0;i<5;i++)
for(j=0;j<6;j++)
x[i][j]=6*i+j+1;
}
void g(int** x){
String^ w=L"";
int i,j;
for(i=0;i<5;i++){
for(j=0;j<6;j++)
if(x[i][j]<10)
w+=L"0"+x[i][j]+L" ";
else
w+=x[i][j]+L" ";
w+=L"\n";
}
label1->Text=w;
}



今回は関数fをvoid型にしましたが、int**型にしてa=f(a);にするとどうなるでしょうか。
例によって解答例を20行下に示します。



















private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         int** a=new int*[5];
         int i;
         for(i=0;i<5;i++)a[i]=new int[6];
         a=f(a);
         g(a);
         delete[] a;
      }
      int** f(int** x){
        int i,j;
        for(i=0;i<5;i++)
          for(j=0;j<6;j++)
            x[i][j]=6*i+j+1;
        return(x);   
      }
      void g(int** x){
        String^ w=L"";
        int i,j;
        for(i=0;i<5;i++){
          for(j=0;j<6;j++)
            if(x[i][j]<10)
              w+=L"0"+x[i][j]+L" ";
            else
             w+=x[i][j]+L" ";
          w+=L"\n";
        }
        label1->Text=w;
      }

(コピーペースト用

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
int** a=new int*[5];
int i;
for(i=0;i<5;i++)a[i]=new int[6];
a=f(a);
g(a);
delete[] a;
}
int** f(int** x){
int i,j;
for(i=0;i<5;i++)
for(j=0;j<6;j++)
x[i][j]=6*i+j+1;
return(x);
}
void g(int** x){
String^ w=L"";
int i,j;
for(i=0;i<5;i++){
for(j=0;j<6;j++)
if(x[i][j]<10)
w+=L"0"+x[i][j]+L" ";
else
w+=x[i][j]+L" ";
w+=L"\n";
}
label1->Text=w;
}




ここでまた、問題です。
2次元フリーストア配列bを用意し、フォームを次のように改造し、

実行結果がとなるようにしてください。
解答例は、20行下。




















解答例
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         int** a=new int*[5];
         int i;
         for(i=0;i<5;i++)a[i]=new int[6];
         f1(a);
         g1(a);
         int** b=new int*[5];
         for(i=0;i<5;i++)b[i]=new int[6];
         f2(b);
         g2(b);
         delete[] a;
         delete[] b;
      }
      void f1(int** x){
        int i,j;
        for(i=0;i<5;i++)
          for(j=0;j<6;j++)
            x[i][j]=6*i+j+1;
      }
      void g1(int** x){
        String^ w=L"";
        int i,j;
        for(i=0;i<5;i++){
          for(j=0;j<6;j++)
            if(x[i][j]<10)
              w+=L"0"+x[i][j]+L" ";
            else
              w+=x[i][j]+L" ";
          w+=L"\n";
        }
        label1->Text=w;
      }
      void f2(int** x){
        int i,j;
        for(i=0;i<5;i++)
          for(j=0;j<6;j++)
            x[i][j]=5*j+i+1;
      }
      void g2(int** x){
        String^ w=L"";
        int i,j;
        for(i=0;i<5;i++){
          for(j=0;j<6;j++)
           if(x[i][j]<10)
              w+=L"0"+x[i][j]+L" ";
            else
              w+=x[i][j]+L" ";
            w+=L"\n";
        }
        label2->Text=w;
      }

(コピーペースト用

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
int** a=new int*[5];
int i;
for(i=0;i<5;i++)a[i]=new int[6];
f1(a);
g1(a);
int** b=new int*[5];
for(i=0;i<5;i++)b[i]=new int[6];
f2(b);
g2(b);
delete[] a;
delete[] b;
}
void f1(int** x){
int i,j;
for(i=0;i<5;i++)
for(j=0;j<6;j++)
x[i][j]=6*i+j+1;
}
void g1(int** x){
String^ w=L"";
int i,j;
for(i=0;i<5;i++){
for(j=0;j<6;j++)
if(x[i][j]<10)
w+=L"0"+x[i][j]+L" ";
else
w+=x[i][j]+L" ";
w+=L"\n";
}
label1->Text=w;
}
void f2(int** x){
int i,j;
for(i=0;i<5;i++)
for(j=0;j<6;j++)
x[i][j]=5*j+i+1;
}
void g2(int** x){
String^ w=L"";
int i,j;
for(i=0;i<5;i++){
for(j=0;j<6;j++)
if(x[i][j]<10)
w+=L"0"+x[i][j]+L" ";
else
w+=x[i][j]+L" ";
w+=L"\n";
}
label2->Text=w;
}




またまた、問題です。データの表示をg1とg2で行わせていますが、
System::Void button1_ClickでString^ w=L"";を定義し、
f1(a);とg1(a);をw=f1(a,w)とw=f2(b,w)に変更し、System::Void button1_Clickで結果を表示させるように変更してください。
解答例は20行下。




















解答例
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         int** a=new int*[5];
         int i;
         for(i=0;i<5;i++)a[i]=new int[6];
         String^ w;
         w=f1(a,w);
         label1->Text=w;
         w=L"";
         int** b=new int*[5];
         for(i=0;i<5;i++)b[i]=new int[6];
         w=f2(b,w);
         label2->Text=w;
         delete[] a;
         delete[] b;
       }
       String^ f1(int** x,String^ w){
         int i,j;
         for(i=0;i<5;i++){
           for(j=0;j<6;j++){
             x[i][j]=6*i+j+1;
             if(x[i][j]<10)
               w+=L"0"+(x[i][j]).ToString()+L" ";
             else
               w+=(x[i][j]).ToString()+L" ";
           }
           w+=L"\n";
         }
         return(w);
       }
       String^ f2(int** x,String^ w){
         int i,j;
         for(i=0;i<5;i++){
           for(j=0;j<6;j++){
             x[i][j]=5*j+i+1;
             if(x[i][j]<10)
               w+=L"0"+(x[i][j]).ToString()+L" ";
             else
              w+=(x[i][j]).ToString()+L" ";
           }
           w+=L"\n";
         }
         return(w);
       }


(コピーペースト用

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
int** a=new int*[5];
int i;
for(i=0;i<5;i++)a[i]=new int[6];
String^ w;
w=f1(a,w);
label1->Text=w;
w=L"";
int** b=new int*[5];
for(i=0;i<5;i++)b[i]=new int[6];
w=f2(b,w);
label2->Text=w;
delete[] a;
delete[] b;
}
String^ f1(int** x,String^ w){
int i,j;
for(i=0;i<5;i++){
for(j=0;j<6;j++){
x[i][j]=6*i+j+1;
if(x[i][j]<10)
w+=L"0"+(x[i][j]).ToString()+L" ";
else
w+=(x[i][j]).ToString()+L" ";
}
w+=L"\n";
}
return(w);
}
String^ f2(int** x,String^ w){
int i,j;
for(i=0;i<5;i++){
for(j=0;j<6;j++){
x[i][j]=5*j+i+1;
if(x[i][j]<10)
w+=L"0"+(x[i][j]).ToString()+L" ";
else
w+=(x[i][j]).ToString()+L" ";
}
w+=L"\n";
}
return(w);
}




では本話最後の問題です。
さらに、2次元フリーストア配列cを用意し、フォームを次のように改造し、たし算ができるように変更してください。

実行結果



第11講第6話へ
 第12講第1話へ 第13講第10話へ 第14講第2話へ 第14講第4話へ

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