סיכום – מחלקת Matrix
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 47 מתוך 104.
אתגר
קלבואו נבנה מחלקה Matrix שמאגדת את כל טכניקות העמסת האופרטורים שלמדת בפרק הזה. תיצור מטריצה מלאה שתומכת בפעולות חשבון, השוואות, גישה לאיברים ופלט לזרם — והכול באמצעות תחביר אינטואיטיבי של אופרטורים.
תארגן את הקוד שלך בשני קבצים:
Matrix.h: הגדר מחלקהMatrixשמנהלת מערך דו־ממדי של מספרים שלמים באמצעות זיכרון דינמי. המטריצה שלך צריכה לתמוך ב:- חברים פרטיים: מצביע
int**לנתונים הדו־ממדיים, וחבריsize_tעבור שורות ועמודות - בנאי שמקבל מספר שורות ועמודות ומאתחל את כל האיברים ל־0
- הורס שמשחרר כראוי את כל הזיכרון שהוקצה
- בנאי העתקה ואופרטור השמת העתקה (העתקה עמוקה עם בדיקת השמה עצמית)
- פונקציות הגישה
getRows()ו־getCols()(שתיהן const) - מתודת
set(row, col, value)להגדרת איברים בודדים - מתודת
get(row, col)מסוג const לשליפת איברים
ממש את האופרטורים הבאים:
- חשבון:
+ו־-לחיבור וחיסור מטריצות (החזר Matrix חדש לפי ערך) - השוואה:
==ו־!=לבדיקה אם לשתי מטריצות יש את אותם ממדים ואיברים זהים - זרם:
<<כפונקציית friend שמוציאה את המטריצה שורה אחר שורה, עם רווחים בין האיברים ושורה חדשה אחרי כל שורה - אינדקס:
[]שמחזיר מצביע לשורה, ומאפשר תחבירmatrix[row][col](ספק גם גרסה const וגם גרסה שאינה const)
באופרטורים החשבוניים, הנח שלשתי המטריצות יש אותם ממדים. אופרטורי ההשוואה צריכים להחזיר
falseאם הממדים שונים.- חברים פרטיים: מצביע
main.cpp: קרא קלט כדי ליצור ולתפעל שתי מטריצות 2x2. פורמט הקלט הוא:- ארבעה מספרים שלמים עבור המטריצה הראשונה (שורה אחר שורה): a00, a01, a10, a11
- ארבעה מספרים שלמים עבור המטריצה השנייה (שורה אחר שורה): b00, b01, b10, b11
צור שני אובייקטים מסוג
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>בכל שורה יש להציג את האיברים כשהם מופרדים ברווח יחיד. הדפס
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השתמש ב־std::stoi() להמרת הקלט. זכור לממש את != באמצעות == כדי לשמור על עקביות בין האופרטורים. אל תשכח להוסיף הגנות הכללה לקובץ הכותרת שלך.
נסו בעצמכם
#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 (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;
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP
קבצים חיצונייםבנייה וקומפילציה של C++קובצי Header וקובצי מקורמרחבי שמות והיקףמבוא ל-OOP ב-C++מחלקות לעומת אובייקטיםמצביע thisמתודות (פונקציות איבר)תכונות (חברי נתונים)יסודות הבנאים וההורסיםסיכום – מחשבון פשוט4מאפייני מחלקה
חברי מופע לעומת חברים סטטייםגטרים וסטריםפונקציות איבר קבועותמילת המפתח mutableמתודות ומשתנים סטטייםפונקציות ומחלקות ידידותסיכום – מנהל חשבונות בנק7ירושה
ירושה בסיסיתרמות גישה בירושהסדר הקריאות לבנאי ולמפרקדריסת מתודותפונקציות וירטואליות ו־VTableירושה מרובהירושה וירטואליתסיכום – היררכיית עובדים2ניהול זיכרון
זיכרון Stack לעומת Heapמצביעים והפניותזיכרון דינמי (new/delete)מצביעים חכמים ב-C++RAII ב-C++סיכום – מנהל מערכים דינמיים5כימוס
מצייני גישה ב-C++מצייני גישה לעומקהסתרת מידעמבנה לעומת מחלקהמחלקות מקוננות ופנימיותסיכום – מערכת רשומות תלמידים8רב־צורתיות
רב־צורתיות בזמן קומפילציה לעומת בזמן ריצההעמסת פונקציותפונקציות וירטואליות — מבט נוסףפונקציות וירטואליות טהורותמחלקות מופשטותתכנון ממשקים ב־C++המרה דינמית ו־RTTIסיכום — מחשבון צורות3בנאים והורסים
בנאי ברירת מחדלבנאי עם פרמטריםבנאי העתקהבנאי העברהרשימות אתחול בבנאיםבנאים מאציליםמעמיקים בנושא הורסיםכלל השלושה / החמישה / האפססיכום – מחלקת String6העמסת אופרטורים
מבוא להעמסת אופרטוריםהעמסת אופרטורים אריתמטייםהעמסת אופרטורי השוואהאופרטורי זרםהעמסת אופרטור השמההעמסת האופרטורים [] ו־()אופרטורים להמרת טיפוסיםסיכום – מחלקת Matrix9תבניות
תבניות פונקציהתבניות מחלקההתמחות תבניותתבניות ארגומנטים משתנותיסודות SFINAE ותכונות טיפוסיםסיכום – מכל גנריתרגלו בעצמכם: קומפיילר C++ אונליין