Menu
CoddyTech

مراجعة - Matrix Class

جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 47 من 104.

challenge icon

التحدي

سهل

لنبنِ فئة Matrix تجمع كل تقنيات تحميل المعاملات الزائد التي تعلمتها في هذا الفصل. ستنشئ مصفوفة متكاملة تدعم العمليات الحسابية والمقارنات والوصول إلى العناصر وإخراج التدفقات، كل ذلك باستخدام صياغة معاملات بديهية.

ستنظم التعليمات البرمجية في ملفين:

  • Matrix.h: عرّف فئة Matrix لإدارة مصفوفة ثنائية الأبعاد من الأعداد الصحيحة باستخدام الذاكرة الديناميكية. ينبغي أن تدعم مصفوفتك ما يلي:
    • أعضاء خاصون: مؤشر int** للبيانات ثنائية الأبعاد، وأعضاء من النوع size_t للصفوف والأعمدة
    • مُنشئ يأخذ عدد الصفوف والأعمدة، ويهيئ جميع العناصر إلى 0. خصص مصفوفة من مؤشرات الصفوف، ثم خصص كل صف: data = new int*[rows]; وdata[r] = new int[cols]; لكل صف r
    • مُدمّر يحرر كل الذاكرة المخصصة على نحو صحيح: نفّذ delete[] لكل صف أولًا، ثم delete[] data;
    • مُنشئ نسخ وعامل إسناد النسخ (نسخ عميق مع التحقق من الإسناد الذاتي)
    • دالتا الحصول getRows() وgetCols() (كلتاهما ثابتتان)
    • دالة set(row, col, value) لتعيين عناصر منفردة
    • دالة get(row, col) ثابتة لاسترجاع العناصر

    نفّذ هذه المعاملات:

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

    بالنسبة إلى المعاملات الحسابية، افترض أن أبعاد المصفوفتين متساوية. ينبغي أن تُعيد معاملات المقارنة 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 لـ Matrix 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

تذكّر تنفيذ != بالاعتماد على == للحفاظ على اتساق معاملاتك. ولا تنسَ حراس التضمين في ملف الترويسة.

جرّب بنفسك

#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: " << (استخدم العامل الثلاثي لتحديد true/false) << endl;
    // cout << "A != B: " << (استخدم العامل الثلاثي لتحديد true/false) << endl;
    
    // TODO: اطبع نتائج الوصول باستخدام الفهرس
    // cout << "A[0][0]: " << ... << endl;
    // cout << "A[1][1]: " << ... << endl;
    
    return 0;
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C++ عبر الإنترنت