知覚情報処理

第12回演習課題の解説
1
第12回演習課題(1)
1. 以下の条件を満たすプログラムを作成せよ



2
以下の仕様を満たす時を表すクラスを持つ
 データメンバとして、時間、分、秒を表すものを持つ

メンバ関数を使用して、任意の時間、分、秒をオブジェ
クトに渡すことができる

メンバ関数を使用して、現在オブジェクトに保存されて
いる時間、分、秒を受け取ることができる

メンバ関数を呼び出せば、自分のオブジェクトに保存さ
れている時間、分、秒と別のオブジェクトが持つ時間、
分、秒を足すことができる
上記のクラスのオブジェクトを使用して、2つの時間、分、
秒を設定して、足し算して結果を表示する
第12回演習課題(1)の回答
ans12-1.cc


時を表すクラス
 分と秒は60を超えると繰り上がるようにする
void set_min(int _min) { // 分を渡す
min = _min;
hour += (int)(min/60); // 分が60を越えたら時間に繰り上げる
min %= 60;
}

3
実行例
$ ./a.exe
thms1: 0:5:0
thms2: 1:59:0
thms1 (thms2 is added): 2:4:0
第12回演習課題(2)
2. 以下の仕様を満たすプログラムを作成し、オブ
ジェクトの深いコピーが実現できていることを示す


以下の仕様を満たすクラスを持つ
 データメンバとして、3次元配列を動的に確保する

4
コピーコンストラクタを持ち、オブジェクトの深いコ
ピーが実現できる
第12回演習課題(2)の回答
ans12-2.cc


定型のパターン
ans10-4.ccの要領で3次元配列を確保
mem3d(int _size1, int _size2, int _size3) { // コンストラクタ
size1 = _size1;
size2 = _size2;
size3 = _size3;
allocate_memory(); // 配列のメモリの確保
}
5
void allocate_memory() { // 配列のメモリの確保
array = new double**[size1]; // 配列のメモリ確保(1次元目)
for (int i=0; i<size1; i++) {
array[i] = new double*[size2]; // 配列のメモリ確保(2次元目)
for (int j=0; j<size2; j++) {
array[i][j] = new double[size3]; // 配列のメモリ確保(3次元目)
}
}
}
第12回演習課題(2)の回答

コピーコンストラクタを用意
mem3d(const mem3d &obj) { // コピーコンストラクタ
size1 = obj.size1;
size2 = obj.size2;
size3 = obj.size3;
allocate_memory(); // 配列のメモリの確保
}
6
for (int i1=0; i1<size1; i1++) { // 配列のコピー
for (int i2=0; i2<size2; i2++) {
for (int i3=0; i3<size3; i3++) {
array[i1][i2][i3] = obj.array[i1][i2][i3];
}
}
}