Προγραμματισμός ΙΙ. Ενότητα 10: Πρότυπες συναρτήσεις και πρότυπες κλάσεις - Μέρος 2 Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Σχετικά έγγραφα
Προγραμματισμός ΙΙ Ενότητα 5:

Προγραμματισμός ΙΙ. Ενότητα 7: Βιβλιοθήκες - Μέρος 1. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 8: Πρότυπες συναρτήσεις και πρότυπες κλάσεις - Μέρος 1 Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 2: Διαχείριση μνήμης. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 7: Βιβλιοθήκες - Μέρος 2. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ Ενότητα 4:

Προγραμματισμός ΙΙ. Ενότητα 8: Βιβλιοθήκες - Μέρος 2. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 1: Προαπαιτούμενα. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 9: Πρότυπες συναρτήσεις και πρότυπες κλάσεις - Μέρος 2 Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 4: Διαχείριση μνήμης. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 6: Βιβλιοθήκες - Μέρος 1. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 9: Πρότυπες συναρτήσεις και πρότυπες κλάσεις - Μέρος 1 Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 1: Βασικοί τύποι δεδομένων. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ Ενότητα 5:

Προγραμματισμός ΙΙ Ενότητα 3:

Προγραμματισμός ΙΙ. Ενότητα 2: Επανάληψη στον Προγραμματισμό Ι. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 3: Βασικοί τύποι δεδομένων. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 3: Constructors και destructors

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 2: Κλάσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 7: Υπερφόρτωση τελεστών. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός ΙΙ Ενότητα 6:

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 5: Κληρονομικότητα. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 6: Φιλικές συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Οντοκεντρικός Προγραμματισμός

Εισαγωγή στους Αλγορίθμους

Εισαγωγή στους Αλγορίθμους

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Δομές Δεδομένων. Ενότητα 2: Περισσότερα για τους δείκτες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων Ενότητα 1

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Διοικητική Λογιστική

Οντοκεντρικός Προγραμματισμός

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός H/Y Ενότητα 6: Δομές (structures) Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 9: Ειδικά θέματα γλώσσας C/C++. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Εισαγωγή στους Αλγορίθμους

Βάσεις Δεδομένων. Ενότητα 1: Εισαγωγή στις Βάσεις δεδομένων. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός H/Y Ενότητα 3: Πίνακες αριθμών και χαρακτήρων. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 2: Εντολές ελέγχου ροής. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Οντοκεντρικός Προγραμματισμός

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

Ηλεκτρονικοί Υπολογιστές

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Δομημένος Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 8: Αρχεία. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους

Αντικειμενοστραφής Προγραμματισμός

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Οικονομετρία Ι. Ενότητα 10: Διαγνωστικοί Έλεγχοι. Δρ. Χαϊδώ Δριτσάκη Τμήμα Λογιστικής & Χρηματοοικονομικής

Συστήματα Αναμονής. Ενότητα 3: Στοχαστικές Ανελίξεις. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός H/Y Ενότητα 7: Αρχεία. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Λογιστική Κόστους Ενότητα 10: Ασκήσεις Προτύπου Κόστους Αποκλίσεων.

Τεχνολογία Πολυμέσων. Ενότητα 8: Pool Table. Νικολάου Σπύρος Τμήμα Μηχανικών Πληροφορικής ΤΕ

Αντικειμενοστραφής Προγραμματισμός

1 η Διάλεξη. Ενδεικτικές λύσεις ασκήσεων

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

ΑΝΤΙΡΡΥΠΑΝΤΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΑΙΩΡΟΥΜΕΝΩΝ ΣΩΜΑΤΙΔΙΩΝ Ενότητα 2: Αιωρούμενα σωματίδια & Απόδοση συλλογής Αν. Καθ. Δρ Μαρία Α. Γούλα Τμήμα Μηχανικών

Διοικητική Λογιστική

Βάσεις Περιβαλλοντικών Δεδομένων

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

ΗΛΕΚΤΡΟΝΙΚΗ ΙIΙ Ενότητα 6

Οντοκεντρικός Προγραμματισμός

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Μηχανολογικό Σχέδιο Ι

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 1

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Οικονομετρία Ι. Ενότητα 3: Θεώρημα των Gauss Markov. Δρ. Χαϊδώ Δριτσάκη Τμήμα Λογιστικής & Χρηματοοικονομικής

