Laboratorio di Linguaggi lezione III

19
Laboratorio di Linguaggi lezione III Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2006/07

description

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] - PowerPoint PPT Presentation

Transcript of Laboratorio di Linguaggi lezione III

Page 1: Laboratorio di Linguaggi lezione III

Laboratorio di Linguaggi

lezione III

Marco Tarini

Università dell’InsubriaFacoltà di Scienze Matematiche, Fisiche e Naturali di VareseCorso di Laurea in InformaticaAnno Accademico 2006/07

Page 2: Laboratorio di Linguaggi lezione III

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

Laboratorio di Linguaggi

• docente: Marco Tarini e-mail: [email protected]

• ricevimento: Mercoledì dalle 11:00o 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

Page 3: Laboratorio di Linguaggi lezione III

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

}

(ricordiamoci la filosofia del C: linguaggio che permette di dire tuttoin poche righe di codice.)(poche e quindi talvolta criptiche. Usare commenti!)

? Es.: QUALE CODICE INSERIRE QUI ?(esercizio non facilissimo)

Page 4: Laboratorio di Linguaggi lezione III

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

int

long

short

char

dimensione(in bytes)

1

2*

4*

4*

tipo minino valoreassumibile

massimo valoreassumibile

- 128 +127

- 32K +32K (-1)

- 2*K*K*K +2*K*K*K (-1)

(idem) (idem)

* Di solito. Dipende dalla macchina. (remember: niente macchine astratte!)

Page 5: Laboratorio di Linguaggi lezione III

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

long double

double

float

dimensione(in bytes)

4* 8*

8*

tipominino/massimo

valoreassumibile

cifre decimaliesprimibili (circa)

* Di solito. Dipende dalla macchina. (remember: niente macchine astratte!)

10∓38

10∓308

(idem)

6 15

(idem)

* float è più efficiente in spazio, ma sorprendentemente può essere persino meno efficiente in tempo (es. su molti processori INTEL).

Page 6: Laboratorio di Linguaggi lezione III

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 )

Page 7: Laboratorio di Linguaggi lezione III

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

5.32

un float che vale 5,32

un double (un float a precisione doppia) che vale 5,32

5.32e-12 un double che vale 5,32 x 10-12

5.32e12 un double che vale 5,32 x 1012

5.32e-12f un float che vale 5,32 x 10-12

double epsilon = 0.000000000000000001;

che è meglio (più chiaro, meno orrendo) di:

double avogadro = 6.022e23; /* N molecole x mole */esempi:double epsilon = 1e-18;

Page 8: Laboratorio di Linguaggi lezione III

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; equivalente a:

double x = 10.0, y;y = x / 3.0;

float x = 10, y;y = x / 3; equivalente a:

double x = 10.0f, y;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).

Page 9: Laboratorio di Linguaggi lezione III

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

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

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

Page 10: Laboratorio di Linguaggi lezione III

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

• 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!

Page 11: Laboratorio di Linguaggi lezione III

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

• Assegnamento base

=

<left value> = <expr>

tipo T0 tipo T1

expr di tipo T0

typecast automatico se T0 diverso da T1 (ma solo se esiste una conversione automatica).Ma e' sempre meglio (piu' chiaro) usare un typecast esplicito!

x = y = z = 10;

Page 12: Laboratorio di Linguaggi lezione III

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– typecast esplicito

• Nelle espressioni miste– conversione automatica al tipo più

preciso• Negli assegnamenti

– conversione automatica al tipo più preciso

(<tipo di destinazione>) <espressione>

SE POSSIBILE !Non tutto si può trasformare in tutto

(da tipo base a tipo base: ok)Se non possibile: errore di compilazione (errore buono)

Page 13: Laboratorio di Linguaggi lezione III

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 !

float x ;x = 1 / 120;

int numerone1, numerone2, media;...media= (numerone1 + numerone2) /2;

float x ;int denominatore = 120.0;x = 1 / denominatore;

media= (((unsigned int) numerone1)+numerone2) /2;Soluz:

int gradi ;float circonferenza = 1000.0; /* in metri */float arco;...arco = circonferenza * (gradi/360); /* calcolo lunghezza arco di cironferenza */

Page 14: Laboratorio di Linguaggi lezione III

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

Page 15: Laboratorio di Linguaggi lezione III

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.

("giorno" è una var che vale uno dei valori listati)enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } giorno;

• esempio:

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

Page 16: Laboratorio di Linguaggi lezione III

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.

typedef enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } GiornoSettimana;

GiornoSettimana ieri, oggi;

semplicemente delle nuove costanti, che valgono 0, 1, 2 , 3, 4, 5, 6

if ( (oggi > MERC) && (oggi <= VEN ) ) ...

if ( oggi == DOM ) oggi = LUN; else oggi++;

oggi = ( oggi + 5 ) % 7;

• come si fanno passare 5 giorni?

• sono implementati come interi, a tutti gli effetti.

Page 17: Laboratorio di Linguaggi lezione III

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;

Data oggi, mio_compleanno;

Data data_esame = { 28, OTTOBRE, 2004 };

int main(){ data_esame.mese = DICEMBRE; ...};

definizione del tipo.

MA NON E' UNA CLASSE: tutto "public"niente metodiniente costruttore…

dichiarazione di alcune variabilicon inizializzatore(nota la sintassi delliteral, a dx del '=')

accesso ai campi(come per le classi)

Page 18: Laboratorio di Linguaggi lezione III

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;

sizeof(Data)

• si può chiedere la dimensione del nuovo tipo "Data":

sizeof(char)+sizeof(Mese)+sizeof(short)• che sarà uguale a:

codifica di giorno codifica di mese codifica di anno

• in fatti, in memoria, una struct e' codificata come la semplice concatenzaione delle codifiche dei suoi campi :

Page 19: Laboratorio di Linguaggi lezione III

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