Tύποι Δεδομένων

30
Tύποι Δεδομένων • signed/unsigned, long/short • μετατροπη τυπων (αυτοματα και casting) • char • enum • typedef • strings • struct

description

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 -12 32 - PowerPoint PPT Presentation

Transcript of Tύποι Δεδομένων

Page 1: Tύποι Δεδομένων

Tύποι Δεδομένων

• signed/unsigned, long/short

• μετατροπη τυπων (αυτοματα και casting)

• char

• enum

• typedef

• strings

• struct

Page 2: Tύποι Δεδομένων

Βασικοί 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)

Page 3: Tύποι Δεδομένων

Άλλοι Βασικοί 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

Page 4: Tύποι Δεδομένων

Άλλοι Βασικοί 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

Page 5: Tύποι Δεδομένων

Περιορισμενο Πεδιο Τιμων

• Λαθοι– 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)

Page 6: Tύποι Δεδομένων

Περιορισμενο Πεδιο Τιμων

Τι θα συμβει;

unsigned w = 0, x = 0xffffffff;

--w;

++x;

Τι ειναι η δεκαδικη τιμη του y και z:

int y = 0xffffffff;

unsigned z = 0xffffffff;

Προσοχη με σχεσιακους τελεστες

Page 7: Tύποι Δεδομένων

Mετατροπη Τυπων

• Σε αριθμητικες εκφρασεις (αυτοματα) ενα τελεσταιος μετατρεπετε σε αλλο τυπο εαν υπαρχει αλλος τελεσταιος που ειναι πιο δεξια στην ακολουθη διαταξη: char int float double

int x=2;float y=3.0; y/x => 3.0/2.0

Page 8: Tύποι Δεδομένων

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 */

Page 9: Tύποι Δεδομένων

char

• καθε χαρακτηρας αντιστοιχει σε ενα μοναδικο κωδικο

• C βασιζεται στο ASCII code

• αλφαβητικοι, ψηφιακοι, ειδικοι (‘\n’, ‘\t’...) – ‘0’ 48, ‘1’ 49,.., ‘9’ 57– ‘A’ 65, …, ‘Z’ 90 – ‘a’ 97, …, ‘z’ 122

Page 10: Tύποι Δεδομένων

char

• τμημα προγραμματος που τυπωνει τους ψηφιακους χαρακτηρες και τις αντιστοιχες ακεραιες τιμες τουςint j;

for(j=‘0’;j<=‘9’;++j)

printf(“%c %d\n”, (char) j, j);

Page 11: Tύποι Δεδομένων

Απαριθμητοί Τύποι(Enumerated Types)

enum boolean_e {FALSE, TRUE};

enum boolean_e x; /* τυπου enum boolean_e*/

if (x== FALSE){ …}

Page 12: Tύποι Δεδομένων

Απαριθμητοί Τύποι(Enumerated Types)

• Συνταξη:enum onoma {name0, name1, …, name n};

• Σημασια: – ενα συνολο ακεραιων σταθερων– πρωτη σταθερά απαρίθμησης αναπαριστάται ως

0, η δευτερη ως 1 κτλ

• Ορισμος απαριθμητης μεταβλητης– enum enum_onoma onoma;– πχ enum boolean_e y;

Page 13: Tύποι Δεδομένων

Απαριθμητοί Τύποι(Enumerated Types)

• Σταθερες απαριθμησης μπορουν να χρησιμοποιηθουν με αλλους τυπους - μεταχειριζονται σαν ακεραιες σταθερες

• Μεταβλητες τυπου απαριθμησης μεταχειριζοντε σαν ακεραιες μεταβλητες– Δεν γινεται ελεγχος για τις τιμες αναθεσης

• Oυσιαστικα ειναι σταθερες • Οριζονται συνηθως μετα τις σταθερες (global

scope)

Page 14: Tύποι Δεδομένων

Απαριθμητοι Τυποι

• Συνταξη:– 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};

Page 15: Tύποι Δεδομένων

Απαριθμητοί Τύποι(Enumerated Types)

• Επιτρεπετε χρηση ενος ονοματος μονο σε ενα enum (οχι σε αλλο enum ουτε και #define)

• Δεν επιτρεπεται:enum day_e{Mon, Tue, Wed, Thu, Fri, Sat, Sun};

enum weekday_e{Mon, Tue, Wed, Thu, Fri};

Page 16: Tύποι Δεδομένων

typedef

typedef unsigned int nsint;

nsint x;

• Συνταξη: typedef type new_type;

• Σημασια: new_type ειναι νεο ονομα για τον τυπο με ονομα type.

• Xρησιμο για αποφυγη μεγαλων ονοματων τυπων (πιο ακριβη περιγραφη)– Ενας τυπος μπορει να εχει πολλα ονοματα

Page 17: Tύποι Δεδομένων

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){...}

Page 18: Tύποι Δεδομένων

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 *

Page 19: Tύποι Δεδομένων

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));

Page 20: Tύποι Δεδομένων

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;

}

Page 21: Tύποι Δεδομένων

int

strlen(char *p){

char *t = p;

while(*p++);

return (int) (p-t)/sizeof(char);

}

Page 22: Tύποι Δεδομένων

πως διαβαζουμε μια γραμμη σε string• Γραψετε την συναρτηση

int getline(char s[], int lim)που διαβαζει μια γραμμη απο την εισοδο. Η γραμμη αποθηκευεται στον πινακα χαρακτηρων s που ειναι παραμετρος της συναρτησης. To μεγιστο μεγεθος γραμμης οριζεται με το lim. Η συναρτηση επιστρεφει το μηκος της γραμμης.

Page 23: Tύποι Δεδομένων

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;

}

Page 24: Tύποι Δεδομένων

strings

• Πολυ χρησιμη βιβλιοθηκη <string.h>

Page 25: Tύποι Δεδομένων

Δομες/struct(ures):ορισμος τυπου

• struct επιτρεπει τον ορισμο συνθετων τυπων δεδομενων

struct student_s{

char name[80];

int id;

int etos;

float vathmos;

};

ονομα struct

structure membersμελη δομης

Page 26: Tύποι Δεδομένων

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];

Page 27: Tύποι Δεδομένων

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);

Page 28: Tύποι Δεδομένων

struct: αναθεση

• Επιτρεπεται αναθεση μεταξυ μεταβλητων τυπου structs– student_table[i]=student_table[j];– αντιγραφει καθε τιμη του j στο i– αργη, ιδιαιτερα για παραμετρους. προτιμοτερο

παιρνατε/επιστρεφεται δεικτη• void display_student(student_t *s) αντι

void display_student(student_t s)

Page 29: Tύποι Δεδομένων

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);

}

Page 30: Tύποι Δεδομένων

struct:αναφορα σε μελη με δεικτη

for(i=0;i<STUDENT_NUM;++i)

display_student(&student_table[i]);

student_t *s,*p;

……...

if (s->id != p->id){...}