Αφηρημένη έννοια τύπου δεδομένων. Αφηρημένες τάξεις και μέλη της τάξης

Παράρτημα του προγράμματος εργασίας για τον κλάδο «Δομές και αλγόριθμοι για την επεξεργασία δεδομένων σε υπολογιστές»

Αφηρημένος τύπος δεδομένων "Λίστα".

Λίστα– ακολουθία στοιχείων ορισμένου τύπου ένα1 , ένα2 , ..., ένα n, Οπου n https://pandia.ru/text/78/308/images/image001_307.gif" width="13" height="16">1, στη συνέχεια ένα1

Ονομάζεται το πρώτο στοιχείο, και ένα– το τελευταίο στοιχείο της λίστας. Τα στοιχεία μιας λίστας ταξινομούνται γραμμικά σύμφωνα με τη θέση τους στη λίστα. αι στοιχείο προηγήθηκεστοιχείο Όλα συμπεριλαμβάνονται+1 Για Εγώ = 1,2, n-1 Και Όλα συμπεριλαμβάνονται πρέπειπίσω Όλα συμπεριλαμβάνονται-1 Για Εγώ = 2,3, n. Κάθε στοιχείο της λίστας Όλα συμπεριλαμβάνονταιΕχει θέση Εγώ, Εγώ=1,2, n. Υπάρχει μια θέση στη λίστα , που σημαίνει το τέλος της λίστας - μηδέν. Ακολουθεί το τελευταίο στοιχείο της λίστας.

Χειριστές της ATD "List":

1.ΕΙΣΑΓΩΓΗ( Χ, R,μεγάλο). Αυτός ο τελεστής εισάγει ένα αντικείμενο Χστη θέση Rστη λίστα ΜΕΓΑΛΟ,μετακινώντας στοιχεία από τη θέση p και μετά στην επόμενη υψηλότερη θέση. Αν λοιπόν η λίστα μεγάλοαποτελείται από στοιχεία ένα1 , ένα2 , ..., ΕΝΑn a1, a2, ..., ar-1, x, ar, ..., έναn.. Αν το p πάρει την τιμή μηδέν, τότε θα έχουμε ένα1 , ένα2 , ..., έναn , , Χ. Αν στη λίστα μεγάλοκαμία θέση R,τότε το αποτέλεσμα της εκτέλεσης αυτής της εντολής είναι απροσδιόριστο.

2. ΕΓΚΑΤΑΣΤΑΣΗ(Χ , μεγάλο ). Αυτή η συνάρτηση επιστρέφει τη θέση του αντικειμένου Χστη λίστα ΜΕΓΑΛΟ.Εάν το αντικείμενο βρίσκεται στη λίστα Χεμφανίζεται πολλές φορές, επιστρέφεται η θέση του πρώτου αντικειμένου από την αρχή της λίστας Χ.Αν το αντικείμενο Χόχι στη λίστα μεγάλο, μετά επιστρέφει μηδέν.

3. ΑΝΑΚΤΩ(Π , μεγάλο ). Αυτή η συνάρτηση επιστρέφει το στοιχείο που βρίσκεται στη θέση Rστη λίστα ΜΕΓΑΛΟ.Το αποτέλεσμα είναι απροσδιόριστο εάν p = μηδένή στη λίστα μεγάλοκαμία θέση R.

4. ΔΙΑΓΡΑΦΩ(Π , μεγάλο ). Αυτός ο χειριστής αφαιρεί το στοιχείο στη θέση του Rλίστα ΜΕΓΑΛΟ.Έτσι, εάν η λίστα μεγάλοαποτελείται από στοιχεία ένα1 , ένα2 , ..., ΕΝΑn, τότε μετά την εκτέλεση αυτού του τελεστή θα μοιάζει α1, α2, ...,, απ- Εγώ , απ+ Εγώ, ..., ΕΝΑ n. Το αποτέλεσμα είναι απροσδιόριστο εάν βρίσκεται στη λίστα μεγάλοκαμία θέση Rή R = μηδέν.

5. ΕΠΟΜΕΝΟ( Π, μεγάλο ) Και ΠΡΟΗΓΟΥΜΕΝΟ(σελ, μεγάλο ). Αυτές οι συναρτήσεις επιστρέφουν την επόμενη και την προηγούμενη θέση αντίστοιχα από τη θέση Rστη λίστα ΜΕΓΑΛΟ.Αν R -τελευταία θέση στη λίστα ΜΕΓΑΛΟ,μετά ΕΠΟΜΕΝΟ (Π, μεγάλο) = μηδέν. Η λειτουργία NEXT δεν ορίζεται όταν p=μηδέν. Η συνάρτηση ΠΡΟΗΓΟΥΜΕΝΗ δεν έχει οριστεί εάν p = 1.Και οι δύο λειτουργίες είναι απροσδιόριστες εάν βρίσκονται στη λίστα μεγάλοκαμία θέση R.

6. ΜΑΚΕΝΟΥΛ( μεγάλο ) . Αυτή η λειτουργία δημιουργεί μια λίστα μεγάλοαδειάζει και επιστρέφει τη θέση μηδέν.

7. ΠΡΩΤΑ(μεγάλο ). Αυτή η συνάρτηση επιστρέφει την πρώτη θέση στη λίστα L. Εάν η λίστα είναι κενή, τότε η θέση επιστρέφεται μηδέν.

8. ΕΚΤΥΠΩΣΗ(μεγάλο ). Εκτυπώνει στοιχεία λίστας μεγάλομε τη σειρά που εμφανίζονται στη λίστα.

Αναπαράσταση λίστας με χρήση πίνακα:

Προβολή λίστας χρησιμοποιώντας λίστα μεμονωμένα συνδεδεμένα:

Ονομασίες:

· – δείκτης στην αρχή της λίστας,

· τελευταίος - δείκτης στο τελευταίο στοιχείο της λίστας ,

· μέγιστο μήκος μέγιστο μήκος(αριθμός στοιχείων) στη λίστα.

Αναπαράσταση λίστας με χρήση λίστας διπλά συνδεδεμένης:

Γυμνάσια:

1. Γράψτε προγράμματα για εισαγωγή, διαγραφή και αναζήτηση στοιχείων μιας ταξινομημένης λίστας, χρησιμοποιώντας για την υλοποίηση της λίστας

§ πίνακας,

§ δείκτες.

2. Γράψτε ένα πρόγραμμα συγχώνευσης

§ δύο ταξινομημένες συνδεδεμένες λίστες,

§ n ταξινομημένες συνδεδεμένες λίστες,

3. Δίνεται πολυώνυμο της μορφής

p(x) = c1 xμι1 + ντο2 ξε2 + + ΜεnΧn, Οπου e1 > e2 > ... > μιn> 0.

Ένα τέτοιο πολυώνυμο μπορεί να αναπαρασταθεί ως μια συνδεδεμένη λίστα, όπου κάθε στοιχείο έχει τρία πεδία: ένα για τον συντελεστή ΜεΕγώτο δεύτερο είναι για τον εκθέτη μιΕγώτο τρίτο είναι για έναν δείκτη στο επόμενο στοιχείο. Για την περιγραφόμενη αναπαράσταση πολυωνύμων, γράψτε ένα πρόγραμμα για την πρόσθεση και τον πολλαπλασιασμό πολυωνύμων χρησιμοποιώντας αυτήν την παράσταση.

4. Εφαρμόστε μια LIST ADT για οποιονδήποτε τύπο δεδομένων και τους τελεστές INSERT, LOCATE, RETRIEVE, DELETE, NEXT, PREVIOUS, MAKENULL, PRINTLIST:

§ η λίστα καθορίζεται ως πίνακας,

§ η λίστα καθορίζεται ως μια μεμονωμένη συνδεδεμένη λίστα,

§ η λίστα ορίζεται ως διπλά συνδεδεμένη λίστα.

Κεφάλαιο πρόγραμμα εργασίας 2.1.2

Αφηρημένος τύπος δεδομένων "Στοίβα".

Σωρός - είναι ένας ειδικός τύπος λίστας στον οποίο όλες οι εισαγωγές και οι διαγραφές εκτελούνται μόνο στο ένα άκρο, που ονομάζεται μπλουζα , (μπλουζα). Η μέθοδος πρόσβασης που χρησιμοποιείται για τη στοίβα είναι LIFO(last-in-first-out - last in - first out).

Χειριστές του ATD "Stack":

1. ΜΑΚΕΝΟΥΛ(μικρό). Κάνει τη στοίβα του S άδεια.

2. ΜΠΛΟΥΖΑ(μικρό). Επιστρέφει το στοιχείο από την κορυφή της στοίβας S. Συνήθως το επάνω μέρος της στοίβας προσδιορίζεται από τη θέση 1, τότε το TOP(S) μπορεί να γραφτεί με όρους κοινών τελεστών λίστας ως RETRIEVE(FIRST(S), S).

3. ΚΡΟΤΟΣ(μικρό). Αφαιρεί ένα στοιχείο από την κορυφή της στοίβας (το βγάζει από τη στοίβα), όσον αφορά τους τελεστές λίστας, αυτός ο τελεστής μπορεί να γραφτεί ως DELETE(FIRST(S), μικρό).

4. ΣΠΡΩΞΤΕ(Χ, μικρό ). Εισάγει ένα στοιχείο Χστην κορυφή της στοίβας S (σπρώχνει ένα στοιχείο στη στοίβα). Το στοιχείο που βρισκόταν προηγουμένως στην κορυφή της στοίβας γίνεται το στοιχείο δίπλα στην κορυφή κ.λπ. Όσον αφορά τους τελεστές κοινής λίστας αυτόν τον χειριστήμπορεί να γραφτεί ως INSERT(;c, FIRST(S), μικρό).

5. ΑΔΕΙΑΖΩ(μικρό) . Αυτή η συνάρτηση επιστρέφει true εάν η στοίβα μικρόκενό και ψεύτικο διαφορετικά.

πίνακας:

Προβολή στοίβας χρησιμοποιώντας λίστα μεμονωμένα συνδεδεμένα:

Γυμνάσια:

Εφαρμόστε το STACK ADT για οποιονδήποτε τύπο δεδομένων και τους τελεστές MAKENULL, TOP, POP, PUSH, EMPTY.

§ η στοίβα καθορίζεται ως πίνακας,

§ Η στοίβα καθορίζεται ως λίστα μεμονωμένα συνδεδεμένα.

Ενότητα προγράμματος εργασίας 2.1.2

Αφηρημένος τύπος δεδομένων "Ουρά".

Ουρά (ουρά) είναι ένας ειδικός τύπος λίστας όπου τα στοιχεία εισάγονται στο ένα άκρο, καλούνται όπισθεν (πίσω), αλλά αφαιρούνται από το άλλο, εμπρός (εμπρός). Οι ουρές ονομάζονται επίσης "λίστες FIFO" (FIFO σημαίνει first-in-first-out). Οι τελεστές που εκτελούνται στις ουρές είναι παρόμοιοι με τους τελεστές στοίβας. Η σημαντική διαφορά μεταξύ τους είναι ότι η εισαγωγή νέων στοιχείων πραγματοποιείται σε τέλος της λίστας , και όχι στην αρχή, όπως στις στοίβες.

Χειριστές του ATD "Queue":

1. ΜΑΚΕΝΟΥΛ(Q) καθαρίζει την ουρά Q , κάνοντας το άδειο.

2. ΕΜΠΡΟΣ(Q) - μια συνάρτηση που επιστρέφει το πρώτο στοιχείο της ουράς Q.Μπορείτε να εφαρμόσετε αυτήν τη λειτουργία χρησιμοποιώντας τελεστές λίστας όπως RETRIEVE(FIRST(Q), Q ).

3. ENQUEUE(ένα, Ε) εισάγει ένα στοιχείο Χστο τέλος της ουράς Q.

Χρησιμοποιώντας τελεστές λίστας, αυτή η πρόταση μπορεί να εκτελεστεί ως εξής: INSERT(x, END(Q), Q ).

4. DEQUEUE(Q) αφαιρεί το πρώτο στοιχείο της ουράς Q . Μπορούμε επίσης να το εφαρμόσουμε χρησιμοποιώντας τελεστές λίστας όπως DELETE(FIRST(Q), Q).

5. ΑΔΕΙΑΖΩ(Q) επιστρέφει true αν και μόνο αν το Q είναι κενή ουρά.

κυκλικός πίνακας:

Ονομασίες:

Q- Ουρά,

Q. εμπρός– δείκτης στην αρχή της ουράς,

Q. όπισθεν- δείκτης προς το τέλος της ουράς.

Αναπαράσταση μιας ουράς χρησιμοποιώντας λίστα μεμονωμένα συνδεδεμένα:

Γυμνάσια:

Εφαρμόστε το QUEUE ADT για οποιονδήποτε τύπο δεδομένων και τους τελεστές MAKENULL, FRONT, ENQUEUE, DEQUEUE, EMPTY.

§ η ουρά καθορίζεται ως κυκλικός πίνακας,

§ Η ουρά καθορίζεται ως διπλά συνδεδεμένη λίστα.

Αφηρημένος τύπος δεδομένων "Δέντρο".

Δέντρο είναι μια συλλογή στοιχείων που ονομάζεται κόμβους (ένα από τα οποία ορίζεται ως ρίζα ), και σχέσεις («γονέας») που σχηματίζουν μια ιεραρχική δομή κόμβων. Οι κόμβοι, όπως και τα στοιχεία λίστας, μπορούν να είναι στοιχεία οποιουδήποτε τύπου. Τυπικά, ένα δέντρο μπορεί να οριστεί αναδρομικά ως εξής.

1. Ένας κόμβος είναι δέντρο. Αυτός ο ίδιος κόμβος είναι επίσης η ρίζα αυτού του δέντρου.

2. Αφήστε Π -αυτός είναι ένας κόμβος, α Τ1 , Τ2, ...,Tk- δέντρα με ρίζες n1 . n2 , ..., nkαντίστοιχα. Μπορείτε να φτιάξετε ένα νέο δέντρο κάνοντας αυτό Πγονέας κόμβων n1 . n2 , ..., nk. Σε αυτό το δέντρο Πθα είναι η ρίζα, α Τ1 , Τ2, ...,Tk - υποδέντρααυτή η ρίζα. Κόμβοι n1 . n2 , ..., nkλέγονται γιους κόμβος Π.

Αυτός ο ορισμός συχνά περιλαμβάνει την έννοια μηδέν δέντρο , δηλ. ένα "δέντρο" χωρίς κόμβους, ένα τέτοιο δέντρο συμβολίζεται με τη λέξη μηδέν .

Παράδειγμα: ΟΤο κεφάλαιο ενός βιβλίου μπορεί να αναπαρασταθεί σχηματικά με ένα δέντρο. Η σχέση γονέα-γιου εμφανίζεται ως γραμμή. Τα δέντρα σχεδιάζονται συνήθως από πάνω προς τα κάτω με τους γονείς πάνω από τα «παιδιά».

DIV_ADBLOCK135">

Ύψος κόμβου το μήκος ενός δέντρου ονομάζεται μακρύς δρόμοςαπό αυτόν τον κόμβο σε οποιοδήποτε φύλλο. Στο παράδειγμα, το ύψος του κόμβου Κεφάλαιο 1ίσο με 1, κόμβος Κεφάλαιο 2 - 2, και οι κόμβοι Ch. Ζ - 0. Ύψος δέντρου συμπίπτει με το ύψος της ρίζας. Βάθος κόμβου ορίζεται ως το μήκος της διαδρομής (είναι η μόνη) από τη ρίζα σε αυτόν τον κόμβο.

Τα παιδιά ενός κόμβου διατάσσονται συνήθως από αριστερά προς τα δεξιά. Επομένως, τα δύο δέντρα στο σχήμα είναι διαφορετικά, αφού η σειρά των παιδιών ενός κόμβου ΕΝΑδιαφορετικός. Εάν αγνοηθεί η σειρά των γιων, τότε ονομάζεται ένα τέτοιο δέντρο διαταραγμένος , αλλιώς το δέντρο λέγεται διέταξε .

Χειριστές του ATD "Tree":

1. ΜΗΤΡΙΚΗ ΕΤΑΙΡΕΙΑ(n, Τ). Αυτή η συνάρτηση επιστρέφει τον γονέα του κόμβου Πστο δέντρο Τ.Αν Πείναι μια ρίζα που δεν έχει γονέα, τότε σε αυτήν την περίπτωση επιστρέφει μηδέν. Εδώ μηδένυποδηλώνει ότι υπήρξε έξοδος έξω από το δέντρο.

2. ΑΡΙΣΤΕΡΟ__ ΠΑΙΔΙ(n , Τ). Αυτή η λειτουργίαεπιστρέφει το αριστερό παιδί του κόμβου nστο δέντρο Τ.Αν nείναι ένα φύλλο (και επομένως δεν έχει γιο), μετά επιστρέφει μηδέν.

3. ΣΩΣΤΑ_ ΑΜΦΙΘΑΛΗΣ ΑΔΕΛΦΟΣ(n , Τ). Αυτή η συνάρτηση επιστρέφει τον δεξιό αδελφό του κόμβου Πστο δέντρο Τή νόημα μηδέν.αν δεν υπάρχει. Για αυτό είναι ο γονιός Rκόμβος Πκαι όλοι οι γιοι του κόμβου R,τότε μεταξύ αυτών των γιων είναι ο κόμβος που βρίσκεται αμέσως στα δεξιά του. κόμβος Π.

4. ΕΠΙΓΡΑΦΗ(n , Τ ). Επιστρέφει την ετικέτα κόμβου n. δέντρο Τ.Αυτή η συνάρτηση απαιτεί οι κόμβοι δέντρων να έχουν καθορισμένες ετικέτες.

5. ΔΗΜΙΟΥΡΓΩ(v , Τ 1 , Τ 2 , ..., Ti ,) είναι μια οικογένεια συναρτήσεων που για κάθε i = 0, 1, 2,... δημιουργούν μια νέα ρίζα rμε ετικέτα vκαι στη συνέχεια για αυτή τη ρίζα δημιουργεί i sons, που γίνονται οι ρίζες των υποδέντρων Τ1 , Τ2, ....Ti;. Αυτές οι συναρτήσεις επιστρέφουν ένα δέντρο με ρίζες r. Σημειώστε ότι εάν i = 0, τότε επιστρέφεται ένας κόμβος r, που είναι και ρίζα και φύλλο.

6. ΡΙΖΑ(Τ ) επιστρέφει τον κόμβο που είναι η ρίζα του δέντρου Τ, Αν Τ- άδειο δέντρο, μετά επιστρέφει μηδέν.

7. ΜΑΚΕΝΟΥΛ(Τ ). Αυτός ο χειριστής δημιουργεί ένα δέντρο Τένα άδειο δέντρο.

Αναπαράσταση ενός δέντρου χρησιμοποιώντας μια σειρά γονέων:

Αναπαράσταση δέντρου χρησιμοποιώντας συνδεδεμένες λίστες:

Αναπαράσταση δέντρου μέσω αριστερών γιων και δεξιών αδελφών.

Ονομασίες στο σχήμα:

κόμβος συστοιχία κόμβων δέντρων,

    επιγραφή ετικέτα κόμβου, επί κεφαλής ευρετήριο του αριστερού γιου στη λίστα των γιων,

κελιά χώρου μια σειρά από λίστες παιδιών κόμβων,

    κόμβος δείκτη σε έναν κόμβο στον πίνακακόμβος , Επόμενο ευρετήριο του σωστού γιου στη λίστα των γιων.

Γυμνάσια:

1. Δίνεται ένα δέντρο:

DIV_ADBLOCK137">

§ το δέντρο καθορίζεται ως ένας πίνακας εγγραφών κόμβου που περιέχει το ευρετήριο του πιο αριστερού γιου, το ευρετήριο του δεξιού αδελφού και μια ετικέτα,

§ Ένα συνδεδεμένο δυαδικό δέντρο ορίζεται χρησιμοποιώντας δείκτες στο αριστερό και το δεξί γιο.

4. Γράψτε συναρτήσεις για τη διέλευση ενός δυαδικού δέντρου σε εμπρός, πίσω και συμμετρική σειρά.

Ενότητα προγράμματος εργασίας 2.1.3

Αφηρημένος τύπος δεδομένων "Σετ".

Ενα μάτσο συνήθως απεικονίζεται ως μια ακολουθία των στοιχείων του που περικλείονται μέσα σιδερακια ΔΟΝΤΙΩΝ, για παράδειγμα (1, 4) υποδηλώνει ένα σύνολο που αποτελείται από δύο στοιχεία - τους αριθμούς 1 και 4. Η σειρά με την οποία γράφονται τα στοιχεία του συνόλου δεν είναι σημαντική, επομένως μπορείτε να γράψετε (4, 1) με τον ίδιο τρόπο όπως (1, 4) , κατά την εγγραφή του ίδιου σετ. Ένα σύνολο δεν είναι λίστα (τουλάχιστον με βάση την αυθαίρετη σειρά με την οποία είναι γραμμένα τα στοιχεία). Το σύνολο δεν έχει επαναλαμβανόμενα στοιχεία ((1, 4, 1) δεν είναι σύνολο).

Η θεμελιώδης έννοια της θεωρίας συνόλων είναι η έννοια της σχέσης που ανήκουν στο σύνολο , που υποδηλώνεται με το σύμβολο. Η είσοδος λοιπόν Χ Χδεν ανήκει στο σύνολο ΕΝΑ", δηλ. Χδεν είναι στοιχείο του συνόλου ΕΝΑ. Υπάρχει ένα ειδικό σύνολο, που υποδηλώνεται με το σύμβολο, που ονομάζεται άδεια, πολλά , και που δεν έχει στοιχεία. Ορισμός DIV_ADBLOCK138">

Λένε ότι είναι πολλοί ΕΝΑ περιέχονται σε αφθονία ΣΕανάβει μέσα στο πλήθος ΣΕ),είναι γραμμένο ΕΝΑ ΣΕή ΣΕ ΕΝΑ, εάν υπάρχει κάποιο στοιχείο του συνόλου ΕΝΑείναι επίσης στοιχείο του συνόλου ΣΕ.Οταν ΕΝΑ ΣΕλένε επίσης ότι είναι πολλοί ΕΝΑείναι ένα υποσύνολο του συνόλου ΣΕ.

Για παράδειγμα, (1, 2) https://pandia.ru/text/78/308/images/image019_36.gif" width="15" height="15 src="> ΣΕκαι Α Β, τότε καλείται το σύνολο Α δικός, αληθινός ή αυστηρό υποσύνολο σκηνικά ΣΕ.

Οι κύριες πράξεις που εκτελούνται σε σύνολα είναι οι πράξεις ένωσης, τομής και διαφοράς. Σχέση σκηνικά ΕΝΑΚαι ΣΕ(σημειώνεται ΕΝΑ ΣΕ)είναι ένα σύνολο που αποτελείται από στοιχεία που ανήκουν σε τουλάχιστον ένα από τα σύνολα ΕΝΑΚαι ΣΕ.

