第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話へ