Δομές Δεδομένων. Ενότητα 1: Βασικοί τύποι δεδομένων. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Σχετικά έγγραφα
Δομές Δεδομένων. Ενότητα 2: Περισσότερα για τους δείκτες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 3: Διαχείριση μνήμης. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 4: Πίνακες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 5: Στοίβες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 1: Βασικοί τύποι δεδομένων. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 3: Βασικοί τύποι δεδομένων. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Δομές Δεδομένων Ενότητα 1

Δομές Δεδομένων. Ενότητα 6: Ουρές. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός H/Y Ενότητα 6: Δομές (structures) Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Εισαγωγή στους Αλγορίθμους

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός H/Y Ενότητα 3: Πίνακες αριθμών και χαρακτήρων. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 7: Υπερφόρτωση τελεστών. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στους Αλγορίθμους

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 2: Κλάσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 3: Constructors και destructors

Συστήματα Αναμονής. Ενότητα 3: Στοχαστικές Ανελίξεις. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 9: Ειδικά θέματα γλώσσας C/C++. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Βάσεις Δεδομένων. Ενότητα 1: Εισαγωγή στις Βάσεις δεδομένων. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 6: Φιλικές συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστραφής Προγραμματισμός

Αντικειμενοστραφής Προγραμματισμός

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Δομές Δεδομένων. Ενότητα 8: Διπλά συνδεδεμένες λίστες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 5: Κληρονομικότητα. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Διοικητική Λογιστική

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Ηλεκτρονικοί Υπολογιστές

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Δομημένος Προγραμματισμός

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 3: Πολλαπλή Παλινδρόμηση. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Συστήματα Αναμονής. Ενότητα 5: Ανέλιξη Poisson. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Εισαγωγή στους Αλγορίθμους

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Συστήματα Αναμονής. Ενότητα 7: Ουρά Μ/Μ/1. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Οντοκεντρικός Προγραμματισμός

Προγραμματισμός Ηλεκτρονικών Υπολογιστών 2 - Εργαστήριο

Εισαγωγή στους Αλγορίθμους Ενότητα 8η

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

Εισαγωγή στους Αλγορίθμους Ενότητα 10η

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Δομημένος Προγραμματισμός

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 1: Εκτιμητές και Ιδιότητες. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

ΑΝΤΙΡΡΥΠΑΝΤΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΑΙΩΡΟΥΜΕΝΩΝ ΣΩΜΑΤΙΔΙΩΝ Ενότητα 2: Αιωρούμενα σωματίδια & Απόδοση συλλογής Αν. Καθ. Δρ Μαρία Α. Γούλα Τμήμα Μηχανικών

Συστήματα Αναμονής. Ενότητα 9: Ανέλιξη Γέννησης - Θανάτου. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Συστήματα Αναμονής. Ενότητα 2: Τυχαίες Μεταβλητές. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Οικονομετρία Ι. Ενότητα 10: Διαγνωστικοί Έλεγχοι. Δρ. Χαϊδώ Δριτσάκη Τμήμα Λογιστικής & Χρηματοοικονομικής

ΑΝΑΛΥΣΗ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΩΝ ΚΑΤΑΣΤΑΣΕΩΝ

Λογιστική Κόστους Ενότητα 10: Ασκήσεις Προτύπου Κόστους Αποκλίσεων.

Οικονομετρία Ι. Ενότητα 5: Ανάλυση της Διακύμανσης. Δρ. Χαϊδώ Δριτσάκη Τμήμα Λογιστικής & Χρηματοοικονομικής

Δομημένος Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 8: Συστήματα αρίθμησης

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Αντικειμενοστραφής Προγραμματισμός

Προγραμματισμός H/Y Ενότητα 7: Αρχεία. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Ηλεκτρονικών Υπολογιστών 2 - Εργαστήριο

Ψηφιακή Επεξεργασία Εικόνων

Εισαγωγή στους Αλγορίθμους Ενότητα 7η