Οργάνωση και Διοίκηση Πωλήσεων Ενότητα 1: Ο ΡΟΛΟΣ ΤΩΝ ΠΩΛΗΣΕΩΝ ΣΤΟ ΠΛΑΙΣΙΟ ΤΗΣ ΣΤΡΑΤΗΓΙΚΗΣ ΜΑΡΚΕΤΙΝΓΚ

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού Υπέρθερμου Ατμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Οντοκεντρικός Προγραμματισμός

Στατιστική Ι. Ενότητα 3: Στατιστική Ι (3/4) Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Κοζάνη)

Δομημένος Προγραμματισμός

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Transcript:

Προγραμματισμός ΙΙ Ενότητα 10: Πρότυπες συναρτήσεις και πρότυπες κλάσεις - Μέρος 2 Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

Πρότυπες συναρτήσεις και πρότυπες κλάσεις - Μέρος 2

Σκοποί ενότητας Η ενότητα αυτή, ασχολείται με το ζήτημα των πρότυπων συναρτήσεων και των πρότυπων κλάσεων. 5

Περιεχόμενα ενότητας Πρότυπες κλάσεις. Πρότυπες κλάσεις και υπερφόρτωση τελεστών. Ασκήσεις. Βιβλιογραφία. 6

Πρότυπες κλάσεις (1/13) Ακολουθεί ο κώδικας της πρότυπης κλάσης και της συνάρτησης main που δείχνει τον τρόπο χρήσης της. 7

Πρότυπες κλάσεις (2/13) #include <iostream> using namespace std; /* --------------------------------------------------------------*/ template <class T> class ArraySorter private: T *Array; size_t NumItems; 8

Πρότυπες κλάσεις (3/13) protected: void inline Swap(T *Arg1, T *Arg2) T Tmp = *Arg1; *Arg1 = *Arg2; *Arg2 = Tmp; } // Swap 9

Πρότυπες κλάσεις (4/13) public: ArraySorter(const size_t N) Array = new T[N]; NumItems = N; } // Constructor ~ArraySorter() delete Array; Array = NULL; NumItems = 0; } // Destructor 10

Πρότυπες κλάσεις (5/13) const T& GetItem(const size_t Index) const return ( Array[Index] ); } // GetItem void SetItem(const size_t Index, const T &Item) Array[Index] = Item; } // SetItem 11

Πρότυπες κλάσεις (6/13) void SetArray(const T Numbers[]) for ( size_t i = 0; i < NumItems; i++ ) Array[i] = Numbers[i]; } // for } // SetArray 12

Πρότυπες κλάσεις (7/13) bool IsSorted() const size_t i = 1; boolsorted = true; while ( ( i < NumItems ) && Sorted ) Sorted = ( Array[i - 1] <= Array[i] ); i++; } // while return ( Sorted ); } // IsSorted 13

Πρότυπες κλάσεις (8/13) void BubbleSort() size_t i, j; for ( i = 0; i < ( NumItems - 1 ); i++ ) for ( j = ( NumItems - 1 ); j > i; j-- ) if ( Array[j] < Array[j - 1] ) Swap(&(Array[j]), &(Array[j - 1])); } // for } // for } // BubbleSort 14

Πρότυπες κλάσεις (9/13) void InsertionSort() T Key; long int i, j; for ( i = 1; i < (long int)numitems; i++ ) Key = Array[i]; j = ( i - 1 ); while ( ( j >= 0 ) && ( Key < Array[j] ) ) Array[j + 1] = Array[j]; j--; } // while Array[j + 1] = Key; } // for } // InsertionSort 15

Πρότυπες κλάσεις (10/13) void SelectionSort() size_t i, j, Min; for ( j = 0; j < NumItems; j++ ) //Find the minimum element of unsorted sub-array Array[j... Size-1]. Min = j; //Assume the minimum element is the first one. //Find the smallest element after j. for ( i = ( j + 1 ); i < NumItems; i++ ) //If there is a smaller element, this is the new minimum. if ( Array[i] < Array[Min] ) Min = i; // Found new min. } // for //Min is the index of the minimum element. //Swap it with the current position. if ( Min!= j ) Swap(&(Array[j]), &(Array[Min])); } /*for*/ } /*SelectionSort*/ }; 16

Πρότυπες κλάσεις (11/13) void main() ArraySorter<int> MySorter(10); int MyNumbers[10] = 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 }; // Bubble sort. MySorter.SetArray(MyNumbers); MySorter.BubbleSort(); cout << "Bubble sort: " << MySorter.IsSorted() << endl; 17

