1 / 19

Laboratorio di Linguaggi lezione III

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

lidia
Télécharger la présentation

Laboratorio di Linguaggi lezione III

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

More Related