第8講 関数(2)
第5話 配列を返す
実行画面
行列
1 7 4 0 9 4 8
8 2 4 5 5 1 7
1 1 5 2 7 6 1
4 2 3 2 2 1 6
8 5 7 6 1 8 9
2 7 9 5 4 3 1
左右反転行列
8 4 9 0 4 7 1
7 1 5 5 4 2 8
1 6 7 2 5 1 1
6 1 2 2 3 2 4
9 8 1 6 7 5 8
1 3 4 5 9 7 2
上下反転行列
2 7 9 5 4 3 1
8 5 7 6 1 8 9
4 2 3 2 2 1 6
1 1 5 2 7 6 1
8 2 4 5 5 1 7
1 7 4 0 9 4 8
転置行列
1 8 1 4 8 2
7 2 1 2 5 7
4 4 5 3 7 9
0 5 2 2 6 5
9 5 7 2 1 4
4 1 6 1 8 3
8 7 1 6 9 1
を実現するプログラム例
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
int **f(); //データ作成
void g(int **x); //行列表示
void h(int **x); //左右反転行列表示
void s(int **x); //上限反転行列表示
void t(int **x); //転置行列表示
int main() {
int **a; //2次元配列を受け取る受け箱
//行列のデータ入力
a=f();
//行列の表示
g(a);
//左右反転行列の表示
h(a);
//上限反転行列の表示
s(a);
//転置行列の表示
t(a);
}
int **f() {
int i, j;
int **x = (int **)malloc(sizeof(int *) * 6); //配列の宣言
for (i = 0; i < 10; i++)x[i] = (int *)malloc(sizeof(int) * 7);
//配列のデータ作成
for (i = 0; i < 6; i++) {
for (j = 0; j < 7; j++)x[i][j] = rand() % 10;
}
return(x);
}
void g(int **x) {
int i, j;
//配列のデータ
cout << "行列" << endl;
for (i = 0; i < 6; i++) {
for (j = 0; j < 7; j++)cout << x[i][j] << " ";
cout << endl; //改行
}
cout << endl; //改行
}
void h(int **x) {
int i, j;
//配列のデータ表示
cout << "左右反転行列" << endl;
for (i = 0; i < 6; i++) {
for (j = 0; j < 7; j++)cout << x[i][6 - j] << " ";
cout << endl; //改行
}
cout << endl; //改行
}void s(int **x) {
int i, j;
//配列のデータ表示
cout << "上下反転行列" << endl;
for (i = 0; i < 6; i++) {
for (j = 0; j < 7; j++)cout << x[5 - i][j] << " ";
cout << endl; //改行
}
cout << endl; //改行
}void t(int **x) {
int i, j;
//配列のデータ表示
cout << "転置行列" << endl;
for (i = 0; i < 7; i++) {
for (j = 0; j < 6; j++)cout << x[j][i] << " ";
cout << endl; //改行
}
cout << endl; //改行
}
main()の
int **a;
は受け皿にすぎません。
実体は、社員f()が作って返してくれたのです。
また、
int **f(); //データ作成
は
int** f(); //データ作成
と表記することも出来ます。
ポインタを宣言するときにも、
int *a;
int* a;
のどちらの表記でもよいことになっています。
ポインタを使えば実質配列を送ることも配列を返すことも出来るのです。
では、次は3次元配列を返したり、送ったして、
を実現します。
条件は、
関数f()が3次元配列を作ってその先頭アドレスをmain()に返し、
main()がそのアドレスを関数g()とh()に送り、
関数g()はデータ入力、関数h()ではデータ出力を担当するものとします。
すなわち、
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
int*** f(); //3次元配列を作る
void g(int ***a); //3次元配列にデータを入力
void h(int ***a); //3次元配列のデータを表示
int main() {
int ***a;
a=f(); //f()が作った3次元配列を受け取る
g(a); //3次元配列にデータを入力
h(a); //3次元配列のデータを表示
return(0);
}
//3次元配列を作る
int*** f() {
}
//3次元配列にデータを入力
void g(int ***a) {
}
//3次元配列のデータを表示
void h(int ***a) {
}
という形にします。
空白部分を埋めて実現して下さい。