Συστήματα Αναμονής. Ενότητα 1: Εισαγωγή. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Οντοκεντρικός Προγραμματισμός

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Πληροφορική ΙΙ Θεματική Ενότητα 5

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

Διδακτική Πληροφορικής

Μηχανολογικό Σχέδιο Ι

Τεχνικό Σχέδιο - CAD

ΑΝΤΙΡΡΥΠΑΝΤΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΑΙΩΡΟΥΜΕΝΩΝ ΣΩΜΑΤΙΔΙΩΝ Ενότητα 6: Ηλεκτροστατικά Φίλτρα

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

Αντικειμενοστραφής Προγραμματισμός

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Οργάνωση και Διοίκηση Πωλήσεων Ενότητα 1: Ο ΡΟΛΟΣ ΤΩΝ ΠΩΛΗΣΕΩΝ ΣΤΟ ΠΛΑΙΣΙΟ ΤΗΣ ΣΤΡΑΤΗΓΙΚΗΣ ΜΑΡΚΕΤΙΝΓΚ

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Τεχνολογία Πολυμέσων. Ενότητα 8: Pool Table. Νικολάου Σπύρος Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Transcript:

Δομές Δεδομένων Ενότητα 1: Βασικοί τύποι δεδομένων Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

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

Περιεχόμενα ενότητας (1/2) Περιεχόμενα ενότητας. Οι βασικοί τύποι δεδομένων. Ακέραιοι. Αριθμοί κινητής υποδιαστολής. Παραδείγματα δήλωσης αριθμών κινητής υποδιαστολής. Δείκτες. 5

Περιεχόμενα ενότητας (2/2) Σύνθετοι τύποι. Μέγεθος τύπων και μεταβλητών. Παραδείγματα. Ασκήσεις. Βιβλιογραφία. 6

Οι βασικοί τύποι δεδομένων Οι βασικοί τύποι δεδομένων που υποστηρίζονται από τη γλώσσα προγραμματισμού C που θα χρησιμοποιήσετε στο εργαστήριο χωρίζονται στις εξής κατηγορίες: Ακέραιοι. Αριθμοί κινητής υποδιαστολής. Δείκτες. Σύνθετοι τύποι (δομές - structures). 7

Ακέραιοι (1/7) Οι αριθμοί αυτοί, όπως υποδηλώνει και το όνομά τους, δεν έχουν δεκαδικό μέρος. Ωστόσο, στην κατηγορία αυτή περιλαμβάνονται και οι φυσικοί αριθμοί. Οι μεταβλητές που δηλώνουμε και ανήκουν σε αυτήν την κατηγορία μπορούν να έχουν μέγεθος 8, 16, 32, ή 64 δυαδικά ψηφία (δ.ψ.), να έχουν πρόσημο (ακέραιοι) ή όχι (φυσικοί). 8

Ακέραιοι (2/7) Η γενική μορφή της δήλωσής τους είναι: [δήλωση προσήμου] [μεταβολή μεγέθους] τύπος_δεδομένων όνομα_μεταβλητής; Η δήλωση του προσήμου είναι προαιρετική. Mπορεί να είναι είτε signed (ακέραιος) είτε unsigned (φυσικός). Όταν δεν υπάρχει, υπονοείται το signed. 9

Ακέραιοι (3/7) Η μεταβολή του μεγέθους είναι προαιρετική, και μπορεί να είναι short ή long. Στη περίπτωση των Windows μπορεί να είναι και long long. Όταν δεν υπάρχει, τότε ο ακέραιος έχει μέγεθος 32 bit. Ο πίνακας που ακολουθεί συνοψίζει τις εκδοχές, τα μεγέθη, καθώς και τα διαστήματα τιμών των ακεραίων. 10