Πρότυπες κλάσεις (12/13) // Insertion sort. MySorter.SetArray(MyNumbers); MySorter.InsertionSort(); cout << "Insertion sort: " << MySorter.IsSorted() << endl; // Selection sort. MySorter.SetArray(MyNumbers); MySorter.SelectionSort(); cout << "Selection sort: " << MySorter.IsSorted() << endl; } // main Η έξοδος του παραπάνω προγράμματος φαίνεται στο σχήμα που ακολουθεί. Το 1 στην έξοδο σημαίνει true, δηλαδή ο πίνακας των στοιχείων που δόθηκε είναι ταξινομημένος κατά αύξουσα σειρά. 18

Πρότυπες κλάσεις (13/13) Εικόνα 1: Αποτελέσματα της εκτέλεσης του Bubble Sort. Πηγή: Διδάσκων (2015). 19

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (1/17) Στην παρούσα υποενότητα θα δούμε ένα παράδειγμα πρότυπης κλάσης και υπερφόρτωσης τελεστών. Το παράδειγμα αυτό είναι απλό και σύντομο, αλλά είναι σημαντικό, διότι δείχνει την απαιτούμενη σύνταξη όταν υπερφορτώνουμε κάποιον τελεστή. Σε αυτήν την περίπτωση θα χρησιμοποιήσουμε το βολικό παράδειγμα των μιγαδικών αριθμών. 20

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (2/17) Θα συνδυάσουμε την υπερφόρτωση τελεστών που έχουμε δει σε προηγούμενη ενότητα, μαζί με πρότυπες κλάσεις που μας επιτρέπουν να αλλάξουμε τον τύπο δεδομένων του πραγματικού και του φανταστικού μέρους ενός μιγαδικού. Ακολουθεί ο κώδικας του παραπάνω σεναρίου. 21

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (3/17) #include <iostream> using namespace std; template <class T> class Complex private: T Re, Im; public: /* ---------- Constructors and destructor ----------------- */ Complex() : Re(0), Im(0) } // Default constructor 22

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (4/17) Complex(const T real, const T imaginary) : Re(real), Im(imaginary) } // Constructor Complex(const Complex<T> &other) if ( this!= &other ) Re = other.re; Im = other.im; } // if } // Copy constructor 23

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (5/17) ~Complex() Re = Im = 0; } // Destructor /* -------------------------------------------------------------*/ /* Set/Get methods. */ /* -------------------------------------------------------------*/ void SetRe(const T r) Re = r; } void SetIm(const T i) Im = i; } T GetRe() const return ( Re ); } T GetIm() const return ( Im ); } 24

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (6/17) /* --------------------------------------------------------*/ /* Operators. */ /* --------------------------------------------------------*/ void operator=(const Complex<T> &c) if ( this!= &c ) Re = c.re; Im = c.im; } // if } // operator= 25

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (7/17) Complex<T> operator+(const Complex<T> &c) const return ( Complex<T>(Re + c.re, Im + c.im) ); } // operator+ void operator+=(const Complex<T> &c) Re += c.re; Im += c.im; } // operator+= 26

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (8/17) Complex<T> operator-(const Complex<T> &c) const return ( Complex<T>(Re - c.re, Im - c.im) ); } // operatorvoid operator-=(const Complex<T> &c) Re -= c.re; Im -= c.im; } // operator-= 27

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (9/17) Complex<T> operator*(const Complex<T> &c) const return ( Complex<T>(Re * c.re - Im * c.im, Im * c.re + Re * c.im) ); } // operator* void operator*=(const Complex<T> &c) Re = Re * c.re - Im * c.im; Im = Im * c.re + Re * c.im; } // operator*= 28

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (10/17) Complex<T> operator/(const Complex<T> &c) const return ( Complex<T>(( Re * c.re + Im * c.im ) / ( c.re * c.re + c.im * c.im ), ( Im * c.re - Re * c.im ) / ( c.re * c.re + c.im * c.im ))); } // operator/ void operator/=(const Complex<T> &c) Re = ( Re * c.re + Im * c.im ) / ( c.re * c.re + c.im * c.im ); Im = ( Im * c.re - Re * c.im ) / ( c.re * c.re + c.im * c.im ); } // operator/= 29

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (11/17) /* -------------------------------------------------------------*/ /* Helper methods. */ /* -------------------------------------------------------------*/ Complex<T> Conjugate() const return ( Complex<T>(Re, -Im) ); } // Conjugate double Magnitude() const return ( sqrt(re * Re + Im * Im) ); } // Magnitude 30

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (12/17) }; void Write() const cout << "(" << Re << ", " << Im << ")" << endl; } // Write 31

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (13/17) void main() Complex<float> z1; Complex<float> z2(1.0, 2.0); Complex<float> z3(z2); z1.write(); z2.write(); z3.write(); 32

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (14/17) z3 += z2; z3.write(); z1 = z3 / z2; z1.write(); z1 += Complex<float>(1.0, 1.0); cout << "Magnitude = " << z1.magnitude() << endl; cout << "Conjugate = "; z1.conjugate().write(); } // main 33

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (15/17) Το παραπάνω παράδειγμα είναι σχεδόν ολόιδιο με αυτό της ενότητας σχετικά με τις Βιβλιοθήκες. Η μόνες δύο διαφορές είναι οι ακόλουθες:. 1. Όπου υπάρχει αναφορά στην κλάση Complex, αυτή έχει αντικατασταθεί από την Complex<T>, δηλαδή έχει προστεθεί στο τέλος του ονόματος της κλάσης, όπου χρησιμοποιείται εκτός της δήλωσης, το <T>, προσδιορίζοντας τον τύπο που θα χρησιμοποιηθεί. 34

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (16/17) 2. Όπου υπάρχει αναφορά στον τύπο των μελών δεδομένων, αυτός έχει αντικατασταθεί από το Τ. Η μόνη εξαίρεση βρίσκεται στη μέθοδο που επιστρέφει το μήκος ενός μιγαδικού, αφού εκεί παρέμεινε το double, διότι θεωρήσαμε ότι το μήκος που επιστρέφεται πρέπει να έχει την ακρίβεια της συνάρτησης της τετραγωνικής ρίζας (δηλαδή double), ανεξάρτητα από την ακρίβεια του τύπου των μελών δεδομένων. Οι χρήστες της συγκεκριμένης μεθόδου θα αποφασίσουν αν η προσφερόμενη ακρίβεια είναι υπερβολική ή όχι. Η εκτέλεση του παραπάνω προγράμματος φαίνεται στο ακόλουθο σχήμα. 35

