Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - Matrix Class

جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 47 من 104.

challenge icon

التحدي

سهل

لنقم ببناء فئة Matrix تجمع بين جميع تقنيات تحميل المعاملات الزائد (operator overloading) التي تعلمتها في هذا الفصل. ستقوم بإنشاء مصفوفة كاملة الميزات تدعم العمليات الحسابية، والمقارنات، والوصول إلى العناصر، وإخراج التدفق (stream output) — كل ذلك من خلال صيغة معاملات بديهية.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Matrix.h: قم بتعريف فئة Matrix تدير مصفوفة ثنائية الأبعاد من الأعداد الصحيحة باستخدام الذاكرة الديناميكية. يجب أن تدعم المصفوفة الخاصة بك ما يلي:
    • أعضاء خاصة (Private members): مؤشر int** للبيانات ثنائية الأبعاد، وأعضاء من نوع size_t للصفوف والأعمدة.
    • منشئ (Constructor) يأخذ الصفوف والأعمدة، ويقوم بتهيئة جميع العناصر إلى 0.
    • مدمر (Destructor) يقوم بتحرير جميع الذاكرة المخصصة بشكل صحيح.
    • منشئ نسخ (copy constructor) ومعامل تعيين النسخ (copy assignment operator) (نسخ عميق مع التحقق من التعيين الذاتي).
    • دوال جلب getRows() و getCols() (كلاهما const).
    • طريقة set(row, col, value) لتعيين العناصر الفردية.
    • طريقة get(row, col) من نوع const لاسترداد العناصر.

    قم بتنفيذ هذه المعاملات:

    • الحسابية: + و - لجمع وطرح المصفوفات (إرجاع Matrix جديدة بالقيمة).
    • المقارنة: == و != للتحقق مما إذا كانت المصفوفتان لهما نفس الأبعاد وعناصر متطابقة.
    • التدفق: << كدالة صديقة (friend function) لإخراج المصفوفة صفاً بصف، مع فصل العناصر بمسافات وكل صف في سطر جديد.
    • الاشتراك: [] الذي يعيد مؤشراً إلى صف، مما يسمح بصيغة matrix[row][col] (قم بتوفير نسختي const وغير const).

    بالنسبة للمعاملات الحسابية، افترض أن كلتا المصفوفتين لهما نفس الأبعاد. يجب أن تعيد معاملات المقارنة false إذا اختلفت الأبعاد.

  • main.cpp: قراءة المدخلات لإنشاء ومعالجة مصفوفتين 2x2. تنسيق الإدخال هو:
    1. أربعة أعداد صحيحة للمصفوفة الأولى (صفاً بصف): a00، a01، a10، a11.
    2. أربعة أعداد صحيحة للمصفوفة الثانية (صفاً بصف): b00، b01، b10، b11.

    قم بإنشاء كائنين من Matrix (صفان وعمودان لكل منهما)، واملأهما باستخدام طريقة 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>

    يجب أن يعرض كل صف العناصر مفصولة بمسافات مفردة. اطبع true أو false (بأحرف صغيرة) لنتائج المقارنة.

على سبيل المثال، مع المدخلات 1 2 3 4 للمصفوفة A و 5 6 7 8 للمصفوفة B:

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() لتحويل المدخلات. تذكر تنفيذ != بدلالة == للحفاظ على اتساق معاملاتك. لا تنسَ حراس الرأس (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;
    
    // قراءة المدخلات للمصفوفة الثانية (2x2): b00, b01, b10, b11
    int b00, b01, b10, b11;
    cin >> b00 >> b01 >> b10 >> b11;
    
    // TODO: إنشاء كائنين من النوع Matrix (صفين وعمودين لكل منهما)
    
    // TODO: ملء المصفوفات باستخدام الطريقة set()
    
    // TODO: إخراج المصفوفة A
    // cout << "Matrix A:" << endl;
    // استخدم المعامل << لطباعة المصفوفة
    
    // TODO: إخراج المصفوفة B
    // cout << "Matrix B:" << endl;
    // استخدم المعامل << لطباعة المصفوفة
    
    // TODO: إخراج A + B
    // cout << "A + B:" << endl;
    
    // TODO: إخراج A - B
    // cout << "A - B:" << endl;
    
    // TODO: إخراج نتائج المقارنة
    // cout << "A == B: " << (استخدم ternary لـ true/false) << endl;
    // cout << "A != B: " << (استخدم ternary لـ true/false) << endl;
    
    // TODO: إخراج نتائج الوصول عبر الفهرس (subscript access)
    // cout << "A[0][0]: " << ... << endl;
    // cout << "A[1][1]: " << ... << endl;
    
    return 0;
}

جميع دروس Object Oriented Programming