Δομζσ Αφαιρετικότθτα ςτα Δεδομζνα
Περιεχόμενα Ζννοια δομισ Οριςμόσ δομισ Διλωςθ μεταβλθτϊν Απόδοςθ Αρχικϊν τιμϊν Αναφορά ςτα μζλθ μιασ δομισ Ζνκεςθ Δομισ Πίνακεσ Δομϊν
Η ζννοια τθσ δομισ Χρθςιμοποιιςαμε τουσ τφπουσ δεδομζνων για να προςδιορίςουμε τισ μεταβλθτζσ με τισ οποίεσ αναπαριςτοφμε τα δεδομζνα του προβλιματόσ μασ. Ζτςι, προςδιορίςαμε ςαν ακζραιου τφπου τθ μεταβλθτι του απαρικμθτι, και ςαν τφπου κινθτισ υποδιαςτολισ απλισ ακρίβειασ τθ μεταβλθτι που αναπαριςτά τθ κερμοκραςία. Τι γίνεται όμωσ με τθν αναπαράςταςθ δεδομζνων όπωσ «διεφκυνςθ», «ςυντεταγμζνεσ τετραγϊνου» κ.λπ. Προφανϊσ, είναι αδφνατο να ζχουμε ζναν τφπο για τθν αναπαράςταςθ κάκε ζννοιασ του φυςικοφ προβλιματοσ. Οι ςφγχρονεσ γλϊςςεσ προγραμματιςμοφ για να επιτρζψουν το χειριςμό ομάδων δεδομζνων διαφορετικοφ τφπου, τα οποία ζχουν ςχζςθ μεταξφ τουσ, παρζχουν ζνα μθχανιςμό που επιτρζπει τον οριςμό νζων τφπων.
Η ζννοια τθσ δομισ Ο τφποσ τθσ δομής (struct) (ή της εγγραφής (record) τηςpascal), ςε αντίκεςθ με αυτόν του πίνακα, μασ επιτρζπει να χειριηόμαςτε ομάδεσ δεδομζνων, τα οποία ζχουν κάποια ςχζςθ μεταξφ τουσ και είναι διαφορετικοφ τφπου. Τον μθχανιςμό struct χρθςιμοποιοφμε για να ορίςουμε ζνα νζο τφπο, είτε όταν κζλουμε να αναπαραςτιςουμε μια ζννοια ι ζνα αντικείμενο του φυςικοφ προβλιματοσ που χαρακτθρίηεται από ζνα ςφνολο ιδιοτιτων διαφορετικοφ πικανόν τφπου ι όταν για οποιοδιποτε λόγο κζλουμε να ομαδοποιιςουμε κάτω από ζνα όνομα μεταβλθτζσ του προγράμματοσ οι οποίεσ είναι πικανόν διαφορετικοφ τφπου. Επιπλζον, ςε αντίκεςθ με τον πίνακα, όπου το κάκε διαφορετικό δεδομζνο προςδιορίηεται από τθν τάξθ του μζςα ςε αυτόν, το κάκε δεδομζνο μζλοσ τθσ δομισ, που ονομάηεται και πεδίο (field), μπορεί να ζχει το δικό του όνομα. Τα μζλθ μιασ δομισ μπορεί να ανικουν ςτουσ βαςικοφσ τφπουσ int, char, float και double, μπορεί να είναι πίνακεσ αλλά ακόμθ και άλλεσ δομζσ.
Οριςμόσ Δομισ Ο οριςμόσ μιασ δομισ ζχει τθν παρακάτω μορφι: struct [<όνομα δομισ >] { <τφποσ 1 ου μζλουσ> <όνομα 1 ου μζλουσ>; <τφποσ 2 ου μζλουσ> <όνομα 2 ου μζλουσ>; <τφποσ 3 ου μζλουσ> <όνομα 3 ου μζλουσ>; <τφποσ n ου μζλουσ> <όνομα n ου μζλουσ>; };
Οριςμόσ Δομισ Ο οριςμόσ τθσ δομισ ορίηει ςτθν πράξθ ζνα «καλοφπι», ςφμφωνα με το οποίο κα δεςμεφεται μνιμθ για τισ δθλοφμενεσ μεταβλθτζσ τθσ νζασ δομισ ι αλλιϊσ, του νζου τφπου. Σαν παράδειγμα, δίνεται ο οριςμόσ τθσ δομισ ορκογϊνιο (rectangle): struct rectangle { int x1, y1; int x2, y2; int line_color; int fill_color; };
Διλωςθ Μεταβλθτϊν Η διλωςθ μεταβλθτϊν ακολουκεί το γενικό κανόνα δθλϊςεων τθσ C και γίνεται με πρόταςθ διλωςθσ τθσ μορφισ: struct <όνομα δομής > <όνομα μεταβλητής >; ι struct <όνομα δομής > <ονομάτα μεταβλητών >; Παράδειγμα: struct rectangle rect1, rect2; με τθν προχπόκεςθ ότι ζχει προθγθκεί ο οριςμόσ τθσ δομισ rectangle
Απόδοςθ Αρχικϊν Τιμϊν Μποροφμε να αποδϊςουμε αρχικζσ τιμζσ ςτισ μεταβλθτζσ τθ ςτιγμι τθσ διλωςισ τουσ. Παράδειγμα: struct rectangle rect1= {10,10,40,40,RED,GREEN}, rect2 = {5,5,50,50,RED,BLUE};
Αναφορά ςτα μζλθ τθσ δομισ Η αναφορά ςτα μζλθ δομισ γίνεται με κατάλλθλο ςυνδυαςμό του ονόματοσ τθσ μεταβλθτισ και του ονόματοσ του μζλουσ. Χρθςιμοποιείται ο τελεςτισ τελεία (.) για να ςχθματιςκεί θ ζκφραςθ τθσ παρακάτω μορφισ: <όνομα μεταβλητής>.<όνομα μζλους> Ζτςι, θ ζκφραςθ rect1.x1 αναφζρεται ςτο μζλοσ x1 τθσ μεταβλθτισ rect1, ενϊ θ rect2.line_color αναφζρεται ςτο μζλοσ line_color τθσ μεταβλθτισ rect2
Ζνκεςθ δομισ Μια δομι μπορεί να περιλαμβάνει μζλθ τα οποία είναι τφπου άλλθσ δομισ. Παράδειγμα: struct person { }; struct address addr; struct day birthday;
Πζραςμα δομισ ςε ςυνάρτθςθ Η C υποςτθρίηει τθν κατ αναφορά αλλά και τθν κατά τιμι μεταβίβαςθ των δομϊν ςτισ ςυναρτιςεισ. Ζτςι, είναι επιλογι του προγραμματιςτι, αν κα περάςει επιλεκτικά οριςμζνα μζλθ τθσ δομισ, κα περάςει όλθ τθ δομι ι κα περάςει μόνο ζνα δείκτθ ςε αυτι.
Πίνακεσ Δομϊν H διλωςθ πίνακα δομϊν ζχει ωσ κατωτζρω: struct address addr[10]; Η απόδοςθ αρχικισ τιμισ ςτθ δομι είναι ανάλογθ με το γενικό κανόνα αρχικοποίθςθσ πινάκων. Ζτςι, για τθν αρχικοποίθςθ των τριϊν πρϊτων ςτοιχείων του πίνακα addr ζχουμε τθν παρακάτω διλωςθ αρχικοποίθςθσ: struct address addr[10] = { { Kleanthis, Telou Agra, 10, 24662, Patras }, { Nikos, Marathona,12,12345, Athens }, { kostas, Korinthou,340, 24561, Aigio } }; Τα υπόλοιπα ςτοιχεία του πίνακα addr κα ζχουν μθδενικζσ τιμζσ.
Πίνακεσ Δομϊν Για τθν αναφορά ςτα μζλθ των ςτοιχείων του πίνακα, ακολουκείται θ προφανισ ςφνταξθ. H ζκφραςθ addr[0].name αναφζρεται ςτο όνομα τθσ πρϊτθσ διεφκυνςθσ του πίνακα, ενϊ θ addr[1].name αναφζρεται ςτο όνομα τθσ δεφτερθσ διεφκυνςθσ του πίνακα. Προςζξτε τθν ζκφραςθ addr[1].name[0] αναφζρεται ςτον πρϊτο χαρακτιρα τοφ ονόματοσ τοφ πρϊτου ςτοιχείου τοφ πίνακα addr.
Παραδείγματα Ειςαγωγι Εμφάνιςθ Αναφορά ςτα μζλθ μιασ δομισ Πζραςμα δομισ ςε ςυνάρτθςθ