a Registro interno 1 199KB Oct 30 2014 03:08:56 PM

Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Programmazione Avanzata Java e C
Lezione 18:
Alcuni aspetti del C
…cose misteriose che è utile sapere
30 October 2014
Annuncio 0:
ð Giovedì 30/10 ci sarà
lezione “normale” in Sala
Consiliare
ð Lunedì 3/11 si va in Mlab 2
ð Orari invariati
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 2
1 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Annuncio 1:
Cari colleghi,
desidero informarvi che le biblioteche dell'ateneo stanno organizzando per la
prima settimana di novembre incontri di presentazione dei servizi offerti dal
sistema bibliotecario di ateneo.
L'iniziativa è rivolta alle matricole e a coloro che non hanno dimestichezza con i
servizi bibliotecari
Prego i docenti dei primi anni di corso di diffondere la comunicazione, di invitare
gli studenti a partecipare e ad inviare una mail ([email protected]) alla
biblioteca di ingegneria per iscriversi.
I dettagli dell'iniziativa sono stati pubblicati sul portale, nelle news delle
biblioteche.
http://www.unibs.it/biblioteche/biblioteca-di-ingegneria
Ringrazio per l'attenzione e porgo cordiali saluti
Emilio
Lezione 18 Alcuni aspetti del C
30 October 2014
3
Annuncio 2:
Cari colleghi,
il pomeriggio del 6 novembre a partire dalle 14 si terrà, nell'aula
magna di Ingegneria, l'Olivetti Day, organizzato da Superpartes a cui
parteciperà Federico Faggin, l'inventore del microprocessore.
L’evento è particolarmente gradito proprio per la presenza di
Federico Faggin. Vi invito a partecipare e a trasmettere tale
informazione agli studenti durante le vostre ore di lezione.
Per la partecipazione è richiesta la registrazione, da effettuarsi al
seguente sito web:
http://www.olivettiday.it/
Un caro saluto
Emilio
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 4
2 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Un breve promemoria:
Numero (intero)
0000 0000
0000 0001
0100 0011
0110 0111
1111 1111
1000 0001
1000 0000
unsigned
0
1
67
103
255
129
128
signed
0
1
67
103
-1
-127
-128
Lo stesso numero (binario) può
essere interpretato in molti modi diversi
Lezione 18 Alcuni aspetti del C
char
<NUL>
<SOH>
C
g
ü
Ç
Convenzionale!
30 October 2014
5
Ma il tipo char cosa rappresenta?
ð Numeri, nient’altro che numeri…
ð …a cui possiamo attribuire una codifica
ð A=65, B=66, C=67, …
ð Usiamo la codifica ASCII
ð Ma possiamo fare le cose più “turpi”:
char carattere, numero_ordine;
carattere='C';
numero_ordine = carattere-'A' + 1;
ð Oppure
char maiuscolo, minuscolo;
maiuscolo=minuscolo - 'a' + 'A';
caratteri
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 7
3 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Definizioni, dichiarazioni, e
inizializzazioni
ð Dichiarazione: dice al compilatore di che tipo è il dato
● 
extern int var1; extern char vett[7];
ð Definizione: dice al compilatore che si userà quel dato,
in modo che il compilatore possa assegnare la memoria
occorrente (dipendente dal tipo di dato);
● 
● 
Quasi sempre contestuale alla dichiarazione
int var1; char vett[7];
ð Assegnamento: assegna un valore al dato
● 
var1=4; vett[3]='E'; i++;
ð Inizializzazione: definizione e assegnamento contestuali
● 
int var2=7;
char lettere[]={'c', 'i', 'a', 'o'};
char lettere[]={"ciao"};
Lezione 18 Alcuni aspetti del C
30 October 2014
8
I tipi floating point
ð Non dimenticate mai i numeri floating point
rappresentano le quantità in maniera approssimata,
anche se la precisione può essere assai grande.
● 
La precisione dipende fra l’altro dal calcolatore utilizzato
ð Fate molta attenzione alle uguaglianze!
● 
Non è detto che a / b * b == a
ð In C, il trattamento standard dei numeri floating point è
molto efficiente ma poco preciso
● 
Può essere necessario usare librerie apposite
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 9
4 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Altri tipi di dati
ð Predefiniti:
● 
● 
● 
● 
Puntatori
Vettori
Stringhe (ma il tipo stringa non esiste!)
Enumerazioni
ð Definiti dall’utente:
● 
● 
● 
Typedef
Struct
Funzioni
Lezione 18 Alcuni aspetti del C
30 October 2014
10
Le costanti
ð Come le variabili, hanno un tipo, che è determinato dal
loro valore e dai caratteri prefissi e suffissi
● 
Intere
•  Ottali, esadecimali, decimali, long, …
● 
Carattere
• 
• 
• 
• 
● 
'q'
ATTENZIONE! Non "q" !
E l’apostrofo come lo rappresento? \'
E il carattere “a capo”? \n
Floating point
•  1234.765;
● 
13.4e-4
Queste cose vanno
studiate e
ricordate!
Enumerazione
•  Ne parleremo più avanti
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 11
5 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Punto importante:
ð Le costanti sono in realtà variabili come le altre, tranne
per il fatto che il compilatore sa che sono costanti e
quindi che non sono lvalue
ð Ma lo sa solo il compilatore! Più avanti vedremo che il
loro valore può essere alterato da programmi scritti con
abilità diabolica…
Lezione 18 Alcuni aspetti del C
30 October 2014
12
A proposito di costanti literal:
ð Il loro tipo è desunto automaticamente dal loro valore:
● 
● 
● 
123 è int
123. è float
2147483648 è long int
ð Ma può essere modificato
● 
● 
● 
● 
1234
1234l
1234u
1234ul
Lezione 18 Alcuni aspetti del C
30 October 2014 int
1234L long int
1234U unsigned int
unsigned long int
30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 13
6 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Tabellina riassuntiva:
75
75u
75l
75ul
//
//
//
//
int
unsigned int
long
unsigned long
3.14159L
6.02e23f
// long double
// float
Lezione 18 Alcuni aspetti del C
3.14159
6.02e23
1.6e-19
3.0
3.
0.3
.3
//
//
//
//
//
//
//
3.14159
6.02 x 10^23
1.6 x 10^-19
3.0
3.0
0.3
0.3
75
0113
0x4b
// decimal
// octal
// hexadecimal
30 October 2014
14
E inoltre provate questo programma:
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
Lezione 18 Alcuni aspetti del C
30 October 2014 (" 1
(" 2
(" 3
(" 4
(" 5
(" 6
(" 7
(" 8
(" 9
("10
%f
%d
%f
%d
%f
%d
%f
%d
%f
%d
\n",
\n",
\n",
\n",
\n",
\n",
\n",
\n",
\n",
\n",
10 / 3 * 3);
10 / 3 * 3);
10. / 3 * 3);
10. / 3 * 3);
10 / 3. * 3);
10 / 3. * 3);
10 / 3 * 3.);
10 / 3 * 3.);
10. / 3. * 3.);
10. / 3. * 3.);
30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 15
7 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C I vettori
ð  Aggregati di elementi tutti uguali fra loro, ordinati a matrice
ð  Indicati con il tipo dell’elemento base e le parentesi quadre:
● 
● 
int vettore[5];
float altro_vettore[7][14];
ð  Se si dichiarano in una inizializzazione, è possibile omettere la dichiarazione
del numero di elementi
● 
int xx[]={11,22,33,44,55,66};
ð  Ma non si possono creare ambiguità:
● 
● 
int xx[] []={11,22,33,44,55,66}; è una matrice 2*3 o 3*2?
int xx[2] [3]={11,22,33,44,55,66}; va bene
ð  Gli indici vanno da 0 a N-1
ð  Ricordare: la memoria del calcolatore è divisa in celle. Ogni cella ha un
indirizzo univoco.
ð  Qualunque sia il numero di dimensioni della matrice, essa viene sempre
memorizzata in un vettore unidimensionale!
Lezione 18 Alcuni aspetti del C
30 October 2014
16
Gli elementi dei vettori
ð  Gli elementi che identificano un elemento del vettore sono solo:
● 
● 
L’indirizzo del primo elemento
La formula per calcolare l’offset dell’elemento cercato
ð  Vettore unidimensionale a[N]:
● 
● 
Offset (ai) = sizeof a0 * i
Indirizzo (ai) = indirizzo (a0) + (sizeof a0 * i)
ð  Vettore bidimensionale a[M][N]:
● 
● 
Offset (ai,j) = (sizeof a0,0 * N * i) + (sizeof a0,0 * j)
Indirizzo (ai,j) = indirizzo (a0,0) + (sizeof a0,0 * N * i) + (sizeof a0,0 * j)
ð  Poi le cose si complicano:
● 
● 
For a three-dimensional array, the formula to compute the offset into memory is the following:
Address = Base + ((depthindex*col_size+colindex) * row_size + rowindex) * Element_Size
Col_size is the number of items in a column, row_size is the number of items in a row. In C/C++, if you've
declared the array as "type A[i] [j] [k];" then row_size is equal to k and col_size is equal to j.
For a four dimensional array, declared in C/C++ as "type A[i] [j] [k] [m];" the formula for computing the
address of an array element is
Address =Base + (((LeftIndex * depth_size + depthindex)*col_size+colindex) * row_size +rowindex) *
Element_Size
Depth_size is equal to j, col_size is equal to k, and row_size is equal to m. LeftIndex represents the value
of the leftmost index.
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 17
8 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Due operatori strani:
ð Operatore &
● 
restituisce l’indirizzo fisico della prima cella di memoria
occupata dalla variabile o dalla funzione a cui è applicato
ð Operatore sizeof
● 
restituisce il numero di byte occupato da un oggetto del tipo
del proprio operando
Lezione 18 Alcuni aspetti del C
30 October 2014
18
Assegnamenti e inizializzazioni dei
vettori
ð La dimensione può essere dichiarata implicitamente
● 
● 
● 
int xx[]={11,22,33,44,55,66};
char yy[]={'C','i','a','o'};
char zz[]="Ciao";
ð La dichiarazione esplicita ha SEMPRE il sopravvento
● 
● 
● 
int xx[100]={11,22,33,44,55,66};
char yy[100]={'C','i','a','o'};
char zz[100]="Ciao";
ð Anche quando è sbagliata!
● 
● 
● 
int xx[4]={11,22,33,44,55,66};
char yy[2]={'C','i','a','o'};
char zz[3]="Ciao";
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 19
9 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Ancora sull’allocazione:
ð Occorre fare molta attenzione alle dimensioni del
vettore allocato
ð Il compilatore fa pochi controlli (per risparmiare
tempo)!
Dimensione_vettori
Lezione 18 Alcuni aspetti del C
30 October 2014
20
Inoltre, molto importante:
ð Non viene fatto nessun controllo sulla validità dell’elemento
indirizzato
● 
Per motivi di efficienza, ovviamente
ð Se leggete un elemento che non esiste, ricavate dati assurdi
ð Se scrivete un elemento che non esiste, rischiate di sporcare altri
dati o addirittura di alterare il programma con effetti che possono
essere terribili!
● 
● 
Per fortuna esiste il meccanismo di protezione della memoria
Ma attenzione: funziona solo all’esterno del vostro programma
vettori2
Lezione 18 Alcuni aspetti del C
30 October 2014 vettori1
30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 21
10 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Un cenno alla funzione printf
ð http://www.cplusplus.com/reference/clibrary/cstdio/
printf/
ð int printf ( const char * format, ... );
Lezione 18 Alcuni aspetti del C
30 October 2014
22
Costanti e variabili stringa
ð Ne parleremo più avanti diffusamente
● 
● 
● 
● 
● 
Per ora, una stringa è un vettore di caratteri
Per ogni stringa è allocato un certo numero di byte, ma la
stringa non li occupa necessariamente tutti
Per capire dove la stringa finisce, conveniamo che essa termini
sempre con il carattere \0 (0x00)
Quindi una stringa di n caratteri occupa sempre n+1 byte, ma
la memoria ad essa allocata potrebbe essere di più
Le costanti stringa vengono indicate da una stringa di caratteri
alfanumerici racchiusa fra doppi apici:
•  "buongiorno"
•  "buonanotte\n"
● 
Il terminatore viene aggiunto automaticamente
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 23
11 Programmazione Avanzata Java e C 2014-­‐2015 Lezione 18 Alcuni aspeA del C Un altro tipo inesistente:
ð Il tipo boolean
● 
● 
● 
È rappresentato da qualunque tipo intero
Il valore false è rappresentato dal valore 0
Il valore true è rappresentato da qualunque valore ≠0
truefalse
Lezione 18 Alcuni aspetti del C
30 October 2014 30 October 2014
© 2013 -­‐ 2016 Riccardo Cassinis -­‐ TuA i diriA riservaG 24
12