190 likes | 354 Views
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: tarini@isti.cnr.it
E N D
Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Laboratorio di Linguaggilezione III Marco Tarini
Laboratorio di Linguaggi • docente: Marco Tarini e-mail: tarini@isti.cnr.it • 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 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
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 */ intis_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!) M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Tipi Base : interi minino valore assumibile massimo valore assumibile dimensione (in bytes) tipo 1 2* 4* 4* - 128 +127 - 32K +32K (-1) - 2*K*K*K +2*K*K*K (-1) (idem) (idem) char short int long * Di solito. Dipende dalla macchina. (remember: niente macchine astratte!) M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Tipi Base : virgola mobile minino/massimo valore assumibile cifre decimali esprimibili (circa) dimensione (in bytes) tipo 10∓38 10∓308 (idem) 4* 8* 8* 6 15 (idem) float double long double * 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). M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
La dimensione dei vari tipi • Si può chiedere al compilatore. • Costrutto "sizeof" • sintassi: • ad esempio, è 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 sizeof( <tipo> ) sizeof( int ) M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Literals in virgola mobile 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 molecolex mole */ double epsilon = 1e-18; che è meglio (più chiaro, meno orrendo) di: double epsilon = 0.000000000000000001; 5.32 un double (un float a precisione doppia) che vale 5,32 5.32f un float che vale 5,32 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Tipo delle espressioni • viene indovinato dal compilatore… int x = 10, y; x = x / 3; double x = 10, y; y = x / 3; double x = 10.0, y; y = x / 3.0; equivalente a: float x = 10, y; y = x / 3; double x = 10.0f, y; y = x / 3.0f; equivalente a: 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). M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Cambiamento di tipo: espliciti int pippo; ... ... (float)pippo ... /* espressione: pippo come float */ (unsigned int)204 /* espressione: pippo come float */ float zap; ... ... (int)zap ... /* espres.: zap come int (fa arrotondamento) */ • si può anche cambiare esplicitamente: • si tratta di un type-cast • sintassi: • altri esempi: double x = 10.0; y = ((int)x) / 3; /* y = 3.0 */ (<tipo di destinazione>)<espressione> M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Cambiamento di tipo: negli assegnamenti 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! • Assegnamento base = <left value> = <expr> M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Cambiamento di tipo: negli assegnamenti expr di tipo T0 tipo T0 tipo T1 • Assegnamento base x = y = z = 10; = <left value> = <expr> typecast automatico se T0 diverso da T1 (ma solo se esiste una conversione automatica). Ma e' sempre meglio (piu' chiaro) usare un typecast esplicito! M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Cambiamento di tipo SE POSSIBILE ! Non tutto si può trasformare in tutto (da tipo base a tipo base: ok) Se non possibile: errore di compilazione (errore buono) • Espliciti • typecast esplicito • Nelle espressioni miste • conversione automatica al tipo più preciso • Negli assegnamenti • conversione automatica al tipo più preciso (<tipo di destinazione>)<espressione> M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Campo minato ! Soluz: media= (((unsigned int) numerone1)+numerone2) /2; float x ; x = 1 / 120; float x ; int denominatore = 120.0; x = 1 / denominatore; int numerone1, numerone2, media; ... media= (numerone1 + numerone2) /2; intgradi ; float circonferenza = 1000.0; /* in metri */ float arco; ... arco = circonferenza * (gradi/360); /* calcolo lunghezza arco di cironferenza */ M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Tipi in C: • Tipi base • Tipi definiti dall'untente M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Tipi definiti: il tipo enum. • 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) • esempio: ("giorno" è una var che vale uno dei valori listati) enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } giorno; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
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; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Tipi composti: il tipo struct typedef struct { char giorno; Mese mese; short anno; } Data; definizione del tipo. MA NON E' UNA CLASSE: tutto "public" niente metodi niente costruttore… Data oggi, mio_compleanno; dichiarazione di alcune variabili Data data_esame = { 28, OTTOBRE, 2004 }; con inizializzatore (nota la sintassi del literal, a dx del '=') int main(){ data_esame.mese = DICEMBRE; ... }; accesso ai campi (come per le classi) M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Tipi composti: il tipo struct • 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 codifica di anno typedef struct { char giorno; Mese mese; short anno; } Data; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
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 }; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a