第8講 関数の学習

第6話 関数の総合演習その1 

第6話と第7話では、
次のようなForm1を作り、いろいろな演習を行ってみましょう。
入門
T 配列を関数に送る。
コーティング例
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //変数の宣言
           int a[5],i;

           //データ発生
           for(i=0;i<5;i++)a[i]=i+1;

           //ポインタ変数の宣言と初期化
           int* b=a;

           //関数の呼び出し
           f(b);

        }
        void f(int* a){
           //関数の独立性のため、宣言が必要
           int i;
           //文字型変数の宣言と初期化
           String^ w=L"";

           //データ表示
           for(i=0;i<5;i++)w=w+(a[i]).ToString()+L" ";
           label1->Text=w;
        }

};
}
解説
配列を関数f()に送ったように見えますが、実際に送っているのは、
配列のアドレスを収納したポインタ変数bである。
ただ、ポインタは配列と同じように扱えるので、あたかも配列を送ったかのようになっている。
尚、前にも説明したとおり、
f(b)の引数とvoid f(int* a)のポインタ変数aは、異なっていてもよい。もしわかりやすさを優先するなら、
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //変数の宣言
           int a[5],i;

           //データ発生
           for(i=0;i<5;i++)a[i]=i+1;

           //ポインタ変数の宣言と初期化
           int* b=a;

           //関数の呼び出し
           f(b);

        }
        void f(int* b){
           //関数の独立性のため、宣言が必要
           int i;
           //文字型変数の宣言と初期化
           String^ w=L"";

           //データ表示
           for(i=0;i<5;i++)w=w+(b[i]).ToString()+L" ";
           label1->Text=w;
        }

};
}
となります。ですから、
        void f(int* a){
           //関数の独立性のため、宣言が必要
           int i;
           //文字型変数の宣言と初期化
           String^ w=L"";

           //データ表示
           for(i=0;i<5;i++)w=w+(a[i]).ToString()+L" ";
           label1->Text=w;
        }
であたかもSystem::Void button1_Clickの配列a[i]を直接扱っているかのように見えますが、
ポインタbから参照して使っているに過ぎません。
ただ、ポインタから参照しているにすぎないといいましても、次のコーティングの場合の実行結果を見ればおわかりになりますように、
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //変数の宣言
           int a[5],i;

           //データ発生
           for(i=0;i<5;i++)a[i]=i+1;

           //ポインタ変数の宣言と初期化
           int* b=a;

           //関数の呼び出し
           f(b);

           //文字型変数の宣言
           String^ w;

           //データ表示
           for(i=0;i<5;i++)w=w+(a[i]).ToString()+L" ";
           label1->Text=w;

        }
        void f(int* b){
           //関数の独立性のため、宣言が必要
           int i;
           
           //データ変換
           for(i=0;i<5;i++)b[i]=b[i]+3;
        }

};
}
実行結果
入門
参照して、その中身も変更することができます。


U 2次元配列を関数に渡す。
今度は、コーティングを次のように変更しましょう。
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //ポインタのポインタの宣言
           int** a;
           //ポインタのポインタの初期化
           a=(int** )malloc(100);
           //ポインタの初期化
           int i;
           for(i=0;i<5;i++)a[i]=(int* )malloc(20);

           //文字型変数の宣言と初期化
           String^ w=L"";

           //関数に2次元配列(ポインタのポインタ)を送る。
           w=f(a);

           //データ表示
           label1->Text=w;

        }
        String^ f(int** a){
           //変数の宣言
           int i,j;
           //文字型変数の宣言と初期化
           String^ w=L"";

           //データの発生
           for(i=0;i<5;i++){
             for(j=0;j<5;j++){
               a[i][j]=5*i+j+1;
             }
           }

           //データを文字型変数に収納する。
           for(i=0;i<5;i++){
             for(j=0;j<5;j++){
               if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
               if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
             }
             w=w+"\n";
           }

           //文字型変数を返す。
           return w;

         }


};
}
実行結果
入門

V 3次元配列を関数に送る。
今度は3次元ですので、Form1を広げておきましょう。
入門
実行結果
入門
実行結果の通りになるようにUの場合のコーティングを参考に考えてみてください。

W 4次元配列を関数に送る
V同様に考えてみてください。
ただし、今回はかなり縦長になり、画面に入り切りませんので、
入門
入門
AoutScrollの入門をクリックして
入門
Trueに変更してください。
すると、入りきらない場合
入門
スクロールできるようになります。

第5話へ 第7話へ


025


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



数学研究室に戻る