Menu
CoddyTech

復習 - Matrixクラス

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 47/104。

challenge icon

チャレンジ

簡単

この章で学んだすべての演算子オーバーロードの技法を組み合わせたMatrixクラスを作りましょう。算術演算、比較、要素へのアクセス、ストリーム出力に対応する、機能を備えた行列を作成します。すべて直感的な演算子構文で扱えます。

コードは2つのファイルに分けます。

  • Matrix.h: 動的メモリを使用して2次元整数配列を管理するMatrixクラスを定義します。行列は次の機能を備える必要があります。
    • プライベートメンバー: 2次元データ用のint**ポインターと、行数および列数用のsize_tメンバー
    • 行数と列数を受け取り、すべての要素を0に初期化するコンストラクター。行ポインターの配列を確保し、続いて各行を確保します。data = new int*[rows];および各行rに対するdata[r] = new int[cols];を使用します。
    • 確保したメモリをすべて適切に解放するデストラクター。まず各行に対してdelete[]を実行し、その後delete[] data;を実行します。
    • コピーコンストラクターとコピー代入演算子(自己代入チェックを伴うディープコピー)
    • ゲッターgetRows()とgetCols()(どちらもconst)
    • 個々の要素を設定するset(row, col, value)メソッド
    • 要素を取得するconstメソッドget(row, col)

    次の演算子を実装します。

    • 算術演算: 行列の加算と減算を行う+および-(新しいMatrixを値として返す)
    • 比較: 2つの行列の次元と要素がすべて同じかを判定する==および!=
    • ストリーム: 行列を行ごとに出力するフレンド関数としての<<。要素はスペースで区切り、各行は改行します。
    • 添字: 行へのポインターを返し、matrix[row][col]という構文を可能にする[](const版と非const版の両方を用意します)

    算術演算子については、両方の行列の次元が同じであると仮定します。比較演算子は、次元が異なる場合にfalseを返す必要があります。

  • main.cpp: 入力を読み取り、2つの2x2行列を作成して操作します。入力形式は次のとおりです。
    1. 1つ目の行列の4つの整数(行ごとの順):a00, a01, a10, a11
    2. 2つ目の行列の4つの整数(行ごとの順):b00, b01, b10, b11

    2つのMatrixオブジェクト(それぞれ2行、2列)を作成し、set()メソッドを使って値を設定した後、演算子の動作を示します。

    出力形式:

    Matrix A:
    <row0>
    <row1>
    Matrix B:
    <row0>
    <row1>
    A + B:
    <row0>
    <row1>
    A - B:
    <row0>
    <row1>
    A == B: <true/false>
    A != B: <true/false>
    A[0][0]: <value>
    A[1][1]: <value>

    各行では、要素を1つのスペースで区切って表示します。比較結果はtrueまたはfalse(小文字)で出力します。

たとえば、Matrix Aの入力が1 2 3 4で、Matrix B:の入力が5 6 7 8の場合:

Matrix A:
1 2
3 4
Matrix B:
5 6
7 8
A + B:
6 8
10 12
A - B:
-4 -4
-4 -4
A == B: false
A != B: true
A[0][0]: 1
A[1][1]: 4

演算子の一貫性を保つため、!=は==を使って実装してください。ヘッダーファイルにヘッダーガードを忘れずに追加してください。

自分で試してみよう

#include <iostream>
#include <string>
#include "Matrix.h"

using namespace std;

int main() {
    // 1つ目の行列(2x2)の入力を読み込む:a00, a01, a10, a11
    int a00, a01, a10, a11;
    cin >> a00 >> a01 >> a10 >> a11;
    
    // 2つ目の行列(2x2)の入力を読み込む:b00, b01, b10, b11
    int b00, b01, b10, b11;
    cin >> b00 >> b01 >> b10 >> b11;
    
    // TODO: Matrixオブジェクトを2つ作成する(それぞれ2行2列)
    
    // TODO: set()メソッドを使って行列に値を設定する
    
    // TODO: Matrix Aを出力する
    // cout << "Matrix A:" << endl;
    // <<演算子を使って行列を出力する
    
    // TODO: Matrix Bを出力する
    // cout << "Matrix B:" << endl;
    // <<演算子を使って行列を出力する
    
    // TODO: A + Bを出力する
    // cout << "A + B:" << endl;
    
    // TODO: A - Bを出力する
    // cout << "A - B:" << endl;
    
    // TODO: 比較結果を出力する
    // cout << "A == B: " << (true/false の判定に三項演算子を使う) << endl;
    // cout << "A != B: " << (true/false の判定に三項演算子を使う) << endl;
    
    // TODO: 添字によるアクセス結果を出力する
    // cout << "A[0][0]: " << ... << endl;
    // cout << "A[1][1]: " << ... << endl;
    
    return 0;
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: C++オンラインコンパイラ