ΚΕΦΑΛΑΙΟ 8: Αφαιρετικές έννοιες δεδομένων 8.1 Βασικές έννοιες δομών δεδομένων 8.2 Σχετικές έννοιες 8.3 Υλοποίηση δομών δεδομένων 8.4 Μια σύντομη μελέτη περίπτωσης 8.4 Προσαρμοσμένοι τύποι δεδομένων 8.6 Κλάσεις και αντικείμενα 8.7 Δείκτες σε γλώσσα μηχανής Οι διαφάνειες βασίζονται σε μεγάλο βαθμό σε αυτές που συνοδεύονται με το προτεινόμενο σύγγραμμα, καθώς και στις διαφάνειες προηγούμενων ετών του 1 κ. Κουρκουμπέτη.
Δομές δεδομένων (data structures) Αδόμητα δεδομένα οδός Ζέας 14, οδός Πατησίων 27 Φρύνη Βάρναλη Δομημένα δεδομένα Ιωάννης Βρανάς 47 οδός Ζέας 27 Φρύνη Βάρναλη 14 οδός Σκουφά 56 Ιωσήφ Κούλης 98 Πατησίων 23 56 47, Ιωάννης Βρανάς Ιωσήφ Κούλης 23 οδός Σκουφά Λογική σχέση Φρύνη Βάρναλη 14 οδός... 98, Ιωάννης Βρανάς 47 οδός... Ιωσήφ Κούλης 98 οδός.. 2
Βασικές δομές δεδομένων Ομοιογενής πίνακας (homogeneous array) Περιλαμβάνει ιδίου τύπου δεδομένα Π.χ. Διδιάστατος πίνακας m x n: m γραμμές (rows) n στήλες (columns) Η θέση κάθε στοιχείου αναγνωρίζεται από ένα ζευγάρι δεικτών (i,j), i=1, m, j=1, n Ετερογενής πίνακας (heterogeneous array) Περιλαμβάνει δεδομένα διαφορετικών τύπων Π.χ. Για υπάλληλο: όνομα, ηλικία, κλπ. Λίστα (list) Στοίβα (stack) Ουρά (queue) Δέντρο (tree) 3
Ορολογία λιστών Η λίστα είναι μία συλλογή δεδομένων της οποίας οι καταχωρήσεις έχουν σειριακή διάταξη. Το ένα άκρο μίας λίστας ονομάζεται αρχή (head) της λίστας, ενώ το άλλο άκρο τέλος (tail). Παραδείγματα: διδιάστατος πίνακας μπορεί να θεωρηθεί ως λίστα γραμμών, κείμενο θεωρείται ως λίστα από χαρακτήρες Λίστες επισκεπτών, κλπ. Λίστα: a1, a2, a3,..., a89, nil τέλος λίστας 4
Ορολογία στοιβών Στοίβα είναι μία λίστα της οποίας οι καταχωρήσεις αφαιρούνται και εισάγονται μόνο από την αρχή. Δομή LIFO (Last In, First Out). H αρχή μίας στοίβας ονομάζεται κορυφή (top) της στοίβας, ενώ το τέλος ονομάζεται βάση (base). Απώθηση (pop) ονομάζεται η αφαίρεση μίας καταχώρησης από την κορυφή. Ώθηση (push) είναι η εισαγωγή μίας νέας καταχώρησης στην κορυφή Χρήσιμη για περιπτώσεις όπου αντικείμενα ανακτούνται με σειρά αντίστροφη από αυτήν με την οποία εισάγονται π.χ. Διαδοχικές κλήσεις μιας διεργασίας σε μια αναδρομή a1 a2 a3 Στοίβα 5
Ορολογία ουρών Η ουρά είναι μία λίστα στην οποία οι καταχωρήσεις αφαιρούνται από την αρχή ενώ οι νέες καταχωρήσεις προστίθενται στο τέλος. Δομή FIFO (First In, First Out). Χρήσιμες ως δομή προσωρινής μνήμης (buffer) όπου αποθηκεύονται δεδομένα μέχρι να μεταφερθούν από μια θέση σε μια άλλη Ουρά: Είσοδος a1 a2 a3 Έξοδος 6
Δέντρα: Παράδειγμα οργανογράμματος 7
Ορολογία δέντρων (1) Ένα δέντρο είναι μία ομάδα δεδομένων της οποίας οι καταχωρίσεις έχουν μία ιεραρχική οργάνωση. Κόμβος (node) είναι η κάθε θέση σε ένα δέντρο. Κόμβος ρίζα (root node) είναι ο κόμβος στην κορυφή. Τερματικός κόμβος (terminal node) ή φύλλο (leaf) είναι ο κόμβος που βρίσκεται στο κάτω μέρος Ως βάθος (depth) ορίζουμε το πλήθος των κόμβων που βρίσκονται στη μεγαλύτερη διαδρομή από τη ρίζα μέχρι ένα φύλλο. 8
Ορολογία δένδρων: κόμβοι Γονικός κόμβος (γονέας) (parent) ονομάζεται ο αμέσως επάνω κόμβος ενός συγκεκριμένου κόμβου. Θυγατρικός κόμβος (παιδί) (child) είναι ο αμέσως από κάτω κόμβος ενός συγκεκριμένου κόμβου. Πρόγονος (ancestor) είναι ο γονέας, ο γονέας του γονέα κτλ. Απόγονος (descendant) είναι το παιδί, το παιδί του παιδιού κτλ. Αμφιθαλείς (ή κόμβοι αδέρφια) (siblings) είναι δύο κόμβοι με τους ίδιους γονείς. Δυαδικό δένδρο (binary tree) είναι ένα δένδρο στο οποίο κάθε κόμβος έχει μέχρι δύο θυγατρικούς κόμβους. Έχουμε επίσης τριαδικά δέντρα (ternary trees), κλπ 9
Ορολογία δέντρων Ένα υποδέντρο με κορυφή κάποιο κόμβο καλείται και κλαδί (branch) από αυτόν τον κόμβο/ 10
Η φύση των δομών δεδομένων H μνήμη είναι οργανωμένη ως μια σειρά από διευθυνσιοδοτημένα κελιά Οι δομές δεδομένων (data structures) (πίνακες, λίστες, στοίβες, ουρές, δέντρα) είναι αφαιρετικά (abstract) εργαλεία προς διευκόλυνση των χρηστών που τα χρησιμοποιούν Καλύτερη οργάνωση δεδομένων Στατική (static) είναι η δομή δεδομένων της οποίας το μέγεθος δεν αλλάζει. Ποιο εύκολη διαχείριση, απλά χρειάζεται ένας τρόπος για την πρόσβαση σε αυτά και για αλλάζουμε την τιμή τους Δυναμική (dynamic) είναι η δομή της οποίας το μέγεθος μπορεί να αλλάξει. Πρέπει να ρυθμίσουμε την εισαγωγή και διαγραφή δεδομένων και την εύρεση μνήμης για την αύξηση του μεγέθους της δομής 11
Δείκτες Τα κελιά μνήμης αναγνωρίζονται από τις διευθύνσεις τους Ως αριθμοί, οι διευθύνσεις μπορεί να αποθηκευτούν σε κελιά μνήμης Δείκτης (Pointer): ένας αποθηκευτικός χώρος σε κάποια θέση μνήμης που περιλαμβάνει μια άλλη θέση μνήμης Π.χ. Ο Program counter (μετρητής προγράμματος) έχει την διεύθυνση της επόμενης εντολής προς εκτέλεση Διασύνδεση ομοειδών δεδομένων (π.χ. μυθιστορήματα από τον ίδιο συγγραφέα) Επιπλέον μνήμη για κάθε δεδομένο (μυθιστόρημα), τη χρησιμοποιώ για να αποθηκεύσω την διεύθυνση του επόμενου μυθιστορήματος στην μνήμη Εύκολη εύρεση όλων των ομοειδών δεδομένων 12
Αποθήκευση πινάκων Αποθήκευση μονοδιάστατου πίνακα σε διαδοχικά κελιά μνήμης Readings[i]: το i-οστό στοιχείο tου μονοδιάστατου πίνακα Readings int Readings[24]; Σημαίνει δήλωση ενός μονοδιάστατου πίνακα 24 στοιχείων {Διεύθυνση του Readings[i]} = {Διεύθυνση του Readings[1]} + (i-1) 13
Αποθήκευση ομοιογενών πινάκων Πίνακας (array): 2 γραμμές, 3 στήλες a11 a12 a13 a21 a22 a23 Απαιτεί ένα επαρκές τμήμα από συνεχόμενα κελιά μνήμης για να αποθηκεύσει όλα τα δεδομένα. Δισδιάστατοι πίνακες Διάταξη κατά γραμμές (row major order) όπου κάθε γραμμή του πίνακα αποθηκεύεται μαζί. Πολυώνυμο διεύθυνσης: A[r,c] = (r-1)(# columns) + c Διάταξη κατά στήλες (column major order) στην οποία ο πίνακας αποθηκεύεται στήλη προς στήλη. Σημ. Στην C, Java όπου η αρίθμηση ξεκινά από το στοιχείο [0][0], έχουμε πολυώνυμο A[r,c] = (r-1)(# columns) + (c-1) 14
Διάταξη πίνακα στην μνήμη κατά γραμμές int Sales[4,5] Χρήση πολυωνύμου διεύθυνσης για εντοπισμό / πρόσβαση / αλλαγή τιμής σε συγκεκριμένο στοιχείο Πολυώνυμο διεύθυνσης: A[r,c] = (r-1)(# columns) + c ή A[r,c] = (r-1)(# columns) + (c-1) 15 (δείτε προηγ. Διαφάνεια)
Αποθήκευση ετερογενούς πίνακα 25 θέσεις μνήμης για 25 χαρακτήρες στο όνομα, 1 θέση μνήμης για την ηλικία και 1 για το Rating 3 θέσεις μνήμης, 1 θέση για 1 pointer που δείχνει σε μια συνιστώσα (όνομα, ηλικία, rating). Χρήσιμη αναπαράσταση, μπορεί δυναμικά να αλλάζει το μήκος του ονόματος. 16
Αποθήκευση λιστών Συνεχόμενη λίστα (contiguous list): είναι η λίστα που αποθηκεύεται σε έναν ομοιογενή πίνακα. Τα στοιχεία της αποθηκεύονται διαδοχικά το ένα μετά το άλλο Συνολικά καταλαμβάνουν ένα μεγάλο μπλοκ μνήμης Χρήσιμη για στατική λίστα, όχι χρήσιμη για δυναμική λίστα (όπου συμβαίνουν προσθήκες, αφαιρέσεις στοιχείων) Συνδεδεμένη λίστα (linked list): είναι η λίστα στην οποία κάθε κόμβος δείχνει στον επόμενο του, με δείκτες (pointers) Δείκτης αρχής είναι ο δείκτης που δείχνει στη αρχή, ή την κεφαλή, της λίστας. Δείκτης ΝΙL είναι ένα ειδικό σχήμα bit που τοποθετείται στο κελί δείκτη της τελευταίας καταχώρισης για να προσδιορίσει ότι δεν υπάρχουν άλλες καταχωρίσεις στη λίστα. 17
Συνεχόμενη λίστα 18
Η δομή μιας συνδεδεμένης λίστας (π.χ.) 8 κελιά μνήμης για το όνομα, 1 κελί για τον Pointer (διεύθυνση του επόμενου στοιχείου στη λίστα) Κινούμαι από στοιχείο σε στοιχείο της λίστας ακολουθώντας τον δείκτη. Τα στοιχεία είναι αποθηκευμένα διάσπαρτα μέσα στη μνήμη 19
Διαγραφή καταχώρισης από συνδεδεμένη λίστα Aλλαγή pointer, ώστε να δείχνει στο επόμενο στοιχείο από αυτό προς διαγραφή. 20
Προσθήκη καταχώρισης σε συνδεδεμένη λίστα Pointer της νέας καταχώρησης δείχνει στο επόμενο στοιχείο. Pointer της προηγούμενης Καταχώρησης από την νέα δείχνει στη νέα καταχώρηση. 21
Μια διαδικασία για την εκτύπωση μιας συνδεδεμένης λίστας διαδικασία PrintList(Λίστα) ΤρέχωνΔείκτης δείκτης κεφαλής της Λίστας όσο (ΤρέχωνΔείκτης διάφορος του NIL) κάνε (Τύπωσε το όνομα της καταχώρισης στην οποία δείχνει ο ΤρέχωνΔείκτης. Βρες την τιμή στο κελί δείκτη της καταχώρισης της Λίστας όπου δείχνει ο ΤρέχωνΔείκτης και ανάθεσε εκ νέου τον ΤρέχονταΔείκτη την τιμή αυτή.) 22
Αποθήκευση στοιβών Δέσμευση ενός μέρους μνήμης για την στοίβα Η απόφαση για το ποσό της μνήμης που θα δεσμευτεί είναι σημαντική Μικρός χώρος: κίνδυνος να εξαντληθεί Μεγάλος χώρος: σπατάληση πόρων αν δεν υπάρχουν τελικά αρκετά δεδομένα προς αποθήκευση Δείκτης στοίβας (stack pointer): διεύθυνση της κορυφής της στοίβας, αποθεκεύεται σε μια διεύθυνση Push: ο pointer μετακινείται στο κενό δεξιά από την τωρινή θέση του και το νέο στοιχείο εισάγεται Pop: o pointer μετακινείται στο στοιχείο αριστερά από την τωρινή θέση του, και το στοιχείο βγαίνει από τη στοίβα 23
Αποθήκευση Ουρών Συνεχές μπλοκ μνήμης, δείκτης αρχής (head pointer), δείκτης τέλους (tail pointer) Μια υλοποίηση ουράς με δείκτες αρχής και τέλους. Παρατηρήστε το πώς «γλιστράει» στη μνήμη η ουρά καθώς προστίθενται και αφαιρούνται καταχωρήσεις 24
Αποθήκευση ουρών (2) Εισαγωγή νέου στοιχείου στη θέση που δείχνει ο δείκτης τέλους (ο οποίος μετά την εισαγωγή μετακινείται στην επόμενη θέση) Εξαγωγή στοιχείου από τη θέση που δείχνει ο δείκτης αρχής (ο οποίος μετά την εξαγωγή μετακινείται στην επόμενη θέση) Η κυκλική ουρά είναι ένας ομογενής πίνακας όπου η πρώτη καταχώριση στον πίνακα συμπεριφέρεται σαν να είναι η αμέσως επόμενη της τελευταίας καταχώρισης. Προστατεύει την ουρά από το να γλιστράει εκτός του τμήματος μνήμης που έχει δεσμευτεί για αυτή. 25
Μια κυκλική ουρά 26
Αποθήκευση Δυαδικών Δέντρων σε συνεχές τμήμα μνήμης Κόμβος Θέσεις (κελιά) μνήμης για: δεδομένα + Δείκτης στον αριστερό θυγατρικό κόμβο + Δείκτης στον δεξιό θυγατρικό κόμβο 27
Αποθήκευση Δέντρου σε συνεχές τμήμα μνήμης Οι κόμβοι (δεδομένα, χωρίς τους δείκτες) αποθηκεύονται σειριακά στην μνήμη, επίπεδο προς επίπεδο, από αριστερά προς τα δεξιά και από πάνω προς τα κάτω Οι θυγατρικοί κόμβοι του κόμβου στην θέση μνήμης n αποθηκεύονται στις θέσεις 2n και 2n+1 Ο γονέας ενός κόμβου στη θέση μνήμης n είναι στην θέση n div 2 O αδερφός κόμβος ενός κόμβου στη θέση n είναι στην θέση n+1 αν n άρτιος ή στη θέση 28 n-1 αν n περιττός
Αναποδοτικότητα στην αποθήκευση δέντρου σε συνεχές τμήμα μνήμης Αραιό (sparse) και μη ισορροπημένο δέντρο: όχι αποδοτικός ο τρόπος αποθήκευσής του σε συνεχές τμήμα μνήμης 29
Αποκομιδή Απορριμάτων Καθώς οι δυναμικές δομές δεδομένων αναπτύσσονται και συρρικνώνονται: ελεύθερος αποθηκευτικός χώρος καταλαμβάνεται από δεδομένα που εισάγονται στη λίστα ή κατειλλημένος αποθηκευτικός χώρος απελευθερώνεται από τα δεδομένα όταν αυτά αφαιρούνται από την λίστα Αποκομιδή απορριμμάτων (garbage collection): η συλλογή αχρησιμοποίητου αποθηκευτικού χώρου για μελλοντική χρήση Ο διαχειριστής μνήμης χρειάζεται να κάνει αποκομιδή απορριμάτων καθώς αναθέτει και επανακτά θέσεις μνήμης Χρειάζεται προσοχή να μην χαθούν κατά λάθος δεδομένα (π.χ. μπορεί κάποιος δείκτης να δείχνει σε μια θέση μνήμης που αποφασίζεται να χρησιμοποιηθεί για άλλα δεδομένα) Υπερχείλιση μνήμης (memory leak): η κατάσταση όταν δεν γίνεται η ανάκτηση της μνήμης που απελευθερώνεται 30
Ορισμός δομής Case study: δημιουργία μιας αφηρημένης δομής Δεδομένα: ονόματα (λίστα ονομάτων) σε αλφαβητική σειρά Μέθοδοι χειρισμού δεδομένων: αναζήτηση, εκτύπωση, εισαγωγή νέας καταχώρησης Υλοποίηση δομής Υλοποίηση στην μνήμη Αλγόριθμοι 31
Αναδρομική στρατηγική (Δυαδική Αναζήτηση) για αναζήτηση της καταχώρισης Κώστας σε μια ταξινομημένη λίστα Είσοδος: Μια λίστα που είναι ταξινομημένη αλφαβητικά 32
Αναζήτηση σε λίστα που είναι αποθηκευμένη ως δυαδικό δέντρο Παρατήρηση: για να αναζητήσω ένα στοιχείο σε μια λίστα διατρέχω διαδοχικά τα μέσα κατάλληλα επιλεγμένων υπολιστών Της πάνω ή της κάτω υπο-λίστας σε σχέση με ένα στοιχείο Αποθηκεύω τα μέσα των υπο-λιστών αυτών ως παιδιά του στοιχείου Π.χ. Στην παραπάνω λίστα Θανάσης Δημήτρης Μανώλης Βασίλης Ζωή Κώστας Ξένια 33
Παράδειγμα αποθήκευσης δυαδικού δέντρου Ο τρόπος που είναι αποθηκευμένο το δέντρο διευκολύνει την αποδοτική αναζήτηση Δυαδική αναζήτηση στην λίστα Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν Το μέσον της λίστας αποθηκεύεται στην ρίζα του δέντρου (Η) Το μέσον της πάνω υπο-λίστας του Η (Δ) αποθηκεύεται ως το αριστερό παιδί του Η Το μέσον της κάτω υπο-λίστας του Η (Λ) αποθηκεύεται ως το δεξιό παιδί του Η κοκ 34
Η δυαδική αναζήτηση με τη μορφή αν η λίστα είχε υλοποιηθεί ως συνδεδεμένο δυαδικό δέντρο διαδικασία Αναζήτηση (Δέντρο, ΤιμήΣτόχος) αν (δείκτης ρίζας Δέντρου = NIL) τότε (δήλωσε την αναζήτηση ως ανεπιτυχή) αλλιώς (εκτέλεσε το τμήμα των παρακάτω εντολών που σχετίζεται με την κατάλληλη περίπτωση) περίπτωση 1: ΤιμήΣτόχος = τιμή κόμβου ρίζας (Ανάφερε ότι η αναζήτηση πέτυχε) περίπτωση 2: ΤιμήΣτόχος < τιμή κόμβου ρίζας (Εφάρμοσε τη διαδικασία Αναζήτησης για να δεις αν η ΤιμήΣτόχος βρίσκεται στο υποδέντρο που προσδιορίζεται από τον αριστερό θυγατρικό κόμβο της ρίζας, και ανάφερε το αποτέλεσμα αυτής της αναζήτησης) περίπτωση 3: ΤιμηΣτόχος > τιμή κόμβου ρίζας (Εφάρμοσε τη διαδικασία Αναζήτησης για να δεις αν η ΤιμήΣτόχος βρίσκεται στο υποδέντρο που προσδιορίζεται από τον δεξιό θυγατρικό κόμβο της ρίζας, και ανάφερε το αποτέλεσμα αυτής της αναζήτησης) ) τέλος αν 35
Σχηματική Αναπαράσταση αναζήτησης σε Λίστες που είναι αποθηκευμένες ως Δέντρα Αναζήτηση σε διαδοχικά μικρότερα υπο-δέντρα 36
Εκτύπωση ενός δέντρου αναζήτησης σε αλφαβητική σειρά Αναδρομική διαδικασία 37
Αναδρομική διαδικασία για την εκτύπωση των δεδομένων ενός δυαδικού δέντρου διαδικασία Εκτύπωση_Δέντρου (Δέντρο) αν (Δέντρο όχι άδειο) τότε (Εφάρμοσε τη διαδικασία Εκτύπωση_Δέντρου στο δέντρο που εμφανίζεται ως αριστερός κλάδος του Δέντρου Τύπωσε το ριζικό κόμβο του Δέντρου. Εφάρμοσε τη διαδικασία Εκτύπωση_Δέντρου στο δέντρο που εμφανίζεται ως δεξιός κλάδος του Δέντρου) 38
Παράδειγμα: Εισαγωγή της καταχώρισης Ν στη λίστα Β,Ε,Η,Θ,Κ,Λ,Ο,Ρ που έχει αποθηκευτεί ως δέντρο Εισαγωγή της καταχώρισης Ν στη λίστα Β,Ε,Η,Θ,Κ,Λ,Ο,Ρ που έχει ήδη αποθηκευτεί ως δέντρο + Ν Η καταχώριση εισάγεται στη θέση που θα κατείχε Αν υπήρχε στην λίστα (οπότε και θα είχε ανακαλυφθεί από τον αλγόρθμο δυαδικής Αναζήτησης) 39
Διαδικασία για την εισαγωγή μιας νέας καταχώρισης σε μία λίστα που είναι αποθηκευμένη ως δυαδικό δέντρο διαδικασία Εισαγωγή (Δέντρο, ΝέαΤιμή) αν (δείκτης ρίζα Δέντρου = NIL) (όρισε το δείκτη ρίζας ώστε να δείχνει σε ένα νέο φύλλο που περιέχει τη ΝέαΤιμή) αλλιώς (εκτέλεσε το τμήμα των εντολών παρακάτω που σχετίζεται με την κατάλληλη περίπτωση) περίπτωση 1: ΝέαΤιμή = τιμή ριζικού κόμβου (Μην κάνεις τίποτα) περίπτωση 2: ΝέαΤιμή < τιμή ριζικού κόμβου (αν (αριστερός θυγατρικός δείκτης του ριζικού κόμβου = NIL) τότε (όρισε το δείκτη αυτόν ώστε να δείχνει σε ένα νέο κόμβο φύλλο που περιέχει τη ΝέαΤιμή) αλλιώς (εφάρμοσε τη διαδικασία Εισαγωγή για την εισαγωγή της ΝέαςΤιμής στο υποδέντρο που προσδιορίζεται από τον αριστερό θυγατρικό δείκτη) περίπτωση 3:ΝέαΤιμή > τιμή ριζικού κόμβου (αν (δεξιός θυγατρικός δείκτης του ριζικού κόμβου = NIL) τότε (όρισε το δείκτη αυτόν ώστε να δείχνει σε ένα νέο κόμβο φύλλο που περιέχει τη ΝέαΤιμή) αλλιώς (εφάρμοσε τη διαδικασία Εισαγωγή για την εισαγωγή της ΝέαςΤιμής στο υποδέντρο που προσδιορίζεται από τον δεξιό θυγατρικό δείκτη) ) ) τέλος αν 40
Προσαρμοσμένοι (customized) τύποι δεδομένων Τύποι δεδομένων οριζόμενοι από το χρήστη (user-defined data types) αποτελούν ένα πρότυπο για μία ετερογενή δομή. Επιτρέπουν στον χρήστη να ορίσει δικούς του τύπους δεδομένους Συχνά εμφανίζονται ως συλλογές βασικών τύπων δεδομένων Δηλώσεις: Τύπος EmployeeType, εκδοχές (instances) Employee1, DistManager, SalesRep1, SalesRep2 41
Αφηρημένοι τύποι δεδομένων Αφηρημένοι τύποι δεδομένων (abstract data types) είναι ορισμένοι από το χρήστη τύποι δεδομένων που περιέχουν ορισμούς λειτουργιών και πράξεων Π.χ. διαδικασίες για προσπέλαση και χειρισμό Δηλ. Επιπλέον των τύπων δεδομένων οριζόμενων από το χρήστη, έχουμε και διαδικασίες που ορίζονται Παράδειγμα: τύπος δεδομένων ορισμένος από το χρήστη Δήλωση: Διαδικασίες του στυλ δεν μπορούν να εκτελεστούν γιατί δεν τις έχουμε ορίσει 42
Αφηρημένοι τύποι δεδομένων (2) Παράδειγμα: Αφηρημένοι τύποι δεδομένων Τώρα μπορεί να κληθεί η διαδικασία: 43
Κλάσεις και Αντικείμενα Κλάση (class): Ένας αφηρημένος τύπος δεδομένων με πρόσθετες λειτουργίες Τα χαρακτηριστικά μπορούν να κληρονομηθούν Τα περιεχόμενα μπορούν να ενθυλακωθούν μέθοδοι κατασκευής για απόδοση αρχικών τιμών σε νέα αντικείμενα Δηλώσεις: 44
Μια υλοποίηση δεικτών σε γλώσσα μηχανής D R X Y : φόρτωσε τον καταχωρητή R με το περιεχόμενο της μνήμης η διεύθυνση της οποίας Βρίσκεται στην διεύθυνση X Y 45
Μια 2 η υλοποίηση δεικτών σε γλώσσα μηχανής Κωδικός εντολής Ε R 0 S : φόρτωσε τον καταχωρητή R με το περιεχόμενο της μνήμης η διεύθυνση της οποίας βρίσκεται στον καταχωρητή S 46