Ακέραιοι (4/7) Πίνακας 1. Ακέραιοι. Πηγή: Διδάσκων (2015). Τύπος Μέγεθος Διάστημα τιμών Διάστημα τιμών (2 ** ) int 32-bit -2 31.. 2 31-1 -2.147.483.648 ως 2.147.483.647 signed int 32-bit -2 31.. 2 31-1 -2.147.483.648 ως 2.147.483.647 unsigned int 32-bit 0.. 2 32-1 0 ως 4.294.967.295 short [int] 16-bit -2 15.. 2 15-1 -32.768 ως 32.767 signed short [int] 16-bit -2 15.. 2 15-1 -32.768 ως 32.767 unsigned short [int] 16-bit 0.. 2 16-1 0.. 65.535 long [int] 32- ή 64-bit -2 31.. 2 31-1, ή -2 63.. 2 63-1 -2.147.483.648 ως 2.147.483.647, ή -9.223.372.036.854.775.808 ως 9.223.372.036.854.775.807 11

Ακέραιοι (5/7) Πίνακας 2. Ακέραιοι (Συνέχεια). Πηγή: Διδάσκων (2015). Τύπος Μέγεθος Διάστημα τιμών (2 ** ) Διάστημα τιμών signed long [int] 32- ή 64-bit -2 31.. 2 31-1, ή -2 63.. 2 63-1 -2.147.483.648 ως 2.147.483.647, ή -9.223.372.036.854.775.808 ως unsigned long 32- ή 0.. 2 32-1, ή [int] 64-bit 0.. 2 64-1 char 8-bit 0.. 2 8-1, ή 9.223.372.036.854.775.807 0 ως 4.294.967.295, ή 0 ως 18.446.744.073.709.551.615 0 ως 255, ή -2 7.. 2 7-1, ανάλογα με την υλοποίηση -128 ως 127, ανάλογα με την υλοποίηση unsigned char 8-bit 0.. 2 8-1 0 ως 255 bool 8-bit Δ.Υ. 0 = false/ψευδές ή 0 = true/αληθές 12

Ακέραιοι (6/7) Η υλοποίηση του long κάτω από Windows σε περιβάλλον 32- ή 64-bit απαιτεί την προσοχή του αναγνώστη. Δεν είναι και στις δύο περιπτώσεις 64- bit. Ακολουθούν παραδείγματα δήλωσης ακεραίων: int index = 0; long int bool file_size; Error = false; 13

Ακέραιοι (7/7) Εδώ έχουμε έναν ακέραιο με όνομα index και αρχική τιμή 0, έναν long int με όνομα file_size αλλά χωρίς αρχική τιμή, και μια μεταβλητή boolean με όνομα Error και αρχική τιμή false. 14

Αριθμοί κινητής υποδιαστολής (1/2) Οι αριθμοί κινητής υποδιαστολής είναι το αντίστοιχο των πραγματικών αριθμών. Στην προκειμένη περίπτωση υπάρχουν τρεις τύποι αριθμών κινητής υποδιαστολής, ανάλογα με την απαιτούμενη ακρίβεια και την υλοποίηση. Μεγαλύτερη ακρίβεια σημαίνει μεγαλύτερο εύρος τιμών, περισσότερα δεκαδικά ψηφία, αλλά και περισσότερο χώρο στη μνήμη και χρόνο επεξεργασίας ορισμένων αριθμητικών πράξεων. 15

Αριθμοί κινητής υποδιαστολής (2/2) Δύο από αυτούς ακολουθούν το πρότυπο IEEE 754 ενός ο τρίτος μόνο σε συγκεκριμένες υλοποιήσεις. Αυτό σημαίνει ότι η δυαδική μορφή αυτών που ακολουθούν το πρότυπο IEEE 754 είναι η ίδια σε διαφορετικές υλοποιήσεις επεξεργαστών (Intel/AMD, IBM Power, Sun UltraSPARC, κ.α.), ενώ αυτών που δεν ακολουθούν κάποιο πρότυπο δεν είναι συμβατοί. 16

Float Οι τρεις τύποι αριθμών κινητής υποδιαστολής είναι οι εξής: float. double. long double. 17

