Menu
Coddy logo textTech

復習 - Matrixクラス

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

challenge icon

チャレンジ

簡単

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

コードを2つのファイルに分けて構成します。

  • Matrix.h: 動的メモリを使用して整数の2次元配列を管理する Matrix class を定義します。行列は次をサポートする必要があります。
    • Private members: 2D data 用の int** ポインター、および行と列用の size_t members
    • 行と列を受け取り、すべての要素を 0 に初期化する constructor
    • 割り当てられたすべてのメモリを適切に解放する destructor
    • copy constructor と copy assignment operator(deep copy と self-assignment check)
    • Getters getRows()getCols()(どちらも const)
    • 個々の要素を設定する set(row, col, value) method
    • 要素を取得する get(row, col) const method

    次の operators を実装します。

    • Arithmetic: 行列の加算と減算を行う +-(新しい Matrix を値として返す)
    • Comparison: 2つの行列の次元が同じで、要素が一致しているかを check する ==!=
    • Stream: friend function としての <<。行列を行ごとに出力し、要素はスペースで区切り、各行を新しい行に表示する
    • Subscript: 行へのポインターを返し、matrix[row][col] 構文を可能にする [](const と non-const の両方の versions を提供する)

    Arithmetic operators では、両方の行列の次元が同じであると仮定します。Comparison operators は、次元が異なる場合に false を返す必要があります。

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

    2つの Matrix objects(それぞれ 2 行、2 列)を作成し、set() method を使用して値を設定した後、operators を実演します。

    出力形式:

    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>

    各行では、要素を単一のスペースで区切って表示します。比較結果には 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

入力変換には std::stoi() を使用します。operators の一貫性を保つため、!=== in terms of で実装してください。header file には header guards を忘れずに追加してください。

自分で試してみよう

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

using namespace std;

int main() {
    // 最初の行列(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: 2つの Matrix オブジェクトを作成する(各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++オンラインコンパイラ