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

Σχετικά έγγραφα
Προγραμματισμός ΙΙ Ενότητα 5:

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

Προγραμματισμός ΙΙ. Ενότητα 7: Βιβλιοθήκες - Μέρος 2. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

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

Προγραμματισμός ΙΙ Ενότητα 4:

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

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

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

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

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

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

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

Προγραμματισμός ΙΙ Ενότητα 3:

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

Προγραμματισμός ΙΙ Ενότητα 5:

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

Προγραμματισμός ΙΙ. Ενότητα 8: Βιβλιοθήκες - Μέρος 2. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός ΙΙ Ενότητα 6:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στον δομημένο προγραμματισμό

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στον δομημένο προγραμματισμό

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

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

Προγραμματισμός Διαδικτύου

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Transcript:

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

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

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

Βασικοί τύποι δεδομένων

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

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

Περιεχόμενα ενότητας (2/3) Αποτελέσματα παραδειγμάτων με δείκτες. Ερωτήσεις για τους δείκτες. Δείκτες - Άσκηση 1. Δείκτες - Άσκηση 2. Δείκτες - Άσκηση 3. Σύνθετοι τύποι. 7

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

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

Ακέραιοι Παραδείγματα δήλωσης ακεραίων:. int index = 0; long int bool file_size; Error = false; Εδώ έχουμε έναν ακέραιο με όνομα index και αρχική τιμή 0, έναν long int με όνομα file_size αλλά χωρίς αρχική τιμή, και μια μεταβλητή boolean με όνομα Error και αρχική τιμή false. 10

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

Παραδείγματα δήλωσης αριθμών κινητής υποδιαστολής (1/3) 12

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

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

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

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

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

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

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

Παραδείγματα με δείκτες (1/7) Δοκιμάστε τον ακόλουθο κώδικα: #include <stdio.h> typedef struct { double x, y; // Οι συντεταγμένες ενός σημείου. } Point; // Ο τύπος δεδομένων του σημείου. 20

Παραδείγματα με δείκτες (2/7) 21

Παραδείγματα με δείκτες (3/7) 22

Παραδείγματα με δείκτες (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)); 23

Παραδείγματα με δείκτες (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); 24

Παραδείγματα με δείκτες (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])); 25

