ΕΠΛ 034: Εισαγωγή στον Προγραμματισμό για ΗΜΥ Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy
Κεφάλαιο 10 Τύποι Δεδομένων και Εγγραφές
Θέματα Διάλεξης Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εντολή typedef Απαριθμητικοι τύποι δεδομένων Εγγραφές και σύνθετοι τύποι δεδομένων
Εντολή typedef Σύνταξη: typedef type new_type; π.χ. typedef float temperature; temperature t; Σημασία: new_type είναι νέο όνομα για τον τύπο με όνομα type. Χρήσιμο για αποφυγή μεγάλων ονομάτων τύπων και πιο ακριβή περιγραφή του τι αντιπροσωπεύει μια μεταβλητή (δέστε πιο κάτω εφαρμογή του στους σύνθετους τύπους δεδομένων π.χ. εγγραφές)
Χρήση Πολλών Ονομάτων typedef float temperature; typedef temperature oset; oset func(temperature x, float y, ID_t z){...}
Απαριθμητοί Τύποι Δεδομένων (Enumerated Types) enum boolean {FALSE, TRUE}; enum boolean x; /* η μεταβλητή x είναι τύπου enum boolean */ if (x == FALSE){ } enumeratated type
Εναλλακτική Δήλωση typedef enum {FALSE, TRUE} boolean_e; boolean_e x; /* η μεταβλητή x είναι τύπου boolean_e */ if (x == FALSE){ } enumeratated type: enum {FALSE, TRUE}
Σύνταξη και Σημασιολογία Σύνταξη: typedef enum {NAME0, NAME1,, NAMEn} enum_onoma; Σημασία: ένα σύνολο ακεραίων σταθερών πρώτη σταθερά απαρίθμησης αναπαριστάται ως 0, η δεύτερη ως 1, η τρίτη ως 2 κτλ Ορισμός μεταβλητής τύπου απαρίθμησης enum_onoma onoma; π.χ.: boolean_e x; Σταθερές απαρίθμησης Μεταβλητή τύπου απαρίθμησης
Σταθερές Απαρίθμησης Σταθερές απαρίθμησης είναι ένα σύνολο ακεραίων σταθερών Ορίζονται συνήθως μετά τις σταθερές (καθολική εμβέλεια) Μεταβλητές τύπου απαρίθμησης μεταχειρίζονται σαν ακέραιες μεταβλητές Δε γίνεται έλεγχος για τις τιμές ανάθεσης (ΠΡΟΣΟΧΗ)....
Παραδείγματα typedef enum {NAME0=<σταθερός ακέραιος>, NAME1,..} onoma; typedef enum {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC} month_e; JAN 1, FEB 2 κτλ for(i=jan; i<=dec; ++i){printf( %d\n, i;} typedef enum {NONE=0, IN1=1, IN2=2, IN3=3, OUT=4, NEW1=10, NEW2} incase_e;
Παράδειγμα #include <stdio.h> typedef enum {SUN, MON, TUE, WED, THU, FRI, SAT} day_e; int main() { day_e today, tomorrow; int i; for (i=sun; i<=sat; i++) printf("%d\n", i); today = MON; if (today == SAT) tomorrow = SUN; else tomorrow = (day_e)(today + 1); printf("\ntomorrow = %d\n", tomorrow); return 0; }
ΠΡΟΣΟΧΗ Επιτρέπεται η χρήση κάποιου ονόματος μόνο σε ένα enum (όχι σε άλλο enum ούτε και #define) Δεν επιτρέπεται: typedef enum {SUN, MON, TUE, WED, THU, FRI, SAT} day_e; typedef enum {MON, TUE, WED, THU, FRI} weekday_e;....
Σύνταξη typedef struct { μέλος; μέλος; } <νέο όνομα τύπου> ; ή struct <όνομα τύπου> { μέλος; μέλος; }; Μέλος: δήλωση οποιουδήποτε τύπου μεταβλητής (μπορεί να είναι struct, δείκτης, κλπ)....
Σημασία Το typedef struct επιτρέπει τον ορισμό ενός καινούργιου σύνθετου τύπου δεδομένων. Το typedef struct δεν είναι μεταβλητή Άρα δεν δεσμεύει χώρο στη μνήμη.....
struct: Ορισμός Μεταβλητής typedef struct { int id; float vathmoi[3]; } student_t; ή struct student_s { int id; float vathmoi[3]; }; σύνθετος τύπος δεδομένων student_t student; ή struct student_s student; Χρήσιμο το typedef για αποφυγή μεγάλων ονομάτων τύπων Σημασία: δεσμεύει χώρο για ΟΛΑ τα μέλη της δομής. Στο παράδειγμα πόσα bytes δεσμεύονται για το student;
struct: Ορισμός Μεταβλητής και Πίνακα student_t student, student_a, student_b; student_t student_table[student_num]; Eάν το STUDENT_NUM είναι 100, πόσα bytes δεσμεύονται για το student_table;....
struct: Αναφορά σε Μέλη student.id = 123456; student.vathmoi[0] = 8; student.vathmoi[1] = 5; student.vathmoi[2] = 9.5; printf( %6d %5.2f %5.2f %5.2f\n, student.id, student.vathmoi[0], student.vathmoi[1], student.vathmoi[2]); τελεστής επιλογής (μέλους) Τελεστής με την πιο ψηλή προτεραιότητα επίσης [] και f( ) scanf(%d%f%f%f, &student.id, &student.vathmoi[0], &student.vathmoi[1], &student.vathmoi[2]); ή scanf(%d, &student.id); for(i=0; i<size;i++) scanf(%f, &student.vathmoi[i]);
Αναφορά σε Πίνακα με structs if (student_table[i].id == find_id) ++in_table; for(i=0; i<student_num; ++i) { printf( Student%d stats:\n, i+1); printf( %6d, student_table [i].id); for (j=0; j<vathmoi_num; ++j) printf( %5.2f, student_table [i]. vathmoi[j]); printf( \n ); }
struct: Σαν Παράμετρος void display_student(student_t s){ printf( %6d %5.2f %5.2f%5.2f\n, s.id, s.vathmoi[0],s.vathmoi[1], s.vathmoi[2]); } Πόσος χώρος δεσμεύεται για το s; for(i=0; i<student_num; ++i) display_student(student_table[i]);
struct: Ανάθεση Επιτρέπεται ανάθεση μεταξύ μεταβλητών τύπου struct student_a = student_b; student_table[i] = student_table[j]; αντιγράφει την τιμή κάθε μέλους - π.χ. student_a = {1234, 5, 3, 7}; /* συντακτικά ορθό*/ - student_b = {7654, 5, 5, 9}; - student_a = student_b; Τι περιέχουν τα δύο structs; Προσοχή: Δεν επιτρέπεται σύγκριση μεταξύ μεταβλητών τύπου structs (αν χρειάζεται, τότε πρέπει να γίνει ανά μέλος)....
Ανακεφαλαίωση typedef Δίνει νέο όνομα σε κάποιο τύπο δεδομένων. π.χ. typedef float temperature; temperature t; typedef struct Επιτρέπει τον ορισμό σύνθετων τύπων δεδομένων.....
Δύο βήματα για ορισμό μεταβλητής (Α) Ορίζουμε τον νέο τύπο typedef struct { int id; } student_t; float vathmoi[3]; (Β) Μπορούμε να δηλώσουμε μεταβλητές του τύπου student_t student; Σημασία: δεσμεύει χώρο για ΟΛΑ τα μέλη της δομής....
Χρήση Πίνακες με struct αντί παράλληλοι πίνακες Πιο αφαιρετική προσέγγιση ομαδοποίηση συγγενικών μεταβλητών Πχ. Πληροφορίες μιας ταινίας DVD Κωδικός DVD Τίτλος ταινίας Κατηγορία ταινίας Είδος ταινίας Διάρκεια ταινίας Ονοματεπώνυμα πρωταγωνιστών
Άσκηση Σας δίνεται η πιο κάτω συνάρτηση float apostasi (float xa, float ya, float xb, float yb){ } return (xa-xb)*(ya-yb); Ξαναγράψετε την συνάρτηση συμπληρώνοντας τα πιο κάτω αλλά αυτή την φορά μόνο με δύο παραμέτρους. Οι δύο παράμετροι πρέπει να είναι του ιδίου τύπου και να είναι εγγραφές (structs). typedef struct {..... } point_t; float apostasi (.,. ){ }.........
Περίληψη Εντολή typedef Σύνταξη και σημασιολογία Απαριθμητοί Τύποι (Enumerated Types) Σύνταξη και σημασιολογία Σταθερές απαρίθμησης Μεταβλητές τύπου απαρίθμησης Εγγραφές (Structs) Σύνταξη και σημασιολογία Ορισμός μεταβλητών σύνθετων τύπων δεδομένων Αναφορά σε μέλη εγγραφών Εγγραφές και συναρτήσεις Εγγραφές και πίνακες Χρήση εγγραφών
Τέλος Κεφαλαίου 10