Με τη διέλευση σκηνικά ΕΝΑΚαι ΣΕ(σημειώνεται ΕΝΑ ΣΕ)είναι ένα σύνολο που αποτελείται μόνο από εκείνα τα στοιχεία που ανήκουν στο σύνολο ΕΝΑ, και πολλά ΣΕ. Με διαφορά σκηνικά ΕΝΑΚαι ΣΕ(σημειώνεται ΕΝΑ\ σι) είναι ένα σύνολο που αποτελείται μόνο από εκείνα τα στοιχεία του συνόλου ΕΝΑ, που δεν ανήκουν στο σύνολο ΣΕ.

Για παράδειγμα, αν A = (a, b, c) και B = (b, a), τότε A B = (a, b, c, d), A B = ( b ) και A \ B = (a, c ) .

Χειριστές του ATD "Multiple":

1. ΕΝΩΣΗ(ΕΝΑ, ΠΡΟ ΧΡΙΣΤΟΥ) ΕΝΑΚαι ΣΕ ΜΕ,ίσος ΕΝΑ ΣΕ.

2. ΣΗΜΕΙΟ ΤΟΜΗΣ(ΕΝΑ, ΠΡΟ ΧΡΙΣΤΟΥ) έχει ως ορίσματα «εισαγωγής» ένα σύνολο ΕΝΑΚαι ΣΕ, και ως αποτέλεσμα - το σύνολο "εξόδου". ΜΕ,ίσος ΕΝΑ ΣΕ..

3. ΔΙΑΦΟΡΑ(ΕΝΑ, ΠΡΟ ΧΡΙΣΤΟΥ) έχει ως ορίσματα «εισαγωγής» ένα σύνολο ΕΝΑΚαι ΣΕ, και ως αποτέλεσμα - το σύνολο "εξόδου". ΜΕ,ίσος A\B.

4. ΣΥΓΧΩΝΕΥΣΗ( ΕΝΑ , ΠΡΟ ΧΡΙΣΤΟΥ) ο χειριστής εκτελεί συγχώνευση (συγχώνευση), ή ένωση ασύνδετων συνόλων . Αυτός ο χειριστής δεν διαφέρει από τον χειριστή. ΕΝΩΣΗ, αλλά εδώ υποτίθεται ότι ο τελεστής θέτει μην τέμνονται (δηλαδή δεν έχουν κοινά στοιχεία). Ο χειριστής εκχωρεί σε ένα σύνολο ΜΕέννοια ΕΝΑ ΣΕ, αλλά το αποτέλεσμα δεν θα καθοριστεί εάν ο Α Σε , δηλαδή στην περίπτωση που τα σύνολα ΕΝΑΚαι ΣΕέχουν κοινά στοιχεία.

5. μέλος(x, Α ) έχει πολλά επιχειρήματα ΕΝΑκαι αντικείμενο Χίδιου τύπου με τα στοιχεία του συνόλου ΕΝΑ, και επιστρέφει μια δυαδική τιμή αληθής(αληθές), αν Χα", "β", "γ"))= "ΕΝΑ".Ο χειριστής ορίζεται με παρόμοιο τρόπο ΜΕΓΙΣΤΗ.

11.ΙΣΟΣ(ΕΝΑ , ΣΕ ) επιστρέφει αξία αληθήςεάν και μόνο εάν τα σύνολα ΕΝΑΚαι ΣΕαποτελούνται από τα ίδια στοιχεία.

12. ΕΥΡΗΜΑ(Χ ) λειτουργεί σε ένα περιβάλλον όπου υπάρχει ένα σύνολο ασύνδετων συνόλων. Επιστρέφει το (μονό) όνομα του συνόλου που περιέχει το στοιχείο Χ.

Ορισμός αναπαράστασης:

Ένα σύνολο μπορεί να καθοριστεί χρησιμοποιώντας έναν πίνακα ή μια συνδεδεμένη λίστα.

Γυμνάσια:

1. Δίνονται δύο σύνολα A = (1, 2, 3) και B = (3, 4, 5). Ποιο θα είναι το αποτέλεσμα της εκτέλεσης των παρακάτω δηλώσεων;

ΕΝΩΣΗ (A.V.C),

ΤΟΜΟΣ (A, B, C),

ΔΙΑΦΟΡΑ (A. V. C),

MEMBER(l. A),

INSERT(1,A),

DELETE(1, A),

2. Εφαρμόστε το «Σετ» ADT για οποιονδήποτε τύπο δεδομένων και τους τελεστές του MAKENULL, UNION, INTERSECTION, MEMBER, MIN.

· το σύνολο ορίζεται χρησιμοποιώντας έναν πίνακα σταθερού μήκους και έναν δείκτη στην τελευταία κατειλημμένη θέση στον πίνακα,

· το σύνολο ορίζεται χρησιμοποιώντας μια μη ταξινομημένη συνδεδεμένη λίστα,

· το σύνολο ορίζεται χρησιμοποιώντας μια ταξινομημένη συνδεδεμένη λίστα,

Ενότητα προγράμματος εργασίας 2.1.3

Ειδικοί τύποι σετ

Αφηρημένος τύπος δεδομένων "Δυαδικό δέντρο αναζήτησης"

Δυαδικό δέντρο αναζήτησης - μια δομή δεδομένων για την αναπαράσταση συνόλων των οποίων τα στοιχεία ταξινομούνται με κάποια σχέση γραμμικής τάξης. Οι τελεστές συνόλου μπορούν να υλοποιηθούν σε δυαδικά δέντρα αναζήτησης ΕΙΣΑΓΕΤΕ, ΔΙΑΓΡΑΦΩ, ΜΕΛΟΣΚαι MIN, και ο χρόνος εκτέλεσής τους κατά μέσο όρο είναι της τάξης του O (log n) για σύνολα που αποτελούνται από Πστοιχεία.

Ένα χαρακτηριστικό γνώρισμα ενός δυαδικού δέντρου αναζήτησης είναι ότι οι κόμβοι του επισημαίνονται με στοιχεία συνόλου (οι κόμβοι δέντρων περιέχουν στοιχεία συνόλου). Επιπλέον, όλα τα στοιχεία είναι αποθηκευμένα στους κόμβους του αριστερού υποδέντρου οποιουδήποτε κόμβου Χ, λιγότερο από το στοιχείο που περιέχεται στον κόμβο Χ,και όλα τα στοιχεία που είναι αποθηκευμένα στους κόμβους του δεξιού υποδέντρου του κόμβου Χ, μεγαλύτερο από το στοιχείο που περιέχεται στον κόμβο Χ.

Παραδείγματα δυαδικού δέντρου:

https://pandia.ru/text/78/308/images/image023_7.jpg" width="277" height="122 src=">

Η αναπαράσταση δέντρου AVL δεν διαφέρει από τη δυαδική αναπαράσταση δέντρου αναζήτησης.

Μια άλλη παραλλαγή του δέντρου ισορροπημένης αναζήτησης είναι 2-3 δέντρο. Η δομή ενός δέντρου 2-3 ​​είναι διαφορετική από τη δομή ενός δέντρου δυαδικής αναζήτησης. Ένα δέντρο 2-3 χαρακτηρίζεται από το γεγονός ότι όλοι οι κόμβοι έχουν 2 ή 3 παιδιά, όλα τα μονοπάτια από τη ρίζα μέχρι το φύλλο έχουν το ίδιο μήκος , και όλα τα στοιχεία του σετ περιέχονται στα φύλλα. Οι κόμβοι 2-3 του δέντρου χωρίζονται σε εσωτερικούς και τερματικούς (φύλλα). Οι εσωτερικοί κόμβοι χρησιμοποιούνται μόνο για τη δρομολόγηση αναζητήσεων στο δέντρο. Κάθε εσωτερικός κόμβος περιέχει τα κλειδιά των μικρότερων στοιχείων του δεύτερου και του τρίτου γιου (αν υπάρχει τρίτος γιος) και δείκτες στους κόμβους των γιων.

Συνδεδεμένη δυαδική αναπαράσταση δέντρου αναζήτησης:

Αναπαράσταση ενός ισορροπημένου συνδεδεμένου δέντρου 2-3:

Γυμνάσια:

1. Σχεδιάστε όλα τα πιθανά δυαδικά δέντρα αναζήτησης για τα τέσσερα στοιχεία 1, 2, 3 και 4.

2. Εισαγάγετε τους ακέραιους αριθμούς 7, 2, 9, 0, 5, 6, 8, 1 στο κενό δέντρο δυαδικής αναζήτησης.

3. Δείξτε το αποτέλεσμα της αφαίρεσης του αριθμού 7 και μετά του αριθμού 2 από το δέντρο που λήφθηκε στην προηγούμενη άσκηση.

4. Σχεδιάστε ένα δέντρο 2-3 που προκύπτει από την εισαγωγή των στοιχείων 5, 2, 7, 0, 3, 4, 6, 1, 8, 9 στο κενό σύνολο (που αναπαρίσταται ως δέντρο 2-3).

5. Δείξτε το αποτέλεσμα της αφαίρεσης του στοιχείου 3 από το δέντρο 2-3 που λήφθηκε στην προηγούμενη άσκηση.

3. Εφαρμόστε το ADT «Search Tree» για οποιονδήποτε τύπο δεδομένων και τους τελεστές INSERT, DELETE, MEMBER και MIN.

· το δέντρο καθορίζεται ως συνδεδεμένο δυαδικό δέντρο

· το δέντρο καθορίζεται ως 2-3 δέντρα

Ενότητα προγράμματος εργασίας 2.1.3

Αφηρημένος τύπος δεδομένων "Λεξικό".

Λεξικό – ένα σετ σχεδιασμένο να αποθηκεύει «τρέχοντα» αντικείμενα με περιοδική εισαγωγή ή αφαίρεση ορισμένων από αυτά. Από καιρό σε καιρό υπάρχει επίσης η ανάγκη να διαπιστωθεί εάν ένα συγκεκριμένο στοιχείο υπάρχει σε ένα δεδομένο σύνολο. Το λεξικό υλοποιείται χρησιμοποιώντας το Λεξικό ADT με τελεστές ΕΙΣΑΓΕΤΕΔΙΑΓΡΑΦΩΚαι ΜΕΛΟΣ. Το σύνολο τελεστών λεξικού περιλαμβάνει επίσης τον τελεστή ΜΑΚΕΝΟΥΛγια την προετοιμασία δομών δεδομένων ADT.

Ένα λεξικό μπορεί να αναπαρασταθεί χρησιμοποιώντας έναν πίνακα κατακερματισμού. Ο πίνακας είναι χτισμένος με βάση την ακόλουθη ιδέα: ένα δυνητικό σύνολο στοιχείων (πιθανώς άπειρο) χωρίζεται σε έναν πεπερασμένο αριθμό κλάσεων. Για ΣΕτάξεις αριθμημένες από 0 έως ΣΕ 1, υπό κατασκευή συνάρτηση κατακερματισμού ητέτοια ώστε για οποιοδήποτε στοιχείο Χλειτουργία του αρχικού σετ h(Χ)παίρνει μια ακέραια τιμή από το διάστημα 0, ..., ΣΕ - 1, που αντιστοιχεί στην κλάση στην οποία ανήκει το στοιχείο Χ.Στοιχείο Χσυχνά καλούν κλειδί, h( Χ) - χασίσι-x τιμή, και "τάξεις" - τμήματα . Πώς να επιλύσετε συγκρούσεις κατακερματισμού (δύο στοιχεία ενός συνόλου έχουν την ίδια τιμή h(Χ)) χρησιμοποιείται ανοιχτός και κλειστός κατακερματισμός.

ανοιχτός πίνακας κατακερματισμού

Ένας πίνακας που ονομάζεται πίνακας τμημάτων και ευρετηριασμένα αριθμοί τμημάτων 0, 1,..., Β - 1 , περιέχει κεφαλίδες για ΣΕσυνδεδεμένες λίστες. Στοιχείο Εγώη λίστα είναι ένα στοιχείο του αρχικού συνόλου για το οποίο η(.χ:) =Εγώ.

Αναπαράσταση λεξικού χρησιμοποιώντας ιδιωτικός πίνακας κατακερματισμού

Ο πίνακας τμημάτων αποθηκεύει απευθείας τα στοιχεία του λεξικού. Επομένως, κάθε τμήμα μπορεί να αποθηκεύσει μόνο ένα στοιχείο λεξικού. Με κλειστό κατακερματισμό, χρησιμοποιείται η τεχνική εκ νέου κατακερματισμός . Όταν προσπαθείτε να τοποθετήσετε ένα στοιχείο Χ στο τμήμα με αριθμό η ( Χ ) , το οποίο καταλαμβάνεται ήδη από ένα άλλο στοιχείο, επιλέγεται μια ακολουθία αριθμών τμημάτων η 1 ( Χ ) ,η 2 ( Χ ) , , όπου μπορείτε να τοποθετήσετε το στοιχείο. Η κατάληψη καθενός από αυτά τα τμήματα ελέγχεται διαδοχικά μέχρι να βρεθεί ένα ελεύθερο τμήμα. Περιέχει ένα στοιχείο Χ . Για να ορίσετε αριθμούς τμημάτων κατά τον εκ νέου κατακερματισμό, χρησιμοποιήστε το διάφορες μεθόδουςεπίλυση των συγκρούσεων. Για παράδειγμα, μέθοδος γραμμικού κατακερματισμού, μέθοδος μεσαίου τετραγώνου, μέθοδος τυχαίας κατακερματισμού

Γυμνάσια:

1. Ας υποθέσουμε ότι η συνάρτηση κατακερματισμού h(i) = i % 7 χρησιμοποιείται για την κατακερματοποίηση ακεραίων σε έναν πίνακα κατακερματισμού 7 τμημάτων.

· Δώστε τον πίνακα κατακερματισμού που προκύπτει εάν έχουν εισαχθεί σε αυτόν ακριβείς κύβοι 1, 8, 27,64,125, 216,343.

· Επαναλάβετε το προηγούμενο σημείο για έναν κλειστό πίνακα κατακερματισμού με τεχνική ανάλυσης γραμμικής σύγκρουσης.

2. Ας υποθέσουμε ότι υπάρχει ένας ιδιωτικός πίνακας κατακερματισμού με 5 τμήματα, μια συνάρτηση κατακερματισμού h(i) = i % 5 και μια τεχνική ανάλυσης γραμμικής σύγκρουσης. Δείξτε το αποτέλεσμα της εισαγωγής της ακολουθίας των αριθμών 23, 48, 35, 4, 10 σε έναν αρχικά άδειο πίνακα κατακερματισμού.

3. Εφαρμόστε ένα λεξικό ADT για συμβολοσειρές κειμένου και τις δηλώσεις INSERT του , ΔΙΑΓΡΑΦΗ, ΜΕΛΗ και MAKENULL

· το λεξικό καθορίζεται χρησιμοποιώντας έναν ανοιχτό πίνακα κατακερματισμού,

· το λεξικό καθορίζεται χρησιμοποιώντας έναν κλειστό πίνακα κατακερματισμού με τεχνική ανάλυσης γραμμικής σύγκρουσης,

Ενότητα προγράμματος εργασίας 2.1.3

Αφηρημένος τύπος δεδομένων "Εμφάνιση".

Απεικόνιση - αυτό είναι ένα σύνολο στα στοιχεία του οποίου ορίζεται μια συνάρτηση για την εμφάνιση στοιχείων του ίδιου τύπου ( τομέα ορισμού ) σε στοιχεία άλλου τύπου ( εύρος τιμών ) άλλου τύπου. Απεικόνιση Μταιριάζει με ένα στοιχείο ρεπληκτρολογήστε domaintype από το πεδίο του στοιχείου rτύπου rangetype από το εύρος τιμών: Μ(ρε) = r.Κενή οθόνη δεν περιέχει κανένα στοιχείο

Χειριστές του ADT "Display":

1. ΜΑΚΕΝΟΥΛ(Μ ). Κάνει οθόνη Μαδειάζω.

2. ΑΝΑΘΕΤΩ(Μ δ, ιη). Κάνει Μ(ρε) ίσος rανεξάρτητα από το πώς Μ(ρε) ορίστηκε προηγουμένως.

3. ΥΠΟΛΟΓΙΖΩ( M, d, r). Επιστρέφει true και εκχωρεί τη μεταβλητή r την τιμή Μ(ρε), εάν το τελευταίο ορίζεται και επιστρέφει ψευδές διαφορετικά.

Προβολή προβολής:η αντιστοίχιση μπορεί να εφαρμοστεί αποτελεσματικά χρησιμοποιώντας πίνακες κατακερματισμού. Εδώ Χ καθορίζει μια τιμή από την περιοχή ορισμού της οθόνης και το στοιχείο πίνακα με τον αριθμό η ( Χ ) – στοιχείο από το εύρος τιμών.

Ενότητα προγράμματος εργασίας 2.1.3

Αφηρημένος τύπος δεδομένων "Ουρά προτεραιότητας"

Ουρά προτεραιότητας - αυτό είναι ένα σύνολο για τα στοιχεία του οποίου καθορίζεται μια συνάρτηση προτεραιότητας, δηλαδή για κάθε στοιχείο Χορίσετε, μπορείτε να υπολογίσετε τη συνάρτηση R( Χ )- προτεραιότητα στοιχείου Χ , που συνήθως παίρνει τιμές από το σύνολο των πραγματικών αριθμών ή, γενικότερα, από κάποιο γραμμικά διατεταγμένο σύνολο.

ADT "Ουρά προτεραιότητας"με βάση το «Σετ» ADT με τελεστές ΕΙΣΑΓΕΤΕΚαι ΔΙΑΓΡΑΦΗ, καθώς και με τον χειριστή ΜΑΚΕΝΟΥΛγια την προετοιμασία της δομής δεδομένων. Χειριστής ΕΙΣΑΓΕΤΕγια μια ουρά προτεραιότητας εννοείται με τη συνήθη έννοια, ενώ ΔΙΑΓΡΑΦΗείναι μια συνάρτηση που επιστρέφει το στοιχείο με τη χαμηλότερη προτεραιότητα και, ως παρενέργεια, το αφαιρεί από το σύνολο.

Αναπαράσταση μιας ουράς χρησιμοποιώντας παραγγελθείσα διπλά συνδεδεμένη λίστα.


Αναπαράσταση μιας ουράς χρησιμοποιώντας μερικώς διατεταγμένο συνδεδεμένο δέντρο:

Η κύρια ιδέα αυτής της υλοποίησης είναι να οργανώσει τα στοιχεία της ουράς με τη μορφή ενός δυαδικού δέντρου. Σε ένα χαμηλότερο επίπεδο, όπου μπορεί να λείπουν μερικά φύλλα, όλα τα φύλλα που λείπουν μπορεί να βρίσκονται ακριβώς δεξιά από τα φύλλα του χαμηλότερου επιπέδου που υπάρχουν. Το πιο σημαντικό, το δέντρο μερικώς παραγγελθέν . Αυτό σημαίνει ότι η προτεραιότητα του κόμβου vόχι μεγαλύτερη από την προτεραιότητα οποιουδήποτε θυγατρικού του κόμβου v, όπου η προτεραιότητα κόμβου είναι η τιμή προτεραιότητας του στοιχείου που είναι αποθηκευμένο σε αυτόν τον κόμβο. Το σχήμα δείχνει ότι οι μικρές τιμές προτεραιότητας δεν μπορούν να εμφανιστούν για περισσότερες υψηλό επίπεδο, όπου υπάρχουν μεγάλες τιμές προτεραιότητας.

Η συνάρτηση DELETEMIN επιστρέφει το στοιχείο με την ελάχιστη προτεραιότητα, η οποία πρέπει να είναι η ρίζα του δέντρου. Για να αποφευχθεί η καταστροφή του δέντρου και να διατηρηθεί η μερική σειρά των τιμών προτεραιότητας στο δέντρο μετά την αφαίρεση της ρίζας, εκτελούνται οι ακόλουθες ενέργειες: ο δεξιότερος κόμβος βρίσκεται στο χαμηλότερο επίπεδο και τοποθετείται προσωρινά στη ρίζα του δέντρου. Στη συνέχεια, αυτό το στοιχείο κατεβαίνει στα κλαδιά του δέντρου (περισσότερα χαμηλά επίπεδα), στην πορεία αλλάζοντας θέσεις με τους γιους να έχουν χαμηλότερη προτεραιότητα, έως ότου αυτό το στοιχείο γίνει φύλλο ή φτάσει σε μια θέση όπου οι γιοι του έχουν το καθένα τουλάχιστονόχι λιγότερη προτεραιότητα.

Αναπαράσταση μιας ουράς χρησιμοποιώντας έναν πίνακα που περιέχει τους κόμβους ενός μερικώς διατεταγμένου δέντρου:

Στη συστοιχία ΕΝΑπρώτα nαντιστοιχούν θέσεις nκόμβοι δέντρων. Στοιχείο ΕΝΑ περιέχει τη ρίζα του δέντρου. Αριστερός γιος ενός κόμβου δέντρου ΕΝΑ[ Εγώ], αν υπάρχει, είναι στο κελί ΕΝΑ, και ο σωστός γιος, αν υπάρχει, είναι στο κελί ΕΝΑ. Και το αντίστροφο, αν ο γιος είναι στο κελί ΕΝΑ[ Εγώ], τότε ο γονέας του είναι στο κελί ΕΝΑ[ Εγώ%2] . Οι κόμβοι δέντρων γεμίζουν τα κελιά ΕΝΑ, ΕΝΑ, … ΕΝΑ[ n] διαδοχικά επίπεδο ανά επίπεδο, ξεκινώντας από τη ρίζα και εντός του επιπέδου - από αριστερά προς τα δεξιά. Το δέντρο που φαίνεται παραπάνω θα αντιπροσωπεύεται στον πίνακα με την ακόλουθη ακολουθία των κόμβων του: 3, 5, 9, 6, 8, 9, 10, 10, 18, 9.

Γυμνάσια:

1. Σχεδιάστε ένα μερικώς διατεταγμένο δέντρο που προκύπτει από την εισαγωγή των ακεραίων αριθμών 5, 6, 4, 9, 3, 1 και 7 σε ένα κενό δέντρο. Ποιο θα είναι το αποτέλεσμα συνεπής εφαρμογήσε αυτό το δέντρο των τριών δηλώσεων DELETEMIN;

2. Εφαρμόστε το Priority Queue ADT για οποιονδήποτε τύπο δεδομένων και τους τελεστές INSERT, DELETEMIN και MAKENULL του

§ ένα μερικώς διατεταγμένο δέντρο υλοποιείται χρησιμοποιώντας δείκτες,

§ Ένα μερικώς διατεταγμένο δέντρο υλοποιείται χρησιμοποιώντας έναν πίνακα.

Ενότητα προγράμματος εργασίας 2.1.3

Αφηρημένος τύπος δεδομένων "Ένωση συνόλων".

