ΠΟΛΥΤΕΧΝΕΙΟ
ΚΡΗΤΗΣ Τμήμα Ηλεκτρονικών Μηχ. και Μηχ. Υπολογιστών ΛΟΓ 201: Τεχνολογία Λογισμικού
ΙΙ |
Για τις δυο κλάσεις Vector
και Matrix
, οι επικεφαλίδες
των ζητούμενων μεθόδων και φιλικών συναρτήσεων είναι οι ακόλουθες.
Vector::Vector (int n)
Matrix::Matrix (int r, int c)
Vector::Vector (const Vector & v)
Matrix::Matrix (const Matrix & m)
=
(ανάθεση)
Vector & Vector::operator = (const Vector & v)
Matrix & Matrix::operator = (const Matrix & m)
+
(πρόσθεση)
friend Vector operator + (const Vector & v1, const Vector & v2)
friend Matrix operator + (const Matrix & m1, const Matrix & m2)
==
(έλεγχος ισότητας)
friend int operator == (const Vector & v1, const Vector & v2)
friend int operator == (const Matrix & m1, const Matrix & m2)
*
(πολλαπλασιασμός)
friend double operator * (const Vector & v1, const Vector & v2)
friend Matrix operator * (const Matrix & m1, const Matrix & m2)
friend Vector operator * (const Matrix & m, const Vector & v)
Οι default constructors δέχονται ως παραμέτρους τις διαστάσεις των διανυσμάτων ή πινάκων (το όνομα "default" χρησιμοποιείται εδώ καταχρηστικά, παρά το γεγονός ότι οι constructors έχουν παραμέτρους). Στην υλοποίηση τους, πιθανώς θα σας φανούν χρήσιμα τα ακόλουθα:
Η υλοποίηση των διαφόρων operators γενικά θα πρέπει να ελέγχει αν οι διαστάσεις
των τελουμένων πληρούν τις απαραίτητες προϋποθέσεις. Για, παράδειγμα, ο πολλαπλασιασμός
πινάκων προϋποθέτει οι διαστάσεις των τελουμένων να είναι m x
n και n x
k, οπότε οι διαστάσεις του αποτελέσματος
είναι m x
k. Σε περίπτωση που οι προϋποθέσεις αυτές
δεν πληρούνται, αρκεί να τυπώνετε κατάλληλο μήνυμα και να τερματίζεται το πρόγραμμα
με μια κλήση exit(1)
. Η επικεφαλίδα της exit
βρίσκεται
στο <stdlib.h>
.
Για τον τελεστή =
μπορείτε να υποθέσετε ότι το αριστερό και το
δεξί τελούμενο θα πρέπει να έχουν τις ίδιες διαστάσεις. Εναλλακτικά, μπορείτε
στην υλοποίησή του να αλλάζετε τις διαστάσεις του αριστερού τελούμενου, ώστε
να συμφωνούν με αυτές του δεξιού.
Οι τελεστές +
, ==
και *
μπορούν να υλοποιηθούν
είτε ως φιλικές συναρτήσεις (όπως παραπάνω), είτε ως μέθοδοι των κλάσεων.
Στο κυρίως πρόγραμμα για την επαλήθευση των ζητούμενων ισοτήτων, μπορείτε να χρησιμοποιήσετε πίνακες και διανύσματα με σταθερές διαστάσεις της επιλογής σας, τα στοιχεία των οποίων να αρχικοποιούνται σε τιμές της επιλογής σας. Προκειμένου να γίνει η αρχικοποίηση των πινάκων, θα χρειαστείτε πιθανώς να υλοποιήσετε επιπλέον μεθόδους των κλάσεων. Για παράδειγμα, μπορείτε να υλοποιήσετε τις ακόλουθες μεθόδους, που επιστρέφουν αναφορές σε επιμέρους στοιχεία των διανυσμάτων ή των πινάκων:
double & Vector::elem (int i)
double & Matrix::elem (int i, int j)
Με χρήση των μεθόδων αυτών, η αρχικοποίηση ενός μοναδιαίου πίνακα 4 x
4 μπορεί να γίνει ως εξής:
Matrix i4(4, 4); for (int i=0; i<4; i++) i4.elem(i, i) = 1.0;
και η επαλήθευση της πρώτης ισότητας για κατάλληλα αρχικοποιημένο πίνακα m
μπορεί να γίνει ως εξής:
if (m * i4 == m) cout << "PASSED: m * i == m"; else cout << "FAILED: m * i == m";
Η στοίβα (stack) είναι ένας διαδεδομένος αφηρημένος τύπος δεδομένων, η υλοποίηση του οποίου μπορεί να γίνει με διαφόρους τρόπους. Οι πιο συχνά χρησιμοποιούμενοι είναι με τη μορφή πίνακα και με τη μορφή συνδεδεμένης λίστας. Εφόσον η άσκηση ζητά να μην υπάρχει περιορισμός στον αριθμό των στοιχείων που μπορούν να τοποθετηθούν στη στοίβα, η υλοποίηση με πίνακα σταθερού μεγέθους δεν είναι κατάλληλη. Αντίθετα, η υλοποίηση με συνδεδεμένη λίστα καλύπτει την προδιαγραφή αυτή.
Οι επικεφαλίδες των ζητούμενων μεθόδων της κλάσης StackInt
είναι
οι ακόλουθες:
StackInt::StackInt ()
void StackInt::push (int n)
void StackInt::pop ()
int StackInt::read ()
void StackInt::empty ()
void StackInt::print ()
Σε περίπτωση που η υλοποίηση της κλάσης StackInt
χρησιμοποιεί
δυναμική παραχώρηση μνήμης, θα πρέπει η μνήμη αυτή να αποδεσμεύεται κατά την
καταστροφή των αντικειμένων. Θα πρέπει δηλαδή να υλοποιηθεί κατάλληλος destructor.
To σύντομο πρόγραμμα επίδειξης αυτών των λειτουργιών αρκεί να κατασκευάζει
μια άδεια λίστα και να χρησιμοποιεί όλες τις μεθόδους της κλάσης, καλώντας την
print()
όπου κρίνετε σκόπιμο για την εκτύπωση της λίστας. Δε χρειάζεται
να υπάρχει αλληλεπίδραση με το χρήστη.
nickie@softlab.ntua.gr
).
1/3/2000
.