180 likes | 315 Views
Διαφάνειες παρουσίασης #8. Εισαγωγή Αφηρημένοι τύποι δεδομένων Παραδείγματα Συμβολοσειρές. Εισαγωγή ( i). Τύποι δεδομένων στη C int double typedef struct { double re, im; } complex; Χρησιμότητα των τύπων δεδομένων Δημιουργία μεταβλητών complex c; Χρήση με τη βοήθεια πράξεων
E N D
Διαφάνειες παρουσίασης #8 Εισαγωγή Αφηρημένοι τύποι δεδομένων Παραδείγματα Συμβολοσειρές
Εισαγωγή (i) • Τύποι δεδομένων στη C int double typedef struct { double re, im; } complex; • Χρησιμότητα των τύπων δεδομένων • Δημιουργία μεταβλητών complex c; • Χρήση με τη βοήθεια πράξεων c = cadd(c1, c2);
Εισαγωγή (ii) • Αφαίρεση δεδομένων (data abstraction) • Διαχωρισμός ιδιοτήτων και υλοποίησης • Ιδιότητες ενός τύπου δεδομένων είναι ο τρόπος με τον οποίο δημιουργεί κανείς μεταβλητές και ο τρόπος με τον οποίο τις χρησιμοποιεί • Σύνταξη και σημασιολογία των ιδιοτήτων • Υλοποίηση ενός τύπου δεδομένων είναι ο συγκεκριμένος τρόπος με τον οποίο προγραμματίζονται οι διάφορες πράξεις που μπορεί κανείς να εφαρμόσει
Εισαγωγή (ii) • Διαφορετικές δυνατές υλοποιήσεις • Μιγαδικοί αριθμοί: καρτεσιανές συντεταγμένες typedef struct { double re, im; } complex; complex cadd (complex c1, complex c2) { complex result; result.re = c1.re + c2.re; result.im = c1.im + c2.im; return result; }
Εισαγωγή (iii) • Μιγαδικοί αριθμοί: πολικές συντεταγμένες typedef struct { double norm, angle; } complex; complex cadd (complex c1, complex c2) { double x = c1.norm * cos(c1.angle) + c2.norm * cos(c2.angle); double y = c1.norm * sin(c1.angle) + c2.norm * sin(c2.angle); complex result; result.norm = sqrt(x*x + y*y); result.angle = atan2(y, x); return result; }
Εισαγωγή (iv) • Οι λεπτομέρειες υλοποίησης επηρεάζουντις επιδόσεις των προγραμμάτων • Είναι συχνή επομένως η αλλαγή τρόπουυλοποίησης κάποιου τύπου δεδομένων • Η αφαίρεση δεδομένων ελαχιστοποιεί τις αλλαγές που απαιτούνται στο πρόγραμμα που χρησιμοποιεί έναν τύπο δεδομένων, όταν αλλάξει ο τρόπος υλοποίησης
Αφηρημένοι τύποι δεδομένων • Αφηρημένος τύπος δεδομένων – ΑΤΔ(abstract data type) • καθορίζει τις ιδιότητες του τύπου δεδομένων • δεν εξαρτάται από την υλοποίησή του • Αλγεβρικός ορισμός ΑΤΔ • σύνταξη: όνομα του τύπου και επικεφαλίδες των πράξεων • σημασιολογία: κανόνες που περιγράφουν τη λειτουργία των πράξεων
Παράδειγμα ΑΤΔ: Λογικές τιμές (i) • Σύνταξη • Όνομα τύπου: boolean • Επικεφαλίδες πράξεων: const boolean true, false; boolean band (boolean x, boolean y); boolean bor (boolean x, boolean y); boolean bnot (boolean x); T if_then_else (boolean x, T a, T b); • Η επικεφαλίδα της if_then_elseπρέπει να ορίζεται για κάθε τύπο Τ. Η υλοποίησή της δεν μπορεί να γίνει με συνάρτηση.
Παράδειγμα ΑΤΔ: Λογικές τιμές (ii) • Σημασιολογία • Αξιωματικός ορισμός band: band(true, y) = y band(false, y) = false • Αξιωματικός ορισμός bor: bor(true, y) = true bor(false, y) = y • Αξιωματικός ορισμός bnot: bnot(true) = false bnot(false) = true • Αξιωματικός ορισμός if_then_else: if_then_else(true, a, b) = a if_then_else(false, a, b) = b
Παράδειγμα ΑΤΔ: Λογικές τιμές (iii) • Μια δυνατή υλοποίηση typedef unsigned char boolean; const boolean true = 1, false = 0; boolean band (boolean x, boolean y){ return x && y; } boolean bor (boolean x, boolean y){ return x || y; } boolean bnot (boolean x){ return !x; } #define if_then_else(x, a, b) \((x) ? (a) : (b))
Παράδειγμα ΑΤΔ: Σύνολα (i) • Σύνταξη • Όνομα τύπου: set (σύνολα ακεραίων) • Επικεφαλίδες πράξεων: const set empty; set add (int x, set s); boolean member (int x, set s); set union (set s1, set s2); boolean subset (set s1, set s2); boolean equal (set s1, set s2);
Παράδειγμα ΑΤΔ: Σύνολα (ii) • Σημασιολογία • Αξιωματικός ορισμός member: member(x, empty) = false member(x, add(x, s)) = true member(x, add(y, s)) = member(x, s)ανx != y • Αξιωματικός ορισμός union: union(empty, s) = s union(add(x, s1), s2) = add(x, union(s1, s2))
Παράδειγμα ΑΤΔ: Σύνολα (iii) • Σημασιολογία • Αξιωματικός ορισμός subset: subset(empty, s) = true subset(add(x, s1), s2) = band(member(x, s2), subset(s1, s2)) • Αξιωματικός ορισμός equal: equal(s1, s2) = band(subset(s1, s2), subset(s2, s1))
ΑΤΔ: Συμβολοσειρές (i) • Σύνταξη • Όνομα τύπου: string • Επικεφαλίδες πράξεων: string stringMake (const char * n); const char * stringGet (string s); void stringCopy (string * s1, string s2); string stringDuplicate (string s); string stringConcat (string s1, string s2); int stringCompare (string s1, string s2);
ΑΤΔ: Συμβολοσειρές (ii) • Σύνταξη (συνέχεια) • Επικεφαλίδες πράξεων: int stringLength (string s); char stringIndex (string s1, int index); string stringPart (string s, int start, int length); string stringUpperCase (string s); void stringPrint (string s);
ΑΤΔ: Συμβολοσειρές (iii) • Σημασιολογία (άτυπη: με λόγια) • stringMake, stringGet : μετατρέπουνconst char *σε stringκαι αντίστροφα • stringDestroy(s): καταστρέφει τη συμβολοσειρά s. • stringDuplicate(s): επιστρέφει ένα αντίγραφο της s. • stringConcat(s1, s2): επιστρέφει μια συμβολοσειρά που περιέχει τη συνένωση των περιεχομένων των s1και s2.
ΑΤΔ: Συμβολοσειρές (iv) • Σημασιολογία (συνέχεια) • stringCompare(s1, s2) : συγκρίνει τα περιεχόμενα των s1και s2λεξικογραφικά. • stringLength(s): επιστρέφει το μήκος της συμβολοσειράς sσε χαρακτήρες. • stringIndex(s, i): επιστρέφει τον i-οστό χαρακτήρα της συμβολοσειράς s. • stringPart(s, i, l): επιστρέφει το τμήμα της συμβολοσειράς s που αρχίζει στονi-οστό χαρακτήρα και έχει μήκος l.
ΑΤΔ: Συμβολοσειρές (v) • Σημασιολογία (συνέχεια) • stringUpperCase(s) : επιστρέφει μια συμβολοσειρά με τα περιεχόμενα της s, όπου όμως τα μικρά γράμματα έχουν αντικατασταθεί με κεφαλαία. • stringPrint(s): εκτυπώνει τα περιεχόμενα της συμβολοσειράς s.