Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό 2013-14 Διδάσκων: Γεώργιος Παπαϊωάννου Μονογραφή επιτηρητή: Στοιχεία Φοιτητή (συμπληρώνεται από το φοιτητή) Όνομα: Αίθουσα/αμφιθέατρο: Επίθετο: Όνομα πατέρα: Έτος παράδοσης τελευταίων εργασιών: Αριθμός εργασιών: Αριθμός Μητρώου: Έτος σπουδών: Βαθμολογία (συμπληρώνεται από τον διδάσκοντα) Όλα τα πεδία συμπληρώνονται με κεφαλαία γράμματα Γραπτό Ενότητα 1 Ενότητα 2 Ενότητα3 Σύνολο Εργασίες Εργασία 1 Εργασία 2 Εργασία 3 Εργασία 4 * Σύνολο Αναγωγή στις 30 μονάδες (*) αφορά μόνο παλαιότερους φοιτητές. Οι εργασίες προσμετρώνται μόνο αν παραδόθηκαν στο ακαδ. Έτος 2011-12 και μετά. Παρατηρήσεις Επόπτη Συνολικός Βαθμός: Γενικές Οδηγίες Συμπληρώστε τα στοιχεία που σας ζητούνται στην πρώτη σελίδα πριν ξεκινήσετε να απαντάτε στα ερωτήματα. Όλα τα ερωτήματα πρέπει να απαντηθούν στο χώρο που δίνεται στο ερώτημα και μόνο εκεί. Καμία παραπομπή σε άλλο σημείο δε θα γίνει δεκτή. Πρόχειρες σημειώσεις μπορείτε να κρατήσετε μόνο στο χώρο που σας δίνεται στην τελευταία σελίδα του φύλλου εξέτασης το οποίο αποτελεί μέρος του γραπτού και παραδίδεται μαζί με τις απαντήσεις. Οποιαδήποτε σημείωση σε άλλο σημείο του φύλλου εξέτασης επιφέρει μείωση βαθμού. Η διάρκεια του διαγωνίσματος είναι 3 ώρες και η συνολική βαθμολογία του γραπτού είναι 70 μονάδες ( βαθμός 7). Η εργασία προσμετράται μόνο για γραπτά με βαθμό 3,5. Δεν επιτρέπεται η χρήση σημειώσεων, βιβλίων ή άλλων βοηθημάτων. Σύμφωνα με τον κανονισμό του πανεπιστημίου απαγορεύεται ρητά η χρήση κινητών τηλεφώνων και άλλων ηλεκτρονικών συσκευών κατά τη διάρκεια του διαγωνίσματος. Σε περίπτωση που ο επόπτης διαπιστώσει οποιαδήποτε απόπειρα αντιγραφής, συνεννόησης ή επικοινωνίας των θεμάτων, αφαιρεί επί τόπου το φύλλο εξέτασης, σημειώνει την αιτία και ο φοιτητής αποβάλλεται από την αίθουσα.
Ενότητα 1 (20 μονάδες) Απαντήστε στις ακόλουθες ερωτήσεις, συμπληρώνοντας την απάντησή σας στα κενά που παρέχονται. Όπου απαιτείται δικαιολόγηση, συμπληρώστε τη σύντομα στον αντίστοιχο χώρο. string a = Marco Polo ; Ποια είναι η τιμή του *( & ( a.c_str() [2])+1 ) ; H string::c_str() επιστρέφει τον πίνακα χαρακτήρων ενός string. class B{virtual void foo(){ ; class C : public B {; Ποια είναι η τιμή του C * c =(dynamic _cast< C*> (new B()) ); (1 μονάδες) Δικαιολογήστε την απάντησή σας: Συμπληρώστε τον κατάλληλο κώδικα στα κενά (όπου χρειάζεται) ώστε να μην διαρρεύσει στο τέλος του κώδικα μνήμη και να μη διαβαστεί άκυρη μνήμη. Δεν επιτρέπεται να αλλάξετε τη σειρά των γραμμών ή να συμπληρώσετε κώδικα εκτός κενών. char * data1 = new char[50]; data1[1] = a ; ; ; char * data2 = new char[60]; data2[1] = b ; ; ; data1 = data2; ; ; if ( ) { cout << data1[1]; class Integer { public: int value; operator ( ) { ; Ορίστε και υλοποιήστε τον παραπάνω τελεστή ώστε να μπορούμε να εισάγουμε αντικείμενα τύπου Integer σε ένα set<integer>. Θυμηθείτε ότι το set περιέχει μοναδικά και ταξινομημένα στοιχεία. (5 μονάδες)
string *p1 = new string( hello ); string *p2 = new string( world ); string *p3 = new string(!!! ); cout << p1 << << p2 << << p3 << endl; string *m[3] = {p1, p2, p3; // εκτυπώνεται: 0xffa0 0xffb1 0xffd5 // Σημείωση: 32bit αρχιτεκτονική cout << m; // εκτυπώνεται: 0x1000 cout << m[ ]; // εκτυπώνεται: 0xffb1 (1 μονάδα) cout << &m[1]; // εκτυπώνεται: (1 μονάδα) cout << m[ ]; // εκτυπώνεται:!!! (1 μονάδα) cout << m; // εκτυπώνεται: hello (1 μονάδα) cout << &*m[1]; // εκτυπώνεται: (1 μονάδα) Ενότητα 2 (20 μονάδες) Μαρκάρετε μια και μόνο απάντηση σε κάθε ένα από τα ακόλουθα θέματα πολλαπλών επιλογών και δώστε σύντομη αιτιολόγηση της απάντησής σας στο χώρο που παρέχεται ακριβώς από κάτω. char buf[] = { a, b ; Ποιο θα είναι το αποτέλεσμα τις πράξης: cout << *( (long *) ( (void*) buf ) +1); α) Τυπώνει το χαρακτήρα b. β) Τυπώνει τον ASCII κωδικό (αριθμό) που αντιστοιχεί στο χαρακτήρα b. γ) Τυπώνει κάτι απροσδιόριστο δ) Παράγει compilation error Απάντηση: (2 μονάδες) Δικαιολογήστε την απάντησή σας: const int i =0; char buf[] = {10,20,30; cout << buf[i++] << and << buf[i] << end; Τι θα συμβεί; Απάντηση: (2 μονάδες) α) Τυπώνει 10 and 20 β) Τυπώνει 20 and 30 γ) Προκαλεί run-time error δ) Προκαλεί compilation error
Δικαιολογήστε την απάντησή σας: void MyFunc(int * & data) {data++; void main () { int a = 5; MyFunc(&a); cout << a; Τι θα συμβεί; Απάντηση: (2 μονάδες) α) Τυπώνει 6 β) Τυπώνει 5 γ) Τυπώνει κάτι απροσδιόριστο δ) Προκαλεί compilation error Δικαιολογήστε την απάντησή σας: void MyFunc(const int data) {cout << data; void main () { int a = 5; int b = 3; MyFunc(a+b); Τι θα συμβεί; Απάντηση: (1 μονάδες) α) Τυπώνει 5 β) Τυπώνει 3 γ) Τυπώνει 8 δ) Προκαλεί compilation error Δικαιολογήστε την απάντησή σας: (4 μονάδες)
template <typename T> class Array {...; void main(int argc, char* argv[]) { Array<int> * a1 = new Array<int>(); Array<int> a2(); a2 = *a1; Τι θα συμβεί στη σημειωμένη γραμμή ( ); Απάντηση: (2 μονάδες) α) Καλείται ο copy constructor του a2 β) Η διεύθυνση του a2 γίνεται ίση με τον δείκτη a1 γ) Καλείται ο copy assignment operator του a2 δ) Προκαλεί compilation error Δικαιολογήστε την απάντησή σας: Ενότητα 3 (30 μονάδες) Συμπληρώστε στο χώρο που σας παρέχεται τον κώδικα για τα παρακάτω ερωτήματα. Οι απαντήσεις δε θα πρέπει να ξεπερνούν το όριο γραμμών που αναφέρεται σε κάθε περίπτωση. Δεν επιτρέπεται να δώσετε πολλαπλές γραμμές σε μια (π.χ. cout << a ; i++; ) template <typename T> class Number { public: T value; operator++ (int) { (7 μονάδες) // i++ ; Υλοποιήστε τον παραπάνω γενικό μεταθεματικό τελεστή της Number<T>. To T είναι γενικά αριθμός.
template <typename T> class ListNode { public: T data; ListNode<T> * next; ListNode(const ListNode<T> & src) { (8 μονάδες) ; template <typename T> class List { protected: ListNode<T> * start; public: List( const List<T> & src) { ; if (src.start == NULL) start = NULL; else start = new ListNode<T>( src.start ); Δώστε τον κώδικα για τον κατασκευαστή αντιγραφής της παραπάνω κλάσης ListNode έτσι ώστε να δημιουργείται πλήρες αντίγραφο των περιεχομένων που δείχνει ο κόμβος src. Βοήθεια: μπορεί να γίνει αναδρομικά. Η κλάση ListNode χρησιμεύει στην κατασκευή της λίστας List και ο κατασκευαστής αντιγραφής καλείται για να κάνει deep copy μιας λίστας, όπως φαίνεται. class Mystic { (7 μονάδες) private: string label; Mystic(string & newlbl) { setlabel (newlbl); public: void setlabel(string newlbl){label = newlbl; Mystic() : label(){; ; int main(int argc, char *argv[]) {... Αρχικοποιήστε ένα δείκτη σε αντικείμενο τύπου Mystic με τιμή Beep στον παραπάνω χώρο που δίνεται.
Συμπληρώστε τον κώδικα ώστε να δουλεύει το κύριο πρόγραμμα παρακάτω: class Shape { public: virtual void draw () = 0; virtual void print () { ; void main () { Shape *a = new Box(); a->print(); // τυπώνει I am a box (8 μονάδες) Πρόχειρο Χρησιμοποιήστε τον ακόλουθο περιγεγραμμένο χώρο ως πρόχειρο και μόνο αυτόν.
(Πρόχειρο - συνέχεια)