5 #.Μάθημα Προγραμματισμού με τη C++


 

Σελίδα1 - ΔΟΜΕΣ

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



Προσδιορισμός της δομής
Ο προσδιορισμός της δομής μας λέει πως είναι οργανωμένη η δομή. Καθορίζει ποια μέλη συνιστούν τη δομή και τι τύπου δεδομένων είναι. Στο επόμενο σχήμα θα προσδιορίσουμε μία δομή, η οποία θα αποτελείται από δύο στοιχεία: τον κωδικό ενός προϊόντος και την τιμή του. Έτσι θα μπορέσουμε να ορίσουμε μία νέα κατασκευή δεδομένων ώστε να αποθηκεύουμε πληροφορίες για τα προϊόντα ενός καταστήματος:
Ο προσδιορισμός της δομής ξεκινά με τη δεσμευμένη λέξη struct. Μετά ακολουθεί το όνομα της δομής, που στο παράδειγμα είναι proion. Τα άγκιστρα οριοθετούν τα μέλη της δομής. Τα μέλη της δομής αυτής είναι μία ακέραια μεταβλητή με όνομα kodikos και μία μεταβλητή κινητής υποδιαστολής με όνομα timi. Το ελληνικό ερωτηματικό στο τέλος ορίζει το τέλος του προσδιορισμού της δομής.
Ο προσδιορισμός της δομής χρησιμεύει σαν πρότυπο για τη δημιουργία μεταβλητών τύπου proion. Ο προσδιορισμός της δομήςδεν ορίζει από μόνος του κάποια μεταβλητή (έτσι όπως παρουσιάστηκε), για αυτό και δε δεσμεύει καμία ποσότητα μνήμης.
Ορισμός μεταβλητής τύπου δομής

Από τη στιγμή που προσδιορίσαμε μία δομή, μπορούμε να ορίσουμε μεταβλητές αυτού του τύπου. Το όνομα της δομής χρησιμεύει όπως οι δεσμευμένες λέξεις int, char και float. Εμείς ως χρήστες έχουμε ορίσει ένα νέο τύπο δεδομένων που λειτουργεί όπως και οι ενσωματωμένοι της γλώσσας.
#include <iostream>

struct proion
{
  int kodikos;
  float timi;
};

void main()
{
proion sokolata;//Ορισμός μεταβλητής τύπου proion
int var1; //Ορισμός μεταβλητής τύπου int
sokolata.kodikos = 15; //Απόδοση τιμών στα μέλη
sokolata.timi = 1.75; //της δομής
cout << "Κωδικός προϊόντος: "<<sokolata.kodikos;
cout << "Τιμή προϊόντος: "<< sokolata.timi;

//Ορισμός και απόδοση αρχικών τιμών μαζί
proion tsigara= {53 , 2.70 };
}
Παρατηρείστε την ομοιότητα στον ορισμό μιας μεταβλητής δομής και στον ορισμό μιας μεταβλητής του ενσωματωμένου τύπου int:
proion sokolata;
int var1; 
Προσπέλαση των μελών μιας δομής
Μόλις οριστεί μια μεταβλητή δομής δεσμεύεται τόσος χώρος στη μνήμη όσος αθροιστικά απαιτείται από τα μέλη της. Για τη δομή proion απαιτούνται 4 bytes για το μέλος kodikos που είναι τύπου int και 4 bytes για το μέλος timi που είναι τύπου float, σύνολο 8 bytes.
Από τη στιγμή που οριστεί η μεταβλητή τύπου δομής και δεσμευτεί μνήμη για τα μέλη της μπορούμε να ορίσουμε ή να διαβάσουμε τις τιμές αυτών. Η προσπέλαση των μελών της δομής γίνεται με τη χρήση του τελεστή τελείας (.)
sokolata.kodikos = 15;
Η παράσταση για να προσπελάσετε ένα μέλος δομής αποτελείται από τρία μέρη: το όνομα της μεταβλητής τύπου δομής (sokolata), τον τελεστή τελείας και το όνομα μέλους (kodikos).
Όπως βλέπετε στο παραπάνω παράδειγμα, αυτή η σημειογραφία χρησιμοποιείται και στις εντολές απόδοσης τιμής και παρακάτω όταν διαβάζουμε τις τιμές των μελών και τις εμφανίζουμε στην οθόνη.
Απόδοση αρχικής τιμής σε μεταβλητές δομής
Στο παραπάνω παράδειγμα τα μέλη της μεταβλητής δομής tsigara παίρνουν αρχικές τιμές τη στιγμή που αυτή ορίζεται:
proion tsigara= {53 , 2.70 };
Οι τιμές αποδίδονται με τη σειρά στα μέλη της δομής, περιβάλλονται από άγκιστρα και χωρίζονται με κόμμα.
Συνδυασμός προσδιορισμού δομής και ορισμού
Εάν κάποιος επιθυμεί να ορίσει κάποια μεταβλητή δομής στο σημείο που την προσδιορίζει, μπορεί να το κάνει:
struct proion
{
  int kodikos;
  float timi;
} sokolata;
Σε αυτή την περίπτωση προσδιορίζουμε ένα μοντέλο δεδομένων που το ονομάζουμε proion και ταυτόχρονα ορίζουμε μια μεταβλητή αυτού του νέου τύπου με το όνομα sokolata δεσμεύοντας χώρο στη μνήμη για αυτή. Σε αυτή την περίπτωση το όνομα της δομής proion μετά τη λέξη struct είναι προαιρετικό, όμως εάν παραλειφθεί:
struct
{
  int kodikos;
  float timi;
} sokolata;
δεν έχουμε δικαίωμα να ορίσουμε άλλη μεταβλητή τύπου proion.
Αυτή η σημειογραφία εξοικονομεί μόνο μια δυο γραμμές κώδικα, τον καθιστά όμως πιο δυσνόητο και καλό είναι να την αποφεύγετε.