Ένα ADT είναι μια ένωση αντικειμένων, καθένα από τα οποία είναι ένα σύνολο. Οι κύριες ενέργειες που εκτελούνται σε ένα τέτοιο σύνολο είναι ο συνδυασμός συνόλων με μια συγκεκριμένη σειρά, καθώς και ο έλεγχος εάν ένα συγκεκριμένο αντικείμενο ανήκει σε ένα συγκεκριμένο σύνολο. Αυτά τα προβλήματα επιλύονται χρησιμοποιώντας τελεστές ΣΥΓΧΩΝΕΥΣΗ(Στραγγίστε) και ΕΥΡΗΜΑ(Εύρημα). ΣΥΓΧΩΝΕΥΣΗ( ΕΝΑ, ΠΡΟ ΧΡΙΣΤΟΥ) κάνει πολλά ΜΕίσο με την ένωση των συνόλων ΕΝΑΚαι ΣΕ, αν αυτά τα σύνολα δεν τέμνονται (δηλαδή δεν έχουν κοινά στοιχεία). αυτός ο τελεστής δεν ορίζεται εάν τα σύνολα ΕΝΑΚαι ΣΕδιατέμνω. Συνάρτηση FIND( Χ) επιστρέφει το σύνολο στο οποίο ανήκει το στοιχείο Χ; σε περίπτωση Χανήκει σε πολλά σύνολα ή δεν ανήκει σε κανένα, η τιμή αυτής της συνάρτησης δεν ορίζεται.

Χειριστές της ADT «Ένωση συνόλων»:

1. ΣΥΓΧΩΝΕΥΣΗ(ΕΝΑ , ΣΕ) συνδυάζει συστατικά ΕΝΑΚαι . ΣΕ,το αποτέλεσμα εκχωρείται είτε στο Α είτε ΣΕ.

2. ΕΥΡΗΜΑ(Χ ) - μια συνάρτηση που επιστρέφει το όνομα του στοιχείου στο οποίο ανήκει Χ.

3. ΑΡΧΙΚΟΣ(ΕΝΑ , Χ ) δημιουργεί ένα στοιχείο με το όνομα A που περιέχει μόνο το στοιχείο Χ.

Αναπαράσταση συνδυασμού συνόλων με χρήση πινάκων:

Το όνομα του συνόλου ταιριάζει με την τιμή του δείκτη πίνακα αποθέτες (όνομα 0 )

Ονομασίες:

αποθέτες – πίνακας κεφαλίδων συνόλου:

§ Με ποντάρισμα – αριθμός στοιχείων στο σετ,

§ πρώτο στοιχείο – ευρετήριο πίνακαονόματαμε το πρώτο στοιχείο του σετ,

ονόματασυστοιχία λιστών στοιχείων συνόλου:

    όνομα συνόλου - το όνομα του συνόλου στο οποίο ανήκει το στοιχείο, επόμενο στοιχείο – ευρετήριο του επόμενου στοιχείου στη λίστα δεδομένο σύνολο(η τιμή ευρετηρίου 0 χρησιμοποιείται ως το τέλος της λίστας).

Ενότητα προγράμματος εργασίας 2.1.3

Αφηρημένος τύπος δεδομένωνΚατευθυνόμενο γράφημα"

Βασικοί ορισμοί:

Κατευθυνόμενο γράφημα (δίφθογγος ) σολ = (V, E)αποτελείται από πολλές κορυφές Vκαι σύνολα τόξων ΜΙ.Κορυφές λέγονται επίσης κόμβους , και τόξα - προσανατολισμένες άκρες . Ένα τόξο μπορεί να αναπαρασταθεί ως ένα διατεταγμένο ζεύγος κορυφών ( u, w), που είναι η κορυφή Καιπου ονομάζεται η αρχη , ένα w - το τέλος τόξα.

Λένε επίσης ότι το τόξο Και -> w οδηγεί από την κορυφή στην κορυφή w,και την κορυφή w γειτονικός με κορυφή v.

Παράδειγμα 1 διάγραμμα:

Οι κορυφές ενός διγράφου μπορούν να χρησιμοποιηθούν για να αναπαραστήσουν αντικείμενα και τα τόξα μπορούν να χρησιμοποιηθούν για να αναπαραστήσουν σχέσεις μεταξύ αντικειμένων.

Με σε ένα δίγραφο ονομάζεται η ακολουθία των κορυφών v1 , v2 , … , vn , , για τα οποία υπάρχουν τόξα v1 -> v2 , v2 , -> v3, , ..., vn-1 , -> vn. Αυτό το μονοπάτι ξεκινά από την κορυφή v1 και, περνώντας μέσα από τις κορυφές v2 , v3 , ..., vn-1 τελειώνει στην κορυφή vn. Μήκος διαδρομής - ο αριθμός των τόξων που αποτελούν τη διαδρομή, σε αυτήν την περίπτωση το μήκος της διαδρομής είναι Π - 1 . Ως ειδική περίπτωση μιας διαδρομής, θεωρήστε μια κορυφή vως διαδρομή μήκους 0 από την κορυφή vΠρος τηναυτή την ίδια κορυφή v. Στο σχήμα, η ακολουθία των κορυφών 1, 2, 4 σχηματίζει μια διαδρομή μήκους 2 από την κορυφή 1 έως την κορυφή 4.

Το μονοπάτι λέγεται απλός , αν όλες οι κορυφές σε αυτό, με πιθανή εξαίρεση την πρώτη και την τελευταία, είναι διαφορετικές. Κύκλος - είναι μια απλή διαδρομή μήκους τουλάχιστον 1 που αρχίζει και τελειώνει στην ίδια κορυφή. Στο σχήμα, οι κορυφές 3, 2, 4, 3 σχηματίζουν έναν κύκλο μήκους 3.

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

Παράδειγμα 2 ενός επισημασμένου διγράφου:

DIV_ADBLOCK149">

3. Μεταβατικός αλγόριθμος κλεισίματος (αλγόριθμος Warshall):

Για την καταμέτρηση σολ = (V, μι) ο αλγόριθμος υπολογίζει τον πίνακα μεταβατικότητας Τ, κάθε στοιχείο του οποίου Τ[Εγώ, ι] = 1 μόνο όταν υπάρχει μονοπάτι από την κορυφή Εγώστην κορυφή ιΚαι Τ[ Εγώ, ι] = 0 σε διαφορετική περίπτωση.

4. Αλγόριθμος για την εύρεση του κέντρου ενός διγράφου:

Αφήνω Και -αυθαίρετη κορυφή ενός διγράφου σολ = (V,ΜΙ). Εκκεντρικότητα (μέγιστη αφαίρεση) κορυφές Καιοριζεται ως

μέγ.(ελάχιστο μήκος διαδρομής από την κορυφή wστην κορυφή v }

w V

Κέντρο του διγράφου σολονομάζεται κορυφή με ελάχιστη εκκεντρότητα. Με άλλα λόγια, το κέντρο του διγράφου είναι η κορυφή για την οποία η μέγιστη απόσταση (μήκος διαδρομής) από άλλες κορυφές είναι ελάχιστη.

Παράδειγμα:Το κέντρο του διγράφου είναι η κορυφή ρε

Εκκεντρικός-τ

5. Αλγόριθμος για τη διέλευση ενός διγράφου σε βάθος (depth-first search):

Πολλά προβλήματα που αφορούν κατευθυνόμενα γραφήματα απαιτούν μια αποτελεσματική μέθοδο για τη συστηματική διέλευση των κορυφών και των τόξων των διγραφημάτων. Αυτή η μέθοδος είναι η λεγόμενη βάθους πρώτη αναζήτηση - γενίκευση της μεθόδου διέλευσης προς τα εμπρός δέντρα. Η αναζήτηση πρώτα σε βάθος ξεκινά με την επιλογή μιας αρχικής κορυφής vγραφική παράσταση ΣΟΛ,αυτή η κορυφή σημειώνεται με μια ετικέτα επισκέφθηκε (επισκέφθηκε). Στη συνέχεια για κάθε κορυφή δίπλα στην κορυφή vκαι το οποίο δεν έχει επισκεφτεί στο παρελθόν, η αναζήτηση πρώτα σε βάθος εφαρμόζεται αναδρομικά. Όταν όλες οι κορυφές που μπορεί κανείς να φτάσει από την κορυφή v, θα «τιμηθεί» μια επίσκεψη, η αναζήτηση τελειώνει. Εάν ορισμένες κορυφές παραμένουν χωρίς επίσκεψη, τότε επιλέγεται μία από αυτές και η αναζήτηση επαναλαμβάνεται. Αυτή η διαδικασία συνεχίζεται έως ότου όλες οι κορυφές του διγράφου καλύπτονται από τη διάβαση. σολ.

6. Αλγόριθμος για την κατασκευή ενός δέντρου σε βάθος ενός γραφήματος:

Όταν διασχίζετε ένα γράφημα χρησιμοποιώντας την αναζήτηση πρώτα σε βάθος, μόνο ορισμένα τόξα οδηγούν σε κορυφές που δεν έχουν επισκεφτεί. Τέτοια τόξα που οδηγούν σε νέες κορυφές ονομάζονται τόξα δέντρων και σχηματίζουν το γράφημα εκτεινόμενο δάσος που κατασκευάστηκε χρησιμοποιώντας τη μέθοδο αναζήτησης πρώτου βάθους βαθύ δάσος . Κατά την κατασκευή ενός δάσους, υπάρχουν 3 τύποι τόξων: ανάστροφο, ευθύ και εγκάρσιο. Αντίστροφα τόξα - τέτοια τόξα που στο εκτεινόμενο δάσος πηγαίνουν από απογόνους σε προγόνους. Ευθύγραμμα τόξα ονομάζονται τόξα που πηγαίνουν από προγόνους σε αληθινούς απογόνους, αλλά δεν είναι τόξα δέντρου.

Τα τόξα που συνδέουν τις κορυφές που δεν είναι ούτε πρόγονοι ούτε απόγονοι το ένα του άλλου ονομάζονται εγκάρσια τόξα . Εάν, κατά την κατασκευή ενός δέντρου που εκτείνεται, οι γιοι μιας κορυφής βρίσκονται από αριστερά προς τα δεξιά με τη σειρά που επισκέπτονται, και εάν προστεθούν νέα δέντρα στο δάσος επίσης από αριστερά προς τα δεξιά, τότε όλα τα εγκάρσια τόξα πηγαίνουν από δεξιά προς τα αριστερά .

Για παράδειγμα, τόξα ρε->Γ και Γ->Δ– εγκάρσιο, τόξο ντο-> ΕΝΑ– αντίστροφα, δεν υπάρχουν άμεσα τόξα.

Όταν διασχίζετε ένα δέντρο σε βάθος, είναι συχνά βολικό να αριθμήσετε τις κορυφές με τη σειρά με την οποία επισκέπτονται. Τέτοιοι αριθμοί ονομάζονται βαθιά.

Αναπαράσταση διγράφου:

§ Αναπαράσταση διγράφου με χρήση πίνακα γειτνίασης:

Πίνακας γειτνίασης για δίγραφο ΣΟΛ-αυτό είναι μια μήτρα ΕΝΑΜέγεθος n nμε Boolean τιμές, όπου ΕΝΑ[ Εγώ, ι] = αληθήςαν και μόνο αν υπάρχει τόξο από την κορυφή Εγώστην κορυφή j. Συχνά σε πίνακες γειτνίασης η τιμή αληθήςαντικαθίσταται από 1 και η τιμή ψευδής- έως 0.

Μια γενίκευση της αναπαράστασης ενός διγράφου χρησιμοποιώντας έναν πίνακα γειτνίασης μπορεί να θεωρηθεί ως αναπαράσταση ενός επισημασμένου διγράφου χρησιμοποιώντας επίσης έναν πίνακα γειτνίασης, αλλά του οποίου το στοιχείο ΕΝΑ[ Εγώ, ι] ίσο με την ετικέτα τόξου i ->ι. Αν τα τόξα είναι από την κορυφή Εγώστην κορυφή ιδεν υπάρχει, τότε η τιμή του Α[ Εγώ, ι] δεν μπορεί να είναι η τιμή οποιασδήποτε έγκυρης ετικέτας, αλλά μπορεί να αντιμετωπίζεται ως "κενό" κελί.

Πίνακας γειτνίασης για ένα επισημασμένο δίγραφο (παράδειγμα 2):

§ Αναπαράσταση διγράφου χρησιμοποιώντας λίστες γειτνίασης:

Λίστα γειτνίασης για μια κορυφή Εγώείναι μια λίστα με όλες τις κορυφές που γειτνιάζουν με μια κορυφή Εγώ, και παρήγγειλε με συγκεκριμένο τρόπο. Δίφθογγος σολμπορεί να αναπαρασταθεί χρησιμοποιώντας έναν πίνακα ΚΕΦΑΛΙ(Τίτλος) του οποίου το στοιχείο ΚΕΦΑΛΙ[Εγώ] είναι ένας δείκτης στη λίστα γειτνίασης μιας κορυφής Εγώ.


Χειριστές του ATD “Orgraf”:

Οι πιο συνηθισμένοι τελεστές που εκτελούνται σε κατευθυνόμενα γραφήματα περιλαμβάνουν τελεστές για την ανάγνωση ετικετών κορυφών και τόξων, εισαγωγή και διαγραφή κορυφών και τόξων και μετακίνηση μέσω ακολουθιών τόξων.

Για να δείτε ένα σύνολο γειτονικών κορυφών, απαιτούνται οι ακόλουθοι τρεις τελεστές.

1. ΠΡΩΤΑ( v) επιστρέφει τον δείκτη της πρώτης κορυφής δίπλα στην κορυφή v. Αν η κορυφή vδεν έχει γειτονικές κορυφές, τότε επιστρέφεται η κορυφή «μηδέν». μηδέν.

2.ΕΠΟΜΕΝΟ( v, Εγώ) επιστρέφει τον δείκτη της κορυφής δίπλα στην κορυφή v,δίπλα στο ευρετήριο Εγώ.Αν Εγώ-αυτός είναι ο δείκτης της τελευταίας κορυφής δίπλα στην κορυφή v,μετά επανέρχεται μηδέν.

3. VERTEX( v,Εγώ) επιστρέφει την κορυφή με δείκτη Εγώαπό το σύνολο των κορυφών που γειτνιάζουν με v.

Γυμνάσια:

Δίνεται ένα κατευθυνόμενο γράφημα (διγράφημα):

https://pandia.ru/text/78/308/images/image043_12.gif" width="125" height="100 src=">


Παράδειγμα αποσυνδεδεμένου γραφήματος:

Κύκλος (απλή) είναι μια διαδρομή (απλή) μήκους τουλάχιστον 3 από οποιαδήποτε κορυφή προς τον εαυτό της. Το γράφημα ονομάζεται κυκλικός , αν έχει τουλάχιστον έναν κύκλο. Ένα συνδεδεμένο άκυκλο γράφημα, το οποίο είναι ένα "δέντρο χωρίς ρίζα", ονομάζεται ελεύθερο δέντρο . Το δεύτερο σχήμα παραπάνω δείχνει ένα γράφημα που αποτελείται από δύο συνδεδεμένα στοιχεία, καθένα από τα οποία είναι ένα ελεύθερο δέντρο. Ένα ελεύθερο δέντρο μπορεί να μετατραπεί σε «κανονικό» δέντρο εάν κάποια κορυφή ορίζεται ως ρίζα και όλες οι άκρες είναι προσανατολισμένες προς την κατεύθυνση από αυτή τη ρίζα.

Τα δωρεάν δέντρα έχουν δύο σημαντικές ιδιότητες:

1. Κάθε ελεύθερο δέντρο με τον αριθμό των κορυφών n, n > 1 , έχει ακριβώς n - 1 παϊδάκια

2. Εάν προσθέσετε μια νέα άκρη σε ένα δωρεάν δέντρο, σίγουρα θα έχετε έναν κύκλο.

Αφήνω σολ = (V, Ε) -συνδεδεμένο γράφημα στο οποίο κάθε άκρη ( r, w) σημειώνεται με έναν αριθμό Με(v, w),η οποία ονομάζεται κόστος πλευρών . εκτεινόμενο δέντρο γραφική παράσταση σολονομάζεται ένα ελεύθερο δέντρο που περιέχει όλες τις κορυφές Vστήλη Ζ. Τιμή Το spanning tree υπολογίζεται ως το άθροισμα του κόστους όλων των άκρων που περιλαμβάνονται σε αυτό το δέντρο

Βασικοί αλγόριθμοι για την επεξεργασία μη κατευθυνόμενων γραφημάτων:

1. Κατασκευάζοντας ένα δέντρο που καλύπτει το ελάχιστο κόστος (αλγόριθμος Prim):

Πολλές κορυφές χτίζονται U, από το οποίο «φύεται» το εκτεινόμενο δέντρο. Αφήνω V= (1, 2, ...,n}. Αρχικά U = (1).Σε κάθε βήμα του αλγορίθμου, βρίσκεται η άκρη του ελάχιστου κόστους ( u, v) έτσι ώστε u UΚαι v V\U, μετά την κορυφή vμεταφέρεται από το σετ V\Uμέσα στο πλήθος U. Αυτή η διαδικασία συνεχίζεται μέχρι πολλούς Uδεν θα είναι ίσο με το σύνολο V.

Η ακολουθία για την κατασκευή ενός εκτεινόμενου δέντρου δίνεται παρακάτω.

https://pandia.ru/text/78/308/images/image048_12.gif" width="501" height="384 src=">

3. Διέλευση μη κατευθυνόμενων γραφημάτων χρησιμοποιώντας την αναζήτηση πρώτα σε βάθος:

Η αναζήτηση πρώτα σε βάθος χρησιμοποιείται για τη συστηματική διέλευση όλων των κορυφών ενός γραφήματος. Ο αλγόριθμος αναζήτησης πρώτου βάθους είναι παρόμοιος με τον αλγόριθμο για τη διέλευση των κορυφών ενός διγράφου. Το τελευταίο χρησιμοποιείται επίσης για μη κατευθυνόμενα γραφήματα, καθώς είναι ένα μη κατευθυνόμενο άκρο (v, w) μπορεί να αναπαρασταθεί ως ζεύγος προσανατολισμένων τόξων v -> wΚαι w -> v.

Η διάσχιση πρώτου βάθους μπορεί να χρησιμοποιηθεί για την κατασκευή ενός εκτεινόμενου δέντρου.

Το γράφημα και το εκτεινόμενο δέντρο που ελήφθησαν διασχίζοντας τις κορυφές του χρησιμοποιώντας τη μέθοδο αναζήτησης κατά βάθος δίνονται παρακάτω:

4. Διέλευση μη κατευθυνόμενων γραφημάτων χρησιμοποιώντας αναζήτηση πλάτους

Μια άλλη μέθοδος για τη συστηματική διέλευση των κορυφών ενός γραφήματος ονομάζεται πλάτος πρώτη αναζήτηση . Πήρε το όνομά του λόγω του γεγονότος ότι όταν έφτανε σε οποιαδήποτε κορυφή ενώ περπατούσε vτότε λαμβάνονται υπόψη όλες οι κορυφές που γειτνιάζουν με την κορυφή v, Δηλαδή, οι κορυφές φαίνονται «πρώτα το πλάτος». Αυτή η μέθοδος μπορεί επίσης να εφαρμοστεί σε κατευθυνόμενα γραφήματα.

Ακριβώς όπως όταν χρησιμοποιείτε την αναζήτηση πρώτα σε βάθος, χρησιμοποιώντας τη μέθοδο αναζήτησης κατά πλάτος, δημιουργείται ένα εκτεινόμενο δάσος κατά τη διέλευση του γραφήματος. Αν αφού φτάσει στην κορυφή Χκατά την εξέταση της πλευράς (x, y)κορυφή στοδεν έχει επισκεφτεί πριν, τότε αυτή η άκρη θεωρείται άκρη του δέντρου. Αν η κορυφή στοέχει ήδη επισκεφθεί πριν, τότε η άκρη (x, y)θα είναι ένα εγκάρσιο άκρο, αφού συνδέει κορυφές που δεν συνδέονται με κληρονομικότητα μεταξύ τους.

Το εκτεινόμενο δέντρο που λήφθηκε χρησιμοποιώντας τη μέθοδο αναζήτησης πρώτου πλάτους φαίνεται παρακάτω.

Αναπαράσταση ενός μη κατευθυνόμενου γραφήματος χρησιμοποιώντας έναν πίνακα γειτνίασης:

Για να αναπαραστήσετε μη κατευθυνόμενα γραφήματα, μπορείτε να χρησιμοποιήσετε τις ίδιες μεθόδους όπως για την αναπαράσταση κατευθυνόμενων γραφημάτων, εάν η μη κατευθυνόμενη άκρη μεταξύ των κορυφών vΚαι wαντιμετωπίζονται ως δύο προσανατολισμένα τόξα από την κορυφή v σεμπλουζα wκαι από την κορυφή wστην κορυφή v.

https://pandia.ru/text/78/308/images/image051_12.gif" width="159" height="106">

Αναπαράσταση ενός μη κατευθυνόμενου γραφήματος χρησιμοποιώντας λίστες γειτνίασης:

https://pandia.ru/text/78/308/images/image053_12.gif" width="339" height="115 src=">

1. Κατασκευή:

ελάχιστης δαπάνης που καλύπτει το δέντρο χρησιμοποιώντας τον αλγόριθμο του Prim.

ελάχιστης δαπάνης που καλύπτει το δέντρο χρησιμοποιώντας τον αλγόριθμο του Kruskal.

εκτεινόμενο δέντρο χρησιμοποιώντας αναζήτηση πρώτα σε βάθος, ξεκινώντας από τις κορυφές a και d.

εκτείνοντας δέντρο χρησιμοποιώντας αναζήτηση πλάτους πρώτα, ξεκινώντας από τις κορυφές a και d.

2. Εφαρμόστε τους αλγόριθμους Prim και Kruskal.

3. Υλοποιήστε την κατασκευή ενός εκτεινόμενου δέντρου χρησιμοποιώντας τη μέθοδο αναζήτησης πρώτου βάθους

§ για ένα μη κατευθυνόμενο γράφημα που αναπαρίσταται χρησιμοποιώντας έναν πίνακα γειτνίασης,

§ για ένα μη κατευθυνόμενο γράφημα που αναπαρίσταται με χρήση λιστών γειτνίασης.

4. Υλοποιήστε την κατασκευή ενός δέντρου που εκτείνεται χρησιμοποιώντας τη μέθοδο αναζήτησης πλάτους-πρώτα

§ για ένα μη κατευθυνόμενο γράφημα που αναπαρίσταται χρησιμοποιώντας έναν πίνακα γειτνίασης,

§ για ένα μη κατευθυνόμενο γράφημα που αναπαρίσταται με χρήση λιστών γειτνίασης.

Υπουργείο Παιδείας και Επιστημών Ρωσική Ομοσπονδία

