variabili e costanti - UNISAüintroduce il nome ed il tipo di una variabile fiil compilatore alloca...
Transcript of variabili e costanti - UNISAüintroduce il nome ed il tipo di una variabile fiil compilatore alloca...
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 1
Lezione 2
Variabili e Costanti
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
1
Struttura di un Programma C++
üUn programma descrive una sequenza di azioni
üogni azione è descritta da una espressione
üun insieme di espressioni seguite da ; è un istruzione®espressione = più piccola unità di programma di significato autonomo
üEsempi di espressioni®dichiarazioni (int i;)®assegnamento (i = 7+1;)®input/output (cout << i;)®controllo di flusso (for, while, if, etc.)
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 2
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
2
Struttura di un Programma C++
ü Istruzioni raggruppate in unità logiche dette funzioni
ü Una funzione consiste di quattro parti® tipo di dati da restituire® nome della funzione® lista degli argomenti® corpo della funzione
ü Ogni programma deve contenere una funzione main
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
3
Esempio Programma C++
Gestione archivio di una libreria. Il programma deve periodicamente aggiornare il file di magazzino e fornire dati sulle vendite.
® legge la lista dei volumi venduti® ordina la lista per autore e titolo® conta il numero di copie vendute di ciascun volume
e cancella duplicati® aggiorna il file di magazzino® stampa i risultati
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 3
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
4
Esempio Programma C++#include <iostream>using namespace std;void leggi() { cout << “sto leggendo”; }void ordina() { cout << “sto ordinando”; }void conteggia() { cout << “sto contando”; }void stampa() { cout << “sto stampando”; }
int main() {leggi();ordina();conteggia();stampa();return 0;
}
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
5
Direttive al Preprocessore
ü #include <iostream> è una direttiva al preprocessore ® include il contenuto del file iostream.h nel file del programma
prima della compilazione® Se il file da includere non ha estensione fa parte della libreria
standard
ü le direttive al preprocessore sono istruzioni eseguite prima della compilazione
ü #include, #define, #ifdef, #ifnotdef, #else, #endif, #pragma sono tutte direttive al preprocessore® # deve essere il primo carattere della linea ® non c’è ; al termine dell’istruzione
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 4
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
6
Spazi dei nomi
ü Ogni variabile è definita all’interno di un namespace® Il nome della variabile è formato dal nome del namespace e
dall’identificatore della variabile
std::cout << “ciao”;
üL’istruzione using namespace std specifica il namespacedi default
®Se non specificato l’identificatore della variabile viene ricercato all’interno del namespace di default
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
7
Compilazione ed Esecuzione di un Programma C++
ü Per compilare® g++ (-g) (-o out) (-c) file1.C file2.c file3.cpp (-llib)w -g ---> debuggerw -o ---> eseguibile in out (per default in a.out)w -c ----> compila ma non linka i file.ow -l ----> linka libreria libw -I ----> modifica path di ricerca nel file system
ü Il compilatore opera due passi® compilazione® linkaggio
ü Il compilatore esegue controlli lessicali e sintattici sul codice del programma
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 5
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
8
Elementi Essenziali del Linguaggio
ü Dati su cui operare
ü Operazioni per manipolare i dati
ü Istruzioni per controllare il flusso del programma
ü Librerie per implementare operazioni non predefinite
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
9
Datiü Un dato ha un tipo ed un indirizzo
® L’indirizzo specifica dove il dato risiede in memoria® Il tipo di un dato specifica come il dato è memorizzato
e quali sono le operazioni legali su di esso
indirizzo
tipo int:4 byterappresentazione in complemento a 2
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 6
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
10
Indirizzo di un Datoü La memoria è una sequenza di celle
® un bit per cella
ü Le celle sono raggruppate in gruppi® byte (8 bit) e word (4-8 byte)
ü ad ogni byte è assegnato un numero d’ordine (indirizzo)® il byte è la minima unità di memoria indirizzabile
ü L’indirizzo di un dato è l’indirizzo del primo byte in cui è contenuta la rappresentazione del dato® Dati e istruzioni sono memorizzati nella stessa memoria
(modello di Von Neumann)
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
11
Tipo di un Dato
ü Il Tipo di un dato specifica® quanti byte sono necessari a rappresentarlo® come il dato è rappresentato® quali operazioni sono possibili su quel dato® come tali operazioni sono realizzate
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 7
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
12
Tipi di Dati Predefiniti
Tipo
char
int
short
long
float
double
long double
Dimensione1 byte
1 worddipende dalla
macchinadipende dalla
macchina1 word
2 word
3-4 word
Utilizzocaratteri o piccoli
interiinteri
reali in singola precisione
reali in doppia precisione
reali in multipla precisione
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
13
Costanti Letterali
ü Dato memorizzato ma non indirizzabile® ha comunque un tipo
int i = 2; // 2 costante letterale
ü Costanti letterali intere sono signed int per default® possono essere rappresentate in decimale, ottale o
esadecimale® possono anche essere di altro tipo
12, 010, 0xFF, 128u, 3e1, 1024Ulü Costanti letterali in virgola mobile sono double per
default® possono anche essere di altro tipo
1.0f, 3.14l, 3e1, 1.4E-2
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 8
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
14
Costanti Letterali
ü Costanti letterali carattere stampabile sono scritte tra apici
ü I caratteri non stampabili, gli apici ed il backslash sono rappresentate da sequenze di escape
‘A’, ‘b’, ‘.’, ‘?’, L ‘a’
ü Costanti letterali stringhe sono scritte tra doppi apici‘\n’, ‘\t’, ‘\”’, ‘\\’, ‘\0’ (null), ‘\12’ (return)
ü Una stringa è un array di caratteri seguito dal carattere ‘\0’
“ciao mondo”, L “città”
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
15
Variabili Simboliche
ü Dato memorizzato ed indirizzabile® tramite l’indirizzo si può recuperare il dato e modificarlo® Si definisce anche oggetto
ü Una variabile è identificata da un nome (identificatore) fornito dal programma
ü Ad un identificatore sono associati un indirizzo ed un tipo ® specificati al momento della definizione del dato
ü ch identifica il valore di un’area di memoria lunga 1 byte,
ü localizzata ad un certo indirizzoü memorizzata come un carattere
(codice ASCII)
char ch;
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 9
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
16
Identificatori
ü Il nome della variabile può contenere lettere, cifre o _® Il compilatore distingue tra maiuscole e minuscole® Il primo carattere deve essere una lettera® Nessun limite di lunghezza
ü Stili più diffusi® variabili in minuscolo, tipi con iniziale maiuscola,
costanti in maiuscolo® nomi composti
voti_esamevotiEsame
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
17
ü Ad ogni variabile sono associati® R-value valore della variabile® L-value indirizzo della variabile
Variabili Simboliche
l’espressione a destra dell’operatore considera il valore della variabilel’espressione a sinistra dell’operatore considera l’indirizzo della variabile.
ch = ch + ‘0’;
ü E’ possibile specificare la stessa variabile su entrambi i lati di un assegnamento
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 10
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
18
nome tipo indir.
Definizione di Variabili Simboliche
ü introduce il nome ed il tipo di una variabile ® il compilatore alloca memoria sufficiente a
contenere il dato ed assegna l’indirizzo di questa memoria all’identificatore della variabile
Una variabile può essere definita una sola volta in tutto il programma
char ch;charch
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
19
Dichiarazione di Variabili Simboliche
ü introduce il nome di una variabile che è stata definita da qualche altra parte nel programma
® il compilatore non alloca memoria
Una variabile può essere dichiarata più volte nello stesso programma
extern char ch;nome tipo indir.
charch ----
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 11
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
20
Dichiarazioni e header file
ü In un progetto strutturato su più file in ogni file vengono dichiarate (o definite) tutte le variabili utilizzate® La stessa variabile è dichiarata in file diversi® Se modifichiamo il tipo della variabile dobbiamo modificare tutte
le dichiarazioni
ü Per agevolare la mantenibilità del codice conviene concentrare le dichiarazioni delle variabili in un solo file® Le variabili sono dichiarate in un header file® Tutti i file del progetto includono l’header file® Per modificare il tipo di una variabile basta modificare l’header
file
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
21
ü Il valore assegnato ad una variabile al momento della definizione è arbitrario
ü E’ possibile assegnare un valore iniziale alla variabile® risultato di una qualunque espressione
Definizioni ed Inizializzazioni
ü E’ possibile concatenare più definizioni sulla stessa linea di codice
char ch = ‘a’;int i(10);double prezzo_vendita(prezzo*sconto);char c = c; // cosa fa?
double prezzo = 100.5, sconto = 0.15;
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 12
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
22
Inizializzazioni di Default
ü E' pericoloso definire una variabile senza inizializzarla® È vietato definire oggetti di tipo classe non inizializzati
ü Le variabili globali definite al di fuori delle funzioni sono inizializzate per default a 0
ü Le variabili locali non sono inizializzate
ü Tutti i tipi predefiniti possono essere inizializzati a 0 da un costruttore di default
int ival = int(); // inizializza ival a 0vector<int> ivec(10); /* definisce un vettore di
10 interi inizializzati a 0 */
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
23
ü Dati memorizzati ed indirizzabili che non possono essere modificati (variabili a sola lettura).
Costanti Simboliche
®L’uso delle costanti simboliche aumenta notevolmente la leggibilità del codice
const int bufferSize = 512;
Il compilatore non permette di®modificare il valore di una costante simbolica®definire una costante simbolica non inizializzata®assegnare l’indirizzo di una costante simbolica ad
un puntatore
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 13
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
24
Puntatoriü Una variabile di tipo puntatore contiene un
indirizzo
® tramite una variabile puntatore si può referenziare indirettamente una variabile
nome tipo indir.
char*ptr
ü Un puntatore può contenere l’indirizzo di un oggetto o di una funzione
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
25
Puntatori
ü Un puntatore viene definito facendo precedere l’identificatore dall’operatore di dereferenziazione (*)
int *ip1, *ip2; // ip1 e ip2 puntano ad intunsigned char *ucp; // ucp punta ad un char senza segnofloat fp, *fp1; // fp è un float, fp1 punta ad un floatchar* cp, cp1; // cp punta a char, cp1 è un char
ü La dimensione di un puntatore ad un oggetto è sufficiente a contenere un indirizzo® 4 byte su macchine a 32 bit
ü Il tipo di un puntatore ad un oggetto è il tipo della variabile puntata® tutti i puntatori ad oggetti hanno la stessa dimensione
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 14
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
26
Inizializzazioni di Puntatori
ü Un puntatore può essere inizializzato con l’indirizzo (L-value) di una variabile dello stesso tipo
ü Per ottenere l’L-value di una variabile si applica l’operatore di indirizzo (&)
int i = 1024;int *p = &i;int *ip = p;char *cp = 0; // inizializza a NIL
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
27
Inizializzazioni Illegali
ü Il C++ è un linguaggio strongly typed® Il compilatore controlla che in ogni assegnazione o
inizializzazione l’R-value del lato destro sia dello stesso tipo dell’L-value del lato sinistro
ü Sono errate tutte le istruzioni che assegnano ad un puntatore l’R-value di una variabile o l’indirizzo di una variabile di tipo diverso
int i = 24;
int *ip = &i;
int *ip1 = &ip; /* ERRORE */
char *cp = ip; // ERRORE
int *ip2 = i; // Errato ma consentito da molti compilatori
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 15
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
28
Indirizzamento Indiretto (Lettura)
üAccede al valore di un oggetto tramite un puntatore che indirizza l’oggetto. Si usa l’operatore (*)
int i = 1024;int *ip = &i; // ip contiene l’indirizzo di i
int k = *ip; // k = 1024k = ip; // ERROREip = i; // ERRORE
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
29
Indirizzamento Indiretto (Scrittura)
ü Tramite l’operatore di indirizzamento indiretto è possibile assegnare un valore ad un oggetto indirettamente
int i = 1024;int *ip = &i; // ip punta ad i
*ip = k; // i = k*ip = abs(*ip); // i = abs(i)*ip = *ip + 1; // i = i + 1
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 16
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
30
Puntatori a Puntatori
üUn puntatore può contenere l’indirizzo di un puntatore® Se dereferenziato restituisce un puntatore
int i = 1024;int *ip = &i; // ip punta ad i
int **ipp = &ip;**ipp = 100; // i = 100ip = ipp; // ERRORE
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
31
Puntatori Generici
ü Un puntatore generico è di tipo void*® ad un puntatore generico possono essere assegnati indirizzi
di oggetti di qualsiasi tipo
ü Un puntatore generico non può essere utilizzato per accessi alla memoria® non ha le informazioni sul tipo di oggetto indirizzato
int *pi; double *pd; void *pv = pi;pv = pd;*pv = 3.14; // ERRORE
ü I puntatori generici sono usati per passare ad una funzione puntatori di tipi differenti o confrontare indirizzi di memoria
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 17
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
32
Aritmetica dei Puntatori
ü E’ possibile effettuare delle manipolazioni sui valori dei puntatori® L’unità di misura nelle manipolazioni dei puntatori è
la dimensione del tipo del puntatoreint i = 100;int *ip = &i; // ip punta ad i
*ip = *ip + 2; // i = i + 2ip = ip + 2; // ip punta 8 byte più avanti di iint *ip2 = ip - 4; // ip2 punta 16 byte dietro ad ipint k = ip - ip2; // k = 4
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
33
Cast
ü Il cast cambia il tipo di una variabile® il contenuto della memoria resta inalterato® cambia la quantità di memoria letta e il modo in
cui viene interpretata
ü Il cast è un operazione pericolosa ed il compilatore non la esegue mai automaticamenteint i = 1000;int *ip = &i;char c = *(char *)ip; // legge solo primo byte di idouble d = *(double *)ip; // legge 4 byte oltre i
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 18
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
34
Puntatori a Costanteü Un puntatore a costante può essere utilizzato solo per
accedere indirettamente ad un oggetto in lettura® non in scrittura
ü L’indirizzo di una costante simbolica può essere assegnato solo ad un puntatore a costante
const double *pc;
const double d = 3.14;pc = &d; // pc punta alla costante d*pc = *pc + 1; // ERRORE, cerca di modificare d
double d1 = 1.2;pc = &d1; // pc punta alla variabile d1*pc = d1*2; /* ERRORE, cerca di modificare d1
tramite pc */
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
35
Puntatori Costantiü Un puntatore costante non può essere
modificato ma può essere utilizzato per modificare l’oggetto puntato® Un puntatore a costante può essere modificato ma
non può essere usato per modificare il contenuto dell’oggetto puntato
*err = *err + 1; // incrementa il valore di errNum
err = err + 1; // ERRORE, modifica err
int errNum;
int *const err = &errNum;
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 19
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
36
Puntatori Costanti a Costante
üUn puntatore costante a costante non può essere modificato e non può essere utilizzato per modificare l’oggetto puntato
const int passo = 1;const int *const ptr = &passo;
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
37
Utilizzo dei Puntatori Costanti
ü I puntatori a costante vengono usati per indirizzare delle variabili che non devono essere modificate® passaggio per riferimento ad una funzione senza side
effect
ü I puntatori costanti sono utilizzati per legare un puntatore ad un oggetto ed impedire che possa essere spostato® indirizzamento di informazioni relative alla gestione
degli errori
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 20
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
38
Variabili Riferimento (Indirizzo)
ü Una variabile di tipo riferimento fornisce un alias per il nome della variabile con cui è stata inizializzata
Una variabile riferimento deve essere inizializzata
nome tipo indir.
inti
int&rif
int i = 1;int &ref = i
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
39
Operazioni su Variabili Riferimento
üOgni operazione sulla variabile riferimento equivale ad una operazione sull’oggetto associato® Equivale a definire un puntatore costante
senza usare la sintassi dei puntatori
ref = ref + 1; // incrementa i di 1
ü Non è possibile modificare la variabile a cui il riferimento è associato
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 21
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
40
Utilizzo Variabili Riferimento
ü Sono usate per passare argomenti ad una funzione per riferimento® la funzione può operare sugli argomenti passati per
riferimento senza usare la sintassi dei puntatori® il codice è più chiaro e leggibile
void scambia(int& x, int& y) {int tmp = x;x = y;y = tmp;
}
void scambia(int* x, int* y) {int tmp = *x;*x = *y;*y = tmp;
}
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
41
Costanti Riferimento
üE’ possibile definire variabili riferimento costanti® non consentono di modificare il valore
dell’oggetto associato
const int& cri = i;cri = cri + 1; // ERRORE
Lezione 2Variabili e Costanti
Laboratorio di algoritmi e Strutture Dati 2001/02 22
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
42
Definizioni di Variabili Riferimento
ü In una lista di definizioni ogni riferimento deve essere preceduto da (&)
ü Un riferimento ad una variabile è inizializzato con l’L-value di una variabile dello stesso tipo
int i;int &ip1 = i, &ip2 = i;int &ip3 = i, ip4 = i; // ip4 non è un riferimento
int& ri = i;char c = ‘a’;int& ri2 = c; // ERRORE
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
43
Inizializzazione di Riferimenti con Variabili Temporanee
ü Un riferimento costante può essere inizializzato con costanti letterali e variabili di tipo diverso ma compatibile® Gli oggetti non indirizzabili vengono memorizzati in variabili
temporanee prima di essere utilizzati per l’inizializzazione® La variabile temporanea può essere convertita ® Le operazioni hanno effetto solo sulla variabile temporanea
const int &ir = 1024; // int temp = 1024; const int &ir = temp;
double d1, d2;
const double &d = d1 + d2; // double t = d1+d2; const int &ir = t;
const int &ci = d1; // int temp = d1; const int &ci = temp;