Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Laboratorio di Linguaggi lezione III Marco Tarini Laboratorio di Linguaggi • docente: Marco Tarini e-mail: [email protected] • ricevimento: Mercoledì dalle 11:00 o anche su appuntamento • libro di testo consigliato: Kelley Al, Pohl Ira: "C Didattica e Programmazione" ("A Book on C") quarta edizione - anche la terza va bene Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Piccoli trucchi con i chars • Caratteri ASCII e numeri di un byte sono proprio lo stesso tipo! /* restituisce 1 se il carattere e' una lettera minuscola, o 0 altrimenti */ int is_minuscolo(char c){ if ( (c>=‘a') && (c<=‘z') ) return 1; return 0; } /* restituisce la versione minuscola di un carattere dato*/ char minuscolo(char c){ ? Es.: QUALE CODICE INSERIRE QUI ? (esercizio non facilissimo) } (ricordiamoci la filosofia del C: linguaggio che permette di dire tutto in poche righe di codice.) (poche e quindi talvolta criptiche. Usare commenti!) Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Tipi Base : interi tipo dimensione minino valore assumibile (in bytes) massimo valore assumibile char 1 - 128 +127 short 2* - 32K +32K (-1) int 4* - 2*K*K*K +2*K*K*K (-1) long 4* (idem) (idem) * Di solito. Dipende dalla macchina. (remember: niente macchine astratte!) Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Tipi Base : virgola mobile tipo minino/massimo cifre decimali dimensione valore esprimibili (circa) (in bytes) assumibile float 4* 10∓38 6 double 8* 10∓308 15 long double 8* (idem) (idem) * Di solito. Dipende dalla macchina. (remember: niente macchine astratte!) * float è più efficiente in spazio, ma sorprendentemente può essere persino meno efficiente in tempo (es. su molti processori INTEL). Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria La dimensione dei vari tipi • Si può chiedere al compilatore. • Costrutto "sizeof" – sintassi: sizeof( <tipo> ) • ad esempio, sizeof( int ) è una espressione (costante) che vale 4. – nota: non è una funzione (che restituisce 4): non c'è nessuna invocazione di funzione, il valore di "sizeof" è risolto staticamente Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Literals in virgola mobile 5.32 5.32f un double (un float a precisione doppia) che vale 5,32 un float che vale 5,32 5.32e12 un double che vale 5,32 x 1012 5.32e-12 un double che vale 5,32 x 10-12 5.32e-12f un float che vale 5,32 x 10-12 esempi: double avogadro = 6.022e23; /* N molecole x mole */ double epsilon = 1e-18; che è meglio (più chiaro, meno orrendo) di: double epsilon = 0.000000000000000001; Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Tipo delle espressioni • viene indovinato dal compilatore… int x = 10, y; x = x / 3; double x = 10, y; y = x / 3; float x = 10, y; y = x / 3; equivalente a: double x = 10.0, y; y = x / 3.0; double x = 10.0f, y; equivalente a: y = x / 3.0f; NB: nelle operazioni miste viene convertito tutto al tipo più preciso. (double più preciso di float, float di int, int di short, short di char, etc). Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Cambiamento di tipo: espliciti • si può anche cambiare esplicitamente: double x = 10.0; y = ((int)x) / 3; /* y = 3.0 */ • si tratta di un type-cast – sintassi: (<tipo di destinazione>) <espressione> – altri esempi: int pippo; ... ... (float)pippo ... (unsigned int)204 float zap; ... ... (int)zap ... /* espressione: pippo come float */ /* espressione: pippo come float */ /* espres.: zap come int (fa arrotondamento) */ Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Cambiamento di tipo: negli assegnamenti • Assegnamento base = <left value> = <expr> tipo T0 tipo T1 typecast automatico se T0 diverso da T1 (ma solo se esiste una conversione automatica). Ma e' sempre meglio (piu' chiaro) usare un typecast esplicito! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Cambiamento di tipo: negli assegnamenti • Assegnamento base x = y = z = 10; = expr di tipo T0 <left value> = <expr> tipo T0 tipo T1 typecast automatico se T0 diverso da T1 (ma solo se esiste una conversione automatica). Ma e' sempre meglio (piu' chiaro) usare un typecast esplicito! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Cambiamento di tipo • Espliciti – typecast esplicito (<tipo di destinazione>) <espressione> • Nelle espressioni miste – conversione automatica al tipo più preciso • Negli assegnamenti – conversione automatica al tipo più preciso SE POSSIBILE ! Non tutto si può trasformare in tutto (da tipo base a tipo base: ok) Se non possibile: errore di compilazione (errore buono) Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Campo minato ! float x ; x = 1 / 120; float x ; int denominatore = 120.0; x = 1 / denominatore; int numerone1, numerone2, media; ... media= (numerone1 + numerone2) /2; Soluz: media= (((unsigned int) numerone1)+numerone2) /2; int gradi ; float circonferenza = 1000.0; /* in metri float arco; ... arco = circonferenza * (gradi/360); */ /* calcolo lunghezza arco di cironferenza */ Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria • Tipi in C: – Tipi base – Tipi definiti dall'untente Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Tipi definiti: il tipo enum. • esempio: enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } giorno; ("giorno" è una var che vale uno dei valori listati) • meglio definire un tipo: typedef enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } GiornoSettimana; GiornoSettimana ieri, oggi; ("GiornoSettimana" è il tipo delle variabili che possono assumere i valori listati, e "ieri" e "oggi" sono due variabili di tale tipo) Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Tipi definiti: il tipo enum. semplicemente delle nuove costanti, che valgono 0, 1, 2 , 3, 4, 5, 6 typedef enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } GiornoSettimana; GiornoSettimana ieri, oggi; • sono implementati come interi, a tutti gli effetti. if ( (oggi > MERC) && (oggi <= VEN ) ) ... if ( oggi == DOM ) oggi = LUN; else oggi++; • come si fanno passare 5 giorni? oggi = ( oggi + 5 ) % 7; Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Tipi composti: il tipo struct definizione del tipo. MA NON E' UNA CLASSE: tutto "public" niente metodi niente costruttore… typedef struct { char giorno; Mese mese; short anno; } Data; dichiarazione di alcune variabili Data oggi, mio_compleanno; con inizializzatore (nota la sintassi del literal, a dx del '=') Data data_esame = { 28, OTTOBRE, 2004 }; accesso ai campi (come per le classi) int main(){ data_esame.mese = DICEMBRE; ... }; Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria Tipi composti: il tipo struct typedef struct { char giorno; Mese mese; short anno; } Data; • si può chiedere la dimensione del nuovo tipo "Data": sizeof(Data) • che sarà uguale a: sizeof(char)+sizeof(Mese)+sizeof(short) • in fatti, in memoria, una struct e' codificata come la semplice concatenzaione delle codifiche dei suoi campi : codifica di giorno codifica di mese Marco Tarini ‧ Laboratorio di Linguaggi ‧ codifica di anno 2006/07 ‧ Università dell’Insubria Tipi composti: il tipo struct typedef struct { char giorno; Mese mese; short anno; } Data; typedef struct { Data partenza; Data arrivo; int numero_stanza; } Prenotazione; Prenotazione p = { { 28, OTTOBRE, 2004 }, { 2, NOVEMBRE, 2004 }, 23 }; Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2006/07 ‧ Università dell’Insubria