2017年11月09日
《その112》 問題演習 p.503演習14-4
次回からは「新版 明解C++ 中級編」を予定しています。
今回の演習14-4 で、入門編の演習問題を全て解いたことになります。
初心者の私なので、あまり出来のよくない解答もあると思います。誰か一人でも、「少しは参考になったかも」と思ってくれたら最高なんですが・・・。
次回からは、「新版 明解C++ 中級編」を予定しています。
やはり、いままでと同じスタイルで、全問を解きながら勉強していこうと思っています。
読んでくださる方が、もしいらっしゃったら、どうかよろしくお願いいたします。
新版明解C++入門編 p.503 演習14-4
簡易的な行列クラス Matrix を作成せよ。以下のコードを参考にして、コンストラクタ・デストラクタ・各メンバ関数を、自分で設計すること。
class Matrix {
int _height; // 行数
int _width; // 列数
double* ptr; // 先頭文字へのポインタ
public:
Matrix(int, int); // コンストラクタ
Matrix(const Matrix&); // コピーコンストラクタ
~string(); // デストラクタ
// +, -, *, = などの演算子を定義せよ。
};
// Matrix.h
#ifndef ___Class_Matrix
#define ___Class_Matrix
#include <iostream>
class Matrix {
int _height;
int _width;
double* ptr;
public:
Matrix(int h, int w);
Matrix(const Matrix& x);
~Matrix() { delete[] ptr; }
Matrix& operator=(const Matrix& x);
int height() { return _height; }
int width() { return _width; }
double& operator[] (int i) const;
friend Matrix operator+(const Matrix& x, const Matrix& y);
friend Matrix operator-(const Matrix& x, const Matrix& y);
friend Matrix operator*(const Matrix& x, const Matrix& y);
friend std::ostream& operator<<(std::ostream& s, const Matrix& x);
};
#endif
// Matrix.cpp
#include <iomanip>
#include "Matrix.h"
Matrix::Matrix(int h, int w) : _height(h), _width(w) {
ptr = new double[_height * _width];
}
Matrix::Matrix(const Matrix& x) {
_height = x._height;
_width = x._width;
ptr = new double[_height * _width];
for (int i = 0; i < _height * _width; i++)
ptr[i] = x.ptr[i];
}
Matrix& Matrix::operator=(const Matrix& x) {
if (&x != this) {
if (_height * _width != x._height * x._width) {
delete[] ptr;
_height = x._height;
_width = x._width;
ptr = new double[_height * _width];
}
for (int i = 0; i < _height * _width; i++)
ptr[i] = x.ptr[i];
}
return *this;
}
double& Matrix::operator[](int i) const {
return ptr[i];
}
Matrix operator+(const Matrix& x, const Matrix& y) {
Matrix temp = x;
for (int i = 0; i < x._height * x._width; i++)
temp[i] = x[i] + y[i];
return temp;
}
Matrix operator-(const Matrix& x, const Matrix& y) {
Matrix temp = x;
for (int i = 0; i < x._height * x._width; i++)
temp[i] = x[i] - y[i];
return temp;
}
Matrix operator*(const Matrix& x, const Matrix& y) {
Matrix temp(x._height, y._width);
for (int i = 0; i < temp._height; i++)
for (int j = 0; j < temp._width; j++) {
temp[i * temp._width + j] = 0;
for (int k = 0; k < x._width; k++)
temp[i * temp._width + j] += x[i * x._width + k] * y[k * y._width + j];
}
return temp;
}
std::ostream& operator<<(std::ostream& s, const Matrix& x) {
for (int i = 0; i < x._height; i++) {
for (int j = 0; j < x._width; j++)
s << std::setw(5) << x[i * x._width + j];
s << '\n';
}
return s;
}
// MatrixTest.cpp
#include <iostream>
#include "Matrix.h"
using namespace std;
void input(Matrix& x) {
for (int i = 0; i < x.height(); i++)
for (int j = 0; j < x.width(); j++) {
cout << " 行" << i + 1 << "・列" << j + 1 << " = "; cin >> x[i * x.width() + j];
}
}
int main()
{
cout << "◆行列の成分を入力してください。\n";
cout << "[ 行列 a … 2行3列 ]\n";
Matrix a(2, 3);
input(a);
cout << a;
cout << "[ 行列 b … 2行3列 ]\n";
Matrix b(2, 3);
input(b);
cout << b;
cout << "[ 行列 c … 3行4列 ]\n";
Matrix c(3, 4);
input(c);
cout << c;
cout << "結果を表示していいですか('y' or 'n') : "; char chr = 'n';
while (chr != 'y' && chr != 'Y') {
cin >> chr;
}
system("cls");
cout << "\n【 行列 a 】\n"; cout << a;
cout << "\n【 行列 b 】\n"; cout << b;
cout << "\n【 行列 c 】\n"; cout << c;
cout << "\n【 a + b 】\n"; cout << a + b;
cout << "\n【 a - b 】\n"; cout << a - b;
cout << "\n【 a * c 】\n"; cout << a * c;
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6951120
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック