ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ
Τμήμα Ηλεκτρονικών Μηχ. και Μηχ. Υπολογιστών

ΛΟΓ 201: Τεχνολογία Λογισμικού ΙΙ
http://www.softlab.ntua.gr/~nickie/TUC/log201/

1η Σειρά Ασκήσεων
Υποδείξεις


Άσκηση 1

Για τις δυο κλάσεις Vector και Matrix, οι επικεφαλίδες των ζητούμενων μεθόδων και φιλικών συναρτήσεων είναι οι ακόλουθες.

Οι default constructors δέχονται ως παραμέτρους τις διαστάσεις των διανυσμάτων ή πινάκων (το όνομα "default" χρησιμοποιείται εδώ καταχρηστικά, παρά το γεγονός ότι οι constructors έχουν παραμέτρους). Στην υλοποίηση τους, πιθανώς θα σας φανούν χρήσιμα τα ακόλουθα:

Η υλοποίηση των διαφόρων operators γενικά θα πρέπει να ελέγχει αν οι διαστάσεις των τελουμένων πληρούν τις απαραίτητες προϋποθέσεις. Για, παράδειγμα, ο πολλαπλασιασμός πινάκων προϋποθέτει οι διαστάσεις των τελουμένων να είναι m x n και n x k, οπότε οι διαστάσεις του αποτελέσματος είναι m x k. Σε περίπτωση που οι προϋποθέσεις αυτές δεν πληρούνται, αρκεί να τυπώνετε κατάλληλο μήνυμα και να τερματίζεται το πρόγραμμα με μια κλήση exit(1). Η επικεφαλίδα της exit βρίσκεται στο <stdlib.h>.

Για τον τελεστή = μπορείτε να υποθέσετε ότι το αριστερό και το δεξί τελούμενο θα πρέπει να έχουν τις ίδιες διαστάσεις. Εναλλακτικά, μπορείτε στην υλοποίησή του να αλλάζετε τις διαστάσεις του αριστερού τελούμενου, ώστε να συμφωνούν με αυτές του δεξιού.

Οι τελεστές +, == και * μπορούν να υλοποιηθούν είτε ως φιλικές συναρτήσεις (όπως παραπάνω), είτε ως μέθοδοι των κλάσεων.

Στο κυρίως πρόγραμμα για την επαλήθευση των ζητούμενων ισοτήτων, μπορείτε να χρησιμοποιήσετε πίνακες και διανύσματα με σταθερές διαστάσεις της επιλογής σας, τα στοιχεία των οποίων να αρχικοποιούνται σε τιμές της επιλογής σας. Προκειμένου να γίνει η αρχικοποίηση των πινάκων, θα χρειαστείτε πιθανώς να υλοποιήσετε επιπλέον μεθόδους των κλάσεων. Για παράδειγμα, μπορείτε να υλοποιήσετε τις ακόλουθες μεθόδους, που επιστρέφουν αναφορές σε επιμέρους στοιχεία των διανυσμάτων ή των πινάκων:

Με χρήση των μεθόδων αυτών, η αρχικοποίηση ενός μοναδιαίου πίνακα 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";


Άσκηση 2

Η στοίβα (stack) είναι ένας διαδεδομένος αφηρημένος τύπος δεδομένων, η υλοποίηση του οποίου μπορεί να γίνει με διαφόρους τρόπους. Οι πιο συχνά χρησιμοποιούμενοι είναι με τη μορφή πίνακα και με τη μορφή συνδεδεμένης λίστας. Εφόσον η άσκηση ζητά να μην υπάρχει περιορισμός στον αριθμό των στοιχείων που μπορούν να τοποθετηθούν στη στοίβα, η υλοποίηση με πίνακα σταθερού μεγέθους δεν είναι κατάλληλη. Αντίθετα, η υλοποίηση με συνδεδεμένη λίστα καλύπτει την προδιαγραφή αυτή.

Οι επικεφαλίδες των ζητούμενων μεθόδων της κλάσης StackInt είναι οι ακόλουθες:

Σε περίπτωση που η υλοποίηση της κλάσης StackInt χρησιμοποιεί δυναμική παραχώρηση μνήμης, θα πρέπει η μνήμη αυτή να αποδεσμεύεται κατά την καταστροφή των αντικειμένων. Θα πρέπει δηλαδή να υλοποιηθεί κατάλληλος destructor.

To σύντομο πρόγραμμα επίδειξης αυτών των λειτουργιών αρκεί να κατασκευάζει μια άδεια λίστα και να χρησιμοποιεί όλες τις μεθόδους της κλάσης, καλώντας την print() όπου κρίνετε σκόπιμο για την εκτύπωση της λίστας. Δε χρειάζεται να υπάρχει αλληλεπίδραση με το χρήστη.


Νίκος Παπασπύρου (nickie@softlab.ntua.gr). 1/3/2000 .