Tύποι Δεδομένων
-
Upload
phoebe-sykes -
Category
Documents
-
view
41 -
download
0
description
Transcript of Tύποι Δεδομένων
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..10308264
*δεικτης 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(ures):ορισμος τυπου
• struct επιτρεπει τον ορισμο συνθετων τυπων δεδομενων
struct student_s{
char name[80];
int id;
int etos;
float vathmos;
};
ονομα struct
structure membersμελη δομης
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){...}