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
Scarica

ppt