Γ7.8 Εγγραφές (Structures) Γ Λυκείου Κατεύθυνσης
Εισαγωγή Εγγραφές ονομάζουμε συλλογές στοιχείων, οι οποίες μας δίνουν τη δυνατότητα να ομαδοποιήσουμε στοιχεία διαφορετικών τύπων. Για παράδειγμα, θα χρησιμοποιήσουμε εγγραφές όταν θέλουμε να αποθηκεύσουμε πληροφορίες για τους μαθητές ενός σχολείου, όπου ο κάθε μαθητής θα μας δίνει: αριθμό μητρώου (ακέραιος), όνομα (συμβολοσειρά), επίθετο (συμβολοσειρά), διεύθυνση (συμβολοσειρά) και ηλικία (ακέραιος). Τα στοιχεία που ανήκουν σε μία εγγραφή καλούνται μέλη. Σε αντίθεση με τους πίνακες, κάθε μέλος της εγγραφής μπορεί να έχει το δικό του αναγνωριστικό.
Εισαγωγή Τα μέλη μπορούν να ανήκουν στους βασικούς τύπους δεδομένων (integer, float, double, boolean, char), να είναι συμβολοσειρές (string), πίνακες ή ακόμη και άλλες εγγραφές.
Ορισμός εγγραφής Μία εγγραφή ορίζεται ως εξής: (α) Ξεκινά με τη δεσμευμένη λέξη struct και ακολουθεί το αναγνωριστικό. (β) Τα άγκιστρα οριοθετούν τα μέλη της εγγραφής. (γ) Το ερωτηματικό στο τέλος ορίζει το τέλος της εγγραφής.
Παράδειγμα Θέλουμε να αποθηκεύσουμε πληροφορίες για τα προϊόντα μίας υπεραγοράς. Για κάθε προϊόν έχουμε τις εξής πληροφορίες: κωδικός προϊόντος (ακέραιος), ποσότητα (ακέραιος), περιγραφή (συμβολοσειρά) και τιμή (πραγματικός). Η εγγραφή να δηλωθεί με το όνομα product.
Δήλωση μεταβλητών εγγραφής Για να δηλώσουμε μεταβλητές τύπου εγγραφής, μπορούμε να κάνουμε τα εξής: (α) Για μία μεταβλητή: product apple; (β) Για πλήθος μεταβλητών: product apple, banana, orange; (γ) Για δήλωση εγγραφής και μεταβλητών ταυτόχρονα: struct product { int code, quantity; string description; double price; } apple, banana, orange;
Απόδοση αρχικών τιμών
Αναφορά στα μέλη μίας εγγραφής Όταν θέλουμε να διαβάσουμε την τιμή ενός μέλους μίας εγγραφής: Ενώ αν θέλουμε να εκχωρήσουμε τιμές:
Πίνακες - Μέλη Ένα μέλος της εγγραφής μπορεί να είναι πίνακας. Αν θέλουμε, για παράδειγμα, στην εγγραφή για έναν μαθητή να μπορούμε να αποθηκεύσουμε τους βαθμούς τεσσάρων διαγωνισμάτων, θα το κάνουμε ως εξής:
Πίνακες - Μέλη Η εκχώρηση τιμών και η απόδοση αρχικών τιμών μπορεί να γίνει ως εξής:
Πίνακες εγγραφών Αν θέλουμε να αποθηκεύσουμε περισσότερα από ένα στοιχεία, μπορούμε να ορίσουμε έναν πίνακα εγγραφών. Για παράδειγμα, αν θέλουμε να αποθηκεύσουμε τις πληροφορίες τριών προϊόντων, θα το κάνουμε ως εξής:
Πίνακες εγγραφών Η αναφορά στα στοιχεία του πίνακα, όπως και στις μεταβλητές τύπου εγγραφής, γίνεται με τη χρήση μίας τελείας μεταξύ του στοιχείου του πίνακα και του μέλους του ως ακολούθως: for (int i=0; i<3; i++) { cin >> fruits[i].code >> fruits[i].quantity >> fruits[i].description >> fruits[i].price; }
Παράδειγμα 8.1 Να δημιουργήσετε πρόγραμμα το οποίο να ορίζει μία εγγραφή με το όνομα student, η οποία να περιέχει τα ακόλουθα μέλη: Αριθμός μητρώου (integer) Επώνυμο (string) Τηλέφωνο (integer) Εκτοπισμένος (boolean) Να ορίσετε έναν πίνακα εγγραφών 20 θέσεων τύπου student, με το όνομα B3. Το πρόγραμμα να δέχεται τα στοιχεία για τους 20 μαθητές από το πληκτρολόγιο. Κώδικας: https://ideone.com/aw7cei
Παράδειγμα 8.2 Να δημιουργήσετε πρόγραμμα το οποίο να ορίζει μία εγγραφή με το όνομα shape, η οποία να περιέχει τα μέλη height (double) και width (double). Το πρόγραμμα να διαβάζει και να αποθηκεύει τις διαστάσεις δέκα ορθογωνίων και να παρουσιάζει στην οθόνη το εμβαδόν και την περίμετρο για κάθε ένα από τα ορθογώνια. Κώδικας: https://ideone.com/zumen1
Ένθετες εγγραφές Μία εγγραφή μπορεί να χρησιμοποιηθεί ως μέλος άλλης εγγραφής. Η πρόσβαση στα μέλη της ένθετης εγγραφής γίνεται ιεραρχικά, με τη χρήση επιπρόσθετης τελείας, όπως θα δείτε στο πιο κάτω παράδειγμα.
Ένθετες εγγραφές Μία εγγραφή μπορεί να χρησιμοποιηθεί ως μέλος άλλης εγγραφής. Η πρόσβαση στα μέλη της ένθετης εγγραφής γίνεται ιεραρχικά, με τη χρήση επιπρόσθετης τελείας, όπως θα δείτε στο πιο κάτω παράδειγμα (Παράδειγμα 3).
Παράδειγμα 8.4 Να δημιουργήσετε πρόγραμμα το οποίο να ορίζει μία εγγραφή με το όνομα member, η οποία να έχει ως μέλη τον κωδικό (integer), το email (string) και μία ένθετη δομή (date), με μέλη την ημέρα (integer), τον μήνα (integer) και τη χρονολογία γεννήσεως (integer). Το πρόγραμμα να δέχεται τα δεδομένα για 50 άτομα και να εμφανίζει το email όσων έχουν γεννηθεί στις 5 Σεπτεμβρίου του 2005. Κώδικας: https://ideone.com/5cbesn
Εγγραφές και συναρτήσεις Οι εγγραφές μπορούν να δοθούν παραμετρικά σε συναρτήσεις όπως και οι μεταβλητές. Μία εγγραφή μπορεί να δοθεί ως παράμετρος αναφοράς, αλλά και ως παράμετρος τιμής. Παράδειγμα 8.5: https://ideone.com/35bc5h
Παράδειγμα 8.6 Να ορίσετε μία εγγραφή (advertising) που να κρατά δεδομένα για το πλήθος των διαφημίσεων (integer), το ποσοστό διαφημίσεων που έχει επιλεγεί για προβολή (double) και το ποσό που κερδίζετε από κάθε διαφήμιση που προβλήθηκε (double). Να δημιουργήσετε πρόγραμμα το οποίο να διαβάζει τα δεδομένα για τα μέλη της εγγραφής και να καλεί μία συνάρτηση (calculate), η οποία να δέχεται παραμετρικά μία εγγραφή advertising και να επιστρέφει τα συνολικά κέρδη από τις διαφημίσεις, που θα εμφανίζονται με δύο δεκαδικά ψηφία. Κώδικας: https://ideone.com/jcrgh9
Αναζήτηση και ταξινόμηση εγγραφών Είδαμε ότι με τη χρήση εγγραφών μπορούμε εύκολα να ομαδοποιήσουμε στοιχεία ανόμοιων τύπων. Το γεγονός αυτό καθιστά ευκολότερο το έργο της αναζήτησης συγκεκριμένων στοιχείων ή της ταξινόμησης αυτών σε σειρά. Ειδικότερα στην ταξινόμηση, η χρήση εγγραφών αντί πολλαπλών παράλληλων πινάκων μειώνει κατά πολύ την έκταση του κώδικα.
Παράδειγμα 8.7 Το Υπουργείο Παιδείας και Πολιτισμού έχει καταγεγραμμένα τα στοιχεία (κωδικός, όνομα, τηλέφωνο, επαρχία) όλων των σχολείων, στο αρχείο schools.txt. Στο αρχείο αυτό υπάρχουν το πολύ 200 σχολεία. Να δημιουργήσετε πρόγραμμα το οποίο να δέχεται τον κωδικό ενός σχολείου και να τυπώνει στην οθόνη, σε μία γραμμή, τα στοιχεία του. Σε περίπτωση που ο κωδικός του σχολείου δεν υπάρχει στο αρχείο, τότε να τυπώνει το μήνυμα «School not found». Κώδικας: https://ideone.com/2hquyt
Παράδειγμα 8.8 Να δημιουργήσετε πρόγραμμα το οποίο να ορίζει μία εγγραφή με το όνομα student, η οποία να περιέχει τα εξής μέλη: όνομα (sting), βαθμός Α τετράμηνου (integer), βαθμός Β τετράμηνου (integer) και τελικός βαθμός (integer). Ο τελικός βαθμός είναι ο μέσος όρος των δύο βαθμών, στρογγυλοποιημένος προς τα πάνω (π.χ. αν έχουμε βαθμούς τετραμήνων 16 και 17, ο τελικός βαθμός θα είναι 17). Το πρόγραμμα να διαβάζει δεδομένα από το αρχείο students.txt (όνομα, βαθμός Α, βαθμός Β) για 20 μαθητές, να υπολογίζει τον τελικό βαθμό για κάθε μαθητή και να εμφανίζει στο αρχείο results.txt το όνομα και τον τελικό βαθμό, με δεξιά στοίχιση δέκα χαρακτήρων, ταξινομημένους σε φθίνουσα σειρά με βάση τον τελικό βαθμό. Κώδικας: https://ideone.com/lkxqvx