アフィリエイト広告を利用しています

広告

posted by fanblog

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;
}
c14_041.png

c14_042.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6951120
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。