Δομές μέσα σε δομές
Από τη στιγμή που προσδιορίσουμε μια δομή κι έχουμε στα χέρια μας ως εφόδιο έναν νέο τύπο δεδομένων ορισμένο από το χρήστη, έχουμε κάθε δικαίωμα να τον χρησιμοποιήσουμε στον προσδιορισμό μιας άλλης δομής.
Στο παράδειγμα που ακολουθεί προσδιορίζουμε πρώτα μία δομής με όνομα stoixeia. Αυτή αποτελείται από δύο μεταβλητές: μία τύπου char με ετικέτα onoma ώστε να συγκρατεί το αρχικό γράμμα του ονόματος ενός ατόμου και μία τύπου int με ετικέτα ilikia ώστε να συγκρατεί την ηλικία του ατόμου:
#include <iostream>
struct stoixeia
{
  char onoma;
  int ilikia;
};
struct zeygos
{
  stoixeia man;
  stoixeia woman;
  int xronia_gamou;
};
void main()
{
zeygos gewrgiou;//Ορισμός μεταβλητής τύπου zeygos
gewrgiou.man.onoma =‘X’; //Απόδοση τιμών στα μέλη
gewrgiou.man.ilikia = 35; //της δομής
gewrgiou.woman.onoma = ‘E’;
gewrgiou.woman.ilikia = 29;
gewrgiou.xronia_gamou = 6;
     …
     …
     …
}
Στη συνέχεια ο ορισμένος από τον χρήστη νέος τύπος stoixeia, μπορεί να χρησιμοποιηθεί στον προσδιορισμό μιας νέας δομής. Η νέα δομή έχει όνομα zeygos και συγκρατεί πληροφορίες για ζευγάρια. Αποτελείται από μία μεταβλητή τύπου stoixeia με όνομα man για τις πληροφορίες του άνδρα, από μία μεταβλητή επίσης τύπου stoixeia με όνομα woman για τις πληροφορίες της γυναίκας και από μία μεταβλητή τύπου int με όνομα xronia_gamou που αποθηκεύει τα χρόνια γάμου.
Στη συνέχεια ορίζουμε μία μεταβλητή τύπου zeygos με όνομα gewrgiou:
Αυτή η μεταβλητή αποτελείται από τρία μέλη. Από δύο μεταβλητές τύπου stoixeia με ετικέτες man και woman και μία μεταβλητή τύπου int με ετικέτα xronia_gamou. Εφόσον όμως οι μεταβλητές man και woman είναι τύπου stoixeia, κάθε μία από αυτές αποτελείται από μία μεταβλητή τύπου char και ετικέτα onoma και μία μεταβλητή τύπου int και ετικέτα ilikia. Έτσι για να αποθηκεύσουμε δεδομένα στα μέλη της μεταβλητής δομής georgiou χρησιμοποιούμε δύο φορές τον τελεστή τελείας (.)
gewrgiou.man.onoma = ‘X’;
gewrgiou.man.ilikia = 35;
gewrgiou.woman.onoma = ‘E’;
gewrgiou.woman.ilikia = 29;
Θεωρητικά οι δομές μπορούν να είναι ένθετες, η μία μέσα στην άλλη μέχρι οποιοδήποτε βάθος, δίνοντάς μας τη δυνατότητα να ορίσουμε πολύπλοκες κατασκευές δεδομένων.

συνεχίζετε