Ομοσπονδιακό κρατικό προϋπολογισμό εκπαιδευτικό ίδρυμα

ανώτερη επαγγελματική εκπαίδευση

ΕΘΝΙΚΟ ΠΥΡΗΝΙΚΟ ΕΡΕΥΝΗΤΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ "MEPhI"

Dimitrovgrad Institute of Engineering and Technology

Τμήμα ΤΕΧΝΟΛΟΓΙΑ της ΠΛΗΡΟΦΟΡΙΑΣ

Παραδεχτείτε την άμυνα "" 2012

Κεφάλι τμήμα Rakova O.A.

Εργασία μαθήματος

κατά πειθαρχία"Αντικειμενοστραφής προγραμματισμός"

Θέμα:"Αφηρημένοι τύποι δεδομένων. Κονίστρα"

Συμπλήρωσε: μαθητής γρ. VT-31

Ο Shayakov A.F.

Επικεφαλής: Τέχνη. καθηγητής του τμήματος Πληροφορικής

Alenin V. A.

Ελεγκτής προτύπων: Άρθ. καθηγητής του τμήματος Πληροφορικής

Alenin V. A.

Βαθμός:

Ημερομηνία υπεράσπισης:

Dimitrovgrad, 2012

Υπουργείο Παιδείας και Επιστημών της Ρωσικής Ομοσπονδίας

Ομοσπονδιακό κρατικό προϋπολογισμό εκπαιδευτικό ίδρυμα

ανώτερη επαγγελματική εκπαίδευση

ΕΘΝΙΚΟ ΠΥΡΗΝΙΚΟ ΕΡΕΥΝΗΤΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ "MEPhI"

Dimitrovgrad Institute of Engineering and Technology

για εργασία μαθημάτων

Πειθαρχία: Αντικειμενοστραφής προγραμματισμός

Θέμα: Αφηρημένοι τύποι δεδομένων. Κονίστρα

Ερμηνευτής: Shayakov A.F.

Επικεφαλής: Alenin V.A.

1.Θεωρητικό μέρος:

Αφηρημένοι τύποι δεδομένων. Η έννοια του αντικειμενοστρεφούς προγραμματισμού. Γραμμικές λίστες μεμονωμένα συνδεδεμένα.

2.Πρακτικό μέρος:

Γράψτε ένα πρόγραμμα σε C++ με αντικειμενοστραφή δομή για την υλοποίηση γραμμικών λιστών μεμονωμένα συνδεδεμένα.

Προγραμματισμένες προθεσμίες για την ολοκλήρωση των εργασιών:

    Θεωρητικό μέρος - 15% την εβδομάδα 5

    Πρακτικό μέρος – 80% την εβδομάδα 7

    Πειραματικό τμήμα - ____% έως ____ εβδομάδα

    Προστασία – 100% την εβδομάδα 10

Απαιτήσεις σχεδιασμού:

    Ο υπολογισμός και η επεξηγηματική σημείωση της εργασίας του μαθήματος πρέπει να υποβάλλονται σε ηλεκτρονικά και έντυπα αντίγραφα.

    Ο όγκος της αναφοράς πρέπει να είναι τουλάχιστον 20 δακτυλόγραφες σελίδες εξαιρουμένων των συνημμένων

    Το RPP υπογράφεται από το άτομο που είναι υπεύθυνο για τον τυπικό έλεγχο

Υπεύθυνος εργασίας _________________

Εκτελεστής _________________________________

Ημερομηνία έκδοσης "_____" ___________ 2012

SHAYAKOV A.F ΘΕΜΑ: ΠΕΡΙΛΗΨΗ ΤΥΠΩΝ ΔΕΔΟΜΕΝΩΝ. LISTS, Coursework / DITI, No. 230105.65-Dimitrovgrad, 2012. - 29 σελίδες, εικ. 11, σαλιάρα. όνομα 10, εφαρμογές 1.

Λέξεις-κλειδιά: γραμμικές λίστες μεμονωμένα συνδεδεμένα, C++, αντικειμενοστραφής προγραμματισμός.

Αντικείμενο μελέτης είναι γραμμικές λίστες μεμονωμένα συνδεδεμένα.

Στόχος της εργασίας είναι η μελέτη γραμμικών λιστών μεμονωμένα συνδεδεμένα και η σύνταξη ενός προγράμματος σε C++ με αντικειμενοστραφή δομή για την υλοποίησή τους.

Συμπεράσματα: σε αυτή την εργασία μελετήθηκαν πλήρως γραμμικές λίστες μεμονωμένα συνδεδεμένα, καθώς και μέθοδοι αναπαράστασής τους στη μνήμη. Το πρόγραμμα, γραμμένο σε C++, συμμορφώνεται πλήρως με την αντικειμενοστραφή δομή, εκτελεί σωστά και αποτελεσματικά το κύριο έργο του - την υλοποίηση γραμμικών λιστών μεμονωμένα συνδεδεμένα.

Εισαγωγή 6

1 Θεωρητικό μέρος 7

1.1 Αφηρημένοι τύποι δεδομένων. Γραμμικές λίστες 7

1.2 Έννοια του αντικειμενοστρεφούς προγραμματισμού 8

2 Πρακτικό μέρος 15

3 Δοκιμή 23

Συμπέρασμα 25

Αναφορές 26

Παράρτημα Α 27

Εισαγωγή

Συχνά, όταν εργάζεστε με δεδομένα, είναι αδύνατο να προσδιοριστεί πόση μνήμη θα χρειαστεί για την αποθήκευσή τους· η μνήμη πρέπει να εκχωρείται κατά την εκτέλεση του προγράμματος όπως απαιτείται σε ξεχωριστά μπλοκ. Τα μπλοκ συνδέονται μεταξύ τους χρησιμοποιώντας δείκτες. Αυτός ο τρόπος οργάνωσης δεδομένων ονομάζεται δυναμική δομή δεδομένων επειδή βρίσκεται μέσα δυναμική μνήμηκαι το μέγεθός του αλλάζει κατά την εκτέλεση του προγράμματος.

Από τις δυναμικές δομές, σε αυτήν την εργασία χρησιμοποιούνται γραμμικές λίστες. Μια δυναμική δομή, σε αντίθεση με έναν πίνακα ή μια εγγραφή, μπορεί να καταλάβει μη συνεχόμενες περιοχές της μνήμης RAM.

Οι δυναμικές δομές χρησιμοποιούνται επίσης ευρέως για την αποτελεσματικότερη εργασία με δεδομένα των οποίων το μέγεθος είναι γνωστό, ειδικά για την επίλυση προβλημάτων ταξινόμησης.

Ένα στοιχείο οποιασδήποτε δυναμικής δομής αποτελείται από δύο μέρη: πληροφορίες, για λόγους αποθήκευσης των οποίων δημιουργείται η δομή, και δείκτες, που διασφαλίζουν τη σύνδεση των στοιχείων μεταξύ τους.

  1. Θεωρητικό μέρος

1.1 Αφηρημένοι τύποι δεδομένων. Γραμμικές λίστες

Η έννοια των αφηρημένων τύπων δεδομένων είναι το κλειδί στον προγραμματισμό. Η αφαίρεση συνεπάγεται διαχωρισμό και ανεξάρτητη εξέταση της διεπαφής και της υλοποίησης.

Η αφαίρεση δεδομένων περιλαμβάνει τον ορισμό και την εξέταση αφηρημένων τύπων δεδομένων (ADT) ή, ισοδύναμα, νέων τύπων δεδομένων που εισάγονται από τον χρήστη.

Ένας αφηρημένος τύπος δεδομένων είναι μια συλλογή δεδομένων μαζί με ένα σύνολο λειτουργιών που μπορούν να εκτελεστούν σε αυτά τα δεδομένα.

Γραμμικές λίστες

Σε μια γραμμική λίστα, κάθε στοιχείο σχετίζεται με το επόμενο και πιθανώς το προηγούμενο. Στην πρώτη περίπτωση, η λίστα ονομάζεται απλά συνδεδεμένη, στη δεύτερη - διπλά συνδεδεμένη. Εάν συνδέσετε το τελευταίο στοιχείο με έναν δείκτη στο πρώτο, λαμβάνετε μια κυκλική λίστα.

Κάθε στοιχείο λίστας περιέχει ένα κλειδί που προσδιορίζει αυτό το στοιχείο. Το κλειδί είναι συνήθως είτε ακέραιος είτε συμβολοσειρά και αποτελεί μέρος του πεδίου δεδομένων. Όταν εργάζεστε με μια λίστα, διαφορετικά μέρη του πεδίου δεδομένων μπορούν να λειτουργήσουν ως κλειδί. Τα κλειδιά διαφορετικών στοιχείων λίστας μπορεί να είναι τα ίδια.

Μπορείτε να εκτελέσετε τις ακόλουθες λειτουργίες σε λίστες:

    αρχικός σχηματισμός της λίστας (δημιουργία του πρώτου στοιχείου).

    προσθήκη ενός στοιχείου στο τέλος της λίστας.

    ανάγνωση ενός στοιχείου με ένα δεδομένο κλειδί.

    εισαγωγή ενός στοιχείου σε μια καθορισμένη θέση στη λίστα (πριν ή μετά από ένα στοιχείο με ένα δεδομένο κλειδί).

    διαγραφή στοιχείου με δεδομένο κλειδί.

    ταξινόμηση της λίστας με κλειδί.

Για να εργαστείτε με μια λίστα σε ένα πρόγραμμα, πρέπει να ορίσετε έναν δείκτη στην αρχή του. Για να διευκολύνετε την προσθήκη νέων στοιχείων στο τέλος της λίστας, μπορείτε επίσης να προσθέσετε έναν δείκτη στο τέλος της λίστας.

1.2 Έννοια αντικειμενοστρεφούς προγραμματισμού

Σύμφωνα με τον ορισμό μιας αρχής στον τομέα των αντικειμενοστρεφών μεθόδων ανάπτυξης προγραμμάτων, Gradi Bucha, «ο αντικειμενοστραφής προγραμματισμός (OOP) είναι μια μεθοδολογία προγραμματισμού που βασίζεται στην αναπαράσταση ενός προγράμματος ως μια συλλογή αντικειμένων, καθένα από τα οποία είναι μια υλοποίηση μιας συγκεκριμένης τάξης (ένας ειδικός τύπος) και οι τάξεις σχηματίζουν μια ιεραρχία στις αρχές της κληρονομικότητας».

Η αντικειμενοστραφής μεθοδολογία, όπως και η δομική μεθοδολογία, δημιουργήθηκε με στόχο την πειθαρχία της διαδικασίας ανάπτυξης μεγάλων συστημάτων λογισμικού και συνεπώς τη μείωση της πολυπλοκότητας και του κόστους τους.

Η αντικειμενοστραφής μεθοδολογία επιδιώκει τους ίδιους στόχους με τη δομική, αλλά τους λύνει από διαφορετική οπτική γωνία. αφετηρίακαι στις περισσότερες περιπτώσεις σας επιτρέπει να διαχειρίζεστε πιο σύνθετα έργα από τη δομημένη μεθοδολογία.

Όπως γνωρίζετε, μία από τις αρχές της διαχείρισης της πολυπλοκότητας του έργου είναι η αποσύνθεση. Ο Gradi Booch διακρίνει δύο τύπους αποσύνθεσης: την αλγοριθμική (όπως αποκαλεί την αποσύνθεση που υποστηρίζεται δομικές μεθόδους) και αντικειμενοστρεφής, η διαφορά μεταξύ των οποίων, κατά τη γνώμη του, είναι η εξής: «Η διαίρεση ανά αλγόριθμους συγκεντρώνει την προσοχή στη σειρά των γεγονότων που συμβαίνουν και η διαίρεση ανά αντικείμενα δίνει ιδιαίτερο νόημαπαράγοντες που είτε προκαλούν ενέργειες είτε αποτελούν αντικείμενο εφαρμογής αυτών των ενεργειών.»

Με άλλα λόγια, η αλγοριθμική αποσύνθεση λαμβάνει περισσότερο υπόψη τη δομή των σχέσεων μεταξύ τμημάτων ενός σύνθετου προβλήματος, ενώ η αντικειμενοστραφής αποσύνθεση δίνει μεγαλύτερη προσοχή στη φύση των σχέσεων.

Στην πράξη, συνιστάται η χρήση και των δύο τύπων αποσύνθεσης: κατά τη δημιουργία μεγάλων έργων, συνιστάται πρώτα η χρήση αντικειμενοστρεφούς προσέγγισης για τη δημιουργία μιας γενικής ιεραρχίας αντικειμένων που αντικατοπτρίζουν την ουσία της προγραμματιζόμενης εργασίας και στη συνέχεια να χρησιμοποιείται αλγοριθμική αποσύνθεση σε ενότητες για την απλοποίηση της ανάπτυξης και συντήρησης του πακέτου λογισμικού.

Ο προγραμματισμός OO είναι αναμφίβολα ένας από τους πιο ενδιαφέροντες τομείς για επαγγελματική ανάπτυξη λογισμικού.

Αντικείμενα και τάξεις

Τα βασικά μπλοκ ενός αντικειμενοστρεφούς προγράμματος είναι αντικείμενα και κλάσεις. Όσον αφορά το περιεχόμενο, ένα αντικείμενο μπορεί να αναπαρασταθεί ως κάτι αισθητό ή φανταστικό και με σαφώς καθορισμένη συμπεριφορά. Έτσι, ένα αντικείμενο μπορεί είτε να φανεί, είτε να αγγιχτεί ή τουλάχιστον να είναι γνωστό ότι βρίσκεται εκεί, για παράδειγμα να αναπαρίσταται ως πληροφορίες που είναι αποθηκευμένες στη μνήμη του υπολογιστή. Ας ορίσουμε ένα αντικείμενο, ακολουθώντας τη γνώμη του GradiButch: «Ένα αντικείμενο είναι μια απτή οντότητα που εκδηλώνει ξεκάθαρα τη συμπεριφορά του».

Ένα αντικείμενο είναι μέρος της πραγματικότητας γύρω μας, δηλαδή υπάρχει στο χρόνο και στο χώρο (η έννοια του αντικειμένου στον προγραμματισμό εισήχθη για πρώτη φορά στη γλώσσα Simula). Τυπικά, το αντικείμενο είναι αρκετά δύσκολο να προσδιοριστεί. Αυτό μπορεί να γίνει μέσω ορισμένων ιδιοτήτων, δηλαδή: το αντικείμενο έχει κατάσταση, συμπεριφορά και μπορεί να αναγνωριστεί μοναδικά (με άλλα λόγια, έχει ένα μοναδικό όνομα).

Μια κλάση είναι ένα σύνολο αντικειμένων που έχουν κοινή δομή και κοινή συμπεριφορά. Μια κλάση είναι μια περιγραφή (αφαίρεση) που δείχνει πώς να κατασκευαστεί μια μεταβλητή αυτής της κλάσης που υπάρχει στο χρόνο και στο χώρο, που ονομάζεται αντικείμενο. Η έννοια των προτάσεων «περιγραφή μεταβλητών κλάσης» και «περιγραφή αντικειμένων κλάσης» είναι η ίδια.

Ένα αντικείμενο έχει κατάσταση, συμπεριφορά και διαβατήριο (μέσο για τη μοναδική αναγνώρισή του). η δομή και η συμπεριφορά των αντικειμένων περιγράφονται στις κλάσεις των οποίων είναι μεταβλητές.

Ας ορίσουμε τώρα τις έννοιες της κατάστασης, της συμπεριφοράς και της ταύτισης ενός αντικειμένου.

Η κατάσταση ενός αντικειμένου συνδυάζει όλα τα πεδία δεδομένων του (στατικό στοιχείο, δηλ. αμετάβλητο) και τις τρέχουσες τιμές καθενός από αυτά τα πεδία (δυναμικό στοιχείο, δηλ. συνήθως μεταβαλλόμενο).

Η συμπεριφορά εκφράζει τη δυναμική των αλλαγών στις καταστάσεις ενός αντικειμένου και την αντίδρασή του στα εισερχόμενα μηνύματα, δηλ. πώς ένα αντικείμενο αλλάζει τις καταστάσεις του και αλληλεπιδρά με άλλα αντικείμενα.

Η αναγνώριση (αναγνώριση) ενός αντικειμένου είναι μια ιδιότητα που σας επιτρέπει να διακρίνετε ένα αντικείμενο από άλλα αντικείμενα της ίδιας ή άλλων κλάσεων. Η αναγνώριση πραγματοποιείται χρησιμοποιώντας μοναδικό όνομα(διαβατήρια) με τα οποία είναι προικισμένο ένα αντικείμενο σε ένα πρόγραμμα, όπως και κάθε άλλη μεταβλητή.

Ειπώθηκε ήδη παραπάνω ότι η διαδικαστική (καθώς και η αρθρωτή) προσέγγιση σας επιτρέπει να δημιουργήσετε προγράμματα που αποτελούνται από ένα σύνολο διαδικασιών (υπορουτίνες) που υλοποιούν δεδομένους αλγόριθμους. Από την άλλη πλευρά, η αντικειμενοστραφής προσέγγιση αντιπροσωπεύει τα προγράμματα ως ένα σύνολο αντικειμένων που αλληλεπιδρούν μεταξύ τους. Τα αντικείμενα αλληλεπιδρούν μέσω μηνυμάτων. Ας υποθέσουμε ότι το αντικείμενο μας είναι ένας κύκλος. Τότε το μήνυμα που αποστέλλεται σε αυτό το αντικείμενο θα μπορούσε να είναι: "ζωγραφίστε τον εαυτό σας". Όταν λέμε ότι ένα μήνυμα αποστέλλεται σε ένα αντικείμενο, στην πραγματικότητα καλούμε κάποια συνάρτηση αυτού του αντικειμένου (συνάρτηση συνάρτησης). Έτσι, στο παραπάνω παράδειγμα, θα καλέσουμε μια συνάρτηση που θα σχεδιάσει έναν κύκλο στην οθόνη.

Ενθυλάκωση

Η ενθυλάκωση είναι μια από τις θεμελιώδεις αρχές του αντικειμενοστρεφούς προγραμματισμού, η ιδέα της οποίας είναι ότι όλες οι ιδιότητες και οι μέθοδοι συνδυάζονται μέσα σε ένα αντικείμενο.

Το ίδιο το όνομα του όρου «ενθυλάκωση» προέρχεται από την αγγλική λέξη encapsulate, που κυριολεκτικά σημαίνει «σφράγιση σε μια κάψουλα» ή «κάλυμμα με ένα κέλυφος». Έτσι, ένα αντικείμενο (κάψουλα) περιέχει μεθόδους και ιδιότητες (περιεχόμενο).

Η έννοια της ενθυλάκωσης μπορεί να θεωρηθεί με μια ευρύτερη έννοια, πολύ πέρα ​​από το πεδίο του αντικειμενοστρεφούς προγραμματισμού στο σύνολό του. Αν μιλάμε για ενθυλάκωση στο υψηλότερο δυνατό επίπεδο αφαίρεσης, τότε η ενθυλάκωση μπορεί να θεωρηθεί ως η ικανότητα ενός αντικειμένου να περιέχει ένα συγκεκριμένο σύνολο άλλων αντικειμένων. Άρα, σε σχέση με ένα πρόγραμμα υπολογιστή, μπορούμε να πούμε ότι ενθυλακώνει πολλές ενότητες, καθεμία από τις οποίες με τη σειρά της ενθυλακώνει ορισμένα αντικείμενα που ενθυλακώνουν μεθόδους και ιδιότητες, τα οποία, παρεμπιπτόντως, μπορούν επίσης να είναι αντικείμενα κ.λπ.

Με βάση όλα όσα περιγράφονται παραπάνω, μια άλλη αναπαράσταση της ενθυλάκωσης μπορεί να θεωρηθεί οποιαδήποτε δομή δέντρου, στο οποίο οποιοσδήποτε κόμβος δέντρου ενθυλακώνει όλα τα άμεσα τέκνα του, τα οποία μπορεί να είναι είτε φύλλα (πρωτόγονα που δεν μπορούν να ενθυλακώσουν τίποτα από μόνα τους) είτε άλλοι κόμβοι.

Και όμως, αν μιλάμε για αντικειμενοστραφή προγραμματισμό, τότε η ενθυλάκωση είναι ο συνδυασμός δεδομένων και μεθόδων μέσα σε ένα αντικείμενο.

Μερικές φορές, όταν μιλάμε για ενθυλάκωση σε αντικειμενοστραφή προγραμματισμό, η έννοια της ενθυλάκωσης εξισώνεται με την έννοια του «μαύρου κουτιού» ή της απόκρυψης δεδομένων, αλλά αυτό δεν είναι το ίδιο πράγμα. Ναι, σε ορισμένες αντικειμενοστρεφείς γλώσσες προγραμματισμού, χρησιμοποιώντας ενθυλάκωση, ένας προγραμματιστής μπορεί να κάνει το αντικείμενό του μαύρο κουτί, αλλά αυτό υλοποιείται χρησιμοποιώντας τροποποιητές πρόσβασης, τους οποίους δεν διαθέτουν όλες οι αντικειμενοστρεφείς γλώσσες προγραμματισμού. Η ίδια η έννοια της ενθυλάκωσης είναι πολύ ευρύτερη. Και ακόμη επιπλέον, μπορούμε να κάνουμε όλες τις ιδιότητες και τις μεθόδους προσβάσιμες από το εξωτερικό, δηλαδή, δεν μπορεί να τεθεί θέμα κανενός μαύρου κουτιού, αλλά η ενθυλάκωση θα εξακολουθεί να υπάρχει σε οποιοδήποτε αντικείμενο. Επομένως, η απόκρυψη δεδομένων με χρήση τροποποιητών πρόσβασης είναι συνέπεια της ενθυλάκωσης, αλλά δεν είναι πανομοιότυπες έννοιες.

Πρώτον, χάρη στην ενθυλάκωση, τα αντικείμενα δεν είναι πλέον απλώς δομές δεδομένων που καθορίζονται από τον χρήστη, των οποίων ο κύριος σκοπός είναι απλώς να συνδυάσουν λογικά πολλούς διαφορετικούς τύπους δεδομένων σε ένα νέο σύνθετου τύπουδεδομένα. Χάρη στην ενθυλάκωση, κάθε αντικείμενο μπορεί πλέον να περιέχει δεδομένα που περιγράφουν την κατάσταση του αντικειμένου και τη συμπεριφορά του, που περιγράφονται με τη μορφή μεθόδων. Με άλλα λόγια, ένα αντικείμενο στον αντικειμενοστραφή προγραμματισμό έχει πάψει να είναι ένας πρωτόγονος παθητικός τύπος δεδομένων, η διαχείριση του οποίου επαφίεται πλήρως στο εξωτερικό περιβάλλον, αλλά έχει αρχίσει να έχει τη δική του συμπεριφορά, θα μπορούσε να πει κανείς, κάποιοι θα και νοημοσύνη, την ικανότητα να ανταποκρίνεται ενεργά σε εξωτερικές επιρροές και να αλλάζει την κατάστασή της και σύμφωνα με τους δικούς τους νόμους και κανόνες.

