第14講 フリーストア配列とCLI配列
第7話 2次元CLI配列の学習その1
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         array<int,2>^ a=gcnew array<int,2>(5,8);
         String^ w;
         w=f(a,w);
         label1->Text=w;
      }
      String^ f(array<int,2>^ x,String^ w){
         int i,j;
         for(i=0;i<5;i++)
           for(j=0;j<8;j++)
             x[i,j]=8*i+j+1;
         for(i=0;i<5;i++){
             for(j=0;j<8;j++)
               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) {
array<int,2>^ a=gcnew array<int,2>(5,8);
String^ w;
w=f(a,w);
label1->Text=w;
}
String^ f(array<int,2>^ x,String^ w){
int i,j;
for(i=0;i<5;i++)
for(j=0;j<8;j++)
x[i,j]=8*i+j+1;
for(i=0;i<5;i++){
for(j=0;j<8;j++)
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次元配列bを用意して、
実行結果がとなるようにしてください。
解答例は20行下。






















解答例
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         array<int,2>^ a=gcnew array<int,2>(5,8);
         String^ w;
         w=f1(a,w);
         label1->Text=w;
         w=L"";
         array<int,2>^ b=gcnew array<int,2>(5,8);
         w=f2(b,w);
         label2->Text=w;
      }
      String^ f1(array<int,2>^ x,String^ w){
         int i,j;
        for(i=0;i<5;i++)
           for(j=0;j<8;j++)
             x[i,j]=8*i+j+1;
         for(i=0;i<5;i++){
           for(j=0;j<8;j++)
             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(array<int,2>^ x,String^ w){
         int i,j;
         for(i=0;i<5;i++)
           for(j=0;j<8;j++)
             x[i,j]=5*j+i+1;
         for(i=0;i<5;i++){
           for(j=0;j<8;j++)
             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) {
array<int,2>^ a=gcnew array<int,2>(5,8);
String^ w;
w=f1(a,w);
label1->Text=w;
w=L"";
array<int,2>^ b=gcnew array<int,2>(5,8);
w=f2(b,w);
label2->Text=w;
}
String^ f1(array<int,2>^ x,String^ w){
int i,j;
for(i=0;i<5;i++)
for(j=0;j<8;j++)
x[i,j]=8*i+j+1;
for(i=0;i<5;i++){
for(j=0;j<8;j++)
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(array<int,2>^ x,String^ w){
int i,j;
for(i=0;i<5;i++)
for(j=0;j<8;j++)
x[i,j]=5*j+i+1;
for(i=0;i<5;i++){
for(j=0;j<8;j++)
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);
}




CLI配列の場合、ベクタと同じように配列のサイズを取得することができます。
今回は、サイズを知っているものと前提してf1などで、
      String^ f1(array<int,2>^ x,String^ w){
         int i,j;
         for(i=0;i<5;i++)
           for(j=0;j<8;j++)
としていましたが、配列のサイズ58を知らないことを前提にプログラムを組むことを考えましょう。
配列xのそれぞれの要素数を取得するには、
int m,n;
m=x->GetLength(0);
n=x->GetLength(1);
等です。
x->GetLength(0)で1番目の添え字の要素数、x->GetLength(1)で2番目の添え字の要素数を
取得できるのです。
では皆さん、プログラムを改良してみましょう。
解答例は20行下。



















解答例
String^ f1(array<int,2>^ x,String^ w){
  int 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]=8*i+j+1;
  for(i=0;i<m;i++){
    for(j=0;j<n;j++)
      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(array<int,2>^ x,String^ w){
  int 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]=5*j+i+1;
  for(i=0;i<m;i++){
    for(j=0;j<n;j++)
      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^ f1(array<int,2>^ x,String^ w){
int 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]=8*i+j+1;
for(i=0;i<m;i++){
for(j=0;j<n;j++)
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(array<int,2>^ x,String^ w){
int 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]=5*j+i+1;
for(i=0;i<m;i++){
for(j=0;j<n;j++)
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次元CLI配列cを用意し、フォームを次のように改造し、
実行結果が
となるようにしてください。
すなわち、足し算を加えてください。


第11講第6話へ
 第12講第1話へ 第13講第10話へ 第14講第6話へ 第14講第8話へ



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