Παραδείγματα με δείκτες (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 26

Αποτελέσματα παραδειγμάτων με δείκτες (1/3) Τα αποτελέσματα της εκτέλεσης του παραπάνω κώδικα φαίνονται παρακάτω. Σημείωση. Οι διευθύνσεις μνήμης που παρουσιάζονται ενδέχεται να αλλάζουν από υπολογιστή σε υπολογιστή και από εκτέλεση του ίδιου προγράμματος σε εκτέλεση. 27

Αποτελέσματα παραδειγμάτων με δείκτες (2/3) Εικόνα 1: Αποτελέσματα παραδειγμάτων με δείκτες. Πηγή: Διδάσκων (2015). 28

Αποτελέσματα παραδειγμάτων με δείκτες (3/3) Εικόνα 2: Αποτελέσματα παραδειγμάτων με δείκτες (Συνέχεια). Πηγή: Διδάσκων (2015). 29

Ερωτήσεις για τους δείκτες Τι παρατηρείτε όσον αφορά τις διευθύνσεις μνήμης του πίνακα (MyArray) του 5ου παραδείγματος και του δείκτη που δείχνει σε αυτόν (ArrayPtr), καθώς και των περιεχομένων τους; Όταν αυξάνουμε το δείκτη του 5ου παραδείγματος με τον τελεστή (ArrayPtr++), κατά πόσο αυξάνει ο δείκτης, και σε ποιο στοιχείο του πίνακά μας δείχνει; 30

Δείκτες - Άσκηση 1 a. Δηλώστε, αρχικοποιήστε, και εκτυπώστε έναν πίνακα ακεραίων με Ν στοιχεία (το Ν να είναι δηλωμένο με #define). b. Αρχικοποιήστε και εκτυπώστε τον παραπάνω πίνακα μέσω ενός κατάλληλου δείκτη. c. Υλοποιήστε την αρχικοποίηση και εκτύπωση του πίνακα (του βήματος 2) μέσω κατάλληλων συναρτήσεων (μία για αρχικοποίηση και μία για εκτύπωση). 31

Δείκτες - Άσκηση 2 (1/2) a. Χρησιμοποιώντας το παράδειγμα του κύκλου και του σημείου, και αφού δημιουργήσετε τις κατάλληλες δομές, υλοποιήστε πίνακα Ν θέσεων (όπου το Ν να δηλώνεται μέσω #define) που περιέχει κύκλους διαφόρων διαστάσεων και τοποθεσιών στο επίπεδο. b. Αρχικοποιήστε και εκτυπώστε τον παραπάνω πίνακα μέσω ενός κατάλληλου δείκτη. 32

Δείκτες - Άσκηση 2 (2/2) c. Υλοποιήστε την αρχικοποίηση και εκτύπωση του πίνακα (του βήματος 2) μέσω κατάλληλων συναρτήσεων (μία για αρχικοποίηση και μία για εκτύπωση). 33

Δείκτες - Άσκηση 3 (1/2) Σας έχει ζητηθεί να γράψετε ένα πρόγραμμα που πρέπει να διαβάζει ένα πολύ μεγάλο αρχείο κειμένου γραμμή προς γραμμή, και να εμφανίζετε στην οθόνη τις 10 τελευταίες γραμμές του. Επειδή το αρχείο αυτό μπορεί να είναι ιδιαίτερα μεγάλο και η σειριακή ανάγνωσή του γραμμή προς γραμμή είναι ιδιαίτερα δαπανηρή από πλευράς χρόνου, δεν έχετε την πολυτέλεια να το διαβάσετε μετρώντας τις γραμμές που έχει, ώστε με τη δεύτερη ανάγνωση να εμφανίσετε τις 10 τελευταίες γραμμές του. 34

Δείκτες - Άσκηση 3 (2/2) Περιγράψτε με απλά βήματα την τεχνική που θα πρέπει να χρησιμοποιηθεί ώστε να επιτευχθεί το παραπάνω με μία μόνο ανάγνωση του αρχείου. Οι 10 τελευταίες γραμμές που θα εμφανίζονται στην οθόνη πρέπει να είναι με την ίδια σειρά που υπάρχουν στο αρχείο. Σημείωση: Μην υλοποιήσετε το παραπάνω πρόγραμμα, εκτός αν γνωρίζετε κάποια βασικά για τη διαχείριση αρχείων. 35

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

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

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

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

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

Σύνθετοι τύποι (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 }; 41

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

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

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

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

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

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

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

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

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

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

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

Ασκήσεις

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

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

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

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

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

Βιβλιογραφία (1/10) 1. Alexandrescu A. (2001) Modern C++ design: generic programming and design patterns applied. USA, Addison-Wesley Publishing Company. 323 pp. ISBN-13 978-0-201-70431-0. ( 22.85, 27,42). 2. Bennett S, McRobb S and R Farmer. (2002) Object-oriented systems analysis and design using UML. 2nd Edition. McGraw- Hill Education. ISBN 0-07-709864-1. 3. Booch G, Maksimchuk RA, Engle MW, Young BJ, Conallen J and Houston KA. (2007) Object-oriented analysis and design with applications. 3rd ed. USA, Addison-Wesley. 691 pp. ISBN10 0-201-89551-X. ISBN13 978-0-201-89551-3. ( 43.44, 52.56). 59

Βιβλιογραφία (2/10) 4. 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. 5. Deitel HM and Deitel PJ. (2010) C++ προγραμματισμός. 6η Έκδοση. Ελλάδα, Εκδόσεις Μ. Γκιούρδα. 1448 σελ. ISBN13 978-960-512-591-2. 6. Fowler M. (1999) Refactoring: improving the design of existing code. USA, Addison Wesley Longman, Inc. 431 pp. ISBN13 978-0-201-48567-7. ( 38.62, 49.05). 60

Βιβλιογραφία (3/10) 7. Fowler M. (2004) UML distilled: a brief guide to the standard object modeling language. 3rd ed. USA, Pearson Education, Inc. 175 pp. ISBN13 978-0-321-19368-1. ( 30.10, 38.23). 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). 9. Lafore R. (2006) Αντικειμενοστρεφής προγραμματισμός με τη C++. Ελλάδα, Εκδόσεις Κλειδάριθμος. 1040 σελ. ISBN10 960-209-904-6. 61

Βιβλιογραφία (4/10) 10. Lafore, R. (2002) Object-oriented programming in C++. 4th ed. USA, Sams Publishing. 1012 pp. ISBN-10 0-672-32308-7. ISBN-13 978-0-672-32308-9. ( 29.60, 33.35). 11. Lakos, J. (1996) Large-Scale Software Design in C++. USA, Addison-Wesley. 852 pp. ISBN-10 0-201-63362-0. ISBN-13 978-0-201-63362-7. ( 26.26, 30.20). 12. MacLennan BJ. (1987) Principles of programming languages: design, evaluation, and implementation. 2nd ed. USA, CBS College Publishing. 568 pp. ISBN 0-03-021999-X. ( 8.00). 62

Βιβλιογραφία (5/10) 13. Martin RC. (2012) Agile software development: principles, patterns, and practices. USA, Pearson Education, Inc. 529 pp. ISBN10 0-13-276068-4. ISBN13 978-0-13-276058-4. ( 54.21, 65.59). 14. McConnell S. (1993) Code complete: a practical handbook of software construction. USA, Microsoft Press. 857 pp. ( 25.99). 15. McConnell S. (1996) Rapid development: taming wild software schedules. USA, Microsoft Press. 647 pp. ISBN 1-55615-900-5. ( 25.99). 63

Βιβλιογραφία (6/10) 16. McConnell S. (2004) Professional software development: shorter schedules, higher quality products, more successful projects, enhanced careers. USA, Addison-Wesley. 243 pp. ISBN 0-321-19367-9. ( 19.79, 29.08). 17. McDermid J, ed. (1991) Software engineer s reference book. Great Britain, Butterworth-Heinemann Ltd. 1140 pp. ISBN 0-7506-0813-7. ( 40.00). 18. Meyers S. (1996) More effective C++: 35 new ways to improve your programs and designs. USA, Addison-Wesley. 318 pp. ISBN 0-201-63371-X. ( 25.29, 36.90). 64

Βιβλιογραφία (7/10) 19. Meyers S. (2005) Effective C++: 55 specific ways to improve your programs and designs. 3rd ed. USA, Pearson Education, Inc. 297 pp. ISBN 0-321-33487-6. ( 18.52, 27.01). 20. Pressman RS. (2005) Software engineering: a practitioner s approach. 6th int. ed. Singapore, McGraw-Hill. 912 pp. ISBN 007-123840-9. ( 45.06, 65.83). 21. Reddy M. (2011) API design for C++. USA, Morgan Kaufmann Publishers. 441 pp. ISBN13 978-0-12-385003-4. ( 28.01, 32.21). 22. Sahni S. (2004) Δομές δεδομένων, αλγόριθμοι, και εφαρμογές στη C++. Ελλάδα/ΗΠΑ, Εκδόσεις Τζιόλα/McGraw-Hill. 852 σελ. ISBN10 960-418-030-4. ( 66.56). 65

Βιβλιογραφία (8/10) 23. Savitch W and Mock K. (2013) Πλήρης C++. 4η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 1024 σελ. ISBN13 978-960-418-358-6. ( 76.14). 24. Savitch W. (2015) Java: and introduction to problem solving and programming. 7th ed. USA, Pearson Education, Inc. 989 pp (+204 pp web chapters). ISBN10 0-13-376626-8. ISBN13 978-0- 376626-4. ( 83.99, 97.85 104.75, $122.68). 25. Schildt H. (2000) Ο οδηγός της C++. 3η Έκδοση, Εκδόσεις Μ. Γκιούρδα. 748 σελ. ISBN10 960-512-229-4. ( 29.00). 26. Schildt H. (2004) Μάθετε τη C++ από το μηδέν. 3η Έκδοση. Ελλάδα, Εκδόσεις Κλειδάριθμος. 660 σελ. ISBN10 960-209-731-0. ( 46.90). 66

Βιβλιογραφία (9/10) 27. Sommerville I. (2004) Software Engineering. 7th ed. USA, Addison-Wesley. 759 pp. ISBN 0-321-21026-3. ( 40.95, 60.17). 28. Stroustrup B. (2000) The C++ programming language. Special Edition. USA, Addison-Wesley Longman, Inc. 1020 pp. ISBN 0-201-70073-5. ( 37.20, 54.26). 29. Sutter H and Alexandrescu A. (2005) C++ coding standards: 101 rules, guidelines, and best practices. USA, Pearson Education, Inc. 220 pp. ISBN10 0-321-11358-6. ISBN13 978-0-321-11358-0. ( 19.71, 22.67). 67

Βιβλιογραφία (10/10) 30. Sutter H. (2000) Exceptional C++: 47 engineering puzzles, programming problems, and solutions. USA, Addison- Wesley Longman, Inc. 215 pp. ISBN10 0-201-61562-2. ISBN13 978-0-201-61562-3. ( 24.32, 27.97). 31. Sutter H. (2002) More exceptional C++: 40 new engineering puzzles, programming problems, and solutions. USA, Pearson Education, Inc. 279 pp. ISBN10 0-201-70434-X. ISBN13 978-0-201-70434-1. ( 28.05, 32.26). 32. Χατζηγιαννάκης ΝΜ. (2014) Η γλώσσα C++ σε βάθος. 2η αναθεωρημένη έκδοση. Ελλάδα, Εκδόσεις Κλειδάριθμος. 974 σελ. ISBN13 978-960-461-620-6. ( 89.00). 68

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

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

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

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