300 likes | 374 Views
Tύποι Δεδομένων. signed/unsigned, long/short μετατροπη τυπων (αυτοματα και casting) char enum typedef strings struct. Βασικοί Tύποι Δεδομένων C. Tυπος Μεγεθος Πεδιο Τιμων Μοναδικες char, 1byte ‘ a’..‘z’ ‘A’..‘Z’‘0’..‘9’ 2 8 ή 256 int, 4 bytes -2 31 ..2 31 -1 2 32
E N D
Tύποι Δεδομένων • signed/unsigned, long/short • μετατροπη τυπων (αυτοματα και casting) • char • enum • typedef • strings • struct
Βασικοί Tύποι Δεδομένων C Tυπος Μεγεθος Πεδιο Τιμων Μοναδικες char, 1byte ‘a’..‘z’ ‘A’..‘Z’‘0’..‘9’28 ή 256 int, 4 bytes -231..231-1 232 float, 4 bytes 10-37..1038 232 double 8 bytes 10-307..10308 264 *δεικτης 4 bytes διευθυνσεις 232 (0..232 -1)
Άλλοι Βασικοί Tύποι Δεδομένων • int Πεδιο Μεγεθος Τυπος -215..215-1 2 bytes short (με προσημο) 0..216-1 2 bytes unsigned short -231 .. 231 4 bytes int (με προσημο) 0 .. 232-1 4 bytes unsigned -263..263-1 8 bytes long (με προσημο) 0..264-1 8 bytes unsigned long\ signed/unsigned: ιδιο μεγεθος διαφορετικη σημασια! σχεση signed με unsigned
Άλλοι Βασικοί Tύποι Δεδομένων • char Πεδιο Μεγεθος Τυπος -27..27 1 byte char (με προσημο) 0..28-1 1 byte unsigned char • float, double Πεδιο Μεγεθος Τυπος 10-37 .. 1038 4 bytes float 10-307 .. 10308 8 bytes double 10-4931..104932 16 bytes long double
Περιορισμενο Πεδιο Τιμων • Λαθοι • Aναπαρασταση (round-off error) • πχ 0.1000001 αντι 0.1 ή • επαναλαμβανομενο round-off error μεγενθυνει λαθος • ισοτητα/ανισοτητα x==0.1, 0.999999866, 0.1000001 • Υπερχειλιση (overflow) char y = (char) 255; ++y; • Yπορροη (underflow) • 0.0 αντι 0.000000000000000000000000..001 (45 0s)
Περιορισμενο Πεδιο Τιμων Τι θα συμβει; unsigned w = 0, x = 0xffffffff; --w; ++x; Τι ειναι η δεκαδικη τιμη του y και z: int y = 0xffffffff; unsigned z = 0xffffffff; Προσοχη με σχεσιακους τελεστες
Mετατροπη Τυπων • Σε αριθμητικες εκφρασεις (αυτοματα) ενα τελεσταιος μετατρεπετε σε αλλο τυπο εαν υπαρχει αλλος τελεσταιος που ειναι πιο δεξια στην ακολουθη διαταξη: char int float double int x=2;float y=3.0; y/x => 3.0/2.0
Mετατροπη Τυπων • Σε αναθεση (αυτοματα) η τιμη στα δεξια του = μετατρεπετε στον τυπο της μεταβλητης στα αριστερα του = int x = 3.14; /* 3 */ float x = (2/3); /* 0.0 */ • Casting (ρητη μετατροπη) float x=(float) 2/3; /*2.0/3, 2.0/3.0, 0.66666*/ float x = (float) (2/3); /* 0 */
char • καθε χαρακτηρας αντιστοιχει σε ενα μοναδικο κωδικο • C βασιζεται στο ASCII code • αλφαβητικοι, ψηφιακοι, ειδικοι (‘\n’,‘\t’...) • ‘0’ 48, ‘1’ 49,.., ‘9’ 57 • ‘A’ 65, …, ‘Z’ 90 • ‘a’ 97, …, ‘z’ 122
char • τμημα προγραμματος που τυπωνει τους ψηφιακους χαρακτηρες και τις αντιστοιχες ακεραιες τιμες τους int j; for(j=‘0’;j<=‘9’;++j) printf(“%c %d\n”, (char) j, j);
Απαριθμητοί Τύποι(Enumerated Types) enum boolean_e {FALSE, TRUE}; enum boolean_e x; /* τυπου enum boolean_e*/ if (x== FALSE){ …}
Απαριθμητοί Τύποι(Enumerated Types) • Συνταξη:enum onoma {name0, name1, …, name n}; • Σημασια: • ενα συνολο ακεραιων σταθερων • πρωτη σταθερά απαρίθμησης αναπαριστάται ως 0, η δευτερη ως 1 κτλ • Ορισμος απαριθμητης μεταβλητης • enum enum_onoma onoma; • πχ enum boolean_e y;
Απαριθμητοί Τύποι(Enumerated Types) • Σταθερες απαριθμησης μπορουν να χρησιμοποιηθουν με αλλους τυπους - μεταχειριζονται σαν ακεραιες σταθερες • Μεταβλητες τυπου απαριθμησης μεταχειριζοντε σαν ακεραιες μεταβλητες • Δεν γινεται ελεγχος για τις τιμες αναθεσης • Oυσιαστικα ειναι σταθερες • Οριζονται συνηθως μετα τις σταθερες (global scope)
Απαριθμητοι Τυποι • Συνταξη: • enum onoma{name0=constant, name1,..}; • enum month_e{JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC}; • JAN 1, FEB 2 κτλ • for(i=JAN;i<=DEC;++i){printf(“%d\n”,i;} • πχ enum incase_e {NONE=0, IN1=1, IN2=2, IN12=3, OUT=4, EMPTY=0};
Απαριθμητοί Τύποι(Enumerated Types) • Επιτρεπετε χρηση ενος ονοματος μονο σε ενα enum (οχι σε αλλο enum ουτε και #define) • Δεν επιτρεπεται: enum day_e{Mon, Tue, Wed, Thu, Fri, Sat, Sun}; enum weekday_e{Mon, Tue, Wed, Thu, Fri};
typedef typedef unsigned int nsint; nsint x; • Συνταξη: typedef type new_type; • Σημασια: new_type ειναι νεο ονομα για τον τυπο με ονομα type. • Xρησιμο για αποφυγη μεγαλων ονοματων τυπων (πιο ακριβη περιγραφη) • Ενας τυπος μπορει να εχει πολλα ονοματα
typedef typedef enum boolean_e boolean_t; boolean_t x; typedef unsigned int nsint; typedef nsint ID_TYPE; nsint foo(nsint x, unsigned int y, ID_TYPE z){...}
strings • string ειναι ενας πινακας με χαρακτηρες που τελειωνει με τον χαρακτηρα NULL ‘\0’ • char tname[]=“yia sou”; • char tname[]={‘y’, ‘i’, ‘a’, ‘ ’, ‘s’, ‘o’, ‘u’, ‘\0’}; • “yia sou” αποτελειται απο 8 χαρακτηρες • printf(“%s”,tname); • scanf(“%s”,tname);/*προσοχη ‘\0’ προστεθει στο τελος*/ • string pointer: σχεδον παντα επεξεργασια strings γινεται με string pointer: char *
int strlen(char *p){ int length; for(length=0;*p!=NULL;++p,++length);/*den metra NULL*/ return length; } char tname[]=“yia sou”; char *pname = tname; char *ps = “epl 131”; printf(“String %s has length %d characters\n”, tname,strlen(tname));
int strlen(char *p){ int length=0; while(*p!=NULL){ ++length; ++p; } return length; } int strlen(char *p){ int length=0; while(*p++!=NULL){ ++length; } return length; }
int strlen(char *p){ char *t = p; while(*p++); return (int) (p-t)/sizeof(char); }
πως διαβαζουμε μια γραμμη σε string • Γραψετε την συναρτηση int getline(char s[], int lim) που διαβαζει μια γραμμη απο την εισοδο. Η γραμμη αποθηκευεται στον πινακα χαρακτηρων s που ειναι παραμετρος της συναρτησης. To μεγιστο μεγεθος γραμμης οριζεται με το lim. Η συναρτηση επιστρεφει το μηκος της γραμμης.
int getline(char s[], int limit) { int c, k; for(k=0;k<limit-1 && (c=getchar())!=‘\n’ && c!=EOF) s[k]=c; if (c==‘\n’){ s[k]=c; ++k; } s[k]=‘\0’; return k; }
strings • Πολυ χρησιμη βιβλιοθηκη <string.h>
ονομα struct structure members μελη δομης Δομες/struct(ures):ορισμος τυπου • struct επιτρεπει τον ορισμο συνθετων τυπων δεδομενων struct student_s{ char name[80]; int id; int etos; float vathmos; };
struct: oρισμος μεταβλητης struct student_s{ char name[80]; int id; float vathmos; }; struct student_s student; typedef struct student_s student_t; student_t student_table[STUDENT_NUM];
struct: αναφορα σε μελη student.id = 123456; if (student_table[i].vathmos >8.0) ++very_good_grade; for(i=0;i<STUDENT_NUM;++i) printf(“%s %6d %5.2f”,student_table[i].name, student_table[i].id, student_table[i].vathmos);
struct: αναθεση • Επιτρεπεται αναθεση μεταξυ μεταβλητων τυπου structs • student_table[i]=student_table[j]; • αντιγραφει καθε τιμη του j στο i • αργη, ιδιαιτερα για παραμετρους. προτιμοτερο παιρνατε/επιστρεφεται δεικτη • void display_student(student_t *s) αντι void display_student(student_t s)
struct: pointers void display_student(student_t s){ printf(“%s %6d %5.2f”,s.name, s.id, s.vathmos); } αναφορα σε μελη struct με δεικτη: δεικτης->μελος void display_student(student_t *s){ printf(“%s %6d %5.2f”,s->name, s->id, s->vathmos); }
struct:αναφορα σε μελη με δεικτη for(i=0;i<STUDENT_NUM;++i) display_student(&student_table[i]); student_t *s,*p; ……... if (s->id != p->id){...}