Double Διπλή ακρίβεια. Ο αριθμός αυτός έχει μέγεθος 64-bit. Τα δ.ψ. 0-51 αναπαριστούν τη βάση του αριθμού, τα 52-62 τον εκθέτη, και το 63 το πρόσημο (0 = θετικός, 1 = αρνητικός). Όταν όλα τα δ.ψ. είναι 0, τότε ο αριθμός είναι ο 0. Το διάστημα τιμών είναι της τάξης του 10-308 ως 10 308, με ακρίβεια 15 ως 16 δεκαδικά ψηφία. 18

Long double (1/3) Εκτεταμένη ή τετραπλή ακρίβεια. Στην προκειμένη περίπτωση υπάρχει ζήτημα συμβατότητας με τους επεξεργαστές των προσωπικών υπολογιστών (Intel/AMD), οι οποίοι επί του παρόντος δεν ακολουθούν το πρότυπο IEEE 754. 19

Long double (2/3) Έτσι αυτοί οι αριθμοί στην υλοποίηση των προσωπικών υπολογιστών έχουν εύρος 80-bit. Τα δ.ψ. 0-62 αναπαριστούν τη βάση, το 63 έχει ειδική χρήση, τα 64-78 αναπαριστούν τον εκθέτη, και το 79 το πρόσημο. Το διάστημα τιμών είναι της τάξης του 10-4951 ως 10 4932, με ακρίβεια 19 ως 20 δεκαδικά ψηφία. Μερικοί μεταγλωττιστές χειρίζονται αυτούς τους αριθμούς των 80-bit ως απλούς double, για λόγους συμβατότητας. 20

Long double (3/3) Στην περίπτωση που κάποια υλοποίηση ακολουθεί το εν λόγω πρότυπο (SPARC V8/V9, IBM Power), οι αριθμοί αυτοί έχουν μέγεθος 128-bit. Τα δ.ψ. 0-111 αναπαριστούν τη βάση, τα 112-126 τον εκθέτη, και το τελευταίο (127) το πρόσημο (0 = θετικός, 1 = αρνητικός). Η ακρίβεια των αριθμών αυτών είναι 33-37 δεκαδικά ψηφία. 21

Παραδείγματα δήλωσης αριθμών κινητής υποδιαστολής (1/3) float distance = 5.25f; // Εναλλακτικά: float distance = (float) 5.25; double pi = 3.14; long double earth_radius = 6400.000; 22

Παραδείγματα δήλωσης αριθμών κινητής υποδιαστολής (2/3) Η πρώτη μεταβλητή (distance) είναι αριθμός κινητής υποδιαστολής απλής ακρίβειας, και αρχικοποιείται με τιμή 5.25. Το f στον αριθμό τύπου float είναι για να αποφύγουμε προειδοποίηση του μεταγλωττιστή. Αυτό που συμβαίνει είναι όταν βάζουμε ένα αριθμό κινητής υποδιαστολής, ο μεταγλωττιστής εξ' ορισμού τον θεωρεί double. 23

Παραδείγματα δήλωσης αριθμών κινητής υποδιαστολής (3/3) Έτσι, όταν προσπαθούμε να θέσουμε έναν double (το 5.25) σε μεταβλητή τύπου float, ο μεταγλωττιστής μάς προειδοποιεί για πιθανή απώλεια ακρίβειας (π.χ. potential loss of accuracy). Κατόπιν ακολουθεί δήλωση αριθμού κινητής υποδιαστολής διπλής ακρίβειας με όνομα pi και αρχική τιμή 3.14. Τέλος έχουμε ένα αριθμό εκτεταμένης ή τετραπλής ακρίβειας, ανάλογα με την αρχιτεκτονική, ο οποίος έχει αρχική τιμή 6400.000. 24

Δείκτες (1/8) Οι δείκτες στην ουσία είναι φυσικοί αριθμοί που αποθηκεύουν εικονικές διευθύνσεις μνήμης. Μπορούμε να έχουμε δείκτη οποιουδήποτε τύπου δεδομένων. Ωστόσο, όλοι οι δείκτες έχουν το ίδιο μέγεθος (αφού αναφέρονται σε διευθύνσεις μνήμης), άσχετα με το μέγεθος του μπλοκ μνήμης στο οποίο δείχνουν. 25

