Δομές Δεδομένων Ενότητα 2: Περισσότερα για τους δείκτες Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Σκοποί ενότητας Σε αυτή την ενότητα παρουσιάζονται περισσότερα στοιχεία σχετικά με τους δείκτες. 4
Περιεχόμενα ενότητας Δείκτες - Παραδείγματα. Αποτελέσματα παραδειγμάτων. Ερωτήσεις. Ασκήσεις. Βιβλιογραφία. 5
Δείκτες - Παραδείγματα (1/7) Δοκιμάστε τον ακόλουθο κώδικα: #include <stdio.h> typedef struct { double x, y; // Οι συντεταγμένες ενός σημείου. } Point; // Ο τύπος δεδομένων του σημείου. 6
Δείκτες - Παραδείγματα (2/7) typedef struct { Point c; // Το κέντρο ενός κύκλου (σημείο, με x // και y, όπως παραπάνω). double radius; // Η ακτίνα του κύκλου. } Circle; // Ο τύπος δεδομένων του κύκλου. void main() { // Παράδειγμα 1. int i = 10; printf("contents of i = %d\n", i); printf(" Address of i = 0x%0x\n\n", &i); 7
Δείκτες - Παραδείγματα (3/7) // Παράδειγμα 2. int j = 5; int *ptr1 = &j; printf(" printf(" printf(" printf(" Contents of j = %d\n", j); Address of j = 0x%0x\n", &j); Contents of *ptr1 = %d\n", *ptr1); Contents of ptr1 = 0x%0x\n", ptr1); printf("address of pointer ptr1 itself = 0x%x\n\n", &ptr1); 8
Δείκτες - Παραδείγματα (4/7) // Παράδειγμα 3. Circle c1 = { { 2.3, 4.5 }, 5.6 }; printf("x = %lf\n", c1.c.x); printf("y = %lf\n", c1.c.y); printf("r = %lf\n", c1.radius); printf("address of c1 = 0x%0x\n", &c1); printf("address of center = 0x%0x\n", &(c1.c)); printf("address of x = 0x%0x\n", &(c1.c.x)); printf("address of y = 0x%0x\n", &(c1.c.y)); printf("address of radius = 0x%0x\n\n", &(c1.radius)); 9
Δείκτες - Παραδείγματα (5/7) // Παράδειγμα 4. Circle *c_ptr = &c1; printf("contents of c_ptr = 0x%0x\n", c_ptr); printf("address of c_ptr = 0x%0x\n", &c_ptr); printf("x = %lf\n", c_ptr->c.x); printf("y = %lf\n", c_ptr->c.y); printf("r = %lf\n\n", c_ptr->radius); 10
Δείκτες - Παραδείγματα (6/7) // Παράδειγμα 5. int MyArray[10] = { 3, 4, 8, 1, 2, 7, 9, 6, 0, 4 }; int *ArrayPtr = MyArray; printf(" Address of MyArray = 0x%0x\n", &MyArray); printf(" Contents of MyArray = 0x%0x\n", MyArray); printf("address of MyArray[0] = 0x%0x\n", &(MyArray[0])); printf("address of MyArray[1] = 0x%0x\n", &(MyArray[1])); printf("address of MyArray[2] = 0x%0x\n", &(MyArray[2])); 11
Δείκτες - Παραδείγματα (7/7) // Παράδειγμα 5. (Συνέχεια) printf("address of MyArray[9] = 0x%0x\n", &(MyArray[9])); printf(" Contents of ArrayPtr = 0x%0x\n", ArrayPtr); ArrayPtr++; printf(" Contents of ArrayPtr = 0x%0x\n", ArrayPtr); printf("address of MyArray[1] = 0x%0x\n", &(MyArray[1])); printf(" *ArrayPtr = %d\n", *ArrayPtr); ArrayPtr++; printf(" Contents of ArrayPtr = 0x%0x\n", ArrayPtr); printf("address of MyArray[2] = 0x%0x\n", &(MyArray[2])); printf(" *ArrayPtr = %d\n\n", *ArrayPtr); } // main 12
Αποτελέσματα παραδειγμάτων (1/3) Τα αποτελέσματα της εκτέλεσης του παραπάνω κώδικα φαίνονται παρακάτω. Σημείωση: Οι διευθύνσεις μνήμης που παρουσιάζονται ενδέχεται να αλλάζουν από υπολογιστή σε υπολογιστή και από εκτέλεση του ίδιου προγράμματος σε εκτέλεση. 13
Αποτελέσματα παραδειγμάτων (2/3) Εικόνα 1. Αποτελέσματα παραδειγμάτων. Πηγή: Διδάσκων (2015). 14
Αποτελέσματα παραδειγμάτων (3/3) Εικόνα 2. Αποτελέσματα παραδειγμάτων (Συνέχεια). Πηγή: Διδάσκων (2015). 15
Ερωτήσεις Τι παρατηρείτε όσον αφορά τις διευθύνσεις μνήμης του πίνακα (MyArray) του 5ου παραδείγματος και του δείκτη που δείχνει σε αυτόν (ArrayPtr), καθώς και των περιεχομένων τους; Όταν αυξάνουμε το δείκτη του 5ου παραδείγματος με τον τελεστή (ArrayPtr++), κατά πόσο αυξάνει ο δείκτης, και σε ποιο στοιχείο του πίνακά μας δείχνει; 16
Ασκήσεις
Άσκηση 1 a. Δηλώστε, αρχικοποιήστε, και εκτυπώστε έναν πίνακα ακεραίων με Ν στοιχεία (το Ν να είναι δηλωμένο με #define). b. Αρχικοποιήστε και εκτυπώστε τον παραπάνω πίνακα μέσω ενός κατάλληλου δείκτη. c. Υλοποιήστε την αρχικοποίηση και εκτύπωση του πίνακα (του βήματος 2) μέσω κατάλληλων συναρτήσεων (μία για αρχικοποίηση και μία για εκτύπωση). 18
Άσκηση 2 (1/2) a. Χρησιμοποιώντας το παράδειγμα του κύκλου και του σημείου, και αφού δημιουργήσετε τις κατάλληλες δομές, υλοποιήστε πίνακα Ν θέσεων (όπου το Ν να δηλώνεται μέσω #define) που περιέχει κύκλους διαφόρων διαστάσεων και τοποθεσιών στο επίπεδο. b. Αρχικοποιήστε και εκτυπώστε τον παραπάνω πίνακα μέσω ενός κατάλληλου δείκτη. 19
Άσκηση 2 (2/2) c. Υλοποιήστε την αρχικοποίηση και εκτύπωση του πίνακα (του βήματος 2) μέσω κατάλληλων συναρτήσεων (μία για αρχικοποίηση και μία για εκτύπωση). 20
Άσκηση 3 (1/2) Σας έχει ζητηθεί να γράψετε ένα πρόγραμμα που πρέπει να διαβάζει ένα πολύ μεγάλο αρχείο κειμένου γραμμή προς γραμμή, και να εμφανίζετε στην οθόνη τις 10 τελευταίες γραμμές του. Επειδή το αρχείο αυτό μπορεί να είναι ιδιαίτερα μεγάλο και η σειριακή ανάγνωσή του γραμμή προς γραμμή είναι ιδιαίτερα δαπανηρή από πλευράς χρόνου, δεν έχετε την πολυτέλεια να το διαβάσετε μετρώντας τις γραμμές που έχει, ώστε με τη δεύτερη ανάγνωση να εμφανίσετε τις 10 τελευταίες γραμμές του. 21
Άσκηση 3 (2/2) Περιγράψτε με απλά βήματα την τεχνική που θα πρέπει να χρησιμοποιηθεί ώστε να επιτευχθεί το παραπάνω με μία μόνο ανάγνωση του αρχείου. Οι 10 τελευταίες γραμμές που θα εμφανίζονται στην οθόνη πρέπει να είναι με την ίδια σειρά που υπάρχουν στο αρχείο. Σημείωση: Μην υλοποιήσετε το παραπάνω πρόγραμμα, εκτός αν γνωρίζετε κάποια βασικά για τη διαχείριση αρχείων. 22
Βιβλιογραφία (1/8) Aho AV, Hopcroft JE, and Ullman JD. (1974) The design and analysis of computer algorithms. USA, Addison-Wesley Publishing Company. 470 pp. ISBN 0-201-00029-6. ( 38.33, 46.76). Aho AV, Hopcroft JE, and Ullman JD. (1983) Data structures and algorithms. USA, Addison-Wesley Publishing Company. 427 pp. ISBN 0-201-00023-7. ( 43.65, 53.25). Bik AJC. (2004) The software vectorization handbook: applying multimedia extensions for maximum performance. USA, Intel Press. 236 pp. ISBN 0-9743649-2-4. ( 32.31, 46.63). 23
Βιβλιογραφία (2/8) Carrano FM and Henry T. (2013) Data abstraction and problem solving with C++: walls and mirrors. 6th ed. UK, Pearson Education Limited. 833 pp. ISBN10 0-273-76841-7, ISBN13 978-0-76841-8. Cormen TH, Leiserson CE, Rivest RL, and Stein C. (2012) Εισαγωγή στους αλγορίθμους. USA/Ελλάδα, MIT Press/Ίδρυμα Τεχνολογίας & Έρευνας - Πανεπιστημιακές Εκδόσεις Κρήτης. 1260 pp. ISBN 978-960-524-224-4. Dasgupta S, Papadimitriou C and Vazirani U. (2009) Αλγόριθμοι. Ελλάδα, Εκδόσεις Κλειδάριθμος. 416 σελ. ISBN13 978-960-461-211-6. 24
Βιβλιογραφία (3/8) Gerber R, Bik AJC, Smith KB and Tian X. (2006) The software optimization cookbook: high-performance recipes for IA-32 platforms. 2nd ed. USA, Intel Press. 404 pp. ISBN 0-9764832-1-1. ( 35.07, 50.61). Helman P and Veroff R. (1988) Walls and mirrors: intermediate problem solving and data structures. Modula 2 ed. USA, The Benjamin/Cummings Publishing Company, Inc. 625 pp. ( 23.95). Kleinberg J and Tardos W. (2008) Σχεδιασμός αλγορίθμων. Ελλάδα, Εκδόσεις Κλειδάριθμος. 944 σελ. ISBN13 978-960- 461-207-9. 25
Βιβλιογραφία (4/8) Knuth DE. (2009) Η τέχνη του προγραμματισμού: θεμελιώδεις αλγόριθμοι, Τόμος Α. 3η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 759 σελ. ISBN13 978-960-418-185-8. Knuth DE. (2010) Η τέχνη του προγραμματισμού: ημιαριθμητικοί αλγόριθμοι, Τόμος Β. 3η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 912 σελ. ISBN13 978-960-418-224-4. Knuth DE. (2010) Η τέχνη του προγραμματισμού: ταξινόμηση και αναζήτηση, Τόμος Γ. 2η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 926 σελ. ISBN13 978-960-418-245-9. 26
Βιβλιογραφία (5/8) Kruse RL and Ryba AJ. (1999) Data structures and program design in C++. USA, Prentice Hall. 717 pp. ISBN 0-13- 082640-5. ( 40.74). Lafore R. (2005) Δομές δεδομένων και αλγόριθμοι στη Java. Ελλάδα, Εκδόσεις Μ. Γκιούρδα. 798 σελ. ISBN10 960-512- 452-1. Levitin A. (2008) Εισαγωγή στην ανάλυση και σχεδίαση αλγορίθμων. 2η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 700 σελ. ISBN13 978-960-418-143-8. 27
Βιβλιογραφία (6/8) McConnell S. (1993) Code complete: a practical handbook of software construction. USA, Microsoft Press. 857 pp. ( 25.99). Mehlhorn K and Sanders P. (2008) Algorithms and data structures: the basic toolbox. Germany, Springer-Verlag Berlin Heidelberg. 300 pp. ISBN13 978-3-540-77977-3. ( 28.11, 34.29). Prichard JJ and Carrano FM. (2011) Data abstraction and problem solving with Java: walls and mirrors. 3rd ed. UK, Pearson Education Limited. 959 pp. ISBN10 0-273-75120-4. ISBN13 978-0-273-75120-5. 28
Βιβλιογραφία (7/8) Sahni S. (2004) Δομές Δεδομένων, Αλγόριθμοι, και Εφαρμογές στη C++. Ελλάδα/ΗΠΑ, Εκδόσεις Τζιόλα/McGraw-Hill. 830 σελ. ISBN10 960-418-030-4. Sedgewick R and Flajolet P. (2013) An introduction to the analysis of algorithms. 2nd ed. USA, Pearson Education, Inc. 572 pp. ISBN13 978-0-321-90575-8. Sedgewick R and Wayne K. (2011) Algorithms. 4th ed. USA, Pearson Education, Inc. 952 pp. ISBN13 978-0-321-57351-3. Κοίλιας Χ. (2004) Δομές δεδομένων & οργανώσεις αρχείων. Ελλάδα, Εκδόσεις Νέων Τεχνολογιών. 447 σελ. ISBN10 960-8105-64-1. 29
Βιβλιογραφία (8/8) Μποζάνης ΠΔ. (2006) Δομές Δεδομένων. Ελλάδα, Εκδόσεις Τζιόλα. 552 σελ. ISBN10 960-418-084-3. Μποζάνης ΠΔ. (2009) Προβλήματα & ασκήσεις στους αλγορίθμους. Ελλάδα, Εκδόσεις Τζιόλα. 492 σελ. ISBN13 978-960-418-186-5. Μποζάνης ΠΔ. (2013) Αλγόριθμοι. Ελλάδα, Εκδόσεις Τζιόλα. 549 σελ. ISBN13 978-960-418-070-1. Μυσιρλής Ν. (2002) Δομές δεδομένων με C. Ελλάδα, αυτοέκδοση. 347 σελ. ISBN10 960-92031-1-6. Παπαρίζος Κ. (2010) Ανάλυση και σχεδίαση αλγορίθμων. Ελλάδα, Εκδόσεις Τζιόλα. 606 σελ. ISBN13 978-960-418-222-0. 30
Τέλος Ενότητας
Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Δρ. Γεώργιος Σίσιας. «Δομές Δεδομένων». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: URL. 32
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 33
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 34