Δεύτερον, η ενθυλάκωση μας δίνει τη δυνατότητα να ελέγχουμε την πρόσβαση στα δεδομένα ενός αντικειμένου. Ο περιορισμός της ορατότητας μπορεί επίσης να θεωρηθεί ως εκδήλωση της βούλησης του ίδιου του αντικειμένου - το ίδιο το αντικείμενο αποφασίζει ποια από τη συμπεριφορά ή τις ιδιότητές του να κάνει προσιτή σε όλους, τι να κάνει προσβάσιμο μόνο σε έναν συγκεκριμένο κύκλο αντικειμένων και τι να κάνει εντελώς οικείο, που δεν θα γνωρίζει για κανένα άλλο αντικείμενο. Γιατί, αλλά επειδή μόνο το ίδιο το αντικείμενο ξέρει ακριβώς πώς να συνεργαστεί με αυτό και πώς όχι. Κάποιος μπορεί να μιλήσει ακόμη και για μια νέα φιλοσοφία προγραμματισμού, όπου τα αντικείμενα μοιάζουν περισσότερο με αντικείμενα στα οποία εκτελούνται ορισμένες ενέργειες, και, αν μου επιτρέπεται να το πω, νέα μορφήαφηρημένο συνθετικό μυαλό, αλληλεπιδρώντας με το οποίο μπορείτε να επιτύχετε το επιθυμητό αποτέλεσμα.

Και επαναλαμβάνω για άλλη μια φορά ότι χάρη στην ενθυλάκωση ένα αντικείμενο μπορεί να είναι προικισμένο με κάποια θέληση, ευφυΐα και την ικανότητα να ανταποκρίνεται εξωτερική επιρροήαντί να είναι ένα παθητικό κατάστημα δεδομένων.

Κληρονομία

Η κληρονομικότητα είναι ένας από τους τέσσερις πιο σημαντικούς μηχανισμούς αντικειμενοστρεφούς προγραμματισμού (μαζί με την ενθυλάκωση, τον πολυμορφισμό και την αφαίρεση), που σας επιτρέπει να περιγράψετε μια νέα κλάση που βασίζεται σε μια υπάρχουσα (γονική), ενώ οι ιδιότητες και η λειτουργικότητα της γονικής κλάσης δανείζονται από τη νέα τάξη.

Με άλλα λόγια, μια κλάση καταγωγής υλοποιεί τις προδιαγραφές μιας ήδη υπάρχουσας κλάσης (βασική κλάση). Αυτό σας επιτρέπει να αντιμετωπίζετε αντικείμενα μιας κλάσης καταγωγής με τον ίδιο τρόπο όπως τα αντικείμενα μιας βασικής κλάσης

Είδη κληρονομικότητας

Απλή κληρονομικότητα

Η κλάση από την οποία προέκυψε η κληρονομικότητα ονομάζεται βασική ή γονική κλάση. Οι τάξεις που προέρχονται από μια βασική κλάση ονομάζονται απόγονοι, κληρονόμοι ή παράγωγες κλάσεις.

Ορισμένες γλώσσες χρησιμοποιούν αφηρημένες τάξεις. Μια αφηρημένη κλάση είναι μια κλάση που περιέχει τουλάχιστον μια αφηρημένη μέθοδο, περιγράφεται στο πρόγραμμα, έχει πεδία, μεθόδους και δεν μπορεί να χρησιμοποιηθεί για την απευθείας δημιουργία αντικειμένου. Δηλαδή, μπορείτε να κληρονομήσετε μόνο από μια αφηρημένη τάξη. Τα αντικείμενα δημιουργούνται μόνο με βάση παραγόμενες κλάσεις που κληρονομούνται από μια αφηρημένη.