Δείκτες (2/8) Στο ίδιο πρόγραμμα δεν μπορούμε να έχουμε 32-bit και 64-bit δείκτες ταυτόχρονα. Το μέγεθος των δεικτών σχετίζεται με τις δυνατότητες του υπολογιστή και του λειτουργικού του συστήματος. Τα όρια ενός 32-bit ΛΣ περιορίζουν μια εφαρμογή σε λιγότερο από 2GB στο σύνολο (π.χ. 1,75 GB). Στην περίπτωση ενός 64-bit ΛΣ τα όρια είναι πολύ μεγαλύτερα, και σχετίζονται με την αρχιτεκτονική του επεξεργαστή και την έκδοση του ΛΣ. 26

Δείκτες (3/8) Γενικά, όμως, για να δοκιμάσουμε 64-bit εκτελέσιμο κώδικα από τα προγράμματά μας, πρέπει να ισχύουν όλες οι ακόλουθες προϋποθέσεις: Ο επεξεργαστής να είναι 64-bit. Το BIOS του υπολογιστή να είναι συμβατό με 64-bit. Το ΛΣ να είναι 64-bit. Το λογισμικό ανάπτυξης εφαρμογών να μπορεί να παράγει (όχι κατ' ανάγκη να είναι το ίδιο) 64-bit. Να έχουμε ρυθμίσει το λογισμικό ανάπτυξης εφαρμογών να παράγει 64-bit εκτελέσιμο. 27

Δείκτες (4/8) Ακολουθούν παραδείγματα δήλωσης δεικτών σε διάφορους τύπους δεδομένων από αυτούς που έχουμε δει μέχρι τώρα: int value = 5; int *int_ptr; int_ptr = &value; // Εναλλακτικά για τις 2 προηγούμενες εντολές: int *int_ptr = &value; char *my_name; double *data = NULL; 28

Δείκτες (5/8) Η πρώτη γραμμή δηλώνει μια απλή ακέραια μεταβλητή που παίρνει αρχική τιμή 5. Στη δεύτερη γραμμή δηλώνουμε δείκτη σε ακέραιο. Ο δείκτης αυτός ΘΑ δείξει σε κάποια διεύθυνση μνήμης αργότερα, όταν πάρει αρχική τιμή. Στην τρίτη γραμμή αρχικοποιούμε το δείκτη της δεύτερης, αποθηκεύοντας σε αυτόν τη διεύθυνση μνήμης της μεταβλητής value (μέσω του τελεστή διεύθυνσης &). 29

Δείκτες (6/8) Παρατηρήστε ότι ο τύπος του δείκτη και ο τύπος της μεταβλητής της οποίας τη διεύθυνση αποθηκεύουμε στο δείκτη είναι ο ίδιος: int. Στη σχολιασμένη γραμμή συνδυάζουμε τη δήλωση και την αρχικοποίηση των δύο προηγούμενων γραμμών σε μία εντολή. Η πέμπτη γραμμή δείχνει τη δήλωση αλλά όχι την αρχικοποίηση ενός δείκτη σε χαρακτήρα (δηλαδή συμβολοσειρά). 30

Δείκτες (7/8) Η τελευταία γραμμή δηλώνει δείκτη σε αριθμό κινητής υποδιαστολής διπλής ακρίβειας, και τον αρχικοποιεί με μια ειδική τιμή που λέγεται NULL. Αυτό σημαίνει ότι ο δείκτης είναι αρχικοποιημένος (σημαντικό), αλλά δε δείχνει σε έγκυρη διεύθυνση μνήμης (ή αν προτιμάτε τη διατύπωση: δεν περιέχει έγκυρη διεύθυνση μνήμης). 31

Δείκτες (8/8) Σημείωση. Η δήλωση ενός δείκτη δε σημαίνει ταυτόχρονα και τη δέσμευση μνήμης. Εδώ ισχύει ό,τι και στην περίπτωση των απλών μεταβλητών: ένας δείκτης μπορεί να μην έχει έγκυρη αρχική τιμή. Για να πάρει έγκυρη τιμή, πρέπει να δεσμεύσουμε μνήμη. Τότε ο δείκτης θα δείχνει στην αρχή του μπλοκ μνήμης που δεσμεύσαμε. Αυτό θα το δούμε σε μεταγενέστερη ενότητα (συνάρτηση malloc και τελεστής new). 32

Σύνθετοι τύποι (1/9) Δομές - structures. Πέρα από τους βασικούς τύπους έχουμε και τους σύνθετους. Αυτοί αποτελούνται από συλλογές απλούστερων ή άλλων σύνθετων τύπων. Έτσι, για παράδειγμα, μπορούμε να ορίσουμε τη δομή της εγγραφής των δεδομένων ενός φοιτητή. 33

Σύνθετοι τύποι (2/9) Στην προκειμένη περίπτωση, για λόγους απλότητας, έχουμε τρία πεδία στο συγκεκριμένο τύπο: // Δήλωση τύπου δομής και εναλλακτικού ονόματος. typedef struct Student_Record_TAG { string Name; // Το όνομα ενός φοιτητή. int AM; // Ο αριθμός μητρώου του. int Modules; // Το πλήθος των μαθημάτων που // χρωστάει. } Student_Record; // Το όνομα του τύπου της δομής (του // καινούργιου τύπου). 34

Σύνθετοι τύποι (3/9) Παράδειγμα δήλωσης και αρχικοποίησης μιας μεταβλητής [του τύπου] της παραπάνω δομής: Student_Record student; // Εναλλακτικά: struct Student_Record_TAG student; // Αρχικοποίηση του πεδίου Name: student.name = "Mary"; // Αρχικοποίηση του πεδίου AM: student.am = 1000; // Αρχικοποίηση του πεδίου Modules: student.modules = 20; 35

Σύνθετοι τύποι (4/9) Η παραπάνω αρχικοποίηση μπορεί να γίνει και με έναν ακόμη τρόπο: Student_Record student = { "Mary", 1000, 20 }; Φυσικά μπορούμε έχουμε πεδία μιας δομής που είναι του τύπου κάποιας άλλης. 36

Σύνθετοι τύποι (5/9) Εδώ θα χρησιμοποιήσουμε το παράδειγμα του κέντρου ενός κύκλου και του ίδιου του κύκλου: typedef struct { double x, y; // Οι συντεταγμένες ενός σημείου. } Point; // Ο τύπος δεδομένων του σημείου. typedef struct { Point c; //Το κέντρο ενός κύκλου (σημείο, με x και y, //όπως παραπάνω). double radius; // Η ακτίνα του κύκλου. } Circle; // Ο τύπος δεδομένων του κύκλου. 37

Σύνθετοι τύποι (6/9) Η δήλωση και αρχικοποίηση ενός κύκλου μπορεί να γίνει όπως παραπάνω: Circle my_circle; // Δήλωση μεταβλητής τύπου Circle. my_circle.c.x = 5.5; my_circle.c.y = 6.2; // Αρχικοποίηση του x του κέντρου (σημείου). // Αρχικοποίηση του y του κέντρου (σημείου). my_circle.radius = 2.3; // Αρχικοποίηση της ακτίνας του κύκλου. Η αρχικοποίηση μπορεί να γίνει και ως εξής: Circle my_circle = { { 5.5, 6.2 }, 2.3 }; 38

Σύνθετοι τύποι (7/9) Ας υποθέσουμε ότι έχουμε μια συνάρτηση που λαμβάνει δεδομένα μέσω δικτύου και αρχικοποιεί τα περιεχόμενα μιας δομής του τύπου Student_Record: void InitStudent(Student_Record *student) { } (*student).name = "Mary"; // Αρχικοποίηση του πεδίου Name. (*student).am = 1000; // Αρχικοποίηση του πεδίου AM. (*student).modules = 20; // Αρχικοποίηση του πεδίου Modules. 39

Σύνθετοι τύποι (8/9) Το παραπάνω μπορεί να γραφεί λιγάκι πιο σύντομα ως εξής: void InitStudent(Student_Record *student) { } student->name = "Mary"; // Αρχικοποίηση του πεδίου Name. student->am = 1000; student->modules = 20; // Αρχικοποίηση του πεδίου AM. // Αρχικοποίηση του πεδίου Modules. 40

Σύνθετοι τύποι (9/9) Το (*παράμετρος).πεδίο μπορεί να γραφεί συντομότερα ως παράμετρος->πεδίο, με την προϋπόθεση ότι η παράμετρος είναι δείκτης. Ο δεύτερος τρόπος είναι και ο πιο συνήθης και διαδεδομένος. Ο λόγος της ανάγκης χρήσης των παρενθέσεων στην πρώτη περίπτωση είναι ότι η "." έχει προτεραιότητα του "*". Έτσι δίνουμε προτεραιότητα στο "*"και μετά στην ".". 41

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

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

Παραδείγματα (1/8) // 1ο παράδειγμα sizeof(int) // 2ο παράδειγμα int x; sizeof(x) // 3ο παράδειγμα sizeof(student_record) // Υποθέτουμε ότι το Student_Record είναι δομή // που έχει ήδη δηλωθεί. // 4ο παράδειγμα Student_Record my_info; // Εναλλακτικά: struct Student_Record my_info; sizeof(my_info) 44

Παραδείγματα (2/8) Στο πρώτο παράδειγμα ζητούμε το μέγεθος ενός ακέραιου. Εμείς, όμως, γνωρίζουμε ότι ένας ακέραιος έχει μέγεθος 4 bytes. Ωστόσο, ΠΟΤΕ και ΣΕ ΚΑΜΙΑ ΠΕΡΙΠΤΩΣΗ δε βάζουμε εμβόλιμο το μέγεθός του, ακόμη κι αν το γνωρίζουμε. 45

Παραδείγματα (3/8) Το αντίθετο θα περιόριζε είτε τη φορητότητα του κώδικά μας σε άλλες αρχιτεκτονικές επεξεργαστών (επί παραδείγματι 32- ή 64-bit) που ενδεχομένως να έχουν διαφορετικό μέγεθος ακεραίου, είτε σε μελλοντικές εκδόσεις της ίδιας αρχιτεκτονικής και των εργαλείων ανάπτυξης. 46

Παραδείγματα (4/8) Στο δεύτερο παράδειγμα ζητούμε το μέγεθος μιας ακέραιας μεταβλητής και όχι του τύπου της. Κι εδώ ισχύουν αυτά που έχουμε πει προηγουμένως. Στο τρίτο παράδειγμα ζητούμε το μέγεθος του τύπου μιας δομής που έχουμε προηγουμένως δηλώσει (δε μας ενδιαφέρει ακόμη τι περιέχει μέσα της όσον αφορά τα πεδία από τα οποία αποτελείται, και συνεπώς το μέγεθός της). 47

Παραδείγματα (5/8) Στο τέταρτο παράδειγμα ζητούμε το μέγεθος μιας μεταβλητής του τύπου της ίδιας δομής με προηγουμένως. Το παράδειγμα αυτό είναι το αντίστοιχο του παραδείγματος 2 σε σχέση με το 1, αλλά αυτή τη φορά με τη χρήση ενός σύνθετου τύπου. 48

Παραδείγματα (6/8) Υπάρχουν περιπτώσεις όπου θέλουμε να μετρήσουμε το πλήθος αντικειμένων ή το μέγεθος κάποιων δομών σε bytes. Στις περιπτώσεις αυτές είναι σκόπιμο να αποφεύγουμε απλουστεύσεις τύπου int, αφού ξέρουμε ότι ένας int όχι μόνο μπορεί να πάρει αρνητικές τιμές, αλλά πιο σημαντικά το ανώτατο όριό του είναι σήμερα πια εύκολο να καλυφθεί με τις ποσότητες μνήμης που έχουν οι σύγχρονοι υπολογιστές. 49

Παραδείγματα (7/8) Για παράδειγμα, ένας πίνακας ακεραίων που έχει 2,5 δισεκατομμύρια στοιχεία θέλει 10 GB RAM. Είναι προφανές ότι το ανώτατο όριο ενός ακεραίου είναι ανεπαρκές (χωρίς να αναφέρουμε την περίπτωση να γυρίσει ο αριθμός σε αρνητικές τιμές). Συνεπώς, το όριο του απλού ακεραίου μάς περιορίζει στα περίπου 500 εκατομμύρια στοιχεία των 4 bytes το καθένα. 50

Παραδείγματα (8/8) Αυτό το πρόβλημα υφίσταται τόσο σε αρχιτεκτονικές 32- όσο και 64-bit. Ο τρόπος αντιμετώπισής του είναι με τη χρήση ενός ειδικού τύπου δεδομένων, του size_t. Ο size_t είναι φυσικός αριθμός (unsigned int) του οποίου το μέγεθος μεταβάλλεται αυτόματα από το μεταγλωττιστή ώστε να είναι συμβατός με 32- ή 64- bit κώδικα. Δηλαδή, το size_t γίνεται αυτόματα 64-bit σε αντίστοιχο περιβάλλον. 51

Ασκήσεις

Άσκηση 1 (1/2) Στην άσκηση αυτή θα πρέπει να δηλώσετε μια δομή (typedef struct) όπου θα συμπεριλάβετε μερικά πεδία δικής σας επιλογής. Δηλώστε μια νέα δομή που χρησιμοποιεί μέσα της (έχει τουλάχιστον ένα πεδίο τύπου της προηγούμενης δομής) την προηγούμενη. Κατασκευάστε τέσσερις συναρτήσεις που θα διαβάζουν από το πληκτρολόγιο τιμές και θα ενημερώνουναρχικοποιούν μεταβλητές των δύο τύπων δομών, όπως επίσης και θα τυπώνουν τα περιεχόμενά τους. 53

Άσκηση 1 (2/2) Δηλώστε δύο δυναμικά δεσμευμένες μεταβλητές των δύο σύνθετων τύπων (δομών) που ορίσατε, αρχικοποιήστε τις (όπως παραπάνω), τυπώστε τα περιεχόμενά τους, και τέλος αποδεσμεύστε τη μνήμη που ζητήσατε. Φροντίστε το πρόγραμμα να ελέγχει για τυχόν ανύπαρκτη μνήμη (δηλαδή ελέγξτε αν οι δείκτες είναι NULL). 54

Άσκηση 2 Δηλώστε πίνακα πέντε (5) θέσεων της παραπάνω σύνθετης δομής (αυτή που περιέχει τουλάχιστον μία ακόμη δομή μέσα της). Αρχικοποιήστε τον πίνακα και κατόπιν τυπώστε τα περιεχόμενά του. 55

Άσκηση 3 (1/2) Δηλώστε πίνακα ακεραίων με μήκος που θα δίνεται σε σταθερά στην αρχή του προγράμματος. Γράψτε συνάρτηση που αρχικοποιεί τον πίνακα με τυχαίες τιμές (rand), καθώς και μία που τυπώνει τα περιεχόμενά του. Γράψτε συνάρτηση που υπολογίζει (επιστρέφει) το μέσο όρο (προφανώς double) των στοιχείων του. 56

Άσκηση 3 (2/2) Επαναλάβετε τα παραπάνω με 2Δ πίνακα. Ομοίως με 3Δ. Φροντίστε στην περίπτωση του 2Δ πίνακα να υπάρχει συνάρτηση που υπολογίζει τον ανάστροφό (όχι αντίστροφο) του. 57

Βιβλιογραφία (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). 58

Βιβλιογραφία (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. 59

Βιβλιογραφία (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. 60

Βιβλιογραφία (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. 61

Βιβλιογραφία (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. 62

Βιβλιογραφία (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. 63

Βιβλιογραφία (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. 64

Βιβλιογραφία (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. 65

Τέλος Ενότητας

Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Δρ. Γεώργιος Σίσιας. «Δομές Δεδομένων». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: URL. 67

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 68

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 69