Πρότυπες κλάσεις και υπερφόρτωση τελεστών (17/17) Εικόνα 2: Αποτελέσματα της εκτέλεσης του προγράμματος. Πηγή: Διδάσκων (2015). 36

Ασκήσεις

Άσκηση 1 (1/3) Δηλώστε μια πρότυπη συνάρτηση με όνομα Sign η οποία επιστρέφει int και δέχεται μια σταθερή παράμετρο με όνομα Val. Η συνάρτηση αυτή να επιστρέφει +1 εάν η Val είναι θετική, -1 εάν είναι αρνητική και 0 εάν είναι ίση με το μηδέν. Δηλώστε μια πρότυπη κλάση με όνομα Colour η οποία κάτω από προσδιορισμό protected θα έχει τέσσερα (4) μέλη δεδομένων με ονόματα Red, Green, Blue και Alpha. 38

Άσκηση 1 (2/3) Κάτω από προσδιορισμό public δηλώστε μια κατασκευαστή που δέχεται τέσσερις (4) παραμέτρους τις οποίες να αντιγράφει στα μέλη δεδομένων. Τέλος δηλώστε και μια σταθερή μέθοδο που δεν επιστρέφει τίποτα αλλά ούτε και δέχεται παραμέτρους, με όνομα Write. Η Write θα τυπώνει τις τιμές των μελών δεδομένων. 39

Άσκηση 1 (3/3) Στο κυρίως πρόγραμμά σας τυπώστε το αποτελέσματα της Sign με ορίσματα -5, 5 και 0. Επίσης δηλώστε δύο στιγμιότυπα της πρότυπης κλάσης Colour για ακέραιους (int) με τιμές 1, 2, 3 και 4, και πραγματικούς απλής ακρίβειας (float) με τιμές 0.3, 0.4, 0.5 και 0.6. Τέλος τυπώστε τα περιεχόμενα των στιγμιότυπων. 40