Για παράδειγμα, μια αφηρημένη τάξη μπορεί να είναι η βασική τάξη "υπάλληλος πανεπιστημίου", από την οποία κληρονομούνται οι τάξεις "πτυχιούχος φοιτητής", "καθηγητής" κ.λπ. Δεδομένου ότι οι παραγόμενες τάξεις έχουν κοινά πεδία και συναρτήσεις (για παράδειγμα, το πεδίο "έτος γέννησης»), αυτά τα μέλη μιας κλάσης μπορούν να δηλωθούν σε μια βασική κλάση. Το πρόγραμμα δημιουργεί αντικείμενα με βάση τις τάξεις "πτυχιούχος φοιτητής" και "καθηγητής", αλλά δεν έχει νόημα να δημιουργήσετε ένα αντικείμενο με βάση την τάξη "υπάλληλος πανεπιστημίου".

Πολλαπλή κληρονομιά

Στην πολλαπλή κληρονομικότητα, μια κλάση μπορεί να έχει περισσότερους από έναν προγόνους. Σε αυτήν την περίπτωση, η κλάση κληρονομεί τις μεθόδους όλων των προγόνων. Τα πλεονεκτήματα αυτής της προσέγγισης είναι η μεγαλύτερη ευελιξία. Η πολλαπλή κληρονομικότητα υλοποιείται στη C++. Άλλες γλώσσες που παρέχουν αυτή τη δυνατότητα περιλαμβάνουν Python και Eiffel. Η πολλαπλή κληρονομικότητα υποστηρίζεται στη γλώσσα UML.

Πολλαπλή κληρονομιά - πιθανή πηγήσφάλματα που μπορεί να προκύψουν λόγω της παρουσίας πανομοιότυπων ονομάτων μεθόδων στους προγόνους. Σε γλώσσες που τοποθετούνται ως διάδοχοι της C++ (Java, C#, κ.λπ.), αποφασίστηκε να εγκαταλειφθεί η πολλαπλή κληρονομικότητα υπέρ των διεπαφών. Μπορείτε σχεδόν πάντα να το κάνετε χωρίς να χρησιμοποιήσετε αυτόν τον μηχανισμό. Ωστόσο, εάν παρόλα αυτά προκύψει μια τέτοια ανάγκη, τότε, για την επίλυση διενέξεων στη χρήση κληρονομικών μεθόδων με τα ίδια ονόματα, είναι δυνατόν, για παράδειγμα, να χρησιμοποιηθεί η λειτουργία επέκτασης ορατότητας - "::" - για να καλέσετε μια συγκεκριμένη μέθοδο συγκεκριμένο γονέα.

Μια προσπάθεια επίλυσης του προβλήματος της ύπαρξης πανομοιότυπων ονομάτων μεθόδων στους προγόνους έγινε στη γλώσσα Eifel, στην οποία, κατά την περιγραφή μιας νέας τάξης, είναι απαραίτητο να υποδεικνύονται ρητά τα εισαγόμενα μέλη καθεμιάς από τις κληρονομικές τάξεις και η ονομασία τους στο παιδί. τάξη.

Οι περισσότερες σύγχρονες αντικειμενοστρεφείς γλώσσες προγραμματισμού (C#, C++, Java, Delphi, κ.λπ.) υποστηρίζουν τη δυνατότητα ταυτόχρονης κληρονομιάς από μια κλάση προγόνων και εφαρμογής μεθόδων πολλών διεπαφών με την ίδια κλάση. Αυτός ο μηχανισμός σάς επιτρέπει να αντικαταστήσετε σε μεγάλο βαθμό πολλαπλή κληρονομικότητα - οι μέθοδοι διεπαφής πρέπει να παρακάμπτονται ρητά, γεγονός που εξαλείφει τα σφάλματα κατά την κληρονομικότητα της λειτουργικότητας πανομοιότυπων μεθόδων διαφορετικών τάξεων προγόνων.

  1. Πρακτικό μέρος

Για την επίλυση του προβλήματος, χρησιμοποιείται μια αντικειμενοστραφή δομή προγράμματος. Το πρόγραμμα αντιπροσωπεύεται από δύο κλάσεις και ένα κύριο αρχείο cpp που περιέχει διεπαφή χρήστηγια ευκολία στην εργασία με λίστες.

Η κλάση cList είναι μια γραμμική, μεμονωμένα συνδεδεμένη λίστα που αποτελείται από αντικείμενα της κλάσης cElement.

Η κλάση cElement έχει την ακόλουθη δομή:

cElement *next;

~ceElement(void);

void setdata(int);

void setref(cElement*);

cElement* getref();

Το πεδίο δεδομένων τύπου int περιέχει αριθμητική αξίαστοιχείο λίστας, το επόμενο πεδίο του τύπου cElement* - ένας σύνδεσμος προς το επόμενο στοιχείο της λίστας. Οι μέθοδοι setdata και getdata χρησιμοποιούνται για πρόσβαση στο πεδίο ιδιωτικών δεδομένων της κλάσης προκειμένου να ληφθεί και να οριστεί η τιμή ανάλογα αυτού του τομέα. Η μέθοδος setref χρησιμοποιείται για να ορίσετε μια σύνδεση από το τρέχον στο επόμενο στοιχείο της λίστας και το getref χρησιμοποιείται για τη μετάβαση στο επόμενο στοιχείο.

void cElement::setdata(int sd)

int ceElement::getdata()

returnthis->data;

void cElement::setref(cElement* rf)

cElement* cElement::getref()

returnthis->next;

Η υλοποίηση αυτών των μεθόδων είναι εξαιρετικά απλή, όπως φαίνεται από τους κωδικούς προγραμμάτων τους που παρουσιάστηκαν παραπάνω.

Τώρα ας δούμε τη δομή της κλάσης cList

#include"ceElement.h"

ceElement *head;

void Προσθήκη(int);

void Insert(int, int);

void Remove(int);

void RemoveAll();

Αυτή η κλάση περιέχει έναν σύνδεσμο προς το στοιχείο head της λίστας - head, τύπου cElement*. Η αποθήκευση αυτού του συνδέσμου είναι απαραίτητη για τη σωστή εκτέλεση των λειτουργιών προσθήκης, διαγραφής δεδομένων και εκτύπωσης της λίστας. Το πράγμα είναι ότι, όταν εκτελείτε οποιαδήποτε από τις παραπάνω λειτουργίες, τα στοιχεία της λίστας απαριθμούνται για να φτάσετε στο επιθυμητό, ​​καθώς η λίστα δεν έχει τυχαία πρόσβαση στα στοιχεία, επομένως είναι πιο λογικό να ξεκινήσετε την απαρίθμηση από την "κεφαλή" του λίστα. Εκτός από έναν σύνδεσμο προς την αρχή της λίστας, κάθε αντικείμενο αυτής της κλάσης θα έχει ένα πεδίο elcount, το οποίο περιέχει τον αριθμό των στοιχείων στη λίστα.

Ας συνεχίσουμε την εξέταση αυτής της τάξης μελετώντας τις μεθόδους που εφαρμόζονται σε αυτήν για την εργασία με λίστες.

Προσθήκη μεθόδου - προσθήκη δεδομένων στο τέλος της λίστας.

Ως παράμετρος, αυτή η μέθοδος λαμβάνει μια αριθμητική τιμή (μεταβλητή xd), η οποία πρέπει να αποθηκευτεί στο προστιθέμενο στοιχείο λίστας.

void cList::Add(int xd)

Έτσι δημιουργείται ένα νέο στοιχείο και ορίζεται η τιμή του αριθμητικού του πεδίου:

cElement *temp = newcElement;

temp->setdata(xd);

Στη συνέχεια ελέγχεται ο αριθμός των στοιχείων της λίστας· εάν η λίστα είναι κενή, τότε δημιουργείται το στοιχείο κεφαλής, διαφορετικά δημιουργείται το "συνηθισμένο" στοιχείο λίστας:

αν (elcount ==0)

temp->setref(NULL);

temp->setref(NULL);

p->setref(temp);

Θα παρατηρήσετε ότι η παραπάνω κατασκευή χρησιμοποιεί τη μέθοδο setref της κλάσης cElement, η οποία είναι απαραίτητη για να ορίσετε μια αναφορά στο επόμενο στοιχείο της λίστας, διαφορετικά η λίστα θα αποσυνδεθεί, γεγονός που μπορεί να οδηγήσει σε απώλεια δεδομένων και λανθασμένη λειτουργία προγράμματος.

Όταν ξεκινάτε για πρώτη φορά το πρόγραμμα, η μέθοδος που περιγράφεται παραπάνω χρησιμοποιείται για τη διαδοχική προσθήκη στοιχείων σε μια λίστα με τα οποία μπορείτε στη συνέχεια να εργαστείτε για να σταματήσετε να πληκτρολογείτε γραμμή εντολώνείναι απαραίτητο να εισαγάγετε την εντολή «stop» αντί για την αριθμητική τιμή του στοιχείου (βλ. Εικόνα 1).

Εικόνα 1 – Η διαδικασία προσθήκης στοιχείων στη λίστα

Αφού εισαγάγετε την εντολή "stop", η λίστα εκτυπώνεται και το πρόγραμμα μεταβαίνει σε λειτουργία αναμονής εντολών (βλ. Εικόνα 2).

Εικόνα 2 - Έντυπη λίστα

Μέθοδος εκτύπωσης - εκτυπώνει τη λίστα.

Για την εκτύπωση, είναι σημαντικό να γνωρίζετε την αρχή της λίστας για να εκτυπώσετε διαδοχικά τις τιμές όλων των στοιχείων της λίστας, επομένως μια αναφορά στην "κεφαλή" της λίστας ορίζεται στη μεταβλητή temp, μετά την οποία ελέγχεται η ύπαρξη της λίστας και εμφανίζεται το αντίστοιχο μήνυμα, εάν δεν επιβεβαιωθεί, εάν η λίστα δεν είναι κενή, τότε εμφανίζεται στην οθόνη:

void cList::Print()

cElement * temp = κεφάλι;

if (temp == NULL) cout while (temp != NULL)

temp = temp->getref();

Μέθοδος Del - κατάργηση του αρχικού στοιχείου της λίστας.

Για να αφαιρέσετε το αρχικό στοιχείο, πρέπει πρώτα να μετακινήσετε την αναφορά στο επόμενο στοιχείο της λίστας, κάνοντάς το πρώτο με αυτόν τον τρόπο και, στη συνέχεια, να διαγράψετε το απαιτούμενο στοιχείο:

voidcList::Del()

cElement * temp = κεφάλι;

head = head->getref();

Μέθοδος RemoveAll - καταργεί ολόκληρη τη λίστα.

Αυτή η μέθοδος βασίζεται στα παραπάνω και συνίσταται στη διαδοχική διαγραφή των αρχικών στοιχείων της λίστας μέχρι να διαγραφεί ολόκληρη η λίστα.

void cList::RemoveAll()

ενώ (elcount!=0)

Για να εκτελέσετε αυτήν τη μέθοδο, πρέπει να εισαγάγετε την εντολή "dellist" στο μενού για εργασία με μια λίστα (βλ. Εικόνα 3).

Εικόνα 3 – Εισαγωγή εντολής για εκκαθάριση της λίστας

Και αν ο χρήστης είναι πραγματικά σίγουρος για τις ενέργειές του, πρέπει να αποδεχτεί την προσφορά του προγράμματος, μετά την οποία θα διαγραφεί ολόκληρη η λίστα (βλ. Εικόνα 4).

Εικόνα 4 – Κενή λίστα

Μέθοδος κατάργησης - καταργεί ένα συγκεκριμένο στοιχείο λίστας.

Μια λιγότερο ριζοσπαστική μέθοδος από την προηγούμενη. Μόνο ένα στοιχείο της λίστας, που καθορίζεται ως παράμετρος, διαγράφεται. Αυτό συμβαίνει ως εξής: το πρόγραμμα ελέγχει πρώτα την ορθότητα της εισαγόμενης παραμέτρου, εάν ο αριθμός του στοιχείου που διαγράφεται είναι μικρότερος από ένα ή μεγαλύτερος από τον συνολικό αριθμό στοιχείων της λίστας, τότε εμφανίζει ένα μήνυμα σφάλματος, αλλά εάν Το πρόγραμμα δεν έχει παράπονα σχετικά με την εισαγόμενη παράμετρο, τότε οι απαραίτητοι σύνδεσμοι στοιχείων που βρίσκονται κοντά μεταφέρονται με αυτό που διαγράφεται, έτσι ώστε η λίστα να παραμείνει συσχετισμένη, μετά την οποία διαγράφεται το απαιτούμενο στοιχείο.

void cList::Remove(int del)

cElement *cur = κεφάλι, *de;

εάν ((del>=1) && (del

head = head->getref();

ενώ (j!=del-1)

cur = cur->getref();

de=cur->getref();

cur->setref(de->getref());

coutsystem("παύση");

Για να εκτελέσετε αυτήν τη μέθοδο, πρέπει να εισαγάγετε την εντολή "διαγραφή" στο μενού για εργασία με τη λίστα. Στη συνέχεια, πληκτρολογήστε τον αριθμό του στοιχείου που θα διαγραφεί ή την εντολή «πίσω» για να ακυρώσετε τη διαγραφή (βλ. Εικόνα 5).

Εικόνα 5 – διαδικασία διαγραφής ενός στοιχείου λίστας

Η λίστα μετά την αφαίρεση του τέταρτου στοιχείου θα μοιάζει με αυτό (βλ. Εικόνα 6).

Εικόνα 6 – Λίστα μετά την αφαίρεση ενός στοιχείου

Μέθοδος εισαγωγής - εισαγωγή νέου στοιχείου σε καθορισμένο μέροςστη λίστα.

Αυτή η μέθοδος λαμβάνει ως παραμέτρους: τη θέση του στοιχείου που θα προστεθεί και την αριθμητική του τιμή. Το νέο στοιχείο θα τοποθετηθεί ακριβώς στην καθορισμένη θέση, επομένως, τα στοιχεία που βρίσκονται στα δεξιά του τρέχοντος θα μετατοπιστούν κατά μία θέση. Όταν προσθέτετε ένα νέο στοιχείο στην αρχή της λίστας, χρειάζεται απλώς να μετακινήσετε τον σύνδεσμο από αυτό το στοιχείο στο επόμενο, συνδέοντας έτσι τη λίστα και να καθορίσετε έναν σύνδεσμο προς το αρχικό στοιχείο. Μια ελαφρώς διαφορετική κατάσταση προκύπτει όταν προσθέτετε ένα νέο στοιχείο μεταξύ δύο υπαρχόντων. Για να το κάνετε αυτό, χρησιμοποιήστε έναν βρόχο για να φτάσετε στο σημείο όπου έχει εισαχθεί το στοιχείο και, στη συνέχεια, συσχετίστε τα στοιχεία που βρίσκονται δεξιά και αριστερά από αυτό με το νέο στοιχείο. Σε τελική ανάλυση, τι πρέπει να γίνει, για παράδειγμα, εάν είναι απαραίτητο να επιμηκύνετε την αλυσίδα: είναι απαραίτητο να την ανοίξετε, στη συνέχεια να συνδέσετε έναν νέο σύνδεσμο στο πρώτο μέρος της αλυσίδας, να συνδέσετε έναν δεύτερο στον ίδιο σύνδεσμο, Κάτι παρόμοιο εφαρμόζεται σε αυτή τη μέθοδο. Αξίζει να σημειωθεί ότι εάν καθορίσετε μια εσφαλμένη θέση για προσθήκη, η οποία είναι μικρότερη από μία ή περισσότερα από τον συνολικό αριθμό στοιχείων, το πρόγραμμα θα εμφανίσει το κατάλληλο μήνυμα σφάλματος.

void cList::Insert (int pos, int val)

cElement *cur = κεφάλι;

cElement *temp = νέο cElement;

temp->setdata(val);

εάν ((pos>=1) && (θέ

temp->setref(head);

ενώ (j!=pos-1)

cur = cur->getref();

p=cur->getref();

cur->setref(temp);

temp->setref(p);

coutsystem("παύση");

Για να εκτελέσετε αυτήν τη μέθοδο, πρέπει να εισαγάγετε την εντολή "εισαγωγή" στο μενού για εργασία με τη λίστα. Στη συνέχεια, εισαγάγετε τη θέση και την αριθμητική τιμή του στοιχείου που θα προστεθεί ή την εντολή «πίσω» για να ακυρώσετε τη διαγραφή (βλ. Εικόνα 7).

Εικόνα 7 - Διαδικασία εισαγωγής στοιχείου

Η λίστα αφού προσθέσετε ένα στοιχείο με την τιμή 111 στην τρίτη θέση, η λίστα θα μοιάζει με αυτό (βλ. Εικόνα 8).

Εικόνα 8 – Λίστα μετά την προσθήκη ενός στοιχείου

Κατά την περιγραφή, το μενού για εργασία με τη λίστα αναφέρθηκε περισσότερες από μία φορές· μένει να σημειωθεί ότι αυτό το μενού διευκολύνει σημαντικά την εργασία με τη λίστα. Ο αλγόριθμος λειτουργίας του συνίσταται στην κυκλική κλήση των ίδιων μεθόδων, στην εκτύπωση μιας λίστας, για παράδειγμα, μέχρι να εισαχθεί μια συγκεκριμένη εντολή. Μπορείτε να δείτε μια λίστα με τις διαθέσιμες εντολές εισάγοντας "help" στην κονσόλα (βλ. Εικόνα 9)

Εικόνα 9 - Διαθέσιμες εντολές

Ο πλήρης κωδικός μενού παρουσιάζεται στο Παράρτημα Α.

  1. Δοκιμές

Συχνά στη διαδικασία της εργασίας προκύπτουν καταστάσεις που σχετίζονται με λανθασμένα εισαγωγή δεδομένων, το οποίο μπορεί να προκαλέσει διακοπή λειτουργίας του προγράμματος. Φυσικά, κάθε πρόγραμμα πρέπει να εφαρμόζει αλγόριθμους προστασίας έναντι άπειρος χρήστης, προειδοποιώντας το πρόγραμμα για αποτυχία. Ας εξετάσουμε πώς λειτουργούν τέτοιοι αλγόριθμοι στο δημιουργημένο πρόγραμμα.

Η αρχική καταχώριση της λίστας υλοποιείται από τον παρακάτω κωδικό:

αν (atoi(ss)!=NULL)

mylist.Add(atoi(s));

Πριν καλέσετε τη μέθοδο προσθήκης για να προσθέσετε ένα νέο στοιχείο στη λίστα, ελέγχεται η εισαγόμενη συμβολοσειρά. Η συνάρτηση atoi μετατρέπει μια τιμή συμβολοσειράς σε αριθμητική τιμή και επιστρέφει NULL εάν η συμβολοσειρά εισόδου δεν είναι αριθμός. Έτσι, κατά την εισαγωγή, τυχόν γραμμές που δεν είναι αριθμοί θα αγνοηθούν, εκτός από τη γραμμή με την εντολή διακοπής εισαγωγής (βλ. Εικόνα 10).

Εικόνα 10 – Εισαγωγή λανθασμένων δεδομένων

Αφού εισαγάγετε τέτοια δεδομένα, η λίστα θα μοιάζει με αυτό (βλ. Εικόνα 11).

Εικόνα 11 – Λίστα ληφθέντων

Το πρόγραμμα συνεχίζει να λειτουργεί σωστά ακόμα και μετά την εισαγωγή λανθασμένων δεδομένων. Παρόμοιες μέθοδοι αντιμετώπισης εσφαλμένων δεδομένων χρησιμοποιούνται για άλλες λειτουργίες εισαγωγής που υπάρχουν στο πρόγραμμα.

συμπέρασμα

Στην εργασία αυτή αποκτήθηκαν έννοιες για αφηρημένους τύπους δεδομένων, για τις αρχές της αναπαράστασής τους σε σύγχρονες γλώσσες προγραμματισμού και ειδικότερα στη C++. Στις περισσότερες σύγχρονες γλώσσες επιτακτικής, η κύρια έννοια που χρησιμοποιείται για την περιγραφή των αφαιρέσεων στον κώδικα προγράμματος είναι η αντικειμενοστραφής προσέγγιση. Ο αντικειμενοστραφής προγραμματισμός (OOP), όπως και η προσέγγιση ADT στον προγραμματισμό, είναι, σε κάποιο βαθμό, μια ανάπτυξη ιδεών σχετικά με τον αρθρωτό προγραμματισμό. Οι ενότητες είναι στοιχεία του προγράμματος, τα οποία έχουν δύο σημαντικές ιδιότητες:

Οι ενότητες κρύβουν λεπτομέρειες υλοποίησης μέσα τους.

Οι ενότητες μπορούν να επαναχρησιμοποιηθούν σε διαφορετικά μέρη του προγράμματος.

Ο Ντέιβιντ Πάρνας, στην εργασία του το 1972, αντιλήφθηκε τις ενότητες ως αφηρημένες μηχανές που αποθηκεύουν την κατάσταση μέσα τους και επιτρέπουν σε αυτήν την κατάσταση να αλλάξει μέσω ενός συγκεκριμένου συνόλου λειτουργιών. Αυτή η έννοια είναι θεμελιώδης τόσο για την έννοια των αφηρημένων τύπων δεδομένων όσο και για τον αντικειμενοστραφή προγραμματισμό. Κάνοντας παραλληλισμούς ανάμεσα στο έργο του Πάρνα και τις σύγχρονες έννοιες του OOP, είναι εύκολο να παρατηρήσει κανείς τη σχέση μεταξύ των εννοιών της τάξης και της ενότητας.

Σε αυτή την εργασία, οι γραμμικές λίστες μεμονωμένα συνδεδεμένα, που είναι ένας αφηρημένος τύπος δεδομένων, αντιπροσωπεύονται από ανεπτυγμένες ενότητες, για πρόσβαση στις καταστάσεις των οποίων υλοποιούνται επίσης ειδικές λειτουργίες, που ονομάζονται μέθοδοι στον αντικειμενοστραφή προγραμματισμό.

Βιβλιογραφία

1. Ian Graham Αντικειμενοστρεφείς μέθοδοι. Principles and Practice = Αντικειμενοστρεφείς Μέθοδοι: Αρχές & Πρακτική. - 3η έκδ. - M.: “Williams”, 2004. - P. 880.

2. Anthony Sintes Μάθετε τον εαυτό σας αντικειμενοστραφή προγραμματισμό σε 21 ημέρες. - M.: “Williams”, 2002. - Σ. 672.

3. Bertrand Meyer Αντικειμενοστραφής σχεδιασμός συστημάτων λογισμικού + CD. Internet University of Information Technologies - INTUIT.ru, Ρωσική Έκδοση, 2005

4. Billig V.A. Βασικά στοιχεία προγραμματισμού σε C#. Internet University of Information Technologies - INTUIT.ru, 2006

5. «Νέες γλώσσες προγραμματισμού και τάσεις στην ανάπτυξή τους», Ushkova V., 2005.

6. Bjarne Stroustrup “The C++ Programming Language” Special edition ή 3rd edition ed. Binom, Nevsky Dialect, ISBN 5-7989-0226-2, 5-7940-0064-3, 0-201-70073-5

7. Bjarne Stroustrup «Σχεδίαση και εξέλιξη της γλώσσας C++». DMK-Press, Αγία Πετρούπολη, ISBN 5-469-01217-4, 0-201-54330-3

8. Bjarne Stroustrup «Αρχές προγραμματισμού και πρακτική χρήσης της C++». "I.D. Williams", 2011, ISBN 978-5-8459-1621-1 (Ρωσικά)

9. Gradi Buch et al. «Αντικειμενοστρεφής ανάλυση και σχεδίαση με παραδείγματα εφαρμογών» 2η ή 3η έκδοση. Binom, Nevsky Dialect, Williams ISBN 978-5-8459-1401-9, 0-201-89551-X, 0-8053-5340-2, 5-7989-0067-3, 5-7940-0017-1

10. Scott Meyers "Αποτελεσματική χρήση της C++. 50 συστάσεις για τη βελτίωση των προγραμμάτων και έργων σας" DMK, Peter, ISBN 0-201-92488-9, 5-93700-006-4, 5-469-01213-1

Παράρτημα Α

Κωδικός μενού

#include "cList.h"

#include "string.h"

χρησιμοποιώντας namespace std?

coutwhile (strstr(ss,"stop")==NULL)

αν (atoi(ss)!=NULL)

mylist.Add(atoi(s));

system("cls");

ενώ (strstr(com,exit")==NULL)

coutmylist.Print();

if (strstr(com,"help")!=NULL) com_ind=1;

if (strstr(com"add")!=NULL) com_ind=2;

if (strstr(com,insert")!=NULL) com_ind=3;

if (strstr(com"delete")!=NULL) com_ind=4;

if (strstr(com,"dellist")!=NULL) com_ind=5;

switch(com_ind)

system("cls");

system("cls");

coutcoutcoutcoutcoutcoutcoutcom_ind=0;

if (strstr(ss,back")==NULL)

αν (atoi(ss)!=NULL)

mylist.Add(atoi(s));

system("cls");

//εισαγωγή στοιχείων

if (strstr(ss,back")==NULL)

αν (atoi(ss)!=NULL)

system("cls");

if (strstr(ss,back")==NULL)

αν (atoi(ss)!=NULL)

mylist.Insert(pos,atoi(s));

system("cls");

//διαγραφή στοιχείων

αν (strstr(ss,back")==NULL) ορίζεται από ένα σύνολο τιμών δεδομένοςκαι ένα σύνολο λειτουργιών... συνδεδεμένων δομών δεδομένακονίστρα. Δομή δεδομέναείναι μια συλλογή στοιχείων δεδομένα, μεταξύ των οποίων... στον υπολογιστή ονομάζεται μνήμη αφηρημένηή λογικό. Πιο συχνά...

  • Πολλαπλούς τύπος δεδομένα. Σκηνικά

    Διάλεξη >> Πληροφορική, προγραμματισμός

    ... τύποςπαρόμοια με τα απλά τύπους δεδομένα. Πολλαπλούς τύπουςπεριγράφονται στην ενότητα τύπους... Το RT μπορεί να περιγραφεί. Αφηρημένηυπολογιστικές δομές που περιγράφουν την είσοδο... άλλες περιπτώσεις τύπουςόλα τα εξαρτήματα λίσταπρέπει να ταιριάζουν τύποςστοιχεία αρχείου. ...

  • Αντικειμενοστρεφείς βάσεις δεδομένων δεδομέναπου λειτουργούν σε κατανεμημένα δίκτυα

    Περίληψη >> Επιστήμη Υπολογιστών

    Ανάπτυξη περιοχών γλωσσών προγραμματισμού με αφηρημένη τύπους δεδομένακαι αντικειμενοστρεφείς γλώσσες προγραμματισμού. ... τύπους δεδομένα- λίστα και πίνακας. Κάθε κυριολεξία προσδιορίζεται μοναδικά από ένα ευρετήριο στον πίνακα και έναν σειριακό αριθμό μέσα λίστα ...

  • Αφηρημένημοντέλα ασφάλειας πληροφοριών

    Περίληψη >> Επιστήμη Υπολογιστών

    Προστασία πληροφοριών………………………………………………………………..17 Αφηρημένημοντέλα ασφάλειας πληροφοριών... που διέπουν την αλληλεπίδραση και με τα δύο τύπους δεδομένα(Κανόνες Πιστοποίησης): Όλες οι... διάφορες παραλλαγές και προσθήκες στην υπάρχουσα λίστα. Επίπεδα ασφαλείας - σίγουρα...

  • Περίληψη ονομάζεται συνήθως ένας τύπος δεδομένων που δεν υπάρχει ρητά σε μια γλώσσα προγραμματισμού· με αυτή την έννοια, αυτή είναι μια σχετική έννοια - ένας τύπος δεδομένων που απουσιάζει σε μια γλώσσα προγραμματισμού μπορεί να υπάρχει σε μια άλλη.

    Αφηρημένος τύπος δεδομένων(ATD) ορίζεται ανεξάρτητα από τη μέθοδο εφαρμογής του:

    § Πολλά πιθανές τιμέςαυτός ο τύπος

    § και ένα σύνολο πράξεων με τιμές αυτού του τύπου.

    Η χρήση του ADT μπορεί να περιοριστεί στο στάδιο ανάπτυξης λογισμικό, αλλά για να το χρησιμοποιήσετε ρητά σε ένα πρόγραμμα, πρέπει να έχετε την υλοποίησή του με βάση τους υπάρχοντες (και προηγουμένως εφαρμοσμένους) τύπους δεδομένων στη γλώσσα προγραμματισμού:

    § ένας τρόπος αναπαράστασης τιμών αυτού του τύπου,

    § και υλοποίηση πράξεων με τιμές αυτού του τύπου.

    Η ADT δεν είναι προκαθορισμένη σε μια γλώσσα προγραμματισμού, και ακόμη περισσότερο, οι εργασίες κατασκευής τέτοιων τύπων, προκαθορισμένες στη γλώσσα, μετατοπίζουν στον προγραμματιστή-προγραμματιστή το ερώτημα πώς να αναπαραστήσουν τιμές αυτού του τύπου και να εφαρμόσουν λειτουργίες με τιμές αυτού του τύπου. Επομένως, για τέτοιους τύπους δεδομένων το ερώτημα αφορά την επιλογή ορισμών και μεθόδων για την υλοποίηση λειτουργιών της φόρμας κατασκευαστής (αξίες και αποθήκες δεδομένων) αυτού του τύπου, εκλέκτορας Και τροποποιητής στοιχεία (τιμές και αποθήκες δεδομένων) αυτού του τύπου ανήκουν στον προγραμματιστή.

    Στην έννοια ATD ειδικό καθεστώςΕχω μια ιδέα διεπαφή , ανοιχτό στο χρήστη και εκτέλεση , κρυμμένο από αυτόν. Ειδικός ρόλοςαπό αυτές τις έννοιες στην έννοια της ADT συνδέεται με τη θεμελιώδη θέση για την ανεξαρτησία της έννοιας της ADT από τη μέθοδο εφαρμογής της.

    Στις σύγχρονες «πρακτικές γλώσσες προγραμματισμού», χρησιμοποιείται συνήθως μια προκαθορισμένη κατασκευή κατασκευής για την κατασκευή ενός ADT τάξη , το οποίο δίνει στον προγραμματιστή-προγραμματιστή όχι μόνο τα μέσα ομαδοποίησης δεδομένων και λειτουργιών (με αυτά τα δεδομένα) σε ένα ενιαίο σύνολο, αλλά και τα μέσα ενθυλάκωσης, κληρονομικότητας και πολυμορφισμού για τον έλεγχο του τρόπου κατασκευής και πρόσβασης αυτών των δεδομένων. Σημειώστε ότι μια κλάση περιγράφει μια πιθανή υλοποίηση ενός ADT, η αντιστοίχιση μιας κλάσης σε μια ADT εκφράζεται με μια συνάρτηση αφαίρεσης, αλλά η αντίστροφη σχέση συνήθως δεν είναι λειτουργική· μπορεί να υπάρχουν πολλές υλοποιήσεις του ίδιου ADT.



    Στην έρευνα για αφηρημένους τύπους δεδομένων, ο σημαντικός ρόλος της έννοιας " παραμετροποίηση τύπου " Πράγματι, για παράδειγμα, η «Στοίβα» ADT δεν εξαρτάται από τον τύπο των στοιχείων της στοίβας, αλλά είναι αδύνατο να εφαρμοστεί αυτό το ADT δείχνοντας «στοιχεία πανομοιότυπου τύπου». Στη γλώσσα προγραμματισμού Ada, αρχικά συμπεριλήφθηκαν κατάλληλα εργαλεία για την κατασκευή παραμετροποιημένων τύπων δεδομένων, και στις σύγχρονες «πρακτικές γλώσσες προγραμματισμού», τα οποία εργαλεία εμφανίστηκαν μόνο από την έλευση της ανάπτυξης χρησιμοποιώντας τη βιβλιοθήκη STL. Σήμερα η έννοια του «γενικευμένου προγραμματισμού» απασχολεί σημαντική θέση V πρακτικός προγραμματισμόςχάρη στην ένταξη σε "πρακτικές γλώσσες προγραμματισμού" εργαλεία για την κατασκευή παραμετροποιημένων τύπων δεδομένων (πρότυπα, πρότυπο , γενικός) .

    Όλα τα παραπάνω σημαίνουν ότι, από μεθοδολογική και θεωρητική άποψη, πιο αναλυτικά ακριβής ορισμόςτην έννοια του «αφηρημένου τύπου δεδομένων». Θεωρητικά, η έννοια του "αφηρημένου τύπου δεδομένων" ορίζεται συνήθως ως αλγεβρικό σύστημα πολλαπλών ταξινομήσεων (πολλαπλών βασικών). , στο οποίο, εκτός από το σύνολο των πιθανών τιμών (φορέας) και το σύνολο των πράξεων σε τέτοιες τιμές, επισημαίνονται οι ακόλουθες έννοιες:

    § Ταξινόμηση και υπογραφή - αυτές οι έννοιες σάς επιτρέπουν να ταξινομήσετε τόσο στοιχεία μέσων όσο και λειτουργίες με αυτά σύμφωνα με τους τύπους τους (για πράξεις - σύμφωνα με τους τύπους των ορισμάτων τους και την τιμή επιστροφής).

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

    Σε αυτή τη βάση, είναι δυνατό να εξεταστούν αφηρημένοι τύποι δεδομένων από μια ενιαία ολιστική λογικοαλγεβρική άποψη, συμπεριλαμβανομένων ερωτήσεων σχετικά με κατασκευαστές (τύπους και τιμές), επιλογείς και τροποποιητές ιδιοτήτων για αντικείμενα αυτού του τύπου.

    Οι έννοιες «δομή δεδομένων» και «αφηρημένος τύπος δεδομένων» είναι πολύ κοντινές κατά κάποιο τρόπο. Μπορεί κανείς, φυσικά, να υποθέσει ότι αυτές οι έννοιες είναι απλώς δύο απόψεις του ίδιου πράγματος. Ο τρόπος με τον οποίο ένα ADT αντιπροσωπεύει τις τιμές βασίζεται πάντα σε κάποια δομή δεδομένων, λιγότερο ή πιο περίπλοκη, και η υλοποίηση πράξεων σε τέτοιες τιμές εξαρτάται φυσικά από αυτήν την επιλεγμένη δομή δεδομένων. Από την άλλη, αν το θέλουμε πραγματικά, μπορούμε πάντα να σχεδιάσουμε τη δομή δεδομένων που μας ενδιαφέρει ως ADT.

    Ωστόσο, θα κάνουμε διάκριση μεταξύ αυτών των δύο εννοιών, λαμβάνοντας υπόψη:

    § Αφηρημένος τύπος δεδομένων - υποδηλώνει ένα ορισμένο επίπεδο αφαίρεσης για τον καθορισμό ενός εφαρμοζόμενου (domain-oriented) τύπου δεδομένων, ανεξάρτητα από τις μεθόδους εφαρμογής του, και είναι δυνατό να συμπεριληφθεί αυτός ο τύπος δεδομένων σε μια βιβλιοθήκη εφαρμογών, τουλάχιστον για η συγκεκριμένη ανάπτυξη ενός συγκεκριμένου συστήματος λογισμικού. Ένα ADT μπορεί να έχει πολλές εναλλακτικές υλοποιήσεις που βασίζονται σε διαφορετικές δομές δεδομένων.

    § Η δομή δεδομένων είναι μάλλον ένα συγκεκριμένο σχήμα για την οργάνωση και τη διαχείριση δεδομένων, το οποίο απαιτεί κατάλληλες προδιαγραφές όταν χρησιμοποιείται σε συγκεκριμένες καταστάσεις κατά την επίλυση συγκεκριμένων προβλημάτων.

    Οι αφηρημένοι τύποι δεδομένων περιλαμβάνουν κυρίως μαθηματικά βασικά αλγεβρικά συστήματα - ακολουθίες, σύνολα, σχέσεις και αντιστοιχίσεις (συναρτησιακές σχέσεις, συναρτήσεις). Αλλά στον προγραμματισμό, το πρώτο πλάνο δεν είναι η μελέτη των γενικών ιδιοτήτων αυτών των μαθηματικών εννοιών, αλλά η δυνατότητα χρήσης τους στην ανάπτυξη μοντέλων για την επίλυση προβλημάτων στην θεματική περιοχή, αλγορίθμων για την επίλυση αυτών των προβλημάτων και η αποτελεσματική εφαρμογή του αναπτυγμένους αλγόριθμους. Ως εκ τούτου, στον προγραμματισμό με τη μορφή ADT, αφενός, συνήθως επισημοποιούνται περιορισμένες εκδόσεις αυτών των βασικών αλγεβρικών συστημάτων και, αφετέρου, επεκτείνονται με εξειδικευμένα σύνολα πράξεων που παρουσιάζουν ρεαλιστικό ενδιαφέρον από την άποψη του πεδίο εφαρμογής.

    2.1. Αλληλουχία.

    Μια άπειρη (πεπερασμένη) ακολουθία ορίζεται τυπικά ως μια συνάρτηση της οποίας το πεδίο ορισμού είναι το σύνολο των θετικών ακεραίων: f(i)= , . Σε πολλές περιπτώσεις, είναι πιο βολικό να ευρετηριάζετε μια ακολουθία από την αρχή. τότε ο τομέας του / θα είναι το σύνολο των μη αρνητικών ακεραίων. Ομοίως, ορίζουμε μια πεπερασμένη ακολουθία ή λίστα ως μια συνάρτηση της οποίας το πεδίο ορισμού είναι το σύνολο (1, 2, ..., ).

    Η έννοια της ακολουθίας, στην οποία τα στοιχεία διαδέχονται το ένα το άλλο, είναι θεμελιώδης στον προγραμματισμό. Εμφανίζεται μια ακολουθία στην έξοδο γραμμή προς γραμμή του κώδικα ενός προγράμματος υπολογιστή, όπου η σειρά των εντολών καθορίζει τις ενέργειες που εκτελεί το πρόγραμμα. Ακολουθία πακέτα δικτύουσυνθέτει ένα μήνυμα email επειδή το μήνυμα θα έχει νόημα μόνο εάν τα πακέτα ληφθούν με την ίδια σειρά με την οποία στάλθηκαν. Οι ακολουθίες αντιπροσωπεύουν σημαντικές σχέσεις μεταξύ αντικειμένων όπως "επόμενο" και "προηγούμενο". Επιπλέον, οι ακολουθίες χρησιμοποιούνται συχνά για την υλοποίηση άλλων δομών δεδομένων, δηλαδή αντιπροσωπεύουν τα μπλοκ στα οποία βασίζεται ο σχεδιασμός τέτοιων δομών.

    ¨ Το σύνολο των πιθανών τιμών είναι μια πεπερασμένη ακολουθία στοιχείων του ίδιου τύπου.

    ¨ Σύνολο λειτουργιών:

    § Εισάγετεστοιχείο σε σειρά.

    § Διαγράφωστοιχείο από την ακολουθία.

    § Κοίτα– μια συνάρτηση που επιστρέφει την τιμή ενός στοιχείου ακολουθίας.

    Οι ποικιλίες αυτού του τύπου ADT διαφέρουν ως προς τον τρόπο πρόσβασης σε στοιχεία ακολουθίας και περιορισμούς σχετικά με το πού μπορούν να εισαχθούν και να αφαιρεθούν στοιχεία.

    Για ADT αυτού του τύπου σωρός , Ουρά Και deque από Double Ended Queue - αμφίδρομη ουρά ) τυπικός καταστροφικό διάβασμα, επειδή Η πρόσβαση στα στοιχεία (και για τις τρεις λειτουργίες) περιορίζεται στο ένα άκρο της ακολουθίας και η λειτουργία "κοιτάξτε ένα άλλο στοιχείο" μπορεί να εκτελεστεί μόνο με την αφαίρεση των παρεμβαλλόμενων στοιχείων. Για ATD διάνυσμα (πίνακας, διάνυσμα), αρχείο (αρχείο) Και γραμμική λίστα εξασφαλίζουν περιορισμούς πρόσβασης μη καταστροφική ανάγνωση, επομένως έχει ιδιαίτερη σημασία ( παράγωγο) λειτουργία αναζήτησης ακολουθίας.

    Οι περιορισμοί στην πρόσβαση σε στοιχεία ακολουθίας επηρεάζουν φυσικά τη σημασιολογία των βασικών πράξεων. Σειριακή πρόσβασημε βάση την έννοια τρέχουσα θέσηκαι επιτρέπει την πρόσβαση (κίνηση, πλοήγηση) στο ένα (ή και στα δύο) από τα άκρα της ακολουθίας και σε μια γειτονική θέση (στα αριστερά, προς τα δεξιά ή και τα δύο) σε σχέση με την τρέχουσα. Το μέρος όπου εφαρμόζονται οι κύριες λειτουργίες σε αυτήν την περίπτωση συνήθως συνδέεται με την τρέχουσα θέση. Άμεση (τοπική, τυχαία) πρόσβασηβασισμένο στο παγκόσμια έννοια θέσηστοιχείο σε μια ακολουθία και παρέχει άμεση πρόσβαση στο στοιχείο εάν είναι γνωστή η θέση του. Για παράδειγμα, στο ATD δυναμικό διάνυσμα (δυναμικός πίνακας, διάνυσμα) , η θέση είναι ο δείκτης του στοιχείου. Αλλά σε άλλες υλοποιήσεις άλλων ειδών ακολουθιών, το αναγνωριστικό θέσης μπορεί να υλοποιηθεί διαφορετικά.

    Οι έννοιες «αριθμός» και «θέση» ενός στοιχείου είναι κοντινές, αλλά μπορεί να μην συμπίπτουν:

    § Αριθμός- αυτός είναι ο πραγματικός σειριακός αριθμός του στοιχείου στην ακολουθία. Αλλά ο σειριακός αριθμός ενός στοιχείου αλλάζει ως αποτέλεσμα των εργασιών εισαγωγής και διαγραφής προηγούμενων στοιχείων· αυτό δημιουργεί μια σειρά ταλαιπωριών στον προσδιορισμό των στοιχείων ακολουθίας.

    § Θέση- παρόμοια σειριακός αριθμόςμε την έννοια ότι για ένα στοιχείο σε μια δεδομένη θέση επιτρέπει σε κάποιον να μιλήσει για το προηγούμενο και το επόμενο στοιχείο της ακολουθίας (και τη θέση τους). Ωστόσο, η τιμή θέσης του στοιχείου δεν αλλάζει ως αποτέλεσμα προηγούμενων εισαγωγών και διαγραφών στοιχείων, επομένως η τιμή θέσης του στοιχείου μπορεί να αποθηκευτεί και να χρησιμοποιηθεί για πρόσβαση σε αυτό το στοιχείο στο μέλλον. Για παράδειγμα, σε μια υλοποίηση συνδεδεμένης λίστας μιας ακολουθίας, η έννοια της "θέσης" μπορεί να αναπαρασταθεί από έναν δείκτη σε ένα στοιχείο και σε άλλες υλοποιήσεις μπορεί να αντιπροσωπεύεται από ένα άλλο είδος αναγνωριστικού που υποστηρίζεται ειδικά από την υλοποίηση.

    Για την ακολουθία ADT, πρόσθετες λειτουργίες της φόρμας ενδιαφέρουν: συνένωση δύο ακολουθιών, αποσύνδεση σε δύο ακολουθίες. Για παράδειγμα, στο ATD σειρά Αυτός ο τύπος λειτουργίας είναι στην πραγματικότητα βασικός.

    Για διαφορετικούς τύπους ADT "Sequence" είναι εφικτή διαφορετική αποτελεσματικότητα υλοποίησης διαφόρων λειτουργιών. Για παράδειγμα, εάν μια υλοποίηση προσφέρει αποτελεσματική άμεση πρόσβαση σε στοιχεία μιας ακολουθίας, τότε πιθανότατα ο χρόνος εκτέλεσης μιας λειτουργίας εισαγωγής στη μέση της ακολουθίας αφήνει πολλά να είναι επιθυμητά. Διάφοροι τύποι (και υλοποιήσεις) της ακολουθίας ADT υποβάλλουν στον προγραμματιστή διάφορες προτάσεις σχετικά με τη σύνθεση των λειτουργιών και την αποτελεσματικότητα της υλοποίησής τους. Επομένως, στην πρακτική προγραμματισμού, συνήθως δεν είναι τόσο οι καθολικές εκδόσεις αυτού του (καθώς και άλλων) ADT που ενδιαφέρουν περισσότερο, αλλά οι εξειδικευμένες και ο προγραμματιστής πρέπει να κάνει την κατάλληλη επιλογή, λαμβάνοντας υπόψη τη χρήση τους στην επίλυση προβλημάτων στη θεματική περιοχή.

    2.2. Σειρά.

    ¨ Το σύνολο των πιθανών τιμών είναι ένα πεπερασμένο σύνολο στοιχείων του ίδιου τύπου.

    ¨ Σύνολο λειτουργιών:

    § Εισάγετεστοιχείο σε ένα σύνολο.

    § Διαγράφωστοιχείο από ένα σύνολο.

    § Ανήκω– μια συνάρτηση που επιστρέφει true αν το στοιχείο ανήκει στο σύνολο.

    Για μια τόσο θεμελιώδη έννοια των κλασικών μαθηματικών, φαίνεται φυσικό να επεκταθεί το σύνολο των πράξεων στο τυπικό κλασικό. Αλλά για μια σειρά από πραγματιστικούς λόγους στον προγραμματισμό, ένα τέτοιο ADT γενικού (καθολικού) τύπου έχει περιορισμένο ενδιαφέρον. Για παράδειγμα, η ενεργοποίηση της λειτουργίας συνδυασμού τεμνόμενων συνόλων απαιτεί την αφαίρεση των στοιχείων τομής κατά την υλοποίηση. Αυτό μπορεί να περιπλέξει σημαντικά την υλοποίηση αυτής της λειτουργίας. Από την άλλη πλευρά, η παρουσία διπλότυπων μπορεί να μην είναι κρίσιμη από την άποψη του προβλήματος που επιλύεται· σε αυτήν την περίπτωση, τα ADT είναι πολυσύνολα. Η θεμελιώδης σημασία της έννοιας του συνόλου, φυσικά, εκδηλώνεται με την παρουσία ενός πλούσιου συνόλου εξειδικευμένων επεκτάσεων αυτού του βασικού "Σετ" ADT, οι οποίες χρησιμοποιούνται ευρέως στην πρακτική προγραμματισμού, τόσο λόγω της ισχυρής εκφραστικής δύναμης αυτής της εργαλειοθήκης. στην ανάπτυξη μοντέλων προβλημάτων και αλγορίθμων για την επίλυσή τους, και λόγω της παρουσίας αποτελεσματικές μεθόδουςυλοποίηση αυτών των ADT.

    Οι εξειδικευμένες επεκτάσεις του ADT "Multiple" εξετάζονται σε διάφορες κατευθύνσεις:

    § Κοντά στην έννοια του «σετ» βρίσκεται η έννοια του «συνόλου». Σετ (τσάντα, MultiSet) – όπως ένα σύνολο είναι μια οικογένεια στοιχείων, ανεξάρτητα από το αν η σχέση σειράς καθορίζεται στα στοιχεία, αλλά τα στοιχεία στο σύνολο μπορούν να επαναληφθούν σε αξία. Σε γενικές γραμμές, ένα σύνολο μπορεί να αναπαρασταθεί ως ένα σύνολο, για παράδειγμα, του οποίου τα στοιχεία είναι ζεύγη [τιμή στοιχείου, αριθμός εμφανίσεων στο σύνολο].

    § Σε πρακτικές εφαρμογές, συχνά εντοπίζονται στοιχεία συνόλων, π.χ. ένα στοιχείο είναι ένα ζεύγος [το κλειδί του στοιχείου, η πραγματική τιμή του στοιχείου], το Λεξικό ADT είναι ένα παράδειγμα μιας τέτοιας εξειδικευμένης επέκτασης του συνόλου ADT. Η προτιμώμενη περίπτωση είναι όταν Το κλειδί στοιχείου είναι μοναδικό, δηλ. ένα σύνολο δεν μπορεί να περιέχει δύο στοιχεία με το ίδιο κλειδί. Αλλά είναι πιθανό το κλειδί που χρησιμοποιείται να είναι μη μοναδικό, δηλ. προσδιορίζοντας διφορούμενα την πραγματική τιμή του στοιχείου. Σε γενικές γραμμές, ένα σύνολο (και μια συλλογή) με ένα μη μοναδικό κλειδί μπορεί να αναπαρασταθεί ως ένα σύνολο με ένα μοναδικό κλειδί περιπλέκοντας τον τύπο τιμής του στοιχείου, για παράδειγμα, λαμβάνοντας υπόψη το σύνολο τιμών του προηγούμενου τύπου (με το ίδιο κλειδί) με την τιμή του στοιχείου.

    § Φαίνεται φυσικό να προσδιορίζεται μια σχέση παραγγελίας, μερική ή γραμμική, σε ένα σύνολο, η "ουρά με προτεραιότητα" ADT είναι ένα παράδειγμα μιας τέτοιας εξειδικευμένης επέκτασης του "Σετ" ADT. Ομοίως, στη θεματική περιοχή του προβλήματος που επιλύεται, άλλες σχέσεις στο σετ μπορεί να έχουν ενδιαφέρον.

    § Η θεμελιώδης θέση στα μαθηματικά καταλαμβάνεται από την έννοια της σχέσης ισοδυναμίας και, κατά συνέπεια, η έννοια της διαίρεσης ενός συνόλου σε τάξεις ισοδυναμίας. Φυσικά, αυτή η έννοια χρησιμοποιείται ευρέως στην πρακτική ανάπτυξη μοντέλων επίλυσης προβλημάτων θεματικές περιοχές. Το ADT "Family of disjoint sets" (Disjoint Sets, Partitions, Partitions) είναι ένα παράδειγμα αντίστοιχης εξειδικευμένης επέκτασης του "Set" ADT.

    Για τις εξειδικευμένες επεκτάσεις του «Σετ» ADT, οι προαναφερθείσες λειτουργίες φυσικά βελτιώνονται ανάλογα και εμφανίζονται νέες εργασίες ενδιαφέροντος.

    2.3. Λεξικό (Χάρτης), ένα άλλο όνομα είναι συσχετικός πίνακας.

    ¨ Το σύνολο των πιθανών τιμών είναι ένα πεπερασμένο σύνολο στοιχείων του ίδιου τύπου, της μορφής , όπου Key είναι το μοναδικό κλειδί του στοιχείου, Τιμή είναι η ίδια η τιμή.

    ¨ Σύνολο λειτουργιών:

    § Εισάγετεστοιχείο (με κλειδί) σε ένα σύνολο.

    § Διαγράφωένα στοιχείο (που καθορίζεται από ένα κλειδί) από ένα σύνολο.

    § Εύρεση στοιχείου– μια συνάρτηση που επιστρέφει την τιμή ενός στοιχείου ανά κλειδί ή μια τιμή "κενό" εάν ένα στοιχείο με τέτοιο κλειδί δεν υπάρχει στο σύνολο.

    Το ADT "Dictionary" είναι μια εξειδικευμένη έκδοση της έννοιας της (αποθηκευμένης) χαρτογράφησης (κλειδιά τιμών), που χρησιμοποιείται ευρέως στον πρακτικό προγραμματισμό. Αλλά για ορισμένες θεματικές περιοχές, μπορεί να είναι πιο βολικό να σχεδιάσετε ένα ADT "Χαρτογράφηση" , πιο κοντά στον κλασικό μαθηματικό ορισμό.

    2.4. Ουρά προτεραιότητας.

    ¨ Το σύνολο των πιθανών τιμών είναι ένα πεπερασμένο σύνολο στοιχείων του ίδιου τύπου. Στα σύνολα (πιθανές τιμές) καθορίζεται μια σχέση γραμμικής τάξης, η οποία ερμηνεύεται ως σύγκριση στοιχείων κατά προτεραιότητα. Το επίπεδο προτεραιότητας μπορεί να προσδιοριστεί ως στοιχείο της τιμής του στοιχείου ή να υπολογιστεί από μια δεδομένη συνάρτηση της τιμής του στοιχείου.

    Σημειώστε ότι ένα τέτοιο σύνολο πιθανών τιμών μπορεί επίσης να ερμηνευτεί ως ένα σύνολο ακολουθιών (με μια λίστα των στοιχείων του σε μια δεδομένη γραμμική σειρά).

    ¨ Σύνολο λειτουργιών:

    § Εισάγετεστοιχείο σε ένα (γραμμικά διατεταγμένο) σύνολο.

    § Αφαιρέστε το ελάχιστοστοιχείο από ένα σύνολο.

    § Βρείτε το ελάχιστο– μια συνάρτηση που επιστρέφει την τιμή του ελάχιστου στοιχείου σε ένα σύνολο.

    Εξετάζονται επίσης (σημαντικές) παραλλαγές αυτού του ADT με πρόσθετες λειτουργίες:

    § Αποσυνδέστε την ουρά στα δύο σύμφωνα με τη δεδομένη τιμή (προτεραιότητα) του στοιχείου - σε μια ουρά στοιχείων με χαμηλότερη προτεραιότητα και μια ουρά των υπολοίπων.

    § Συνδέστε δύο ουρές, η μία από τις οποίες έχει όλα τα στοιχεία της υψηλότερης προτεραιότητας από όλα τα στοιχεία της άλλης ουράς, σε μία ουρά προτεραιότητας χωρίς να διατηρηθούν οι αρχικές συνενωμένες ουρές.

    § Συνδυάστε δύο ασύνδετα διατεταγμένα σύνολα (συγχωνεύστε δύο τέτοιες ουρές) σε ένα ταξινομημένο σύνολο (μία ουρά με προτεραιότητα), επίσης χωρίς να διατηρήσετε τη συγχώνευση των αρχικών.

    § Μειώστε την τιμή (προτεραιότητα) ενός δεδομένου στοιχείου.

    § Αφαιρέστε ένα (τυχαία) καθορισμένο στοιχείο από ένα σύνολο.

    2.5. Disjoint Sets, Partitions, Partitions.

    ¨ Το σύνολο των πιθανών τιμών είναι πεπερασμένα σύνολα (οικογένειες) ασύνδετων πεπερασμένων συνόλων. Έχουν εντοπιστεί οικογενειακά στοιχεία, δηλ. κάθε σετ στην οικογένεια έχει ένα (μοναδικό) όνομα.

    ¨ Σύνολο λειτουργιών:

    § Συγχώνευση(A,B)– μια πράξη της μορφής A:= A È B χωρίς τη διατήρηση των αρχικών συνδυασμένων συνόλων (που σημαίνει ότι η νέα τιμή της οικογένειας θα παραμείνει μια οικογένεια ασύνδετων συνόλων και ο αριθμός τους θα μειωθεί).

    § Εύρεση σετ– μια συνάρτηση που επιστρέφει, για ένα δεδομένο x, το όνομα ενός συνόλου X στην οικογένεια έτσι ώστε x О X.

    2.6. Δέντρα, γραφήματα και γενικές σχέσεις.

    Στα διακριτά μαθηματικά, δίνεται ιδιαίτερη προσοχή στις (πεπερασμένες) σχέσεις της μορφής - δέντρου, γραφήματος και δικτύου (πολύγραφος, υπεργράφος), οι οποίες έχουν μια σαφώς καθορισμένη γεωμετρική ερμηνεία:

    ¨ Γραφική παράσταση – (πεπερασμένη) δυαδική σχέση (συμμετρική – στην περίπτωση μη κατευθυνόμενων γραφημάτων), E Í V 2, όπου V είναι το σύνολο των κορυφών και E είναι το σύνολο των ακμών του γραφήματος.

    Στα διακριτά μαθηματικά, το Ε ορίζεται συνήθως όχι ως ένα σύνολο, αλλά ως ένα σύνολο ακμών ενός γραφήματος· αυτό μας επιτρέπει να εξετάσουμε γραφήματα στα οποία ένα ζεύγος κορυφών μπορεί να συνδεθεί με πολλές ακμές (για παράδειγμα, επισημαίνονται διαφορετικά με κάποιο τρόπο ).

    ¨ Δέντρο είναι μια δυαδική σχέση (αυστηρής) μερικής τάξης, που επιπλέον ικανοποιεί τις απαιτήσεις (ιεραρχία, δενδρότητα):

    § από το γεγονός ότι x<у,z следует, что у и z сравнимы, т.е. либо у£z либо z£у (х<у трактуется как: х встречается раньше у в пути к корню дерева, х – потомок, у - предок);

    § στο σύνολο V (κορυφές δέντρων) υπάρχει ένα μεγαλύτερο στοιχείο (ρίζα δέντρου).

    Τα δέντρα μπορούν να διακριθούν εάν η σειρά των γιων (τουλάχιστον μιας) κορυφής δέντρου είναι διαφορετική. Παραγγελθέν δέντρο – ένα δέντρο στο οποίο για κάθε κορυφή καθορίζεται μια σειρά στο σύνολο των θυγατρικών κορυφών, δηλ. τα παιδιά μπορούν να οριστούν ως πρώτο, δεύτερο κ.λπ.

    ¨ Καθαρά – αυτή είναι μια σχέση γενικής μορφής, η οποία μπορεί να ερμηνευθεί ως γενίκευση – E Í VÈV 2 È...V k , ή μπορεί να ερμηνευθεί ως σχέση (E Í V k) με ένα σύνολο στοιχείων V που έχει «κενό» (πλασματικό) στοιχείο.

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

    Ο θεμελιώδης ρόλος των δέντρων και των γραφημάτων εμφανίζεται μάλλον στο πλαίσιο του εφαρμοσμένου προβλήματος κατά την επιλογή δομών δεδομένων για την αποτελεσματική υλοποίηση του επιλεγμένου ADT και του αλγόριθμου για την επίλυση του προβλήματος συνολικά. Αλλά σε ένα τέτοιο πλαίσιο, τόσο ο τρόπος αναπαράστασής τους όσο και το σύνολο των λειτουργιών με αυτά τα δέντρα, γραφήματα και δίκτυα, εξειδικεύονται φυσικά σύμφωνα με το συγκεκριμένο πλαίσιο.

    Τελευταία ενημέρωση: 04/08/2018

    Εκτός από τα κανονικά μαθήματα, η C# έχει αφηρημένες τάξεις. Μια αφηρημένη τάξη είναι παρόμοια με μια κανονική τάξη. Μπορεί επίσης να έχει μεταβλητές, μεθόδους, κατασκευαστές, ιδιότητες. Το μόνο πράγμα είναι ότι κατά τον ορισμό αφηρημένων κλάσεων, χρησιμοποιείται η αφηρημένη λέξη-κλειδί:

    Αφηρημένη τάξη Human ( δημόσια int Μήκος ( get; set; ) public double Weight ( get; set; ) )

    Αλλά η κύρια διαφορά είναι ότι δεν μπορούμε να χρησιμοποιήσουμε τον κατασκευαστή μιας αφηρημένης κλάσης για να δημιουργήσουμε το αντικείμενό της. Για παράδειγμα, ως εξής:

    Human h = new Human();

    Γιατί χρειάζονται αφηρημένα μαθήματα; Ας πούμε ότι στο πρόγραμμά μας για τον τραπεζικό τομέα μπορούμε να ορίσουμε δύο βασικές οντότητες: έναν τραπεζικό πελάτη και έναν τραπεζικό υπάλληλο. Κάθε μία από αυτές τις οντότητες θα είναι διαφορετική, για παράδειγμα, για έναν υπάλληλο είναι απαραίτητο να προσδιοριστεί η θέση του και για έναν πελάτη - το ποσό στον λογαριασμό. Αντίστοιχα, ο πελάτης και ο εργαζόμενος θα σχηματίσουν ξεχωριστές τάξεις Πελάτης και Υπάλληλος. Ταυτόχρονα, και οι δύο αυτές οντότητες μπορεί να έχουν κάτι κοινό, για παράδειγμα, όνομα και επώνυμο ή κάποια άλλη κοινή λειτουργία. Και είναι καλύτερο να μετακινήσετε αυτή τη γενική λειτουργικότητα σε μια ξεχωριστή κατηγορία, για παράδειγμα, το Person, που περιγράφει ένα άτομο. Δηλαδή, οι κατηγορίες Υπάλληλος (εργαζόμενος) και Πελάτης (πελάτης τράπεζας) θα προέρχονται από την κλάση Person. Και επειδή όλα τα αντικείμενα στο σύστημά μας θα αντιπροσωπεύουν είτε έναν τραπεζικό υπάλληλο είτε έναν πελάτη, δεν θα δημιουργήσουμε απευθείας αντικείμενα από την κλάση Person. Είναι λοιπόν λογικό να το κάνουμε αφηρημένο:

    Abstract class Person ( δημόσια συμβολοσειρά Όνομα ( get ; σύνολο όνομα, θέση συμβολοσειράς) : βάση(όνομα) ( Θέση = θέση; ) )

    Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε αυτές τις τάξεις:

    Client client = new Client("Tom", 500); Υπάλληλος υπάλληλος = νέος υπάλληλος ("Bob", "Apple"); client.Display(); υπάλληλος.Εμφάνιση();

    Ή ακόμα και έτσι:

    Person client = new Client("Tom", 500); Υπάλληλος = νέος Υπάλληλος ("Bob", "Operator");

    Αλλά ΔΕΝ μπορούμε να δημιουργήσουμε ένα αντικείμενο Person χρησιμοποιώντας τον κατασκευαστή κλάσης Person:

    Person person = new Person("Bill");

    Ωστόσο, παρά το γεγονός ότι δεν μπορούμε να καλέσουμε απευθείας τον κατασκευαστή της κλάσης Person για να δημιουργήσει ένα αντικείμενο, εντούτοις, ο κατασκευαστής σε αφηρημένες κλάσεις μπορεί επίσης να παίξει σημαντικό ρόλο, συγκεκριμένα, να αρχικοποιήσει ορισμένες μεταβλητές και ιδιότητες κοινές σε παραγόμενες κλάσεις, όπως στο την περίπτωση του ακινήτου Όνομα. Παρόλο που ο κατασκευαστής της κλάσης Person δεν καλείται στο παραπάνω παράδειγμα, οι παραγόμενες κλάσεις Client και Employee μπορούν ακόμα να έχουν πρόσβαση σε αυτήν.

    Περίληψη Μέλη Τάξης

    Εκτός από τις συνήθεις ιδιότητες και μεθόδους, μια αφηρημένη κλάση μπορεί να έχει αφηρημένα μέλη κλάσης, τα οποία ορίζονται χρησιμοποιώντας τη λέξη-κλειδί αφηρημένη και δεν έχουν καμία λειτουργικότητα. Ειδικότερα, οι αφηρημένες μπορούν να είναι:

    • Ιδιότητες

      Ευρετήρια

    Τα μέλη της αφηρημένης τάξης δεν πρέπει να έχουν τον ιδιωτικό τροποποιητή. Σε αυτήν την περίπτωση, η παραγόμενη κλάση απαιτείται να επαναπροσδιορίσει και να εφαρμόσει όλες τις αφηρημένες μεθόδους και ιδιότητες που υπάρχουν στη βασική αφηρημένη κλάση. Όταν παρακάμπτεται σε μια παράγωγη κλάση, μια τέτοια μέθοδος ή ιδιότητα δηλώνεται επίσης με τον τροποποιητή παράκαμψης (όπως με την κανονική παράκαμψη εικονικών μεθόδων και ιδιοτήτων). Θα πρέπει επίσης να σημειωθεί ότι εάν μια κλάση έχει τουλάχιστον μία αφηρημένη μέθοδο (ή αφηρημένη ιδιότητα, δείκτη, συμβάν), τότε αυτή η κλάση πρέπει να οριστεί ως αφηρημένη.

    Τα αφηρημένα μέλη, όπως και τα εικονικά, αποτελούν μέρος μιας πολυμορφικής διεπαφής. Αλλά αν στην περίπτωση των εικονικών μεθόδων λέμε ότι η κλάση κληρονομιάς κληρονομεί την υλοποίηση, τότε στην περίπτωση των αφηρημένων μεθόδων η διεπαφή που αντιπροσωπεύεται από αυτές τις αφηρημένες μεθόδους κληρονομείται.

    Αφηρημένες μέθοδοι

    Για παράδειγμα, ας κάνουμε τη μέθοδο Εμφάνιση αφηρημένη στο παραπάνω παράδειγμα:

    Abstract class Person ( public string Name ( get; set; ) public Person(string name) ( Name = name; ) public abstract void Display(); ) class Client: Person ( public int Sum ( get; set; ) // sum στον λογαριασμό δημόσιο Client(όνομα συμβολοσειράς, άθροισμα int) : βάση(όνομα) ( Άθροισμα = άθροισμα; ) δημόσια παράκαμψη void Display() ( Console.WriteLine($"(Όνομα) έχει λογαριασμό στο ποσό (Sum)") ; ) ) κλάση Employee: Person ( public string Position ( get; set; ) // position public Employee (όνομα συμβολοσειράς, θέση συμβολοσειράς) : base(name) ( Position = position; ) public override void Display() ( Console.WriteLine ($" (Θέση) (Όνομα)"); ) )

    Αφηρημένες ιδιότητες

    Σημειώστε τη χρήση αφηρημένων ιδιοτήτων. Ο ορισμός τους είναι παρόμοιος με τον ορισμό των ιδιοτήτων αυτοκινήτων. Για παράδειγμα:

    Κλάση αφηρημένης Person ( δημόσια αφηρημένη συμβολοσειρά Όνομα ( get; set; ) ) class Client: Person (όνομα ιδιωτικής συμβολοσειράς; δημόσια παράκαμψη συμβολοσειράς Όνομα (get (επιστροφή "Κύριος/Κυρία" + όνομα; ) σύνολο (όνομα = τιμή; ) ) ) κλάση Υπάλληλος: Πρόσωπο ( δημόσια παράκαμψη συμβολοσειράς Όνομα ( get; set; ) )

    Η κλάση Person ορίζει μια αφηρημένη ιδιότητα που ονομάζεται Όνομα. Μοιάζει με ιδιοκτησία αυτοκινήτου, αλλά δεν είναι ιδιοκτησία αυτοκινήτου. Εφόσον αυτή η ιδιότητα δεν χρειάζεται να έχει υλοποίηση, έχει μόνο κενά μπλοκ λήψης και ορισμού. Σε παράγωγες κλάσεις, μπορούμε να παρακάμψουμε αυτήν την ιδιότητα, κάνοντάς την πλήρη ιδιότητα (όπως στην κλάση Πελάτη) ή καθιστώντας την αυτόματη (όπως στην κατηγορία Υπάλληλος).

    Αποφυγή Εφαρμογής Αφηρημένων Μελών

    Η παραγόμενη κλάση πρέπει να υλοποιεί όλα τα αφηρημένα μέλη της βασικής κλάσης. Ωστόσο, μπορούμε να επιλέξουμε να μην το εφαρμόσουμε, αλλά σε αυτήν την περίπτωση η παραγόμενη κλάση πρέπει επίσης να οριστεί ως αφηρημένη:

    Abstract class Person ( δημόσια αφηρημένη συμβολοσειρά Όνομα ( get; set; ) ) abstract class Manager: Person ( )

    Παράδειγμα αφηρημένης τάξης

    Ένα παράδειγμα σχολικού βιβλίου είναι ένα σύστημα γεωμετρικών σχημάτων. Στην πραγματικότητα, δεν υπάρχει γεωμετρικό σχήμα ως τέτοιο. Υπάρχει ένας κύκλος, ένα ορθογώνιο, ένα τετράγωνο, αλλά απλά δεν υπάρχει σχήμα. Ωστόσο, τόσο ο κύκλος όσο και το ορθογώνιο έχουν κάτι κοινό και είναι σχήματα:

    // abstract class of a figure abstract class Figure ( // abstract method for get the perimeter public abstract float Perimeter(); // abstract method for get the area public abstract float Area(); ) // παραγόμενη κλάση ορθογωνίου Ορθογώνιο: Σχήμα ( δημόσιος πλωτήρας Πλάτος ( πάρτε; σύνολο perimeter public override float Perimeter() ( return Width * 2 + Height * 2; ) // override λήψη της περιοχής public override float Area() ( return Width * Height; ) )

    Η ανάπτυξη αφηρημένων μοντέλων για δεδομένα και τρόπων επεξεργασίας αυτών των δεδομένων είναι ένα κρίσιμο στοιχείο της επίλυσης προβλημάτων υπολογιστή. Βλέπουμε παραδείγματα αυτού τόσο σε χαμηλό επίπεδο στον καθημερινό προγραμματισμό (για παράδειγμα, όταν χρησιμοποιούνται πίνακες και συνδεδεμένες λίστες, που συζητούνται στο) όσο και σε υψηλό επίπεδο κατά την επίλυση εφαρμοζόμενων προβλημάτων (όπως όταν επιλύετε το πρόβλημα συνδεσιμότητας χρησιμοποιώντας ένα δάσος σύνδεσης αναζήτησης στην «Εισαγωγή»). Αυτή η διάλεξη εξετάζει αφηρημένους τύπους δεδομένων (εφεξής ADT), οι οποίοι σας επιτρέπουν να δημιουργείτε προγράμματα χρησιμοποιώντας αφαιρέσεις υψηλού επιπέδου. Οι αφηρημένοι τύποι δεδομένων επιτρέπουν στους αφηρημένους (εννοιολογικούς) μετασχηματισμούς που εκτελούν τα προγράμματα σε δεδομένα να διαχωριστούν από οποιαδήποτε συγκεκριμένη αναπαράσταση της δομής δεδομένων και οποιαδήποτε συγκεκριμένη υλοποίηση του αλγορίθμου.

    Όλα τα υπολογιστικά συστήματα βασίζονται σε επίπεδα αφαίρεσης: ορισμένες φυσικές ιδιότητες του πυριτίου και άλλων υλικών επιτρέπουν την υιοθέτηση ενός αφηρημένου μοντέλου bit, το οποίο μπορεί να λάβει τις δυαδικές τιμές 0-1. τότε ένα αφηρημένο μοντέλο της μηχανής βασίζεται στις δυναμικές ιδιότητες των τιμών ενός συγκεκριμένου συνόλου bit. Επιπλέον, με βάση την αρχή της λειτουργίας μιας μηχανής υπό τον έλεγχο ενός προγράμματος σε γλώσσα μηχανής, δημιουργείται ένα αφηρημένο μοντέλο μιας γλώσσας προγραμματισμού. και τέλος, κατασκευάζεται μια αφηρημένη έννοια αλγορίθμου, η οποία υλοποιείται ως πρόγραμμα σε C++. Οι αφηρημένοι τύποι δεδομένων καθιστούν δυνατή τη συνέχιση αυτής της διαδικασίας περαιτέρω και την ανάπτυξη αφηρημένων μηχανισμών για συγκεκριμένα υπολογιστικά προβλήματα σε υψηλότερο επίπεδο από αυτό που παρέχει το σύστημα C++, αναπτύσσουν αφηρημένους μηχανισμούς που είναι προσανατολισμένοι σε συγκεκριμένες εφαρμογές και είναι κατάλληλοι για την επίλυση προβλημάτων σε πολλούς τομείς εφαρμογών , και επίσης να δημιουργήσουν αφηρημένους μηχανισμούς υψηλότερου επιπέδου που χρησιμοποιούν αυτά τα βασικά σχέδια. Οι αφηρημένοι τύποι δεδομένων μας παρέχουν ένα άπειρα επεκτάσιμο σύνολο εργαλείων για την επίλυση ολοένα και περισσότερων νέων προβλημάτων.

    Από τη μία πλευρά, η χρήση αφηρημένων κατασκευών σας απαλλάσσει από ανησυχίες σχετικά με τη λεπτομερή εφαρμογή τους. από την άλλη, όταν εκτέλεσηπρόγραμμα είναι σημαντικό, πρέπει να γνωρίζετε το κόστος της εκτέλεσης βασικών λειτουργιών. Χρησιμοποιούμε πολλές βασικές αφαιρέσεις ενσωματωμένες σκεύη, εξαρτήματαυπολογιστή και χρησιμεύει ως βάση για οδηγίες μηχανών· να εφαρμόσουν άλλες αφαιρέσεις στο λογισμικό. και χρησιμοποιήστε πρόσθετες αφαιρέσεις που παρέχονται από προηγουμένως γραμμένο λογισμικό συστήματος. Οι αφηρημένες κατασκευές υψηλού επιπέδου προέρχονται συχνά από απλούστερες κατασκευές. Η ίδια βασική αρχή ισχύει σε όλα τα επίπεδα: βρείτε τις πιο σημαντικές λειτουργίες σε προγράμματα και τα πιο σημαντικά χαρακτηριστικά των δεδομένων και στη συνέχεια ορίστε με ακρίβεια και τα δύο σε αφηρημένο επίπεδο και σχεδιάστε αποτελεσματικούς συγκεκριμένους μηχανισμούς για την υλοποίησή τους. Σε αυτή τη διάλεξη θα δούμε πολλά παραδείγματα εφαρμογής αυτής της αρχής.

    Η ανάπτυξη ενός νέου επιπέδου αφαίρεσης θα απαιτήσει (1) τον καθορισμό των αφηρημένων αντικειμένων που πρέπει να χειριστούν και των λειτουργιών που πρέπει να εκτελεστούν σε αυτά. (2) αντιπροσωπεύουν τα δεδομένα σε κάποια δομή δεδομένων και εφαρμόζουν τις λειτουργίες. (3) και (το πιο σημαντικό) διασφαλίζουν ότι αυτά τα αντικείμενα είναι βολικά στη χρήση για την επίλυση εφαρμοζόμενων προβλημάτων. Αυτά τα σημεία ισχύουν επίσης για απλούς τύπους δεδομένων, επομένως οι βασικοί μηχανισμοί για την υποστήριξη τύπων δεδομένων που συζητήθηκαν στο "Στοιχειώδεις δομές δεδομένων" μπορούν να προσαρμοστούν για τους σκοπούς μας. Ωστόσο, η C++ προσφέρει μια σημαντική επέκταση στον μηχανισμό δομής που ονομάζεται class. Οι τάξεις είναι εξαιρετικά χρήσιμες στη δημιουργία στρωμάτων αφαίρεσης και επομένως θεωρούνται το κύριο εργαλείο που χρησιμοποιείται για αυτόν τον σκοπό στο υπόλοιπο του βιβλίου.

    Ορισμός 4.1.Ένας αφηρημένος τύπος δεδομένων (ADT) είναι ένας τύπος δεδομένων (ένα σύνολο τιμών και ένα σύνολο λειτουργιών σε αυτές τις τιμές) που μπορεί να προσπελαστεί μόνο μέσω μιας διεπαφής. Ένα πρόγραμμα που χρησιμοποιεί ένα ADT θα ονομάζεται πελάτης και ένα πρόγραμμα που περιέχει μια προδιαγραφή αυτού του τύπου δεδομένων θα ονομάζεται υλοποίηση.

    Είναι η λέξη που κάνει μόνο τον τύπο δεδομένων αφηρημένο: στην περίπτωση ενός ADT, τα προγράμματα-πελάτες δεν έχουν πρόσβαση στις τιμές δεδομένων με κανέναν άλλο τρόπο εκτός από τις λειτουργίες που περιγράφονται στη διεπαφή. Η αναπαράσταση αυτών των δεδομένων και οι συναρτήσεις που υλοποιούν αυτές τις λειτουργίες βρίσκονται στην υλοποίηση και διαχωρίζονται πλήρως από τη διεπαφή από τον πελάτη. Λέμε ότι μια διεπαφή είναι αδιαφανής: ο πελάτης δεν μπορεί να δει την υλοποίηση μέσω της διεπαφής.

    Στα προγράμματα C++ αυτή η διάκριση γίνεται συνήθως λίγο πιο ξεκάθαρα, καθώς είναι πιο εύκολο να δημιουργήσετε μια διεπαφή με τη συμπερίληψη παρουσίαση δεδομένων, αλλά προσδιορίζοντας ότι τα προγράμματα-πελάτες δεν επιτρέπεται να έχουν άμεση πρόσβαση στα δεδομένα. Με άλλα λόγια, οι προγραμματιστές προγραμμάτων πελάτη μπορούν να γνωρίζουν παρουσίαση δεδομένων, αλλά δεν μπορεί να το χρησιμοποιήσει με κανέναν τρόπο.

    Ως παράδειγμα, εξετάστε τη διεπαφή τύπου δεδομένων για σημεία (πρόγραμμα 3.3) από την ενότητα 3.1 «Στοιχειώδεις δομές δεδομένων». Αυτή η διεπαφή δηλώνει ρητά ότι τα σημεία αναπαρίστανται ως δομές που αποτελούνται από ένα ζεύγος αριθμών κινητής υποδιαστολής, που συμβολίζονται x και y. Αυτή η χρήση τύπων δεδομένων είναι κοινή σε μεγάλα συστήματα λογισμικού: αναπτύσσουμε ένα σύνολο συμβάσεων για την αναπαράσταση δεδομένων (και ορίζουμε επίσης ένα σύνολο λειτουργιών που σχετίζονται με αυτά) και καθιστούμε αυτούς τους κανόνες διαθέσιμους μέσω μιας διεπαφής, ώστε να μπορούν να χρησιμοποιηθούν από προγράμματα-πελάτες που αποτελούν μέρος του μεγάλου συστήματος. Ο τύπος δεδομένων διασφαλίζει ότι όλα τα μέρη του συστήματος είναι συνεπή στην αντιπροσώπευση των υποκείμενων δομών δεδομένων σε όλο το σύστημα. Ανεξάρτητα από το πόσο καλή είναι αυτή η στρατηγική, έχει ένα ελάττωμα: εάν πρέπει να αλλάξετε παρουσίαση δεδομένων, τότε θα χρειαστεί να αλλάξετε όλα τα προγράμματα-πελάτες. Το Πρόγραμμα 3.3 μας δίνει και πάλι ένα απλό παράδειγμα: Ένας από τους λόγους για τον σχεδιασμό αυτού του τύπου δεδομένων είναι να διευκολύνει τα προγράμματα-πελάτες να λειτουργούν με σημεία και αναμένουμε από τους πελάτες να έχουν πρόσβαση σε μεμονωμένες συντεταγμένες σημείων όταν χρειάζεται. Αλλά δεν μπορούμε να προχωρήσουμε σε διαφορετική αναπαράσταση δεδομένων (ας πούμε, πολικές συντεταγμένες ή τρισδιάστατες συντεταγμένες, ή ακόμα και διαφορετικούς τύπους δεδομένων για μεμονωμένες συντεταγμένες) χωρίς να αλλάξουμε όλα τα προγράμματα-πελάτες.

    Αντίθετα, το Πρόγραμμα 4.1 περιέχει μια υλοποίηση ενός αφηρημένου τύπου δεδομένων που αντιστοιχεί στον τύπο δεδομένων στο Πρόγραμμα 3.3, αλλά χρησιμοποιώντας μια κλάση γλώσσας C++ που ορίζει αμέσως τόσο τα δεδομένα όσο και τις σχετικές λειτουργίες του. Το Πρόγραμμα 4.2 είναι ένα πρόγραμμα-πελάτη που λειτουργεί με αυτόν τον τύπο δεδομένων. Αυτά τα δύο προγράμματα εκτελούν τους ίδιους υπολογισμούς με τα προγράμματα 3.3 και 3.8. Παρουσιάζουν μια σειρά από βασικές ιδιότητες των κλάσεων που θα εξετάσουμε τώρα.

    Όταν γράφουμε έναν ορισμό όπως το int i σε ένα πρόγραμμα, λέμε στο σύστημα να δεσμεύσει μια περιοχή μνήμης για δεδομένα του (ενσωματωμένου) τύπου int, στα οποία είναι δυνατή η πρόσβαση με το όνομα i. Στη γλώσσα C++, υπάρχει ένας όρος για τέτοιες οντότητες ως αντικείμενο. Όταν ένα πρόγραμμα γράφει έναν ορισμό όπως POINT p, λέγεται ότι δημιουργεί ένα αντικείμενο της κλάσης POINT που μπορεί να αναφέρεται με το όνομα p. Στο παράδειγμά μας, κάθε αντικείμενο περιέχει δύο στοιχεία δεδομένων, που ονομάζονται x και y. Όπως και με τις δομές, μπορούν να αναφέρονται με ονόματα όπως p.y.

    Τα μέλη δεδομένων x και y ονομάζονται μέλη δεδομένων της κλάσης. Η κλάση μπορεί επίσης να ορίσει συναρτήσεις μέλους που υλοποιούν λειτουργίες που σχετίζονται με αυτόν τον τύπο δεδομένων. Για παράδειγμα, η κλάση που ορίζεται στο Πρόγραμμα 4.1 έχει δύο συναρτήσεις μέλους που ονομάζονται POINT και απόσταση.

    Τα προγράμματα-πελάτες, όπως το Πρόγραμμα 4.2, μπορούν να καλούν τις συναρτήσεις μέλους που σχετίζονται με ένα αντικείμενο καθορίζοντας τα ονόματά τους με τον ίδιο τρόπο όπως τα ονόματα των δεδομένων που περιέχονται σε μια δομή. Για παράδειγμα, η έκφραση p.distance(q) υπολογίζει την απόσταση μεταξύ των σημείων p και q (η ίδια απόσταση θα πρέπει να επιστραφεί καλώντας q.distance(p) ). Η συνάρτηση POINT(), η πρώτη συνάρτηση στο Πρόγραμμα 4.1, είναι μια ειδική συνάρτηση μέλους που ονομάζεται κατασκευαστής: έχει το ίδιο όνομα με μια κλάση και καλείται όταν θέλετε να δημιουργήσετε ένα αντικείμενο αυτής της κλάσης.

    Πρόγραμμα 4.1. Υλοποίηση της τάξης POINT

    Αυτή η κλάση ορίζει έναν τύπο δεδομένων που αποτελείται από ένα σύνολο τιμών που είναι "ζεύγη αριθμών κινητής υποδιαστολής" (υποτίθεται ότι ερμηνεύονται ως σημεία στο καρτεσιανό επίπεδο), καθώς και δύο συναρτήσεις μελών που ορίζονται για όλες τις περιπτώσεις του Κλάση POINT: η συνάρτηση POINT() , η οποία είναι ένας κατασκευαστής που αρχικοποιεί συντεταγμένες με τυχαίες τιμές μεταξύ 0 και 1, και μια απόσταση συνάρτησης (POINT) , που υπολογίζει την απόσταση από ένα άλλο σημείο. Παρουσίαση δεδομένωνείναι ιδιωτικό και μπορεί να προσπελαστεί ή να τροποποιηθεί μόνο από λειτουργίες μέλους. Οι ίδιες οι λειτουργίες μέλους είναι δημόσιες και προσβάσιμες σε οποιονδήποτε πελάτη. Ο κώδικας μπορεί να αποθηκευτεί, για παράδειγμα, σε ένα αρχείο που ονομάζεται POINT.cxx.

    #περιλαμβάνω κλάση POINT ( private: float x, y; public: POINT() ( x = 1.0*rand()/RAND_MAX; y = 1.0*rand()/RAND_MAX; ) float distance(POINT a) (float dx = x-a.x , dy = y-a.y; return sqrt(dx*dx + dy*dy); ) );

    Πρόγραμμα 4.2. Πρόγραμμα πελάτη για την τάξη POINT (εύρεση του πλησιέστερου σημείου)

    Αυτή η έκδοση του προγράμματος 3.8 είναι ένας πελάτης που χρησιμοποιεί το POINT ADT που ορίζεται στο πρόγραμμα 4.3. Η νέα λειτουργία δημιουργεί έναν πίνακα αντικειμένων POINT (καλώντας τον κατασκευαστή POINT() για να αρχικοποιήσει κάθε αντικείμενο με τυχαίες τιμές συντεταγμένων). Η έκφραση a[i].distance(a[j]) καλεί τη συνάρτηση μέλους απόστασης στο αντικείμενο a[i] με όρισμα a[j] .

    #περιλαμβάνω #περιλαμβάνω #include "POINT.cxx" int main(int argc, char *argv) ( float d = atof(argv); int i, cnt = 0, N = atoi(argv); POINT *a = νέο POINT[N]; για (i = 0; i< N; i++) for (int j = i+1; j < N; j++) if (a[i].distance(a[j]) < d) cnt+ + ; cout << cnt << " пар в радиусе " << d << endl; }

    Ο ορισμός του POINT p στο πρόγραμμα πελάτη εκχωρεί μια περιοχή μνήμης για το νέο αντικείμενο και στη συνέχεια (χρησιμοποιώντας τη συνάρτηση POINT()) εκχωρεί σε καθένα από τα δύο στοιχεία δεδομένων του μια τυχαία τιμή στην περιοχή από 0 έως 1.

    Αυτό το στυλ προγραμματισμού, που μερικές φορές ονομάζεται αντικειμενοστραφής προγραμματισμός, υποστηρίζεται πλήρως από την κατασκευή κλάσης C++. Μια κλάση μπορεί να θεωρηθεί επέκταση της έννοιας μιας δομής, όπου όχι μόνο συνδυάζονται δεδομένα, αλλά ορίζονται και λειτουργίες σε αυτά τα δεδομένα. Μπορεί να υπάρχουν πολλά διαφορετικά αντικείμενα που ανήκουν στην ίδια κλάση, αλλά είναι όλα παρόμοια καθώς τα μέλη δεδομένων τους μπορούν να λάβουν το ίδιο σύνολο τιμών και το ίδιο σύνολο λειτουργιών μπορεί να εκτελεστεί σε αυτά τα μέλη δεδομένων - γενικά, αυτές είναι περιπτώσεις του ίδιου τύπου δεδομένων. Στον αντικειμενοστραφή προγραμματισμό, τα αντικείμενα σχεδιάζονται για να επεξεργάζονται τα δεδομένα μελών τους (σε αντίθεση με τη χρήση ανεξάρτητων συναρτήσεων για την επεξεργασία δεδομένων που είναι αποθηκευμένα σε αντικείμενα).

    Εξετάζουμε το παράδειγμα της μικρής τάξης που περιγράφηκε παραπάνω για να εξοικειωθούμε με τα βασικά χαρακτηριστικά των κλάσεων. οπότε απέχει πολύ από το να έχει ολοκληρωθεί. Σε πραγματικό κώδικα, θα έχουμε πολλές περισσότερες πράξεις για την κατηγορία σημείων. Για παράδειγμα, στο πρόγραμμα 4.1 δεν υπάρχουν καν πράξεις που σας επιτρέπουν να μάθετε τις τιμές των συντεταγμένων x και y. Όπως θα δούμε, η προσθήκη αυτών και άλλων λειτουργιών είναι μια αρκετά απλή εργασία. Στο Μέρος 5 θα ρίξουμε μια πιο προσεκτική ματιά σε τάξεις για το σημείο και άλλες γεωμετρικές αφαιρέσεις, όπως γραμμές και πολύγωνα.

    Στη C++ (αλλά όχι στη C), οι δομές μπορούν επίσης να έχουν συναρτήσεις που σχετίζονται με αυτές. Η βασική διαφορά μεταξύ κλάσεων και δομών σχετίζεται με την πρόσβαση σε πληροφορίες, η οποία χαρακτηρίζεται από λέξεις-κλειδιά