Γομέρ Γεδομένων (Data Structures) Χαπμανδάπηρ Δςάγγελορ, Τμήμα Δθαπμοζμένων Μαθημαηικών, Δαπινό Δξάμηνο 2010/11 Διζαγωγή: Σύνηομη Δπιζκόπηζη ηηρ C++ Βαζικά Θέμαηα. Σςναπηήζειρ και παπάμεηποι. Αναδπομικέρ ζςναπηήζειρ. Γςναμική παπασώπηζη μνήμηρ. Classes (Κλάζειρ).
C++ Βαςικά Θζματα Η C++ είναι μια επζκταςη τησ C. Όλεσ οι βαςικζσ εντολζσ τησ C ιςχφουν (είναι παρόμοιεσ) και ςτη C++. Δήλωςη μεταβλητών: int, float, double, Εντολζσ βρόχων: for, while, Εντολζσ ανάθεςησ: if, Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 2
C++ Ειδικά Θζματα Παρακάτω θα παρουςιάςουμε ςυνοπτικά κάποια από τα χαρακτηριςτικά τησ C++ που αφοροφν: Συναρτήςεισ και παραμζτρουσ. Αναδρομικζσ ςυναρτήςεισ. Πρότυπεσ ςυναρτήςεισ. Δυναμική παραχώρηςη μνήμησ. Classes (Κλάςεισ). Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 3
Συναρτήςεισ και παράμετροι ςτη C++ Πρότυπεσ ςυναρτήςεισ: επιτρζπουν τη δημιουργία γενικοφ κώδικα για κάθε τύπο δεδομζνων. #include<iostream.h> template <class T> T test1(t a, T b, T c, T d) { return a*b + c*d + (a+b-c-d)/10; void main(void) { cout << test1(1,2,3,4) << endl; Οι μεταβλητζσ a, b, c, d μπορεί να είναι: int, long, double, Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 4
Παράμετροι τιμήσ: οι τιμζσ των πραγματικών παραμζτρων αντιγράφονται ςτισ τιμζσ των τυπικών παραμζτρων. Με το τερματιςμό καλείται η μζθοδο καταςτροφήσ για τον τφπο Τ. Παράμετροι αναφοράσ (pointers): τα ονόματα των πραγματικών παραμζτρων χρηςιμοποιοφνται ςτη θζςη των τυπικών παραμζτρων. #include<iostream.h> Συναρτήςεισ και παράμετροι ςτη C++ template <class T> T test1(t& a, T& b, T& c, T& d) { return a*b + c*d + (a+b-c-d)/10; void main(void) { cout << test1(x,y,z,w) << endl; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 5
Υπολογιςμόσ αναδρομικών ςυναρτήςεων: Π.χ. υπολογιςμόσ του Ν παραγοντικοφ ι του ακροίςματοσ Ν αρικμών, από διάνυςμα b[0:n-1] #include<iostream.h> template<class T> T Sum(T b[], int n) {// Return sum of numbers b[0:n -1]. T tsum = 0; for (int i = 0; i < n; i++) tsum += b[i]; return tsum; Αναδρομικζσ Συναρτήςεισ ςτη C++ Παράδειγμα: Υπολογιςμόσ ακροίςματοσ χωρίς τθ χριςθ αναδρομικών ςυναρτιςεων. n 1 i 0 S b i void main(void) { float b[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20; cout << Sum(b,8) << endl; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 6
Αναδρομικζσ Συναρτήςεισ ςτη C++ Παράδειγμα: Υπολογιςμόσ ακροίςματοσ με τθ χριςθ αναδρομικών ςυναρτιςεων. #include <iostream.h> n 1 i 0 S b i template<class T> T Rsum(T b[], int n) {// // recursive sum of n numbers, b[0:n - 1]. if (n > 0) return Rsum(b, n-1) + b[n-1]; return 0; void main(void) { int b[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20; cout << Rsum(b,8) << endl; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 7
Δυναμική παραχώρηςη μνήμησ ςτη C++ Στατική χρήςη μνήμησ: θ μνιμθ που χρθςιμοποιεί κάκε μεταβλθτι τίκεται εξαρχισ ςτθ διλωςθ τθσ μεταβλθτισ και είναι σταθερή κατά τθ διάρκεια του προγράμματοσ. Δυναμική χρήςη μνήμησ: αρχικά γίνεται μόνο θ διλωςθ τθσ μεταβλθτισ. Η μνιμθ που καταλαμβάνει ορίηεται κατά τθ διάρκεια τθσ εκτζλεςθσ του προγράμματοσ. Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 8
Δυναμική παραχώρηςη μνήμησ ςτη C++ Οι τελεςτζσ malloc, calloc τησ C ιςχφουν κανονικά και ςτη C++ Τελεςτήσ new: καινοφριοσ τελεςτισ τθσ C++ για παραχώρθςθ μνιμθσ κατά το χρόνο εκτζλεςθσ. Παράδειγμα: διάνυςμα κινητήσ υποδιαςτολήσ μεγζθουσ n float *x = new float [n]; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 9
Παράδειγμα: οριςμόσ 2D πίνακα με χριςθ του τελεςτι new. #include <iostream.h> Δυναμική παραχώρηςη μνήμησ ςτη C++ template <class T> void Make2DArray(T ** &z, int rows, int cols) {// Create a two-dimensional array. // create pointers for the rows z = new T * [rows]; // get memory for each row for (int i = 0; i < rows; i++) z[i] = new T [cols]; void main(void) { int **b; Make2DArray(b,2,2); b[0][0] = 1; b[0][1] = 2; b[1][0] = 2; b[1][1] = 1; cout << b[0][0] << ' ' << b[0][1] << endl; cout << b[0][0] << ' ' << b[1][1] << endl; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 10
Classes (Κλάςεισ) ςτη C++ Δομή class: επιτρζπει τθ χριςθ επιπρόςκετων τφπων δεδομζνων (επζκταςθ τθσ δομισ struct). Αποτελείται από: ςτακερζσ, μεταβλθτζσ ςυναρτιςεισ (ι μεκόδουσ) Οι ςυναρτήςεισ (ή μζθοδοι) μποροφν να υλοποιοφνται είτε μζςα ςτη κλάςη είτε ζξω από αυτή με τον τελεςτή πεδίο ανάλυςησ :: Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 11
Classes (Κλάςεισ) ςτη C++ Ορίηουμε αντικείμενο nobject μιασ κλάςθσ nameclass με τθν εντολι: nameclass nobject Μποροφμε να καλζςουμε τισ μεταβλθτζσ ι ςυναρτιςεισ (μεκόδουσ) μιασ δομισ class χρθςιμοποιώντασ: nobject.nfunction(a,b,c ) nobject: όνομα αντικειμζνου μιασ κλάςθσ nfunction: όνομα ςυνάρτθςθσ μιασ κλάςθσ a, b, c, : μεταβλθτζσ τθσ ςυνάρτθςθσ nfunction Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 12
Classes (Κλάςεισ) ςτη C++ Τα μζλη μιασ δομήσ class μπορεί να είναι: public: Συναρτιςεισ (ι μζκοδοι) που εφαρμόηονται ςε αντικείμενα τφπου τθσ ςυγκεκριμζνθσ κλάςθσ. Είναι ορατζσ ςτουσ χριςτεσ τθσ κλάςθσ. private: Συναρτιςεισ και μζλθ (όπωσ απλζσ μεταβλθτζσ, πίνακεσ κλπ.) που μποροφν να πάρουν τιμζσ. Δεν είναι ορατζσ ςτουσ χριςτεσ τθσ κλάςθσ, δθλαδι ΔΕΝ μποροφμε να τισ καλζςουμε από το κυρίωσ πρόγραμμα. Είναι όμωσ ορατζσ ςτισ υπόλοιπεσ ςυναρτιςεισ τθσ κλάςθσ. Μποροφμε να αλλάξουμε το τμιμα αυτό χωρίσ να αλλάξουν οι εφαρμογζσ. friend: μποροφμε να δώςουμε ςε άλλεσ κλάςεισ ι ςυναρτιςεισ δικαίωμα προςπζλαςθσ προσ τα private μζλθ. Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 13
Classes (Κλάςεισ) ςτη C++ Παράδειγμα: Η κλάςη currency. Ζςτω ότι κζλουμε να ορίςουμε/χρθςιμοποιιςουμε αντικείμενα τφπου νομίςματοσ (currency) τθσ μορφισ a.b, π.χ. 1.40. Επιλζγουμε να αναπαραςτιςουμε αντικείμενα τζτοιου τφπου με 3 μεταβλθτζσ: (1) Το πρόςθμο (plus ι minus), sgn: sign (plus, minus) (2) Τον ακζραιο αρικμό Ευρώ, euro: unsigned long (3) Τον ακζραιο αρικμό των cents, cents: unsinged int Η μεταβλθτι sgn μπορεί να οριςτεί με τθν εντολι enum: enum sign(plus, minus); Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 14
Classes (Κλάςεισ) ςτη C++ - Παράδειγμα: Η κλάςη currency. enum sign {plus, minus; class Currency { public: // constructor Currency(sign s = plus, unsigned long e = 0, unsigned int c = 0); // destructor ~Currency() { bool Set(sign s, unsigned long e, unsigned int c); bool Set(float a); sign Sign() const {return sgn; unsigned long Euro() const {return euro; unsigned int Cents() const {return cents; Currency Add(const Currency& x) const; void Output() const; private: sign sgn; unsigned long euro; unsigned int cents; ; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 15
Classes (Κλάςεισ) ςτη C++ - Παράδειγμα: Η κλάςη currency. Constructor: Συνάρτθςθ καταςκευισ τθσ κλάςθσ. Προςοχι: ζχει όνομα ίδιο με το όνομα τθσ κλάςθσ. Currency::Currency(sign s, unsigned long e, unsigned int c) {// Create a Currency object. if (c > 99) {// too many cents cerr << "Cents should be < 100" << endl; exit(1); sgn = s; euro = e; cents = c; enum sign {plus, minus; Destructor: Συνάρτθςθ καταςτροφισ τθσ κλάςθσ. Καλείται όταν ζνα αντικείμενο τφπου currency βγει εκτόσ πεδίου. {=κενι ςυνάρτθςθ. Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 16
Classes (Κλάςεισ) ςτη C++ - Παράδειγμα: Η κλάςη currency. Συνάρτηςη Set: ανάθεςη τιμών ςτισ μεταβλητζσ τησ κλάςησ. bool Currency:: Set(sign s, unsigned long d,unsigned int c) {// Reset value. if (c > 99) return false; sgn = s; euro = e; cents = c; return true; bool Currency:: Set(float a) {// Reset value. if (a < 0) {sgn = minus; a = -a; else sgn = plus; euro = a; // extract integer part // get two decimal digits cents = (a + 0.001 - euro) * 100; return true; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 17
Currency Currency:: Add(const Currency& x) const {// Add x and *this. long a1, a2, a3; Currency ans; // convert invoking object to signed integers a1 = euro* 100 + cents; if (sgn == minus) a1 = -a1; // convert x to signed integer a2 = x.euro * 100 + x.cents; if (x.sgn == minus) a2 = -a2; a3 = a1 + a2; Classes (Κλάςεισ) ςτη C++ - Παράδειγμα: Η κλάςη currency. // convert to currency representation if (a3 < 0) {ans.sgn = minus; a3 = -a3; else ans.sgn = plus; ans.euro = a3 / 100; ans.cents = a3 - ans.euro * 100; Overloading Operators (Υπερφόρτωςη Τελεςτών) Συνάρτηςη Add: «πρόςθεςη» αντικειμζνων τφπου currency. return ans; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 18
Classes (Κλάςεισ) ςτη C++ - Παράδειγμα: Η κλάςη currency. Παράδειγμα: πρόγραμμα που χρηςιμοποιεί την κλάςη currency #include <iostream> using namespace std; #include "curr1.h //include file with all code relevant to class currency // test currency class void main(void) { Currency g, h(plus, 3, 50), i, j; g.set(minus, 2, 25); i.set(-6.45); j = h.add(g); j.output(); cout << endl; j = i.add(g).add(h); j.output(); cout << endl; Δομές Δεδομένων 2010/11, Επιζκόπηζη ηης C++ 19
Βιβλιογπαθία Thinking in C++, B. Eckel, Prentice Hall, 2000. The compete book of C++! www.cplusplus.com/doc/tutorial Effective C++, S. Meyers, 3 rd Ed. Addison-Wesley, 2005. Δομές Δεδομένων, Αλγόριθμοι και Εθαρμογές ζηη C++, S. Sahni, Εκδόζεις Τζιόλα, 2004. Δομές Δεδομένων 2010/11, Κεθάλαιο 1: Ειζαγωγή 20