第8講 関数の学習

第4話 ポインタを関数に渡す

前話問題解答例
#pragma once
#include<stdlib.h> //malloc使うためにインクルードファイルstdlib.hを読み込む
namespace while文による2次元ループ {
           ・
           ・
           ・
#pragma endregion

   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //変数の宣言
           int **a,**b,i;
           String^ w;

           //ポインタのポインタとポインタの初期化
           a=(int**)malloc(100);
           for(i=0;i<5;i++)a[i]=(int*)malloc(20);
           b=(int**)malloc(100);
           for(i=0;i<5;i++)b[i]=(int*)malloc(20);

           //データ1発生
           f1(a,w);

           //データ1表示
           w=L""; 
           w=f2(a,w);
           label1->Text=w;

           //データ1表示
           f3(b,w);

           //データ2表示
           w=L"";
           w=f4(b,w);
           label2->Text=w;

           //データ1とデータ2の和の計算と表示
           w=L"";
           w=f5(a,b,w);
           label3->Text=w;

         }

         void f1(int** a,String^ w){
           int i,j; //iはbutton1_Clickで宣言してあるが、関数の独立性=変数のローカル性のため再度宣言が必要
           i=0;
           while(i<5){
             j=0;
             while(j<5){
               a[i][j]=5*i+j+1; //ポインタのポインタは2次元配列のように使用できる。
               j++;
             }
             i++;
         }
       }

       String^ f2(int** a,String^ w ){ //String^型の値を戻す関数
         int i,j; //関数の独立性=変数のローカル性のため宣言が必要
         i=0;
         while(i<5){
           j=0;
           while(j<5){
             if(a[i][j]<10)w+=L"0"+(a[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             if(a[i][j]>=10)w+=(a[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             j++;
           }
           w+=L"\n";
           i++;
         }
         return w; //wの値を戻している
       }

       void f3(int** b,String^ w){ 
         int i,j;
         i=0;
         while(i<5){
           j=0;
           while(j<5){
             b[j][i]=5*i+j+1; //ポインタのポインタは2次元配列のように使用できる。
             j++;
           }
           i++;
         }
       }

       String^ f4(int** b,String^ w){ //String^型の値を戻す関数
         int i,j; //関数の独立性=変数のローカル性のため宣言が必要
         i=0;
         while(i<5){
           j=0;
           while(j<5){
             if(b[i][j]<10)w+=L"0"+(b[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             if(b[i][j]>=10)w+=(b[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             j++;
           }
           w+=L"\n";
           i++;
         }
         return w; //wの値を戻している
       }

       String^ f5(int** a,int** b,String^ w){ //String^型の値を戻す関数
         int i,j; //関数の独立性=変数のローカル性のため宣言が必要
         i=0;
         while(i<5){
           j=0;
           while(j<5){
             if((a[i][j]+b[i][j])<10)w+=L"0"+(a[i][j]+b[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             if((a[i][j]+b[i][j])>=10)w+=(a[i][j]+b[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             j++;
           }
           w+=L"\n";
           i++;
         }
         return w; //wの値を戻している
       }

};
}

関数の独立性のため、各関数においてint i,j; を繰り返して宣言しています。
System::Void button1_Clickのみの宣言のみで済ませたかったらどのようになるでしょうか。
解答は30行下。




























#pragma once
#include<stdlib.h> //malloc使うためにインクルードファイルstdlib.hを読み込む
namespace while文による2次元ループ {
           ・
           ・
           ・
#pragma endregion

   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //変数の宣言
           int **a,**b,i;
           String^ w;

           //ポインタのポインタとポインタの初期化
           a=(int**)malloc(100);
           for(i=0;i<5;i++)a[i]=(int*)malloc(20);
           b=(int**)malloc(100);
           for(i=0;i<5;i++)b[i]=(int*)malloc(20);

           //データ1発生
           f1(a,0,0,w);

           //データ1表示 
           w=L"";
           w=f2(a,0,0,w);
           label1->Text=w;

           //データ2発生
           f3(b,0,0,w);

           //データ2表示
           w=L"";
           w=f4(b,0,0,w);
           label2->Text=w;

           //データ1とデータ2の和の計算と表示
           w=L"";
           w=f5(a,b,0,0,w);
           label3->Text=w;

         }

         void f1(int** a,int i,int j,String^ w){
           while(i<5){
             j=0;  //本当は1回目のループでは必要ない。jは0の値を渡されているから。ただ、2回目以降に必要なので入れてある。
             while(j<5){
               a[i][j]=5*i+j+1; //ポインタのポインタは2次元配列のように使用できる。
               j++;
             }
             i++;
         }
       }

       String^ f2(int** a,int i,int j,String^ w ){ //String^型の値を戻す関数
         while(i<5){
           j=0;  //本当は1回目のループでは必要ない。jは0の値を渡されているから。ただ、2回目以降に必要なので入れてある。
           while(j<5){
             if(a[i][j]<10)w+=L"0"+(a[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             if(a[i][j]>=10)w+=(a[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             j++;
           }
           w+=L"\n";
           i++;
         }
         return w; //wの値を戻している
       }

       void f3(int** b,int i,int j,String^ w){ 
         while(i<5){
           j=0;  //本当は1回目のループでは必要ない。jは0の値を渡されているから。ただ、2回目以降に必要なので入れてある。
           while(j<5){
             b[j][i]=5*i+j+1; //ポインタのポインタは2次元配列のように使用できる。
             j++;
           }
           i++;
         }
       }

       String^ f4(int** b,int i,int j,String^ w){ //String^型の値を戻す関数
         while(i<5){
           j=0;  //本当は1回目のループでは必要ない。jは0の値を渡されているから。ただ、2回目以降に必要なので入れてある。
           while(j<5){
             if(b[i][j]<10)w+=L"0"+(b[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             if(b[i][j]>=10)w+=(b[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             j++;
           }
           w+=L"\n";
           i++;
         }
         return w; //wの値を戻している
       }

       String^ f5(int** a,int** b,int i,int j,String^ w){ //String^型の値を戻す関数
         while(i<5){
           j=0;  //本当は1回目のループでは必要ない。jは0の値を渡されているから。ただ、2回目以降に必要なので入れてある。
           while(j<5){
             if((a[i][j]+b[i][j])<10)w+=L"0"+(a[i][j]+b[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             if((a[i][j]+b[i][j])>=10)w+=(a[i][j]+b[i][j]).ToString()+L" "; //ポインタのポインタは2次元配列のように使用できる。
             j++;
           }
           w+=L"\n";
           i++;
         }
         return w; //wの値を戻している
       }

};
}

第3話へ 第5話へ


025


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



数学研究室に戻る