Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό 2013-14 Διδάσκων: Γεώργιος Παπαϊωάννου Μονογραφή επιτηρητή: Στοιχεία Φοιτητή (συμπληρώνεται από το φοιτητή) Όνομα: Αίθουσα/αμφιθέατρο: Επίθετο: Όνομα πατέρα: Έτος παράδοσης τελευταίων εργασιών: Αριθμός εργασιών: Αριθμός Μητρώου: Έτος σπουδών: Βαθμολογία (συμπληρώνεται από τον διδάσκοντα) Όλα τα πεδία συμπληρώνονται με κεφαλαία γράμματα Γραπτό Ενότητα 1 Ενότητα 2 Ενότητα3 Σύνολο Εργασίες Εργασία 1 Εργασία 2 Εργασία 3 Εργασία 4 * Σύνολο Αναγωγή στις 30 μονάδες (*) αφορά μόνο παλαιότερους φοιτητές. Οι εργασίες προσμετρώνται μόνο αν παραδόθηκαν στο ακαδ. Έτος 2011-12 και μετά. Παρατηρήσεις Επόπτη Συνολικός Βαθμός: Γενικές Οδηγίες Συμπληρώστε τα στοιχεία που σας ζητούνται στην πρώτη σελίδα πριν ξεκινήσετε να απαντάτε στα ερωτήματα. Όλα τα ερωτήματα πρέπει να απαντηθούν στο χώρο που δίνεται στο ερώτημα και μόνο εκεί. Καμία παραπομπή σε άλλο σημείο δε θα γίνει δεκτή. Πρόχειρες σημειώσεις μπορείτε να κρατήσετε μόνο στο χώρο που σας δίνεται στην τελευταία σελίδα του φύλλου εξέτασης το οποίο αποτελεί μέρος του γραπτού και παραδίδεται μαζί με τις απαντήσεις. Οποιαδήποτε σημείωση σε άλλο σημείο του φύλλου εξέτασης επιφέρει μείωση βαθμού. Η διάρκεια του διαγωνίσματος είναι 3 ώρες και η συνολική βαθμολογία του γραπτού είναι 70 μονάδες ( βαθμός 7). Η εργασία προσμετράται μόνο για γραπτά με βαθμό 3,5. Δεν επιτρέπεται η χρήση σημειώσεων, βιβλίων ή άλλων βοηθημάτων. Σύμφωνα με τον κανονισμό του πανεπιστημίου απαγορεύεται ρητά η χρήση κινητών τηλεφώνων και άλλων ηλεκτρονικών συσκευών κατά τη διάρκεια του διαγωνίσματος. Σε περίπτωση που ο επόπτης διαπιστώσει οποιαδήποτε απόπειρα αντιγραφής, συνεννόησης ή επικοινωνίας των θεμάτων, αφαιρεί επί τόπου το φύλλο εξέτασης, σημειώνει την αιτία και ο φοιτητής αποβάλλεται από την αίθουσα.
Ενότητα 1 (15 μονάδες) Απαντήστε στις ακόλουθες ερωτήσεις, συμπληρώνοντας την απάντησή σας στα κενά που παρέχονται. Όπου απαιτείται δικαιολόγηση, συμπληρώστε τη σύντομα στον αντίστοιχο χώρο. 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; // εκτυπώνεται: 0xΑ900 0xΒ220 0xΒ278 // Σημείωση: 64 bit αρχιτεκτονική cout << m; // εκτυπώνεται: 0x1000 cout << m + ; // εκτυπώνεται: 0x1008 (1 μονάδα) cout << & m[2]; // εκτυπώνεται: (1 μονάδα) cout << m[ ]; // εκτυπώνεται: world (1 μονάδα) cout << m; // εκτυπώνεται: hello (1 μονάδα) cout << &*m[1]; // εκτυπώνεται: (1 μονάδα) void main(int argc,char *argv[]) cout << argv[1]; // myprog.exe > myprog f log.txt -o parsed.log Τυπώνει: (2 μονάδες) Δικαιολογήστε την απάντησή σας: (3 μονάδες) class A1 public : void draw() ; class A2 public : void draw() ; class A : public A1, public A2 ; void main(int argc, char* argv[]) A obj; // Καλέστε την draw() της βασικής κλάσης Α1 του obj: (5 μονάδες)
Ενότητα 2 (10 μονάδες) Απαντήστε με σαφήνεια στις παρακάτω ερωτήσεις: Τι κάνει ο ακόλουθος κώδικας; class ListNode public: T data; ListNode<T> * next; ListNode(const ListNode<T> & src) data = src.data; if (src.next!=null) next = new ListNode<T> ((const ListNode<T>) * src.next); else next = NULL; return; ; class List protected: ListNode<T> * start; public: List( const List<T> & src) if (src.start == NULL) start = NULL; return; else start = new ListNode<T>( src.start ); ; (5 μονάδες)
Ποια είναι η διαφορά μεταξύ των δύο σημειωμένων γραμμών; unsigned int number = 12002; ofstream fs = ofstream("a.out", ios_base::out ); if (!fs.bad()) fs.write(reinterpret_cast<char*>(&number), sizeof(int)); // ΓΡΑΜΜΗ Α fs << number; // ΓΡΑΜΜΗ Β fs.close(); (5 μονάδες) Ενότητα 3 (45 μονάδες) Συμπληρώστε στο χώρο που σας παρέχεται τον κώδικα για τα παρακάτω ερωτήματα. Δίνεται η κλάση: (30 μονάδες) class Container protected: T * storage; size_t num_items; size_t storage_size;
public: virtual void operator += (const T item) virtual ~Container() Container() : storage(nullptr), num_items(0), storage_size(0) T & operator [] (size_t index) return storage[index]; inline size_t size() return num_items; ; Επεκτείνετε κατάλληλα την Container, ώστε ο παρακάτω κώδικας να δουλεύει χωρίς σφάλματα και να παράγει το αποτέλεσμα που φαίνεται: void main(int argc, char* argv[]) Container<long> * store = new ; // Συμπληρώστε την αρχικοποίηση // αντικειμένου της δικής σας κλάσης *store+=10l; *store+=20l; *store+=30l; for (size_t i=0; i<store->size(); i++) std::cout << (*store)[i] << " "; std::cout << std::endl; delete store; Αποτέλεσμα της εκτέλεσης: 10 20 30 Γράψτε εδώ τη δήλωση της δικής σας κλάσης. Δεν επιτρέπεται να αλλοιώσετε την Container, ούτε να χρησιμοποιήσετε κλάσεις της STL.
(15+5 μονάδες) // Η κλάση Counter κατασκευάζεται με βάση ένα std::vector // από δεδομένα οποιουδήποτε τύπου και αυτό που κάνει είναι να αναφέρει // πόσες φορές υπάρχει ένα συγκεκριμένο στοιχείο μέσα στο vector // κατά τη στιγμή της δημιουργίας ενός στιγμιοτύπου Counter. // class Counter private: // Συμπληρώστε πεδία που χρειάζεται η κλάση...
public: // Μοναδικός κατασκευαστής Counter(std::vector<T> & input); ; // Αναφέρει πόσες φορές ένα συγκεκριμένο στοιχείο βρέθηκε μέσα στο vector<t> // input. Αν το στοιχείο δεν υπάρχει, αναφέρει 0, αλλιώς το αριθμό των φορών // που το έχει συναντήσει size_t GetCount(T item); Counter<T>::Counter(std::vector<T> & input) size_t Counter<T>::GetCount(T item)
Ενδεικτική χρήση: void main(int argc, char* argv[]) vector<long> data; data.push_back(-10); data.push_back(1); data.push_back(1); Counter<long> cnt = Counter<long>(data); size_t found = cnt.getcount(-10); found = cnt.getcount(0); found = cnt.getcount(1); // found==1 // found==0 // found==2 Σημείωση: δίνονται +5 μονάδες (15+5) σε αυτό το θέμα για την πιο σύντομη, σωστή απάντηση Πρόχειρο Χρησιμοποιήστε τον ακόλουθο περιγεγραμμένο χώρο ως πρόχειρο και μόνο αυτόν.
(Πρόχειρο - συνέχεια)
(Πρόχειρο - συνέχεια) Βοήθημα: Δίνονται οι βασικές μέθοδοι για κοινές δομές δεδομένων της STL vector<t> size_type size() const; reference operator[] (size_type n); iterator begin(); iterator end(); unordered_map<key, ITEM> ITEM& operator[] ( const KEY& k ); If k matches the key of an element in the container, the function returns a reference to its mapped value. If k does not match the key of any element in the container, the function inserts a new element with that key and returns a reference to its mapped value. iterator find ( const key_type& k ); Searches the container for an element with k as key and returns an iterator to it if found, otherwise it returns an iterator to unordered_map::end (the element past the end of the container). unordered_map<key,t>::iterator it; (*it).first; // the key value (of type KEY) (*it).second; // the mapped value (of type ITEM) (*it); // the "element value" (of type pair<const KEY,ITEM>) iterator end(); set<t> pair<iterator,bool> insert (const T& val); iterator find (const T& val) const; size_type size() const; iterator end(); set<t>::iterator it; (*it); // the "element value" (of type T)