Άσκηση 2 Δηλώστε και υλοποιήστε μια πρότυπη συνάρτηση ως Τ Clamp(const T val, const T min, const T max) η οποία επιστρέφει τιμή μέσα στα όρια των min και max ή αλλιώς val. Δηλώστε και υλοποιήστε μια πρότυπη συνάρτηση με όνομα Abs που επιστρέφει την απόλυτη τιμή της παραμέτρου της. Δηλώστε και υλοποιήστε μια πρότυπη συνάρτηση με όνομα Swap η οποία εναλλάσσει τις τιμές των δύο παραμέτρων της. Βεβαιωθείτε ότι οι παραπάνω συναρτήσεις δουλεύουν σωστά. 41

Άσκηση 3 Χρησιμοποιώντας τον κώδικα της κλάσης που έχουμε δει παραπάνω και ταξινομεί δεδομένα, δηλώστε και υλοποιήστε δύο επιπλέον μεθόδους, όπου η πρώτη χρησιμοποιεί τον αλγόριθμο ταχείας ταξινόμησης και η δεύτερη τον αλγόριθμο ταξινόμησης με συγχώνευση. Μπορείτε να χρησιμοποιήσετε τις σημειώσεις του μαθήματος των Δομών Δεδομένων. 42

Βιβλιογραφία (1/10) 1. Alexandrescu A. (2001) Modern C++ design: generic programming and design patterns applied. USA, Addison-Wesley Publishing Company. 323 pp. ISBN-13 978-0-201-70431-0. ( 22.85, 27,42). 2. Bennett S, McRobb S and R Farmer. (2002) Object-oriented systems analysis and design using UML. 2nd Edition. McGraw- Hill Education. ISBN 0-07-709864-1. 3. Booch G, Maksimchuk RA, Engle MW, Young BJ, Conallen J and Houston KA. (2007) Object-oriented analysis and design with applications. 3rd ed. USA, Addison-Wesley. 691 pp. ISBN10 0-201-89551-X. ISBN13 978-0-201-89551-3. ( 43.44, 52.56). 43

Βιβλιογραφία (2/10) 4. Carrano FM and Henry T. (2013) Data abstraction and problem solving with C++: walls and mirrors. 6th ed. UK, Pearson Education Limited. 833 pp. ISBN10 0-273-76841-7, ISBN13 978-0-76841-8. 5. Deitel HM and Deitel PJ. (2010) C++ προγραμματισμός. 6η Έκδοση. Ελλάδα, Εκδόσεις Μ. Γκιούρδα. 1448 σελ. ISBN13 978-960-512-591-2. 6. Fowler M. (1999) Refactoring: improving the design of existing code. USA, Addison Wesley Longman, Inc. 431 pp. ISBN13 978-0-201-48567-7. ( 38.62, 49.05). 44

Βιβλιογραφία (3/10) 7. Fowler M. (2004) UML distilled: a brief guide to the standard object modeling language. 3rd ed. USA, Pearson Education, Inc. 175 pp. ISBN13 978-0-321-19368-1. ( 30.10, 38.23). 8. Kruse RL and Ryba AJ. (1999) Data structures and program design in C++. USA, Prentice Hall. 717 pp. ISBN 0-13- 082640-5. ( 40.74). 9. Lafore R. (2006) Αντικειμενοστρεφής προγραμματισμός με τη C++. Ελλάδα, Εκδόσεις Κλειδάριθμος. 1040 σελ. ISBN10 960-209-904-6. 45

Βιβλιογραφία (4/10) 10. Lafore, R. (2002) Object-oriented programming in C++. 4th ed. USA, Sams Publishing. 1012 pp. ISBN-10 0-672-32308-7. ISBN-13 978-0-672-32308-9. ( 29.60, 33.35). 11. Lakos, J. (1996) Large-Scale Software Design in C++. USA, Addison-Wesley. 852 pp. ISBN-10 0-201-63362-0. ISBN-13 978-0-201-63362-7. ( 26.26, 30.20). 12. MacLennan BJ. (1987) Principles of programming languages: design, evaluation, and implementation. 2nd ed. USA, CBS College Publishing. 568 pp. ISBN 0-03-021999-X. ( 8.00). 46

Βιβλιογραφία (5/10) 13. Martin RC. (2012) Agile software development: principles, patterns, and practices. USA, Pearson Education, Inc. 529 pp. ISBN10 0-13-276068-4. ISBN13 978-0-13-276058-4. ( 54.21, 65.59). 14. McConnell S. (1993) Code complete: a practical handbook of software construction. USA, Microsoft Press. 857 pp. ( 25.99). 15. McConnell S. (1996) Rapid development: taming wild software schedules. USA, Microsoft Press. 647 pp. ISBN 1-55615-900-5. ( 25.99). 47

Βιβλιογραφία (6/10) 16. McConnell S. (2004) Professional software development: shorter schedules, higher quality products, more successful projects, enhanced careers. USA, Addison-Wesley. 243 pp. ISBN 0-321-19367-9. ( 19.79, 29.08). 17. McDermid J, ed. (1991) Software engineer s reference book. Great Britain, Butterworth-Heinemann Ltd. 1140 pp. ISBN 0-7506-0813-7. ( 40.00). 18. Meyers S. (1996) More effective C++: 35 new ways to improve your programs and designs. USA, Addison-Wesley. 318 pp. ISBN 0-201-63371-X. ( 25.29, 36.90). 48

Βιβλιογραφία (7/10) 19. Meyers S. (2005) Effective C++: 55 specific ways to improve your programs and designs. 3rd ed. USA, Pearson Education, Inc. 297 pp. ISBN 0-321-33487-6. ( 18.52, 27.01). 20. Pressman RS. (2005) Software engineering: a practitioner s approach. 6th int. ed. Singapore, McGraw-Hill. 912 pp. ISBN 007-123840-9. ( 45.06, 65.83). 21. Reddy M. (2011) API design for C++. USA, Morgan Kaufmann Publishers. 441 pp. ISBN13 978-0-12-385003-4. ( 28.01, 32.21). 22. Sahni S. (2004) Δομές δεδομένων, αλγόριθμοι, και εφαρμογές στη C++. Ελλάδα/ΗΠΑ, Εκδόσεις Τζιόλα/McGraw-Hill. 852 σελ. ISBN10 960-418-030-4. ( 66.56). 49

Βιβλιογραφία (8/10) 23. Savitch W and Mock K. (2013) Πλήρης C++. 4η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 1024 σελ. ISBN13 978-960-418-358-6. ( 76.14). 24. Savitch W. (2015) Java: and introduction to problem solving and programming. 7th ed. USA, Pearson Education, Inc. 989 pp (+204 pp web chapters). ISBN10 0-13-376626-8. ISBN13 978-0- 376626-4. ( 83.99, 97.85 104.75, $122.68). 25. Schildt H. (2000) Ο οδηγός της C++. 3η Έκδοση, Εκδόσεις Μ. Γκιούρδα. 748 σελ. ISBN10 960-512-229-4. ( 29.00). 26. Schildt H. (2004) Μάθετε τη C++ από το μηδέν. 3η Έκδοση. Ελλάδα, Εκδόσεις Κλειδάριθμος. 660 σελ. ISBN10 960-209-731-0. ( 46.90). 50

Βιβλιογραφία (9/10) 27. Sommerville I. (2004) Software Engineering. 7th ed. USA, Addison-Wesley. 759 pp. ISBN 0-321-21026-3. ( 40.95, 60.17). 28. Stroustrup B. (2000) The C++ programming language. Special Edition. USA, Addison-Wesley Longman, Inc. 1020 pp. ISBN 0-201-70073-5. ( 37.20, 54.26). 29. Sutter H and Alexandrescu A. (2005) C++ coding standards: 101 rules, guidelines, and best practices. USA, Pearson Education, Inc. 220 pp. ISBN10 0-321-11358-6. ISBN13 978-0-321-11358-0. ( 19.71, 22.67). 51

Βιβλιογραφία (10/10) 30. Sutter H. (2000) Exceptional C++: 47 engineering puzzles, programming problems, and solutions. USA, Addison- Wesley Longman, Inc. 215 pp. ISBN10 0-201-61562-2. ISBN13 978-0-201-61562-3. ( 24.32, 27.97). 31. Sutter H. (2002) More exceptional C++: 40 new engineering puzzles, programming problems, and solutions. USA, Pearson Education, Inc. 279 pp. ISBN10 0-201-70434-X. ISBN13 978-0-201-70434-1. ( 28.05, 32.26). 32. Χατζηγιαννάκης ΝΜ. (2014) Η γλώσσα C++ σε βάθος. 2η αναθεωρημένη έκδοση. Ελλάδα, Εκδόσεις Κλειδάριθμος. 974 σελ. ISBN13 978-960-461-620-6. ( 89.00). 52

Τέλος Ενότητας

Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Σίσιας Γεώργιος. «Προγραμματισμός ΙΙ». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: 54

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 55

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 56