Fondamenti di Programmazione Argomenti del corso Rappresentazione dell’informazione. Architettura...
Embed Size (px)
Transcript of Fondamenti di Programmazione Argomenti del corso Rappresentazione dell’informazione. Architettura...

Materiale didattico di supporto alle lezioni del corso di
Fondamenti di Programmazione
Corso di Laurea in Ingegneria Informatica
Prof. Cinzia Bernardeschi
Prof. Marco Cococcioni
Dipartimento di Ingegneria dell’Informazione
Anno Accademico 2016-2017
Il corso è composto da due moduli da 6 CFU:
• Fondamenti di Programmazione (titolare Prof. Bernardeschi)
• Programmazione ad Oggetti (titolare Ing. Cococcioni)
Libri di testo:
• Paolo Corsini
Il calcolatore didattico DC86.32
Edizioni ETS, Pisa, 2011.
Acquistabile presso le principali librerie della città
• Andrea Domenici, Graziano Frosini
Introduzione alla Programmazione ed
Elementi di Strutture Dati con il Linguaggio C++
Milano: Franco Angeli.
(va bene dalla quinta edizione in poi)
Acquistabile presso le principali librerie della città
• Raccolta di lucidi delle lezioni: scaricabili dal sito del corso
http://www.iet.unipi.it/c.bernardeschi/FondamentiDiProgrammazione.html
Modalità di esame: prova pratica e prova orale.

1
Argomenti del corso
Rappresentazione dell’informazione.
Architettura del calcolatore. Linguaggio Assembler
Concetti di base della programmazione
Concetto di algoritmo. Il calcolatore come esecutore di algoritmi. Linguaggi di programmazione ad
alto livello. Sintassi e semantica di un linguaggio di programmazione. Metodologie di
programmazione strutturata. Principi fondamentali di progetto e sviluppo di semplici algoritmi.
Programmare in C
Tipi fondamentali. Istruzioni semplici, strutturate e di salto. Funzioni. Ricorsione. Riferimenti e
puntatori. Array. Strutture e unioni. Memoria libera. Visibilità e collegamento. Algoritmi di ricerca e di
ordinamento.
Concetti di base della programmazione a oggetti
Limitazioni dei tipi derivati. Il concetto di tipo di dato astratto.
Programmare in C++
Classi. Operatori con oggetti classe. Altre proprietà delle classi. Classi per l’ingresso e per l’uscita.
Progettare ed implementare tipi di dato astratti
Alcuni tipi di dato comuni con le classi: Liste, Code, Pile.
2
Rappresentazione dell’Informazione (1/2)
L’informazione è qualcosa di astratto. Per poterla manipolare bisogna rappresentarla. In un calcolatore i vari tipi di informazione (testi, figure, numeri, musica,…) si rappresentano per mezzo di sequenze di bit (cifre binarie). Bit è l’abbreviazione di Binary digIT, numero binario. Il bit è l'unità di misura elementare dell'informazione, ma anche la base del sistema numerico utilizzato dai computer. Può assumere soltanto due valori: 0 o 1. Byte è l’unità di misura dell'informazione che corrisponde ad 8 bit.

3
Rappresentazione dell’Informazione (2/2)
Quanta informazione può essere contenuta in una sequenza di n bit? L’informazione corrisponde a tutte le possibili disposizioni con ripetizione di due oggetti (0 ed 1) in n caselle (gli n bit), ossia 2n
Esempio: n=2.
00 01 10 11 ATTENZIONE: Una stessa sequenza di bit può rappresentare informazione differente. Per esempio 01000001 rappresenta
– l’intero 65 – il carattere ‘A’ – il colore di un puntino sullo schermo
4
Calcolatore e Informazione
testo disegni
immagini numeri musica
...
Calcolatore
sequenze di bit
dispositivi di conversione
OUT
IN

5
Rappresentazione del testo (1/2)
Sequenze 00110000
00110001
00110010
...
00111001
...
01000001
01000010
01000011
...
01100001
01100010
...
Caratteri 0
1
2
...
9
...
A
B
C
...
a
b
...
Caro amico,
01000011
01100001
01110010
01101111
00100000
01100001
01101110
01101001
01100011
01101111
00101100
Codifica ASCII (American Standard Code for Information Interchange)
Standard su 7 bit (il primo bit del byte sempre 0)
6
Rappresentazione del testo (2/2)
Codifica ASCII – Tabella di corrispondenza
4 cifre meno significative
3 cifre più significative

7
Base dieci
u Cifre: 0, 1, 2, 3, 4, 6, 7, 8, 9
u Rappresentazione posizionale
(123)dieci significa 1´102 + 2´101 + 3´100
Base due
u Cifre: 0, 1
u Rappresentazione posizionale
(11001)due significa 1´24 + 1´23 + 0´22 + 0´21 + 1´20 (= 25)dieci
Rappresentazione dei numeri naturali (1/11)
8
Data una base b ³ due
Ogni numero naturale N minore di b (N < b) è associato ad un simbolo elementare detto cifra
Rappresentazione dei numeri naturali (2/11)
BASE CIFRE
due 0 1 cinque 0 1 2 3 4 otto 0 1 2 3 4 5 6 7 sedici 0 1 2 3 4 5 6 7 8 9 A B C D E F

9
I numeri naturali maggiori o uguali a b possono essere rappresentati da
una sequenza di cifre secondo la rappresentazione posizionale
Se un numero naturale N ³ b è rappresentato in base b dalla sequenza di
cifre:
allora N può essere espresso come segue:
dove a0 è detta «cifra meno significativa» e ap-1 «cifra più significativa»
Chiamiamo questa formula «formula della sommatoria»
Rappresentazione dei numeri naturali (3/11)
p-1 p-2 1 0a a …a a
åp-1
i p-1 p-2 2
i p-1 p-2 2 1 0i=0
Ν= = + +...+ + +β β β β βa a a a a a
10
Data una sequenza di cifre in base b, a quale numero naturale
corrisponde?
Rappresentazione dei numeri naturali (4/11)
Sequenze di simboli (in base b)
Sequenze di simboli
(in base 10)
N ?
6568 A0316 11012
6 ·8 2 + 5 ·8 1 + 6 · 8 0 10 ·16 2 + 0 ·16 1 + 3 ·16 0 1 ·2 3 + 1 ·2 2 + 0 ·2 1 + 1 ·2 0
430 2563
13
p-1 p-2 1 0a a …a a

11
Data la base b ed un numero naturale N, trovare la sequenza di cifre che
rappresenta N in base b
Rappresentazione dei numeri naturali (5/11)
Sequenze di simboli (in base b)
Sequenze di simboli
(in base 10)
Np-1 p-2 1 0a a …a a
12
Esempio: da base 10 a base 2
Rappresentazione dei numeri naturali (6/11)
inizio
fine
div 2
div 2
div 2
div 2
QUOZIENTE RESTO Rappresentazione
23 - 11 1 11*2+1 5 1 ((5*2)+1)*2+1 2 1 ((((2*2)+1)*2)+1)*2+1 1 0 (((((1*2)+0)*2)+1)*2)+1)*2+1 0 1 (((((0*2+1)*2+0)*2+1)*2+1)*2)+1
(10111)due a4a3a2a1a0
N = 23
che in base dieci vale 1*24+…+1=(23)dieci, cvd

13
Sia mod il resto e div il quoziente della divisione intera
Procedimento mod/div
Se N = 0 porre a0 = 0; => fine
Altrimenti: porre q0 = N e poi eseguire la seguente procedura iterativa:
q1 = q0 div b a0 = q0 mod b
q2 = q1 div b a1 = q1 mod b
...
qp = qp-1 div b ap-1 = qp-1 mod b
fino a quando qp diventa uguale a 0
Il procedimento si arresta quando qp = 0 (più precisamente
subito dopo aver calcolato ap-1). Inoltre p è proprio il numero
di cifre necessario per rappresentare N in base b
Rappresentazione dei numeri naturali (7/11)
Esempio: 23 div 2 = 11 23 mod 2 = 1
NB: Il risultato della mod è sempre una cifra valida in base b, perché restituisce sempre un numero fra 0 e b -1 (estremi inclusi).
14
Rappresentazione dei numeri naturali (8/11)
Inizio q0 = N
fine
div b
div b
div b
div b
div b
QUOZIENTE RESTO q0 = N - q1 = q0 / b a0 q2 = q1 / b a1 q3 = q2 / b a2 q4 = q3 / b a3 q5 = q4 / b a4 q6 = q5 / b a5 q7 = 0 a6
div b
N = a6 ·b 6 + a5 ·b 5 + a4 ·b 4 + a3 ·b 3 + a2 ·b 2 + a1 ·b 1 + a0 ·b 0

p
11¼11 (= 2p-1)
p
00¼00 00¼01
p
0 1 2p-1 ¼ N
Intervallo di rappresentabilità con p bit
15
Rappresentazione dei numeri naturali (9/11)
Potenza della base: 2p « (100¼00)due
p
p Intervallo [0, 2p-1] 8 [0, 255]
16 [0, 65535]
32 [0, 4294967295]
NB: per la generica base b,
l’intervallo di rappresentabilità con p cifre è [0, b
p-1]
16
Calcolatore lavora con un numero finito di bit
u Supponiamo che p = 16 bit
u A = 0111011011010101 (30421) B = 1010100001110111 (43127)
u Poiché A + B (73552) è maggiore di 2p-1(65535), quindi non è rappresentabile su p bit, si dice che la somma ha dato luogo ad overflow
u In generale, ci vogliono p+1 bit per la somma di due numeri di p bit
A = 1111111111111111 (65535) B = 1111111111111111 (65535)
11111111111111110 (131070)
Rappresentazione dei numeri naturali (10/11)

17
Somma fra due numeri naturali espressi in binario.
Per sommare 10011 e 101101, basta metterli in colonna allineandoli a destra (come si fa con i numeri in base 10) e poi tenere presenti le seguenti regole:
Esempio: calcolare la somma di 101100 e 111010
11 ¬ riporti generati
101100 +
111010 =
1101110
Rappresentazione dei numeri naturali (11/11)
0 + 0 =
0 + 1 =
1 + 0 =
1 1 + 1 =
11 1+ 1=
0 1 1 10 11
genera
un riporto
genera
un riporto
eventuale riporto
generatosi
precedentemente
18
Numeri naturali - Cambio di base (1/2)
1
Numeri Naturali
Rappresentazioni base X
Rappresentazioni base Y
2
Trovare la rappresentazione in base 9 di (1023)cinque 1) Trasformo in base 10 ed ottengo 138 2) Applico il procedimento mod/div ed ottengo (163)nove
Da base X a base Y

19
Casi particolari (potenze di 2)
Numeri naturali - Cambio di base (2/2)
b =16
(657)otto
( 110 101 111 )due
(A03)sedici
(1010 0000 0011)due
(FFE4)sedici
(1111 1111 1110 0100)due
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
b = 16
0
1
2
3
4
5
6
7
000
001
010
011
100
101
110
111
b = 8
b =2 b =8
20
Numeri Interi (1/14)
Sia a (es. a=+3, a=-3, …) il numero intero che si vuole rappresentare in modulo e segno su su p bit. La rappresentazione A (es. 0011, 1011, ...) di a è data da:
A = ap-1,…,a0 = (segno_a, ABS_a)
dove ABS_a è la rappresentazione (come numero naturale) del valore assoluto di a su p-1 bit (in particolare ABS_a è rappresentato mediante i bit ap-2,…,a0), e segno_a è un unico bit che vale 0 se a >= 0 e 1 se a <= 0). NB: ad a=0 corrispondono due rappresentazioni: +zero (0,00..0) e -zero (1,00..0) Ad esempio, per p = 4 si ha: a=+3 => segno_a = 0, ABS_a = 011 (naturale 3 rappresentato su 3 cifre) => A=0011 a= -3 => segno_a = 1, ABS_a = 011 (naturale 3 rappresentato su 3 cifre) => A=1011
Prima rappresentazione: rappresentazione in modulo e segno
Trasformazione a => A

21
Numeri Interi (2/14)
Data una rappresentazione A di un intero in modulo e segno su p bit, come si risale all’intero a da esso rappresentato? La rappresentazione A va vista come composta di due parti: A=(ap-1, ap-2…a0) dopodiché:
a = (ap-1 == 0) ? +ABS_a : -ABS_a
dove ABS_a è il naturale corrispondente ad ap-2…a0
Ad esempio, per p = 4 si ha: A=0011 => viene visto come (0,011) => a = +011 (+tre) A=1011 => viene visto come (1,011) => a = -011 (-tre) NB: 0000 rappresenta +zero, mentre 1000 rappresenta –zero.
Prima rappresentazione: rappresentazione in modulo e segno
Trasformazione A => a
22
Numeri Interi (3/14)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
+0
+1
+2
+3
+4
+5
+6
+7
-0
-1
-2
-3
-4
-5
-6
-7
numero negativo Û bit più significativo della rappresentazione uguale a 1
(zero rappresentato due volte)
numero negativo Û bit più significativo della rappresentazione uguale a 1
(zero rappresentato due volte)
A a { }4
0,1
Rappresentazione di interi
in modulo e segno su
calcolatore con p=4 bit

23
Numeri Interi (4/14)
Intervallo di rappresentabilità in modulo e segno su p bit (doppia rappresentazione dello zero)
[-(2p-1-1),+2p-1-1]
•p = 4 [-7,+7] •p = 8 [-127,+127] •p = 16 [-32767,+32767]
NB: prima di applicare l’algoritmo per a=>A occorre verificare che a sia rappresentabile su p bit, altrimenti l’algoritmo conduce a risultati sbagliati.
Ad esempio: tentando di rappresentare a=-9 su p=4 bit, si ottiene: A=(segno_a, ABS_a), dove segno_a=1 e ABS_a = 9 ma il naturale 9 (1001) non è rappresentabile su 3 bit!!
Intervallo di rappresentabilità in modulo e segno su p bit (doppia rappresentazione dello zero)
[-(2p-1-1),+2p-1-1]
•p = 4 [-7,+7] •p = 8 [-127,+127] •p = 16 [-32767,+32767]
NB: prima di applicare l’algoritmo per a=>A occorre verificare che a sia rappresentabile su p bit, altrimenti l’algoritmo conduce a risultati sbagliati.
Ad esempio: tentando di rappresentare a=-9 su p=4 bit, si ottiene: A=(segno_a, ABS_a), dove segno_a=1 e ABS_a = 9 ma il naturale 9 (1001) non è rappresentabile su 3 bit!!
24
Numeri Interi (5/14)
Sia a (es. a=+3, a=-3, …) il numero intero che si vuole rappresentare in complemento a 2 su p bit. La rappresentazione A (es. 0011, 1101, …) di a è data da:
A = ap-1…a0 = (a >= 0) ? ABS_a : (duep-ABS_a) dove sia ABS_a che (duep-ABS_a) sono rappresentati in base due come numeri naturali su p bit.
Ad esempio, per p = 4 si ha:
a = 0 => ABS_a = 0, e il naturale 0 ha rappr. 0000 su 4 bit => A = 0000
a = 1 => ABS_a = 1, e il naturale 1 ha rappr. 0001 su 4 bit => A = 0001
a = 7 => ABS_a = 7, e il naturale 7 ha rappr. 0111 su 4 bit => A = 0111
a = -1 => ABS_a = 1, 16-1=15, dove il naturale 15 ha rappr. 1111 su 4 bit => A = 1111
a = -2 => ABS_a = 2, 16-2=14, dove il naturale 14 ha rappr. 1110 su 4 bit => A = 1110
a = -8 => ABS_a = 8, 16-8=8, dove il naturale 8 ha rappr. 1000 su 4 bit => A = 1000
NB: La rappresentazione in complemento a 2 è anche detta in complemento alla base. Infatti lo
stesso procedimento può essere generalizzato per rappresentare interi in basi diverse da due.
Seconda rappresentazione: rappresentazione in complemento a 2
Trasformazione a => A

25
Numeri Interi (6/14)
Data una rappresentazione A = ap-1…a0 di un intero in complemento a due su p bit, come si risale all’intero a da esso rappresentato? a = (ap-1 == 0) ? +A : -(duep-A) dove sia A che (duep-A) vengono visti come naturali su p bit. Ad esempio, per p = 4 si ha: A = 0000 => a = 0 (zero) A = 0001 => a = +1 (+uno) A = 0111 => a = +7 (+sette) A = 1000 => 16-8 = 8 => a = -8 (-otto) A = 1001 => 16-9 = 7 => a = -7 (-sette) A = 1111 => 16-15=1 => a = -1 (-uno)
Seconda rappresentazione: rappresentazione in complemento a 2
Trasformazione A => a
26
Numeri Interi (7/14)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
0
+1
+2
+3
+4
+5
+6
+7
-8
-7
-6
-5
-4
-3
-2
-1
Anche in questo caso:
numero negativo Û bit più significativo della rappresentazione uguale a 1
Inoltre, a differenza della rappresentazione in modulo e segno,
non viene sprecata nessuna rappresentazione (lo zero è
rappresentato una volta sola)
Anche in questo caso:
numero negativo Û bit più significativo della rappresentazione uguale a 1
Inoltre, a differenza della rappresentazione in modulo e segno,
non viene sprecata nessuna rappresentazione (lo zero è
rappresentato una volta sola)
A a { }4
0,1
Rappresentazione di interi
in complemento a due su
calcolatore con p=4 bit

27
Numeri Interi (8/14)
Intervallo di rappresentabilità in complemento a 2 su p bit
[-2p-1,+2p-1-1]
• p = 4 [-8,+7] • p = 8 [-128,+127] • p = 16 [-32768,+32767]
NB: prima di applicare l’algoritmo per a=>A occorre verificare che a sia rappresentabile su p bit, altrimenti l’algoritmo conduce a risultati sbagliati. Ad esempio, tentando di rappresentare a=-9 su p=4 bit, si ottiene: A=(due4-9)=16-9 = 7 =>0111, ma è sbagliato! Infatti -9 non è rappresentabile su 4 bit, ne servono almeno 5! Che il risultato fosse sbagliato si poteva dedurre dal fatto che la rappresentazione del negativo -9 iniziava per 0 (0111 è infatti la rappresentazione di a=+7 su 4 bit!). (su 5 bit, a=-9 ha rappresentazione (due5-9)=23 => A=10111)
Numeri Interi (9/14)
Terza Rappresentazione: rappresentazione con bias Trasformazione a => A
Sia a (es. a=+3, a=-3, …) il numero intero che si vuole rappresentare in rappresentazione con bias su p bit. La rappresentazione A (es. 1010, 0100, …) di a è data da:
A = ap-1…a0 = a + (2p-1 - 1)
dove a+(2p-1 - 1) è supposto essere non negativo e dunque viene rappresentato come un naturale su p bit. La quantità (2p-1 - 1) è detta bias e A = a + bias
Ad esempio, per p = 4 si ha:
a = 0 => 0+(24-1-1) = 7, e il naturale 7 ha rappr. 0111 su 4 bit => A = 0111 a = 1 => 1+(24-1-1) = 8, e il naturale 8 ha rappr. 1000 su 4 bit => A = 1000 a = 8 => 8+(24-1-1) = 15, e il naturale 15 ha rappr. 1111 su 4 bit => A = 1111 a = -1 => -1+(24-1-1) = 6, e il naturale 6 ha rappr. 0110 su 4 bit => A = 0110 a = -2 => -2+(24-1-1) = 5, e il naturale 5 ha rappr. 0101 su 4 bit => A = 0101 a = -7 => -7+(24-1-1) = 0, e il naturale 0 ha rappr. 0000 su 4 bit => A = 0000
NB1: questa rappresentazione è anche detta rappresentazione con polarizzazione NB2: come si vedrà nelle prossime slides, questa rappresentazione viene utilizzata nella rappresentazione dei numeri reali in virgola mobile
28

29
Terza Rappresentazione: rappresentazione con bias Trasformazione A => a
Sia A (es. 1010, 0100, …) la rappresentazione di un numero intero nella rappresentazione con bias su p bit. Il numero intero a (es. a=+3, a=-3, …) associato ad A è dato da:
a = A - (2p-1 - 1)
dove A viene visto come numero naturale su p bit. Dunque a = A - bias
Ad esempio, per p = 4 si ha:
A = 0111 => 7-(24-1-1) = 0 => a = 0 A = 1000 => 8-(24-1-1) = 1 => a = 1 A = 1111 => 15-(24-1-1) = 8 => a = 8 A = 0110 => 6-(24-1-1) = -1 => a = -1 A = 0101 => 5-(24-1-1) = -2 => a = -2 A = 0000 => 0-(24-1-1) = -7 => a = -7 NB: Lo zero viene rappresentato una sola volta (come accade in compl. a 2).
Numeri Interi (10/14)
30
Numeri Interi (11/14)
Intervallo di rappresentabilità nella rappresentazione con bias
[-2(p-1)-1, +2(p-1)], ossia [-bias, bias+1]
• p = 4 [-7,+8] (bias=7) • p = 5 [-15,+16] (bias=15) • p = 7 [-127,+128] (bias=127) • p = 10 [-1023,+1024] (bias=1027) • p = 14 [-16383,+16384] (bias=16383)
NB: prima di applicare l’algoritmo per a=>A occorre verificare che a sia rappresentabile su p bit, altrimenti l’algoritmo conduce a risultati sbagliati. Ad esempio, tentando di rappresentare a=-9 su p=4 bit, si ottiene: A=-9+(24-1-1)=-9+7 = -2, che non è un numero naturale!

31
Rappresentazioni degli
interi su p=5 bit
messe a confronto
Osservazione:
In complemento a due, a=-1
è sempre rappresentazione
dalla sequenza di p bit a 1
(11….11), qualunque sia il
valore di p.
Numeri Interi (12/14)
A {0,1}5 ams ac2 abias
0 00000 +0 0 -15
1 00001 +1 +1 -14
2 00010 +2 +2 -13
3 00011 +3 +3 -12
4 00100 +4 +4 -11
5 00101 +5 +5 -10
6 00110 +6 +6 -9
7 00111 +7 +7 -8
8 01000 +8 +8 -7
9 01001 +9 +9 -6
10 01010 +10 +10 -5
11 01011 +11 +11 -4
12 01100 +12 +12 -3
13 01101 +13 +13 -2
14 01110 +14 +14 -1
15 01111 +15 +15 0
16 10000 -0 -16 +1
17 10001 -1 -15 +2
18 10010 -2 -14 +3
19 10011 -3 -13 +4
20 10100 -4 -12 +5
21 10101 -5 -11 +6
22 10110 -6 -10 +7
23 10111 -7 -9 +8
24 11000 -8 -8 +9
25 11001 -9 -7 +10
26 11010 -10 -6 +11
27 11011 -11 -5 +12
28 11100 -12 -4 +13
29 11101 -13 -3 +14
30 11110 -14 -2 +15
31 11111 -15 -1 +16
32
Numeri Interi (13/14)
-2
+1
-1
1110
0001 compl. a due
Sommatore per naturali
1111
Operazioni su numeri
Operazioni sulle rappresentazioni
QUESTO è il motivo per cui i calcolatori rappresentano gli interi in complemento a due: non occorre una nuova circuiteria per sommare e
sottrarre numeri interi, viene utilizzata la stessa dei numeri naturali!

0 1 1 1 + (+7)
0 1 0 1 = (+5)
------------------------------
1 1 0 0 (-4) overflow!
1 0 1 0 + (-6)
1 0 0 0 = (-8)
-------------------------------
1 0 0 1 0 (+18) overflow!
33
Numeri Interi (14/14)
Sommando due numeri interi si verifica un overflow quando i due numeri hanno lo stesso segno ed il risultato ha segno diverso
7+5=12 7-1=6
0 1 1 1 + (+7)
1 1 1 1 = (-1)
------------------------------
1 0 1 1 0 (+6) corretto!
NB: L’eventuale (p+1)-esimo bit viene sempre scartato
-6+8=2
34
Numeri Reali
Sottoinsieme
discreto dei Numeri Razionali
Sequenze di bit
0
Densità che dipende dal numero di bit usati
Overflow Overflow Underflow

35
Numeri Reali – Virgola fissa (1/5)
q Si usa un numero fisso di bit per la parte intera ed un numero fisso di bit per la parte frazionaria.
q Sia r un numero reale da rappresentare. Di seguito, indichiamo con I(r) la parte intera e con F(r) la parte frazionaria di r
q Siano p i bit per rappresentare r: f per la parte frazionaria e (p-f) i bit la parte intera:
R = ap-f-1…a0 a-1...a-f
Esempio: +1110.01 in base due vale +14.25 in base dieci
q NB: La virgola non si rappresenta
q La parte intera I(r) si rappresenta con le tecniche note
q Per la parte frazionaria si usa il procedimento seguente:
0 1
...f--
@ + + +åp- f -1
p- f -1i
i 0 -1 - fp- f -1i = - f
r = + ...+a β ββ β βa a a a
parte
frazionaria
36
Numeri Reali – Virgola fissa(2/5)
Si usa la così detta procedura parte frazionaria-parte intera:
f0 = F(r)
Se f0 ≠ 0 eseguire la seguente procedura iterativa:
f-1 = F( f0 * 2 ) a-1 = I( f0 * 2 )
f-2 = F( f-1 * 2 ) a-2 = I( f-1 * 2 )
...
fino a che f-j è uguale a zero oppure si è raggiunta la precisione
desiderata
Esempio: p = 16 e f = 5
r = +331,6875

37
Numeri Reali – Virgola fissa(3/5)
• Dalla rappresentazione dei numeri naturali: 331 Û 101001011;
QUOZIENTE RESTO
331 - 165 1 82 1 41 0 20 1 10 0 5 0 2 1 1 0 0 1
38
Numeri Reali – Virgola fissa(4/5)
• r = +10100101110110 Þ R = 0010100101110110 • Parte frazionaria -> 1* 2-1 + 0*2-2 + 1*2-3 + 1*2--4 Þ 0,5 + 0,125 + 0,0625 Þ 0,6875
• Dall’algoritmo precedente: 0,6875 Û 0,1011
• r = (+101001011,1011) base due
F I f-1=F(0.6875*2=1.375)=0.375 a-1=I(1.375)=1
f-2=F(0.375*2=0.75)=0.75 a-2=I(0.75)=0 f-2=F(0.75*2=1.5)=0.5 a-3=I(1.5)=1 f-3=F(0.5*2=1.0)=0 a-4=I(1.0)=1

39
Numeri Reali – Virgola fissa(5/5)
ERRORE DI TRONCAMENTO
Rappresentare r = 2.3 con f = 6.
Per esprimere r sono necessarie un numero infinito di cifre!
(10.0 1001 1001 1001… = 10.01001 dove 1001 è la parte periodica)
Ne abbiamo a disposizione solo 6. Quindi si opera un troncamento alla 6a cifra dopo la virgola.
Quindi, in realtà si rappresenta non r ma il numero r’
r’ = 10.010011 r’ = 2 + 2-2 + 2-5 + 2-6 = 2 + 0.25 + 0.03125 + 0.015625 = 2.296875
L’errore di troncamento è (2.3-2.296875)=0,00312499 ( < 2-6 = 0.015625 )
F I f-1=F(0.3*2=0.6)=0.6 a-1=I(0.6)=0
f-2=F(0.6*2=1.2)=0.2 a-2=I(1.2)=1 f-3=F(0.2*2=0.4)=0.4 a-3=I(0.4)=0 f-4=F(0.4*2=0.8)=0.8 a-4=I(0.8)=0 f-5=F(0.8*2=1.6)=0.6 a-5=I(1.6)=1 f-6=F(0.6*2=1.2)=0.2 a-6=I(1.2)=1
40
Numeri Reali – Virgola mobile(1/10)
CALCOLO DI FISICA ASTRONOMICA
me = 9 ´ 10-28 gr; msole = 2 ´ 10+33 gr Þ Intervallo di variazione » 10+60.
Sarebbero quindi necessarie almeno 62 cifre, di cui 28 per la parte frazionaria.
Si hanno tante cifre perché l’intervallo da rappresentare è grande Þ si separa l’intervallo di rappresentabilità dalla precisione, cioè dal numero di cifre.
Notazione Scientifica
b= ± × er m m = mantissa; e = esponente
L’intervallo di rappresentabilità è fissato dal numero di cifre
dell’esponente.
La precisione è fissata dal numero di cifre della mantissa.
Diverse rappresentazioni
3.14 0.314 10+1 31.4 10-1
Si fissa una forma standard

41
Numeri Reali – Virgola mobile(2/10)
Rappresentazione di un numero binario in virgola mobile:
+1110.01 numero reale binario in virgola fissa
esponenti espressi in binario
+1.11001·due+11 … … +111001·due-10
(alcune possibili rappresentazioni in virgola mobile)
Numeri reali normalizzati:
- mantissa con parte intera costituita da un solo bit di valore 1
- rappresentazione è una tripla costituita da tre numeri naturali
42
Numeri Reali – Virgola mobile(3/10)
, ,r R s E F« = Standard IEEE 754-1985
La rappresentazione R è composta da tre naturali (s, E ed F), dove:
s = codifica del segno (1 bit)
F = codifica della parte frazionaria della mantissa su G bit E = codifica dell’esponente su K bit
r = (s == 0)? [+(1+f) · duee)] : [-(1+f) · duee)]
f = F/2G è la parte frazionaria della mantissa (m=1+f= 1+F/2G)
e = +E – (2K-1 – 1) è l’esponente rappresentato dal numero
naturale E (rappresentazione con polarizzazione)
Conseguenza dell’ “uno implicito” Þ lo zero non è rappresentabile!

43
Numeri Reali – Virgola mobile(4/10)
Half precision: 16 bit, K = 5 e G = 10. Esempi di trasformazione R => r
Esempio 1
R = {1,10011,1110100101} rappresenta il numero reale negativo con:
f = F/2G = F/2dieci = 0.1110100101
e = E -(2K-1 - 1) = +10011 – (+01111) = +100 (bias=quindici)
r = -1.1110100101 · due+quattro = -11110.100101
r = -30.578125 in base dieci
Esempio 2
R = {0,01111,0000000001} rappresenta il numero reale positivo:
f = F/2M = 1/2G = due-dieci=0.0009765625
e = E -(2K-1 - 1) = 01111-01111 = 15-15=0
r = +1.0000000001 · due+zero = 20+2-10 = 1 + 0.0009765625 = 1.0009765625
r = + 1.0009765625 in base dieci
44
Numeri Reali – Virgola mobile(5/10)
Half precision, esempi di trasformazione r => R
Esempio A – Rappresentare r=2 in half precision
La rappresentazione di r= 2 è R = {0,10000,0000000000}. Infatti,
decodificando:
f = F/2G = 0
e = E -(2K-1 - 1) = 10000-01111 = 1
r = +1.0000000000 · due+1 = 2 in base dieci
Esempio B – Rappresentare r=0.5 in half precision
La rappresentazione di r = 0.5 è R = {0,01110,0000000000}. Infatti,
decodificando:
f = F/2G = 0
e = E -(2K-1 - 1) = 01110-01111 = -1
r = +1.0000000000 · due-1 = 0.5 in base dieci

45
Half precision, esempi di trasformazione r => R
Esempio C – Rappresentare r=2.3 in half precision
Sapendo che r ha rappresentazione in virgola fissa 10.01001,
iniziamo a portarlo in forma normalizzata: 1.001001 · due+1
Ora ci servono 10 cifre per la parte frazionaria della mantissa, le
restanti verranno scartate, provocando il consueto errore di
troncamento:
1.00 1001 1001 1001 1001… · due+1
A questo punto la rappresentazione è immediata (per trovare E si
faccia riferimento all’esempio A: R={0,10000,0010011001}
Numeri Reali – Virgola mobile(6/10)
F (prime 10 cifre a destra della virgola. Le altre vengono ignorate)
46
Numeri Reali – Virgola mobile(7/10)
Esempio (numeri con modulo massimo, i cosiddetti ± ∞):
R={0,11111,1111111111} (massimo numero rappresentabile, +∞)
R={1,11111,1111111111} (minimo numero rappresentabile, -∞)
f = F/2G = F/2dieci = 0.1111111111
e = + E -(2K-1 - 1) = +11111 – (+01111) = +10000 (+sedici)
|r| = 1.1111111111 · due+10000 < 2(2(K-1)+1)= 2bias+2=217=131072 |r| = 131008 1.3 · 10+5 in base dieci
Riassumendo, nella rappresentazione half precision: il «+∞» corrisponde a 2+17
il « -∞» corrisponde a -2+17
NB: L’intervallo di rappresentabilità [-∞, +∞] è approssimabile dal seguente: [ -2bias+2, 2bias+2 ]

47
Numeri Reali – Virgola mobile(8/10)
Esempio (numeri con modulo minimo, i cosiddetti ± 0):
R={0, 00000,0000000000} (minimo numero positivo, +0)
R= {1,00000,0000000000} (massimo numero negativo, -0)
f = F/2G = F/2dieci = 0.0000000000
e = + E -(2K-1 - 1) = +00000 – (+01111) = –01111= -quindici
|r| = 1.0000000000 · due-01111 = 2-bias |r| = 2-15 0.31 · 10-4
Riassumendo, nella rappresentazione half precision: il «+0» corrisponde a 2-15 0.31 · 10-4
il « -0» corrisponde a -2-15 -0.31 · 10-4
48
Numeri Reali – Virgola mobile(9/10)
Standard IEEE 754-1985 prevede: Rappresentazione in single precision su 32 bit con K = 8 e G = 23 Intervallo di rappresentabilità: massimo modulo 2(bias+2) = 2+129 6.8 · 10+38 minimo modulo =2-bias = 2-127 0.58 · 10-38
Rappresentazione in double precision su 64 bit con K = 11 e G = 52 Intervallo di rappresentabilità: massimo modulo 2(bias+2) = 2+1025 3.6 · 10+308
minimo modulo = 2-bias = 2-1023 1.1 · 10-308
IEEE 754-2008 aggiunge: rappresentazione in quadruple precision su 128 bit con K = 15 e G = 112 massimo modulo 2(bias+2) = 2+16385 1.2 · 10+4932
minimo modulo = 2-bias = 2-16383 1.6 · 10-4932

Numeri Reali - Virgola mobile (10/10)
49
0
0+=2-15 +∞ 2+17
0+=2-127 +∞ 2+129
0
r1 r2
half precision
single precision
50
Architettura di von Neumann (1946)
Schema a blocchi di un semplice calcolatore
MEMORIA
PRINCIPALE
(RAM)
RETE di INTERCONNESSIONE
INTERFACCE
TRASDUTTORI
PROCESSORE
(CPU)
tastiera video disco rigido
…

51
La memoria contiene dati e programmi (istruzioni) codificati in forma binaria
Il processore ripete all’infinito le azioni seguenti :
• preleva una nuova istruzione dalla memoria
• la decodifica
• la esegue
L’esecuzione di un’istruzione può comportare » Elaborazione e/o Trasferimento (memoria « processore,
I/O « processore)
Le periferiche permettono al calcolatore di interagire con il mondo esterno
Funzionamento
52
Struttura logica della memoria
OPERAZIONI
1. LETTURA di UNA cella
2. SCRITTURA di UNA cella ...
0
1
2
...
...
2h-2
2h-1
k bit
• 2h celle di k bit ognuna • Ogni cella ha un indirizzo

53
Struttura logica del processore (1)
CLOCK
Spazio di I/O Spazio di Memoria
0 1
216-2
216-1
0 1
65534 232-1
ALU
232-2
EIP
EF
Registri di stato
ESP
Puntatore di pila
AL AH
EAX AX
BL BH
EBX BX
CL CH
ECX CX
DL DH
EDX DX
EBP
ESI
EDI
BP
SI
DI
Registri generali
54
Esistono linguaggi a vari livelli di astrazione
Linguaggio macchina sequenze di bit (difficile da leggere e capire)
0001001000110100
Linguaggio Assembler istruzioni macchina espresse con nomi
simbolici (dipendente dalla macchina)
MOV $35, %AL
Linguaggi ad Alto livello indipendenti dalla macchina
int main()
{
…
}
Livelli di astrazione dei Linguaggi

55
Istruzioni MOV e JMP
L’istruzione MOV del processore DP.86.32 permette di:
• Copiare un valore (immediato) in un registro
Es: MOV $0x64, %AL
• Copiare il contenuto di una cella di memoria in un registro:
Es: MOV (5544FA04), %BH
• Copiare il contenuto della cella puntata da un registro a 32 bit
in un altro registro a 8 bit:
Es: MOV (%EBX), %CH
• Copiare il contenuto delle 2 celle consecutive di cui la prima è puntata
da un registro a 32 bit in un altro registro a 16 bit:
Es: MOV (%EDX), %DX
• Copiare il contenuto delle 4 celle consecutive di cui la prima è puntata
da un registro a 32 bit in un altro registro a 32 bit:
Es: MOV (%ECX), %EAX
L’istruzione JMP del processore DP.86.32 permette di saltare all’indirizzo
(sempre a 32 bit) specificato:
Es: JMP 5544FA0B
56
... ... (5544FA04) 00010001 (5544FA05) 01000010 (5544FA06) 10100101 (5544FA07) 00000101 (5544FA08) 11100101 (5544FA09) 01011010 (5544FA0A) 01100101 (5544FA0B) 10001011 (5544FA0C) 01110100 (5544FA0D) 10001011 (5544FA0E) 01100100 (5544FA0F) 00000001 (5544FA10) 01010100 (5544FA11) 10011011 (5544FA12) 01010101 (5544FA13) 01000100 (5544FA14) 11111010 (5544FA15) 00001011
... ... (5544FE05) 01001101
... ...
← istruzione di salto (JMP)
indirizzo a cui saltare (32 bit)
Parte dati del programma
Parte codice del programma
eseguibile
Esempio di programma in memoria
← istruzione di fine programma (RET )
← identificativo del registro %AL
← immediato 64 (in esadecimale)
← istruzione MOV (imm. 8 bit su reg. 8 bit)

57
Lo spazio di ingresso/uscita
memoria
cpu I/O
bus
... ... (C1CF) 10010001 (C1D0) 01110000 (C1D1) 10100101 (C1D2) 00100101 (C1D3) 01000001 (C1D4) 01011010 ... ...
← Porta di IN
← Porta di OUT
← Porta di OUT
← Porta di OUT
← Porta di IN
← Porta di OUT tastiera
video
IN (C1D3), %AL # carica in AL l’esad. 41, ossia ‘A’ (cfr cod. ASCII) OUT $0x70, (C1D0) # stampa a video 0x70, ossia il carattere ‘p’
A ‘p’
10001011 01100100 00000001
58
Le istruzioni sono codificate come sequenze di bit.
Formato delle istruzioni (1/2)
codice operativo
operandi
Stringa di bit
MOV %AL immediato 0x64
Codice
Operativo Operandi
Esempio

59
OPCODEsize source destination
OPCODEsize source
OPCODEsize destination
Dove size può essere: B (byte): 8 bit W (word): 16 bit L (Long): 32 bit
Esempi: MOVB (%EBX), %AL MOVW (%EBX), %AX MOVL (%EBX), %EAX
Formato delle istruzioni (2/2)
60
Esempio di programma in lunguaggio assembler
3F0D0100 00000000 Dato da elaborare (una WORD) 3F0D0102 00000000 Risultato (un BYTE) 3F0D0103
...
... 40B1A200 MOV $0, %AL Azzera il contatore AL
40B1A203 MOV (3F0D0100), %DX Copia in DX il dato da elaborare
40B1A207 CMP %DX, $0 Confronta il contenuto di DX con 0
40B1A211 JE 40B1A232 Salta se uguale
40B1A215 SHL %DX Trasla a sinistra il contenuto di DX
40B1A217 JC 40B1A225 Salta se CF è settato all’indirizzo 225
40B1A221 JMP 40B1A207 Salta incondizionatamente a 207
40B1A225 ADD $1, %AL Incrementa il contatore AL
40B1A228 JMP 40B1A207 Salta incondizionatamente
40B1A232 MOV %AL, (3F0D0102) Memorizza il risultato
40B1A236 HLT ALT
…

61
Istruzioni per il trasferimento di dati MOV Movimento (ricopiamento) IN Ingresso dati OUT Uscita dati PUSH Immissione di un long (32 bit) nella pila POP Estrazione di un long (32 bit) dalla pila
Istruzioni aritmetiche
ADD Somma (fra interi oppure naturali) SUB Sottrazione (fra interi oppure naturali) CMP Confronto (fra interi oppure naturali) MUL Moltiplicazione (fra naturali) DIV Divisione (fra naturali) IMUL Moltiplicazione (fra interi) IDIV Divisione (fra interi)
Istruzioni operative (1)
62
Istruzioni logiche NOT Not logico bit a bit AND And logico bit a bit OR Or logico bit a bit
Istruzioni di traslazione/rotazione SHL Traslazione a sinistra SHR Traslazione a destra ROL Rotazione a sinistra ROR Rotazione a destra
Istruzioni operative (2)

63
Istruzioni di salto
JMP Salto incondizionato
Jcond Salto sotto condizione
Istruzioni per la gestione dei sottoprogrammi
CALL Chiamata di sottoprogramma
RET Ritorno da sottoprogramma
Istruzione di alt
HLT Alt
Istruzioni di controllo
64
Registri di stato:
Extended Instruction Pointer EIP: registro che contiene l’indirizzo
della prossima istruzione da eseguire
Extended Flag register EF
Controllo del flusso: salto condizionato e registro dei flag
Carry Flag CF, Zero Flag ZF
SignFlag SF, Overflow Flag OF
CFZFSFOF
11 7 6 031
Esempio di test del contenuto dei flag:
Es1: CMP $0, %AL
JZ indirizzo_di_memoria
Es2: ADD %AL,%BL
JO indirizzo_di_memoria
NB:
Alcune istruzioni influenzano i flag, altre no
Ad esempio: la ADD influenza sia CF che OF, ma
• CF va testato nel caso si lavori sui naturali
• OF va testato nel caso si lavori sugli interi

65
Labels
Ogni istruzione assembler inizia ad un certo indirizzo in memoria (l’indirizzo della cella contenente il primo byte dell’istruzione)
L’indirizzo assoluto di una istruzione sarà noto solo a tempo di esecuzione, quando il programma assembler, reso eseguibile dall’assemblatore e dal linker, verrà caricato in memoria.
Il programmatore può creare delle etichette (dette labels), che possono essere utilizzate dal programmatore per indicare l’indirizzo di una istruzione. Sarà compito dell’assemblatore e del linker sostituire l’etichetta con l’indirizzo fisico assoluto.
Esempio di un programma che stampa 5 asterischi a video (il sottoprogramma output stampa a video il carattere la cui codifica ASCII si trova in %AL):
_main: MOV $5, %AH
MOV $’*’, %AL
label: CALL output # label conterrà l’indirizzo dell’istruzione
DEC %AH # CALL output
JNZ label
RET
.INCLUDE "utility"
66
Le direttive .BYTE, .FILL e .ASCII
In assembler si può allocare memoria «statica» per delle «variabili». Si tratta dell’equivalente C/C++ delle variabili globali.
Una «variabile» assembler è una etichetta (che corrisponde all’indirizzo della prima cella di memoria in cui inizia la «variabile») seguita da una direttiva assembler che riserva area di memoria.
v1: .BYTE 0x6F,‘k’ # alloca un vettore di 2 byte con "ok" v2: .FILL 12, 1 # alloca un vettore di 12 byte (1=byte)
v3: .FILL 25, 2 # alloca un vettore di 25 word (2=word = 2byte)
v4: .FILL 10, 4 # alloca un vettore di 10 long (4=long = 4byte)
str: .ASCII "Ciao Mondo"
_main:
MOV $str, %EBX # copia l’indirizzo di str in EBX
MOV $10, %CX
CALL outmess
RET
NB: Le direttive .BYTE e .ASCII calcolano il numero di celle di memoria da allocare
ed inoltre provvedono anche alla loro inizializzazione. La .FILL non inizializza.

67
Lo Stack (1/7)
• Lo STACK è un’area di memoria a disposizione dei programmi (sia Assembler che C/C++)
• Viene gestita mediante strategia LIFO (last in-first out): un nuovo dato può essere immesso oppure prelevato dalla cima allo STACK
• Sfrutta una registro speciale del processore, l’Extended Stack Pointer (ESP)
• L’ESP punta sempre alla prima locazione libera dello STACK
68
Lo Stack (2/7)
Lo STACK
cresce verso
indirizzi più
bassi ↑
Parte Dati Statici str: .ASCII "Ciao mondo!"
vett: .FILL 14, 4
←ESP (punta alla prima cella vuota)
Parte Codice _main: MOV %BX,%AX
…
RET
Parte Dati Dinamici (nota comunemente come HEAP: la
vedremo in azione nel linguaggio C++)
(memoria non ancora utilizzata dallo
STACK/HEAP)
Parte Dati Automatici (nota comunemente come STACK)
Struttura di un programma eseguibile in memoria

69
• L’istruzione PUSH salva il contenuto di un registro a 32 bit nelle 4 celle in cima allo STACK e decrementa ESP di 4
Esempio:
PUSH %EAX
• L’istruzione POP recupera il contenuto delle 4 locazioni in cima allo STACK, lo salva in un registro a 32 bit e incrementa ESP di 4
Esempio
POP %EBX
Le istruzioni PUSH e POP
Lo Stack (3/7)
70
…
cella vuota ←ESP-3
cella vuota ←ESP-2
cella vuota ←ESP-1
cella vuota ←ESP
cella piena ←ESP+1
cella piena ←ESP+2
cella piena ←ESP+3
cella piena ←ESP+4
cella piena
…
STACK
Le 4 celle
interessate da
una eventuale
POP
Le 4 celle
interessate da
una eventuale
PUSH
Funzionamento delle istruzioni PUSH e POP
Lo Stack (4/7)

71
L’istruzione CALL
• L’istruzione CALL permette di andare ad eseguire un sottoprogramma
• Esempio di chiamata del sottoprogramma input:
04AAFFB3 CALL input
04AAFFB8 INC %EAX
...
• Concettualmente la CALL equivale alle seguenti istruzioni:
PUSH %EIP # salva 04AAFFB8 sullo STACK
JMP 1E22AF0C # se input inizia a 1E22AF0C
NB: la PUSH %EIP non si può fare esplicitamente in quanto non fa parte del set delle istruzioni del processore!
← quando si arriva ad eseguire la CALL
in EIP ci sarà indirizzo dell’istruzione
INC (ad esempio, 04AAFFB8)
Lo Stack (5/7)
72
L’istruzione RET
• L’istruzione RET permette di tornare ad eseguire il sottoprogramma chiamante a partire dall’istruzione successiva alla CALL
Esempio:
1E22AF0C input: IN (0AFB), %AL
...
RET
• Concettualmente, effettua le seguenti operazioni: POP %EIP
JMP %EIP
Lo Stack (6/7)

73
Lo Stack (7/7)
Sintetizzando, le istruzioni che utilizzano lo STACK sono:
PUSH, POP, PUSHAD, POPAD, CALL e RET
NB:
• Tutte modificano l’ESP
• Alcune modificano anche l’EIP (CALL e RET)
74
Sottoprogrammi (1/2)
Qualunque blocco di istruzioni assembler consecutive che inizia con una label e termina con una RET. Esempio di un sottoprogramma che stampa a video un asterisco: subprog: PUSHAD # salva il contenuto di tutti i registri gen.
MOV ‘*’, %AL
CALL output
POPAD # ripristina il contenuto di tutti i reg. gen.
RET
Le informazioni fra il sottoprogramma chiamante (ad esempio il _main) e
quello chiamato avviene tramite registri.
subprog: CALL output # stampa il carattere messo in %AL dal chiamante
CALL input # legge un nuovo carattere e lo restituisce in %AL
RET

75
Sottoprogrammi (2/3)
Il sottoprogramma principale: _main
Ogni programma Assembler deve prevedere un sottoprogramma principale, denominato _main
Quando il file ascii (con estensione .s) viene compilato per generare il file oggetto file.o e poi linkato in un .exe, la prima istruzione assembler che verrà eseguita sarà quella che si trova all’indirizzo dell’etichetta _main
76
Sottoprogrammi (3/3)
Alcuni sottoprogrammi di utilità, contenuti nel file assembler "utility"
Input ed output di caratteri e stringhe input aspetta un carattere dalla tastiera e mette il suo codice ASCII in AL output stampa a video il carattere contenuto in %AL outmess stampa a video gli N caratteri che si trovano in memoria a partire
dall’indirizzo contenuto in EBX. N è il naturale contenuto in CX.
Input ed output di naturali e interi su 8 bit inbyte aspetta che vengano inseriti due caratteri (entrambi fra 0-9 o A-F)
e poi, interpretandoli come cifre esadecimali, assegna gli 8 bit di %AL. Esempio ‘E3’ => in AL ci finisce 11100011 outbyte stampa a video i due caratteri ASCII corrispondenti alle due
cifre esadecimali associate al corrente contenuto di %AL. Esempio: se il contenuto di AL è 01101010 a video viene stampata la stringa "6A" newline Porta il cursore all’inizio della linea seguente (CALL newline equivale al cout<<endl)

77
Informatica (definizione informale): è la scienza della rappresentazione e dell’elaborazione dell’informazione Informatica (definizione formale dell’Association for Computing Machinery - ACM): è lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione, la loro teoria e analisi, il loro progetto, e la loro efficienza, realizzazione e applicazione. Algoritmo: sequenza precisa e finita di operazioni, comprensibili e perciò eseguibili da uno strumento informatico, che portano alla realizzazione di un compito. Esempi di algoritmi:
• Istruzioni di montaggio di un elettrodomestico • Somma in colonna di due numeri • Bancomat
Definizione di informatica
78
Calcolatore elettronico come risolutore di problemi
Compito dell’esperto informatico: data la descrizione di un problema, produrre algoritmi (cioè capire la sequenza di passi che portano alla soluzione del problema) e codificarli in programmi. -La descrizione di un problema non fornisce in generale un modo per risolverlo. - La descrizione del problema deve essere chiara e completa.
Calcolatori Elettronici come esecutori di algoritmi: gli algoritmi vengono descritti tramite programmi, cioè sequenze di istruzioni scritte in un opportuno linguaggio comprensibile al calcolatore.

79
Algoritmo: sequenza precisa (non ambigua) e finita di operazioni, che portano alla realizzazione di un compito.
Le operazioni utilizzate appartengono ad una delle seguenti categorie:
1. Operazioni sequenziali
Realizzano una singola azione. Quando l’azione è terminata passano all’operazione successiva.
2. Operazioni condizionali
Controllano una condizione. In base al valore della condizione, selezionano l’operazione successiva da eseguire.
3. Operazioni iterative
Ripetono l’esecuzione di un blocco di operazioni, finchè non è verificata una determinata condizione.
Algoritmo (1)
80
L’esecuzione delle azioni nell’ordine specificato dall’algoritmo
consente di risolvere il problema.
Risolvere il problema significa produrre risultati a partire da dati in ingresso
L’algoritmo deve essere applicabile ad un qualsiasi insieme di dati in ingresso
appartenenti al dominio di definizione dell’algoritmo (se l’algoritmo si applica ai
numeri interi deve essere corretto sia per gli interi positivi che per gli interi negativi)
Algoritmo (2)
dati risultati
algoritmo
esecutore

81
Calcolo equazione ax+b = 0 - leggi i valori di a e di b
- calcola –b
- dividi quello che hai ottenuto per a e chiama x il risultato
- stampa x
Calcolo del massimo fra due numeri
- leggi i valori di a e di b
- se a > b stampa a altrimenti stampa b
Algoritmo (3)
82
Calcolo del massimo di un insieme - scegli un elemento come massimo provvisorio max
- per ogni elemento i dell’insieme: se i>max eleggi i come nuovo massimo provvisorio max
- il risultato è max
Stabilire se una parola P precede alfabeticamente una parola Q. Ipotesi: P e Q di uguale lunghezza > = 1 leggi P e Q; inizializza trovato a 0
- ripeti finché (trovato vale 0 e lettere non finite)
se prima lettera di P < prima lettera di Q
allora scrivi vero; trovato = 1; altrimenti se prima lettera di P > prima lettera di Q
allora scrivi falso; trovato = 1;
altrimenti togli da P e da Q la prima lettera - se trovato vale 0 allora scrivi falso
Algoritmo (4)

83
Eseguibilità: ogni azione deve essere eseguibile dall’esecutore in un tempo finito
Non-ambiguità: ogni azione deve essere univocamente interpretabile dall’esecutore
Finitezza: il numero totale di azioni da eseguire, per ogni insieme di dati in ingresso, deve essere finito
Algoritmi equivalenti
u hanno lo stesso dominio di ingresso
u hanno lo stesso dominio di uscita
u in corrispondeza degli stessi valori del dominio di ingressso producono gli stessi valori del dominio di uscita
u Due algoritmi equivalenti – Forniscono lo stesso risultato, ma possono avere diversa efficienza e possono
essere profondamente diversi
Algoritmo (5)
84
Esempio: calcolo del Massimo Comun Divisore (MCD) fra due interi M e N
Algoritmo 1 • Calcola l’insieme A dei divisori di M
• Calcola l’insieme B dei divisori di N
• Calcola l’insieme C dei divisori comuni
• il massimo comun divisore è il massimo divisore contenuto in C
Algoritmo (6)

85
Algoritmo 2 (di Euclide)
Se due numeri, m e n, sono divisibili per un terzo numero, x, allora anche la loro differenza è divisibile per x.
Per dimostrarla, si può utilizzare la proprietà distributiva. Supponiamo m>n. m=kx n=hx m-n=kx-hx=x(k-h) Dunque si può dire che: MCD(m,n) = MCD((m-n),n)
Algoritmo • ripeti finché (M != N):
§ se M > N, sostituisci a M il valore M-N
§ altrimenti sostituisci a N il valore N-M
- il massimo comun divisore corrisponde a M (o a N)
Algoritmo (7)
86
Algoritmo (8)
Proprietà essenziali degli algoritmi: Correttezza:
– un algoritmo è corretto se esso perviene alla soluzione del compito cui è preposto, senza difettare in alcun passo fondamentale.
Efficienza:
– un algoritmo è efficiente se perviene alla soluzione del compito cui è preposto nel modo più veloce possibile, compatibilmente con la sua correttezza.

87
La formulazione testuale di un algoritmo in un linguaggio comprensibile ad un calcolatore è detta PROGRAMMA. Ricapitolando, per risolvere un problema:
- Individuazione di un procedimento risolutivo
- Scomposizione del procedimento in un insieme ordinato di azioni – ALGORITMO
- Rappresentazione dei dati e dell’algoritmo attraverso un formalismo
comprensibile al calcolatore: LINGUAGGIO DI PROGRAMMAZIONE
Programmazione
88
Perché non usare direttamente il linguaggio naturale?
Il LINGUAGGIO NATURALE è un insieme di parole e di regole per combinare tali parole che sono usate e comprese da una comunità di persone
- non evita le ambiguità
- non si presta a descrivere processi computazionali automatizzabili
Occorre una nozione di linguaggio più precisa.
Un LINGUAGGIO di programmazione è una notazione formale che può essere usata per descrivere algoritmi.
Si può stabilire quali sono gli elementi linguistici primitivi, quali sono le frasi lecite e se una frase appartiene al linguaggio.
Linguaggi di Programmazione (1)

89
Un linguaggio è caratterizzato da: SINTASSI - insieme di regole formali per la scrittura di programmi, che fissano le modalità per costruire frasi corrette nel linguaggio SEMANTICA - insieme dei significati da attribuire alle frasi (sintatticamente corrette) costruite nel linguaggio - a parole (poco precisa e ambigua) - mediante azioni (semantica operazionale) - mediante funzioni matematiche (semantica denotazionale) - mediante formule logiche (semantica assiomatica)
Linguaggi di Programmazione (2)
90
Definizione di linguaggio
Alfabeto V (lessico) - insieme dei simboli con cui si costruiscono le frasi Universo linguistico V*
- insieme di tutte le frasi (sequenze finite) di elementi di V Linguaggio L su alfabeto V
- un sottoinsieme di V* Come definire il sottoinsieme di V* che definisce il linguaggio? Specificando in modo preciso la sintassi delle frasi del linguaggio TRAMITE una grammatica formale

91
Grammatica G = <V, VN, P, S>
V insieme finito di simboli terminali
VN insieme finito di simboli non terminali
P insieme finito di regole di produzione
S simbolo non terminale detto simbolo iniziale
Data una grammatica G, si dice Linguaggio LG generato da G l’insieme delle frasi di V
- Derivabili dal simbolo iniziale S
- Applicando le regole di produzione P
Le frasi di un linguaggio di programmazione vengono dette programmi di tale linguaggio.
Grammatiche
92
GRAMMATICA BNF (Backus-Naur Form) è una grammatica le cui regole di produzione sono della forma X ::= A X simbolo non terminale A sequenza di simboli (terminali e non terminali) Una grammatica BNF definisce quindi un linguaggio sull’alfabeto terminale V mediante un meccanismo di derivazione (riscrittura) A deriva da X se esiste una sequenza di derivazioni da X ad A X ::= A1
A2 unica regola che indica l’alternativa fra A1, …, An
… An
Grammatica BNF (1)

93
G = <V, VN, P, S>
V = {lupo, canarino, bosco, cielo, mangia, vola, canta, ., il, lo} VN = {frase, soggetto, verbo, articolo, nome } S = frase
Produzioni P frase ::= soggetto verbo . soggetto ::= articolo nome
articolo ::= il lo nome ::= lupo canarino bosco cielo verbo ::= mangia vola canta
Esempio: derivazione della frase
“il lupo mangia.”
frase -> soggetto verbo.
-> articolo nome verbo.
-> il nome verbo.
-> il lupo verbo.
-> il lupo mangia.
derivazione left-most
Grammatica BNF (2)
94
Albero sintattico
frase
soggetto verbo
articolo nome
mangia lupo il
Albero sintattico: albero che esprime il processo di derivazione di una frase usando una data grammatica
Esistono programmi per generare analizzatori sintattici per linguaggi descritti con BNF
.

95
Scrivere un programma sintatticamente corretto non implica che il programma faccia quello per cui è stato scritto La frase “il lupo vola” è sintatticamente corretta ma non è semanticamente corretta (non è significativa) // Somma di due numeri interi inseriti da tastiera int main() { int a, b; cout << “immettrere due numeri” << endl; cin >> a; cin >> b; int c = a + a; ç cout << “Somma: “ << c << endl; return 0; }
Sintassi e semantica
96
Sviluppo di un programma (approccio compilato):
- editing: scrivere il testo e memorizzarlo su supporti di memoria permanenti
- compilazione
- linking
- esecuzione Compilatore: traduce il programma sorgente in programma oggetto
u ANALISI programma sorgente
analisi lessicale
analisi sintattica
u TRADUZIONE
generazione del codice
ottimizzazione del codice
Esempi: C, C++, Pascal…
Approccio compilato

97
Sviluppo di un programma (approccio interpretato):
- editing: scrivere il testo e memorizzarlo su supporti di memoria permanenti
- interpretazione
u ANALISI programma sorgente
analisi lessicale
analisi sintattica
u ESECUZIONE
ESEMPIO: Basic, Java
Approccio Interpretato

•P
er
defi
nir
esin
tassi
esem
an
tica
di
un
lin
gu
ag
gio
occo
rre
uti
lizzare
un
alt
rolin
gu
ag
gio
,o
ssia
un
meta
lin
gu
ag
gio
•M
eta
lin
gu
ag
gio
per
lasin
tassiC
++
:
–in
sie
me
di
no
tazio
ni
(no
nam
big
ue),
ch
ep
osso
no
essere
sp
ieg
ate
co
np
och
ep
aro
led
ellin
gu
ag
gio
natu
rale
.
•M
eta
lin
gu
ag
gio
per
lasem
an
tica
C+
+:
–ri
su
lta
assai
co
mp
lesso
,p
er
cu
isi
rico
rre
dir
ett
am
en
teallin
gu
ag
gio
natu
rale
.
•N
ota
zio
ne
uti
lizzata
per
lasin
tassiC
++
:
–d
eri
vata
dalcla
ssic
ofo
rmalism
od
iB
acku
se
Nau
r(B
NF
,B
acku
s-N
au
rF
orm
).
2.1
Lin
gu
ag
gio
di
Pro
gra
mm
azio
ne C
++
(I) 9
8
NO
TA
ZIO
NE
UT
ILIZ
ZA
TA
basata
su
lla
gra
mm
ati
ca
BN
F;
term
ino
log
iain
gle
se;
risp
ett
oalla
sin
tassiu
ffic
iale
,re
go
lesem
plifi
cate
,
cara
tteri
zzate
dalp
refi
sso
basic
;
div
ers
ao
rgan
izzazio
ne
delle
cate
go
rie
sin
tatt
ich
e.
Reg
ole
-u
na
reg
ola
descri
ve
un
acate
go
ria
sin
tatt
ica,
uti
lizzan
do
alt
recate
go
rie
sin
tatt
ich
e,
co
str
utt
id
im
eta
lin
gu
ag
gio
,sim
bo
lite
rmin
ali
-le
form
ealt
ern
ati
ve
po
sso
no
sta
resu
rig
he
sep
ara
te,
op
pu
reessere
ele
ncate
do
po
ilsim
bo
lod
elm
eta
lin
gu
ag
gio
on
eo
f.
Cate
go
rie
sin
tatt
ich
e:
–scri
tte
inco
rsiv
o.
Co
str
utt
id
im
eta
lin
gu
ag
gio
:
–scri
ttico
nso
tto
lin
eatu
ra.
Sim
bo
lite
rmin
ali:
–scri
ttico
ncara
tteri
norm
ali.
2.1
Meta
lin
gu
ag
gio
per
il C
++
(I)
99

•E
sem
pio
frase
so
gg
ett
overb
o.
so
gg
ett
o
art
ico
lon
om
e
art
ico
lo
on
eo
f
illo
no
me
on
eo
f
lupo
canarino
bosco
cie
loscoia
ttolo
verb
o on
eo
f
mangia
vola
canta
•F
rasi
sin
tatt
icam
en
teco
rrett
e(s
eco
nd
ola
sem
plice
sin
tassiin
tro
do
tta)
ilcan
ari
no
vo
la.
illu
po
man
gia
.
illu
po
can
ta.
ilsco
iatt
olo
vo
la.
•A
TT
EN
ZIO
NE
:
Un
asin
tassi
co
rrett
an
on
imp
lica
un
asem
an
tica
co
rrett
a.
2.1
Meta
lin
gu
ag
gio
per
il C
++
(II
)
100
Ele
men
tid
iu
na
cate
go
ria
sin
tatt
ica:
–p
osso
no
essere
op
zio
nali:
»ve
ng
on
oco
ntr
asseg
nati
co
nil
su
ffis
so
|op
t(s
imb
olo
dim
eta
lin
gu
ag
gio
).
–p
osso
no
essere
rip
etu
tip
iùvo
lte:
»p
er
far
qu
esto
,ven
go
no
intr
od
ott
ecate
go
rie
sin
tatt
ich
eag
giu
nti
ve.
Cate
go
rie s
inta
ttic
he a
gg
iun
tive
1. S
eq
uen
za d
i u
n q
ualu
nq
ue g
en
ere
di ele
men
ti:
so
me-e
lem
en
t-seq
so
me-e
lem
en
t
so
me-e
lem
en
t so
me-e
lem
en
t-seq
2. L
ista
di u
n q
ualu
nq
ue g
en
ere
di ele
men
ti (
sep
ara
ti d
a
vir
go
la):
so
me-e
lem
en
t-list
so
me-e
lem
en
t
so
me-e
lem
en
t ,
so
me-e
lem
en
t-list
2.1
Meta
lin
gu
ag
gio
per
il C
++
(II
I)
101

2.1
Meta
lin
gu
ag
gio
per
il C
++
(IV
)
so
me-e
lem
en
t-seq
so
me-e
lem
en
tso
me-e
lem
en
t-seq
so
me-e
lem
en
tso
me-e
lem
en
t-seq
so
me-e
lem
en
t
1
2
3
Alb
ero
di d
eri
vazio
ne p
er
la s
eq
uen
za:
1 2
3
so
me-e
lem
en
t
on
eo
f
0 1 2 3 4 5 6 7 8 9
102
•P
rog
ram
ma
C+
+:
–co
sti
tuit
od
aseq
uen
ze
dip
aro
le(t
oken
);
–le
paro
lep
osso
no
essere
delim
itate
da
sp
azi
bia
nch
i(w
hit
esp
ace).
•P
aro
le:
–co
sti
tuit
ed
aiseg
uen
ticara
tteri
:
token
-ch
ara
cte
r
dig
it
lett
er
sp
ecia
l
dig
it on
eo
f
01
23
45
67
89
lett
er
on
eo
f
_a
b...
zA
B...
Z
sp
ecia
l
on
eo
f
!%
^...
/
2.2
Sin
tassi C
++
(I)
103

•S
pazib
ian
ch
i:
–cara
ttere
sp
azio
;
–cara
tteri
tab
ula
zio
ne
(ori
zzo
nta
lee
vert
icale
);
–cara
tteri
nu
ova
rig
ae
rito
rno
carr
ello
.
•C
om
men
ti:
–seq
uen
ze
di
paro
lee
sp
azi
bia
nch
ira
cch
iuse
fra
icara
tteri
/*e
*/,
op
pu
refr
ai
cara
tteri
//e
lafi
ne
della
rig
a;
–h
an
no
losco
po
di
do
cu
men
tare
un
pro
gra
mm
a;
–p
osso
no
essere
inseri
tili
bera
men
ten
el
testo
en
on
han
no
alc
un
eff
ett
osu
ll’e
secu
zio
ne
del
pro
gra
mm
a.
•S
pazib
ian
ch
ie
co
mm
en
ti:
–co
sti
tuis
co
no
lesp
azia
ture
.
2.2
Sin
tassi C
++
(II
)
104
•C
ate
go
rie
sin
tatt
ich
eele
men
tari
(ele
men
tile
ssic
ali):
–o
pp
ort
un
eseq
uen
ze
di
cara
tteri
(to
ken
-ch
ara
cte
ro
wh
itesp
ace);
–n
on
po
sso
no
inclu
dere
sp
azia
ture
(ag
giu
nti
ve)
fra
un
cara
ttere
eu
nalt
ro.
•E
lem
en
tile
ssic
ali:
–id
en
tifi
cato
ri(i
den
tifi
er)
;
–p
aro
lech
iave
(keyw
ord
);
–esp
ressio
nile
ttera
li(l
itera
l);
–o
pera
tori
(op
era
tor)
;
–sep
ara
tori
(sep
ara
tor)
.
2.2
Sin
tassi C
++
(II
I)
105

•E
nti
tàu
sate
inu
np
rog
ram
ma:
–d
evo
no
po
ssed
ere
no
mi;
–in
om
ip
osso
no
essere
iden
tifi
cato
ri:
iden
tifi
er
lett
er
lett
er
iden
tifi
er-
ch
ar-
seq
iden
tifi
er-
ch
ar
lett
er
dig
it
•Il
cara
ttere
diso
tto
lin
eatu
ra_
èu
na
lett
era
.
–la
do
pp
iaso
tto
lin
eatu
raall'in
tern
od
eg
liid
en
tifi
cato
riè
sco
nsig
liata
,p
erc
hé
riserv
ata
alle
imp
lem
en
tazio
nied
alle
lib
reri
e.
•Il
C+
+d
isti
ng
ue
fra
maiu
sco
lee
min
usco
le(è
case
sen
sit
ive).
•E
sem
pi:
iden
t
_id
en
t
Iden
t
2.2
.1 Id
en
tifi
cato
ri
106
•N
ota
:
–i
term
ini
no
me
eid
en
tifi
cato
resp
esso
ven
go
no
usati
inte
rcam
bia
bilm
en
te,
ma
èn
ecessari
od
isti
ng
uerl
i:
»u
nn
om
ep
uò
essere
un
iden
tifi
cato
re,
op
pu
reu
nid
en
tifi
cato
reco
nalt
risim
bo
liag
giu
nti
vi.
•P
aro
lech
iave:
–sim
bo
lico
sti
tuit
id
ap
aro
lein
gle
si
(fo
rmate
da
seq
uen
ze
di
lett
ere
),il
cu
isig
nif
icato
èsta
bilit
od
allin
gu
ag
gio
:
keyw
ord
on
eo
f
and
...
while
•U
nid
en
tifi
cato
ren
on
pu
òessere
ug
uale
ad
un
ap
aro
lach
iave.
•E
sp
ressio
nile
ttera
li:
–ch
iam
ate
sem
plicem
en
tele
ttera
li;
–d
en
ota
no
valo
rico
sta
nti
(co
sta
nti
sen
za
no
me);
»n
um
eri
inte
ri(p
er
es.10);
»n
um
eri
reali
(per
es.–12.5
);
»le
ttera
licara
ttere
(per
es.‘a
’);
»le
ttera
listr
ing
a(p
er
es.“in
form
ati
ca”).
2.2
.2 P
aro
le C
hia
ve e
Esp
ressio
ni
Lett
era
li 107

•O
pera
tori
:
–cara
tteri
sp
ecia
lie
loro
co
mb
inazio
ni;
–serv
on
oa
de
no
tare
op
era
zio
ni
nel
calc
olo
delle
esp
ressio
ni;
–esem
pi:
�cara
ttere
+
�cara
ttere
-
�K
•S
ep
ara
tori
:
–sim
bo
lid
iin
terp
un
zio
ne,
ch
ein
dic
an
oil
term
ine
di
un
ais
tru
zio
ne,
sep
ara
no
ele
men
tid
iliste
,ra
gg
rup
pan
ois
tru
zio
ni
oesp
ressio
ni,
eccete
ra;
–esem
pi:
�cara
ttere
;
�co
pp
iad
icara
tteri
()
�K2.2
.4O
pera
tori
e s
ep
ara
tori
108
–p
osiz
ion
eri
sp
ett
oai
su
oi
op
era
nd
i(o
arg
om
en
ti):
�p
refi
sso
:se
pre
ced
eg
liarg
om
en
ti
�o
parg
do
ve
op
e’l’o
pera
tore
earg
e’l’arg
om
en
to
Esem
pio
:+
5
�p
ostf
isso
:se
seg
ue
gli
arg
om
en
ti
�arg
op
Esem
pio
:x+
+(o
pera
tore
incre
men
to)
�in
fisso
:in
tutt
ig
lialt
ricasi;
�arg
1o
parg
2
Esem
pio
:4
+5
–n
um
ero
diarg
om
en
ti(o
ari
età
):
Esem
pio
:o
parg
(ari
età
1)
arg
1o
parg
2(a
rietà
2)
2.2
.4P
rop
rietà
deg
li o
pera
tori
(I)
109

–p
reced
en
za
(op
rio
rità
)n
ell’o
rdin
ed
i
esecu
zio
ne:
�g
lio
pera
tori
co
np
rio
rità
più
alt
ave
ng
on
o
eseg
uit
ip
er
pri
mi;
Esem
pio
:
arg
1+
arg
2*
arg
3
(op
era
tore
pro
do
tto
pri
ori
tàm
ag
gio
re
dell’o
pera
tore
so
mm
a)
–asso
cia
tivit
à(o
rdin
ein
cu
iven
go
no
eseg
uit
i
op
era
tori
della
ste
ssa
pri
ori
tà):
�o
pera
tori
asso
cia
tivi
asin
istr
a:
ve
ng
on
o
eseg
uit
id
asin
istr
aa
destr
a;
Esem
pio
:arg
1+
arg
2+
arg
3
(arg
1+
arg
2)
+arg
3
�o
pera
tori
asso
cia
tivi
ad
es
tra:
ven
go
no
eseg
uit
i
da
destr
aa
sin
istr
a.
Esem
pio
:arg
1=
arg
2=
arg
3
arg
1=
(arg
2=
arg
3)
2.2
.4P
rop
rietà
deg
li o
pera
tori
(II
)
110
Il p
iù s
em
plice p
rog
ram
ma C
++
int
main
(){
}
Un
passo
avan
ti
#in
clu
de <
cstd
lib
>// d
irettiv
e p
er
il pre
pocessore
usin
g n
am
esp
ace s
td;
/*direttiv
a c
he indic
a a
l com
pila
tore
che tutti i nom
iusati n
el pro
gra
mm
a s
i rife
riscono a
llo s
tandard
A
NS
I-C
++
*/
int
main
()// d
ichia
razio
ne d
ella
funzio
ne m
ain
{
syste
m("
PA
US
E");
/* c
onsente
di blo
ccare
l’e
secuzio
ne in a
ttesa c
he
l’ute
nte
dig
iti un tasto
*/
retu
rn 0
; // r
estitu
isce 0
ovverr
o tutto O
K!!!!
}
3. U
n s
em
pli
ce p
rog
ram
ma
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
111

3.1
Og
gett
i (I
)
Og
gett
o: gru
ppo d
i celle
consecutive c
he v
engono
consid
era
te d
al pro
gra
mm
ato
re c
om
e u
n’u
nic
a c
ella
info
rmativa.
Att
rib
uti
di un o
ggetto:
Ind
iriz
zo
della
prim
a c
ella
Valo
re(c
onte
nuto
di tu
tte le c
elle
)
Cella
Oggetto
Indiriz
zo
Valo
re
Mem
ori
a:
insie
me d
i celle.
Cella:
in g
en
ere
dim
en
sio
ne d
i u
n b
yte
(8 b
it) 112
•O
gg
ett
ico
sta
nti
(co
sta
nti
co
nn
om
e)
eo
gg
ett
ivari
ab
ili:
–l’in
dir
izzo
co
mu
nq
ue
no
ncam
bia
;
–il
valo
ren
on
pu
òo
pu
òsu
bir
em
od
ific
he,
risp
ett
ivam
en
te.
•P
rog
ram
mato
re:
–si
rife
risce
au
no
gg
ett
om
ed
ian
teu
nn
om
e(c
aso
part
ico
lare
din
om
e:
iden
tifi
cato
re).
•O
gg
ett
o:
–h
au
nti
po
.
•T
ipo
diu
no
gg
ett
o:
–in
sie
me
di
valo
ri(d
ett
iele
men
tio
co
sta
nti
de
lti
po
);
–in
sie
me
di
op
era
zio
ni
defi
nit
esu
gli
ele
men
ti(c
on
risu
ltato
ap
part
en
en
teallo
ste
sso
tip
oo
ad
un
alt
roti
po
).
•A
sso
cia
reu
nti
po
au
no
gg
ett
o:
–p
erm
ett
ed
iri
levare
inm
an
iera
au
tom
ati
ca
va
lori
ch
en
on
sia
no
co
mp
resi
nell’in
sie
me
di
defi
niz
ion
ee
op
era
zio
nin
on
co
nsen
tite
.
3.1
Og
gett
i (I
I)
113

•C
ostr
utt
ich
ein
tro
du
co
no
nu
ove
en
tità
:
–d
ich
iara
zio
ni;
–d
efi
niz
ion
i.
•D
ich
iara
zio
ni:
–en
tità
acu
iil
co
mp
ilato
ren
on
asso
cia
locazio
ni
dim
em
ori
ao
azio
nieseg
uib
ili;
–esem
pio
:d
ich
iara
zio
nid
iti
po
.
•D
efi
niz
ion
i:
–en
tità
acu
iil
co
mp
ilato
reasso
cia
locazio
ni
di
mem
ori
ao
azio
nieseg
uib
ili;
–esem
pio
:d
efi
niz
ion
id
iva
riab
ili
od
ico
sta
nti
(co
nn
om
e).
•N
om
en
cla
tura
co
nsen
tita
inC
++
:
–sp
esso
no
nè
sem
plice
né
co
nven
ien
tetr
att
are
sep
ara
tam
en
ted
ich
iara
zio
nie
defi
niz
ion
i;
–co
nd
ich
iara
zio
ne
si
pu
òin
ten
dere
sia
un
ad
ich
iara
zio
ne
vera
ep
rop
ria
sia
un
ad
efi
niz
ion
e(l
ed
ich
iara
zio
nico
mp
ren
do
no
led
efi
niz
ion
i).
3.2
Dic
hia
razio
ni
e D
efi
niz
ion
i
114
Tip
i:T
ipifo
nd
am
en
tali
Tip
id
eri
vati
•T
ipifo
nd
am
en
tali:
–ti
pip
red
efi
nit
i;
–ti
pien
um
era
zio
ne.
Tip
ip
red
efi
nit
i:
–ti
po
inte
ro(i
nt)
eti
po
natu
rale
(un
sig
ned
);
–ti
po
reale
(do
ub
le);
–ti
po
bo
ole
an
o(b
oo
l);
–ti
po
cara
ttere
(ch
ar)
.
•I
tip
ifo
nd
am
en
tali
so
no
ch
iam
ati
an
ch
eti
pi
ari
tmeti
ci.
•Il
tip
oin
tero
eil
tip
ore
ale
so
no
dett
iti
pi
nu
meri
ci.
•Il
tip
oin
tero
,il
tip
ob
oo
lean
o,
ilti
po
cara
ttere
ed
iti
pien
um
era
tiso
no
dett
iti
pid
iscre
ti.
•T
ipid
eri
vati
:
–sio
tten
go
no
ap
art
ire
daiti
pip
red
efi
nit
i;
–p
erm
ett
on
od
ico
str
uir
estr
utt
ure
dati
più
co
mp
lesse.3.2
Tip
i d
el
C+
+
115

3.3
Tip
o i
nte
ro (
I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;
int
i1 =
7;
int
i2(7
);
int
i3 =
0, i4
, i5
= 6
;
i1 =
-7;
// i1 =
-7 (
cam
bia
mento
di segno)
i2 =
i1 +
3;
// i2 =
-4 (
som
ma)
i2 =
i1 -
1;
// i2 =
-8 (
sottra
zio
ne)
i2 =
i1 *
2;
// i2 =
-14 (
moltip
licazio
ne)
i4 =
1 / 2
;// i4 =
0 (
quozie
nte
)
i5 =
1 %
2;
// i5 =
1 (
resto
)
i3 =
1 / 2
* 2
+ 1
% 2
;// i3 =
1 (
a=
(a/b
)*b +
a%
b)
co
ut
<<
i3 <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;
} 1 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
116
3.3
Tip
o i
nte
ro (
II)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
// tip
o s
hort
int
sh
ort
in
t s1 =
1;
// lettera
le int
sh
ort
s2 =
2;
// tip
o long int
lon
g in
t ln
1 =
6543;
// lettera
le int
lon
g ln
2 =
6543L
;// lettera
le long int (s
uffis
so L
)lo
ng
ln
3 =
6543l;
// lettera
le long int (s
uffis
so l)
// lettera
le int ottale
, pre
fisso 0
(zero
)in
t o
tt =
011;
// o
tt =
9 (
lettera
le inte
ro o
ttale
)
// lettera
le int esadecim
ale
, pre
fisso 0
x o
0X
int
esad
1 =
0xF
;// e
sad1 =
15
int
esad
2 =
0X
F;
/
/ esad2 =
15
co
ut
<<
ott
<<
en
dl <
< e
sad
1 <
< e
nd
l;co
ut
<<
esad
2 <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 9 15
15
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
117

3.3
Tip
o i
nte
ro (
III)
Defi
niz
ion
e d
i u
n i
nte
ro c
on
il
form
alism
o d
i B
acku
s e
Nau
r
basic
-in
t-d
efi
nit
ion
int
int-
sp
ecif
ier-
list
;
int-
sp
ecif
ier-
list
int-
sp
ecif
ier
int-
sp
ecif
ier,
int-
sp
ecif
ier-
list
int-
sp
ecif
ier
iden
tifi
er
int-
init
ializer|
op
t
int-
init
ializer
=exp
ressio
n
( exp
ressio
n )
Osserv
azio
ni:
•se
Nè
iln
um
ero
di
bit
imp
ieg
ati
per
rap
pre
sen
tare
gli
inte
ri,ivalo
rivan
no
da
-2**
(N-1
)a
2**
(N-1
)-1;
•valo
reti
pic
od
iN
:32.
118
3.3
Tip
o I
nte
ro(I
V)
int-
sp
ecif
ier-
list
basic
-in
t-d
efi
nit
ion
iden
tifi
er
int-
sp
ecif
ier
Alb
ero
di d
eri
vazio
ne p
er
la d
efi
niz
ion
e:
in
t i =
1, j
= 2
;
int
int-
sp
ecif
ier-
list
;
,
=exp
ressio
nin
t-sp
ecif
ier
iden
tifi
er
=exp
ressio
n
i
j
lett
er
lett
er
dig
it
1
lite
ral
dig
it
2
lite
ral
119

3.3
.1 T
ipo
un
sig
ned
(I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
// tip
o u
nsig
ned int
un
sig
ned
in
t u
1 =
1U
; // lettera
le u
nsig
ned, suffis
so U
un
sig
ned
u2 =
2u
; // le
ttera
le u
nsig
ned, suffis
so u
// tip
o u
nsig
ned s
hort
int
un
sig
ned
sh
ort
in
t u
3 =
3;
un
sig
ned
sh
ort
u4 =
4;
// tip
o u
nsig
ned long int
un
sig
ned
lo
ng
in
t u
5 =
5555;
un
sig
ned
lo
ng
u6 =
6666U
L;
un
sig
ned
lo
ng
u7 =
7777L
U;
// lettera
le u
nsig
ned long, suffis
so U
L (
ul)
un
sig
ned
sh
ort
in
t u
8 =
-0X
0001;
// W
arn
ing
co
ut
<<
u1 <
< '\t
' <
< u
2 <
< e
nd
l;co
ut
<<
u3 <
< '\t
' <
< u
4 <
< e
nd
l;co
ut
<<
u5 <
< '\t
' <
< u
6 <
< '\t
' <
< u
7 <
< e
nd
l;co
ut
<<
u8 <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 1 2
3 4
5555 6666 7777
65535
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
120
3.3
.1 T
ipo
un
sig
ned
(II
)
Osserv
azio
ni:
•se N
è il n
um
ero
di b
it im
pie
gati
per
rap
pre
sen
tare
g
li in
teri
, i valo
ri v
an
no
da 0 a
2**
N -
1;
•Il t
ipo
un
sig
ned
èu
tilizzato
pri
ncip
alm
en
te p
er
op
era
zio
ni a b
asso
liv
ello
:
–il c
on
ten
uto
di alc
un
e c
elle d
i m
em
ori
a n
on
è
vis
to c
om
e u
n v
alo
re n
um
eri
co
, m
a c
om
e u
na
co
nfi
gu
razio
ne d
i b
it.
Op
era
tori
bit
a b
it:
| O
R b
it a
bit
& A
ND
bit
a b
it
^ O
R e
sclu
siv
o b
it a
bit
~ co
mp
lem
en
to b
it a
bit
<<
tr
asla
zio
ne a
sin
istr
a
>>
tr
asla
zio
ne a
destr
a
121

3.3
.1 T
ipo
un
sig
ned
(II
)
ab
|&
^~
00
00
01
01
10
11
10
10
10
11
11
00
122
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
un
sig
ned
sh
ort
a =
0xF
FF
9;
// 1
111 1
111 1
111 1
001 (
65529)
un
sig
ned
sh
ort
b =
~a;
// 0
000 0
000 0
000 0
110 (
6)
un
sig
ned
sh
ort
c =
0x0013;
// 0
000 0
000 0
001 0
011 (
19)
un
sig
ned
sh
ort
c1, c2, c3;
c1 =
b | c
;// 0
000 0
000 0
001 0
111 (
23)
c2 =
b &
c;
// 0
000 0
000 0
000 0
010 (
2)
c3 =
b ^
c;
// 0
000 0
000 0
001 0
101 (
21)
un
sig
ned
sh
ort
b1, b
2;
b1 =
b <
< 2
;// 0
000 0
000 0
001 1
000 (
24)
b2 =
b >
> 1
;// 0
000 0
000 0
000 0
011 (
3)
co
ut
<<
a <
< '\t
' <
< b
<<
'\t
' <
< c
<<
en
dl;
co
ut
<<
c1 <
< '\t
' <
< c
2 <
< '\t
' <
< c
3 <
< e
nd
l;co
ut
<<
b1 <
< '\t
' <
< b
2 <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 65529
6
19
23
2
21
24
3P
rem
ere
un
tasto
per
co
nti
nu
are
. . .. . .
3.3
.1 T
ipo
un
sig
ned
(II
I)
123

3.4
Tip
o r
eale
(I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
// tip
o d
ouble
d
ou
ble
d1 =
3.3
;d
ou
ble
d2 =
-12.1
4e-3
, d
3 =
1.5
1;
// tip
o flo
at
flo
at
f =
-2.2
;fl
oat
g =
f -
12.1
2F
;// lettera
le flo
at, s
uffis
so F
(f)
lon
g d
ou
ble
h =
+0.1
;lo
ng
do
ub
le k
= 1
.23e+
12L
;// lettera
le long d
ouble
, suffis
so L
(l)
co
ut
<<
d1 <
< '\t
' <
< d
2 <
< '\t
' <
< d
3 <
< e
nd
l;co
ut
<<
f <
< '\t
' <
< g
<<
en
dl;
co
ut
<<
h <
< '\t
' <
< k
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} 3.3
-
0.0
1214 1.5
1-2
.2 -1
4.3
20.1
1
.23e+
012
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
124
3.4
Tip
o r
eale
(II
)
Lett
era
le r
eale
(fo
rma e
ste
sa):
10 .
56 E
-3
•la
part
e in
tera
o la p
art
e f
razio
nari
a, se v
alg
on
o z
ero
,
po
sso
no
essere
om
esse.
Le o
pera
zio
ni su
gli in
teri
e s
ui re
ali s
i in
dic
an
o
co
n g
li s
tessi sim
bo
li (
so
vra
pp
osiz
ion
eo
o
verl
oad
ing
), m
a s
on
o o
pera
zio
ni d
ivers
e.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i =
1, j
= 2
;in
t z =
i / j;
// 0
flo
at
f1 =
1.0
/ 2
.0;
// 0
.5fl
oat
f2 =
1 / 2
;// 0
flo
at
f3 =
(fl
oat)
i / j;
// 0
.5co
ut
<<
z <
< '\t
' <
< f
1 <
< '\t
' <
< f
2 <
< '\t
' <
< f
3 <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 0 0
.5 0
0
.5P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
Part
e Inte
raP
art
e F
razio
naria
Com
ponente
in v
irgola
fis
sa
125

3.5
Tip
o b
oo
l (I
)
Tip
ob
oo
l:
valo
ri:
co
sta
nti
pre
defi
nit
e f
als
ee t
rue
(co
dif
icati
co
n g
li in
teri
0 e
1, ri
sp
ett
ivam
en
te).
Op
era
zio
ni:
|| O
R lo
gic
o o
dis
giu
nzio
ne
&&
A
ND
lo
gic
o o
co
ng
iun
zio
ne
! N
OT
lo
gic
o o
neg
azio
ne
p q
p ||q
p&
&q
!p--
----
----
----
----
----
----
----
----
----
----
----
----
----
--fa
lse f
als
efa
lse
fals
etr
ue
fals
e tr
ue
tru
efa
lse
tru
e
tru
e f
als
etr
ue
fals
efa
lse
tru
e t
rue
tru
etr
ue
fals
e
126
#in
clu
de <
cstd
lib
>
#in
clu
de <
iostr
eam
>
usin
g n
am
esp
ace s
td;
int
main
()
{
bo
ol
b1 =
tru
e,
b2 =
fals
e;
bo
ol
b3 =
b1 &
& b
2;
// b
3 =
fals
e
bo
ol
b4 =
b1 |
| b
2;
// b
4 =
tru
e
bo
ol
b5 =
b1 |
| b
2 &
& f
als
e;
// b
5 =
tru
e (
AN
D p
recedenza m
aggio
re d
i O
R)
bo
ol
b6 =
!b
2||
b2 &
& f
als
e;
// b
6 =
tru
e (
NO
T p
rec.
maggio
re d
i A
ND
e O
R)
co
ut
<<
b3 <
< '\t
' <
< b
4 <
< '\t
' <
< b
5;
co
ut
<<
'\t
' <
< b
6 <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;
} 0 1
1
1
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
3.5
Tip
o b
oo
l (I
I)
127

3.5
Op
era
tori
di
co
nfr
on
to e
lo
gic
i (I
)
I ti
pi ari
tmeti
ci p
osso
no
uti
lizzare
gli o
pera
tori
di
co
nfr
on
to:
==
u
gu
ale
!=
d
ivers
o
> m
ag
gio
re
>=
m
ag
gio
re o
ug
uale
< m
ino
re
<=
m
ino
re o
ug
uale
Op
era
tori
di co
nfr
on
to:
–il r
isu
ltato
è u
n b
oo
lean
o, ch
e v
ale
fals
ese la
co
nd
izio
ne e
sp
ressa d
all’o
pera
tore
no
n è
veri
ficata
, tr
ue
alt
rim
en
ti;
–g
li o
pera
tori
di co
nfr
on
to s
i d
ivid
on
o i
n:
•o
pera
tori
di u
gu
ag
lian
za (
==
e
!
= )
;
•o
pera
tori
di re
lazio
ne;
–i p
rim
i h
an
no
un
a p
reced
en
za p
iù b
assa d
eg
li
alt
ri.
128
3.5
Op
era
tori
di
co
nfr
on
to e
lo
gic
i (I
I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
bo
ol b
1, b
2, b
3, b
4, b
5;
int
i =
10;
flo
at
f =
8.0
;
b1 =
i >
3 &
& f
< 5
.0;
// fals
e
b2 =
i =
= f
< 5
.0;
// fals
e
b3 =
i =
= i;
// tru
e
b4 =
4 <
i <
7;
// tru
e ?
???
b5 =
4 <
i &
& i <
7;
// fals
e
co
ut
<<
b1 <
< '\t
' <
< b
2 <
< '\t
' <
< b
3 <
< e
nd
l;co
ut
<<
b4 <
< '\t
' <
< b
5 <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 0 0
1
1 0
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
129

3.6
Tip
o c
ara
ttere
(I)
•in
sie
me d
i valo
ri:
cara
tteri
op
po
rtu
nam
en
te c
od
ific
ati
(g
en
era
lmen
te
un
cara
ttere
occu
pa u
n b
yte
).
•o
pera
zio
ni su
i cara
tteri
:so
no
po
ssib
ili tu
tte le o
pera
zio
ni d
efi
nit
e s
ug
li
inte
ri, ch
e a
gis
co
no
su
lle lo
ro c
od
ific
he.
Co
dif
ica u
sata
:
–d
ipen
de d
all’im
ple
men
tazio
ne;
–la
più
co
mu
ne è
qu
ella A
SC
II.
Lett
era
le c
ara
ttere
:
–cara
ttere
racch
iuso
fra
ap
ici;
–esem
pio
:
•Il lettera
le 'a
' ra
pp
resenta
il cara
ttere
a.
Cara
tteri
di co
ntr
ollo
:
–ra
pp
resen
tati
da c
om
bin
azio
ni sp
ecia
li c
he
iniz
ian
o c
on
un
a b
arr
a in
vert
ita (
seq
uen
ze d
i escap
e).
Alc
un
i esem
pi:
–n
uo
va r
iga (
LF
)\n
–ta
bu
lazio
ne o
rizzo
nta
le
\t
–ri
torn
o c
arr
ello
(C
R)
\r
–b
arr
a in
vert
ita
\\
–ap
ice
\'
–vir
go
lett
e
\"
130
3.6
Tip
o c
ara
ttere
(II
)
Ord
inam
en
to:
–tu
tte le c
od
ific
he r
isp
ett
an
o l'o
rdin
e a
lfab
eti
co
fr
a le lett
ere
, e l'o
rdin
e n
um
eri
co
fra
le c
ifre
;
–la
rela
zio
ne f
ra lett
ere
maiu
sco
le e
lett
ere
m
inu
sco
le, o
fra
cara
tteri
no
n a
lfab
eti
ci, n
on
è
pre
sta
bilit
a (
per
esem
pio
, in
AS
CII s
i h
a 'A
' <
'a
').
Cara
ttere
:
–p
uò
essere
scri
tto
usan
do
il su
o v
alo
re n
ella
co
dif
ica a
do
ttata
dall’im
ple
men
tazio
ne (
per
esem
pio
AS
CII).
Il valo
re p
uo
’ essere
esp
resso
in
decim
ale
, o
ttale
ed
esad
ecim
ale
.
Valo
ri o
ttali:
–fo
rmati
da c
ifre
ott
ali p
reced
ute
da u
na b
arr
a
invert
ita.
Valo
ri e
sad
ecim
ali:
–fo
rmati
da c
ifre
esad
ecim
ali p
reced
ute
da u
na
barr
a in
vert
ita e
dal cara
ttere
x (
no
n X
).
No
ta: –
le s
eq
uen
ze d
i escap
e e
le r
ap
pre
sen
tazio
ni
ott
ale
e e
sad
ecim
ale
di u
n c
ara
ttere
, q
uan
do
ra
pp
resen
tan
o u
n lett
era
le c
ara
ttere
, van
no
ra
cch
iuse f
ra a
pic
i;
–esem
pi:
–'\n
' '\1
5'
131

3.6
Tip
o c
ara
ttere
(II
I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>
usin
g n
am
esp
ace s
td;
int
main
(){
ch
ar
c1 =
'c', t
= '\t
', d
= '\n
';ch
ar
c2 =
'\x
63';
// 'c' (
in e
sadecim
ale
)ch
ar
c3 =
'\1
43';
// 'c' (
in o
ttale
)ch
ar
c4 =
99;
// 'c' (
in d
ecim
ale
)
co
ut
<<
c1 <
< t
<<
c2 <
< t
<<
c3 <
< t
<<
c4 <
< d
;
ch
ar
c5 =
c1 +
1;
// 'd'
ch
ar
c6 =
c1 -
2;
// 'a'
ch
ar
c7 =
4 *
d +
3;
// '+
' (!!!)
int
i =
c1 -
'a';
// 2
co
ut
<<
c5 <
< t
<<
c6 <
< t
<<
c7 <
< t
<<
i <
< d
;
bo
ol m
= 'a' <
'b
', n
= 'a' >
'c';
// m
= tru
e, n =
fals
e
co
ut
<<
m <
< '\n
' <
< n
<<
'\n
';syste
m("
PA
US
E");
retu
rn 0
;} c c
c
c
d a
+
2
1 0 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
132
3.7
Tip
i en
um
era
zio
ne (
I)
Tip
i en
um
era
zio
ne (
o e
nu
mera
ti):
–co
sti
tuit
i d
a in
sie
mi d
i co
sta
nti
in
tere
, d
efi
nit
e
dal p
rog
ram
mato
re, cia
scu
na in
div
idu
ata
da u
n
iden
tifi
cato
re e
dett
a e
nu
mera
tore
;
–u
tilizzati
per
vari
ab
ili
ch
e a
ssu
mo
no
so
lo u
n
nu
mero
lim
itato
di valo
ri;
–serv
on
o a
rap
pre
sen
tare
in
form
azio
ni n
on
nu
meri
ch
e;
–n
on
so
no
pre
defi
nit
i, m
a d
efi
nit
i d
al
pro
gra
mm
ato
re.
No
ta: –
è p
ossib
ile e
ffett
uare
sep
ara
tam
en
te la
dic
hia
razio
ne d
i u
n t
ipo
en
um
era
zio
ne e
la
defi
niz
ion
e d
i vari
ab
ili
di q
uel ti
po
.
Op
era
zio
ni:
–ti
pic
am
en
te, q
uelle d
i co
nfr
on
to;
–so
no
po
ssib
ili tu
tte le o
pera
zio
ni d
efi
nit
e s
ug
li
inte
ri, ch
e a
gis
co
no
su
lla c
od
ific
a d
eg
li
en
um
era
tori
.
133

3.7
Tip
i en
um
era
zio
ne (
II)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
en
um
Gio
rni {L
UN
,MA
R,M
ER
,GIO
,VE
N,S
AB
,DO
M};
Gio
rni o
gg
i =
MA
R;
og
gi =
ME
R;
int
i =
og
gi;
// 2
, convers
ione im
plic
ita
//o
gg
i =
ME
R-M
AR
; // E
RR
OR
E! M
ER
-MA
R->
inte
ro//
og
gi =
3;
// E
RR
OR
E! 3 c
osta
nte
inte
ra//
og
gi =
i;
// E
RR
OR
E! i e' u
n inte
ro
co
ut
<<
in
t(o
gg
i) <
< e
nd
l;// 2
co
ut
<<
og
gi <
< e
nd
l;// 2
, conv. im
plic
ita
en
um
{R
OS
SO
, G
IAL
LO
, V
ER
DE
} sem
afo
ro;
sem
afo
ro =
GIA
LL
O;
co
ut
<<
sem
afo
ro <
< e
nd
l;// 1
en
um
{IN
IZ1=
10, IN
IZ2, IN
IZ3=
9, IN
IZ4};
co
ut
<<
IN
IZ1 <
< '\t
' <
< IN
IZ2 <
< '\t
';co
ut
<<
IN
IZ3 <
< '\t
' <
< IN
IZ4 <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 2 2 1 10 11 9 1
0P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
134
3.8
.1 C
on
vers
ion
i im
pli
cit
e (
I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i =
10, j;
flo
at
f =
2.5
, h
;d
ou
ble
d =
1.2
e+
1;
ch
ar
c =
'd
';
h =
f +
1;
// 3
.5co
ut
<<
h <
< '\t
';
j =
f +
3.1
;// 5
co
ut
<<
j <
< e
nd
l;
d =
i +
1;
// 1
1co
ut
<<
d <
< '\t
';
d =
f +
d;
// 1
3.5
co
ut
<<
d <
< e
nd
l;
j =
c -
'a';
// 3
co
ut
<<
j <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;} 3.5
5
11 13.5
3 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
135

3.8
.1 C
on
vers
ion
i im
pli
cit
e (
II)
Osserv
azio
ne:
•n
ella c
on
vers
ion
e d
a d
ou
ble
a in
tsi p
uò
avere
un
a
perd
ita d
i in
form
azio
ne, p
oic
hé a
vvie
ne u
n
tro
ncam
en
to d
ella p
art
e d
ecim
ale
;
•in
alc
un
i casi, n
ella c
on
vers
ion
e d
a in
ta d
ou
ble
si
pu
ò v
eri
ficare
un
a p
erd
ita d
i p
recis
ion
e p
er
arr
oto
nd
am
en
to, p
oic
hé g
li in
teri
so
no
rap
pre
sen
tati
in f
orm
a e
satt
a e
d i r
eali s
on
o r
ap
pre
sen
tati
in
fo
rma
ap
pro
ssim
ata
.
•E
sem
pi:
–il r
eale
1588.5
co
nvert
ito
nell’in
tero
1588;
–l’in
tero
0X
7F
FF
FF
F0
(2147483632)
convert
ito n
el re
ale
0X
80000000
(2147483648)
Co
nvers
ion
i p
iù s
ign
ific
ati
ve p
er
gli o
pera
tori
bin
ari
(a
ritm
eti
ci)
:
–se u
n o
pera
tore
ha e
ntr
am
bi g
li o
pera
nd
i in
teri
o r
eali, m
a d
i lu
ng
hezza d
ivers
a,
qu
ello
di
lun
gh
ezza m
ino
re v
ien
e c
on
vert
ito
al ti
po
di
qu
ello
di lu
ng
hezza m
ag
gio
re;
–se u
n o
pera
tore
ha u
n o
pera
nd
o in
tero
ed
un
o
reale
, il v
alo
re d
ell’o
pera
nd
o in
tero
vie
ne
co
nvert
ito
nella r
ap
pre
sen
tazio
ne r
eale
, ed
il
risu
ltato
dell’o
pera
zio
ne è
un
reale
.
136
3.8
.1 C
on
vers
ion
i im
pli
cit
e (
III)
Co
nvers
ion
i p
iù s
ign
ific
ati
ve p
er
l’asseg
nam
en
to:
–a u
na v
ari
ab
ile d
i ti
po
reale
pu
ò e
ssere
asseg
nato
un
valo
re d
i ti
po
in
tero
;
–a u
na v
ari
ab
ile d
i ti
po
in
tero
pu
ò e
ssere
asseg
nato
un
valo
re d
i ti
po
reale
, d
i ti
po
bo
ole
an
o, d
i ti
po
cara
ttere
o d
i u
n t
ipo
en
um
era
zio
ne;
–a u
na v
ari
ab
ile d
i ti
po
cara
ttere
pu
ò e
ssere
asseg
nato
un
valo
re d
i ti
po
in
tero
, d
i ti
po
bo
ole
an
o, o
di u
n t
ipo
en
um
era
zio
ne.
No
ta: –
a u
na v
ari
ab
ile d
i ti
po
bo
ole
an
o o
di u
n t
ipo
en
um
era
zio
ne n
on
pu
ò e
ssere
asseg
nato
un
valo
re c
he n
on
sia
del su
o t
ipo
.
Co
nvers
ion
i im
plicit
e in
seq
uen
za:
–esem
pio
: a u
na v
ari
ab
ile d
i ti
po
reale
pu
ò
essere
asseg
nato
un
valo
re d
i ti
po
cara
ttere
(co
nvers
ion
e d
a c
ara
ttere
a in
tero
, q
uin
di d
a
inte
ro a
reale
).
137

3.8
.2 C
on
vers
ion
i esp
licit
e
Op
era
tore
sta
tic_
cast:
–eff
ett
ua u
na c
on
vers
ion
e d
i ti
po
qu
an
do
esis
te l
a
co
nvers
ion
e i
mp
licit
a i
nvers
a;
–p
uo
essere
usato
per
eff
ett
uare
co
nvers
ion
i d
i ti
po
p
revis
te d
alla c
on
vers
ion
e i
mp
licit
a.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
en
um
Gio
rni {L
UN
,MA
R,M
ER
,GIO
,VE
N,S
AB
,DO
M};
int
i; G
iorn
i g
1 =
MA
R, g
2, g
3;
i =
g1;
g1 =
sta
tic_
cast<
Gio
rni>
(i);
g2 =
(G
iorn
i) i;
// c
ast
g3 =
Gio
rni (i
);
// n
ota
zio
ne funzio
nale
co
ut
<<
g1 <
< '\t
' <
< g
2 <
< '\t
' <
< g
3 <
< e
nd
l;
int
j =
(in
t) 1
.1;
// c
ast, 1
flo
at
f =
flo
at(
2);
// n
ota
zio
ne funzio
nale
co
ut
<<
j <
< '\t
' <
< f
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} 1 1
1
1 2
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
138
3.9
Dic
hia
razio
ni
di
og
gett
i co
sta
nti
Og
gett
o c
osta
nte
:
–si u
sa la p
aro
la c
on
st
nella s
ua d
efi
niz
ion
e;
–è r
ich
iesto
sem
pre
un
in
izia
lizzato
re.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
co
nst
lon
g in
t i =
0;
co
nst
do
ub
le e
1 =
3.5
;co
nst
lon
g d
ou
ble
e2 =
2L
* e
1;
co
ut
<<
i <
< '\t
' <
< e
1 <
< '\t
' <
< e
2 <
< e
nd
l;
//i =
3;
// E
RR
OR
E!
//co
nst
int
j;// E
RR
OR
E!
syste
m("
PA
US
E");
retu
rn 0
;} 0 3
.5 7
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
139

3.1
0 O
pera
tore
siz
eo
f (I
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
co
ut
<<
"ch
ar
\t" <
< s
izeo
f(ch
ar)
<<
en
dl;
// 1
co
ut
<<
"sh
ort
\t"
<<
siz
eo
f(sh
ort
) <
< e
nd
l;// 2
co
ut
<<
"in
t \t
" <
< s
izeo
f(in
t) <
< e
nd
l;// 4
co
ut
<<
"lo
ng
\t"
<<
siz
eo
f(lo
ng
) <
< e
nd
l;// 4
co
ut
<<
"u
nsig
ned
ch
ar
\t";
co
ut
<<
siz
eo
f(u
nsig
ned
ch
ar)
<<
en
dl;
// 1
co
ut
<<
"u
nsig
ned
sh
ort
\t"
;co
ut
<<
siz
eo
f(u
nsig
ned
sh
ort
) <
< e
nd
l;// 2
co
ut
<<
"u
nsig
ned
in
t \t
";
co
ut
<<
siz
eo
f(u
nsig
ned
in
t) <
< e
nd
l;// 4
co
ut
<<
"u
nsig
ned
lo
ng
\t"
; co
ut
<<
siz
eo
f(u
nsig
ned
lo
ng
) <
< e
nd
l;// 4
co
ut
<<
"fl
oat
\t" <
< s
izeo
f(fl
oat)
<<
en
dl;
// 4
co
ut
<<
"d
ou
ble
\t"
;co
ut
<<
siz
eo
f(d
ou
ble
) <
< e
nd
l;// 8
co
ut
<<
"lo
ng
do
ub
le \t"
;co
ut
<<
siz
eo
f(lo
ng
do
ub
le)
<<
en
dl;
// 1
2
syste
m("
PA
US
E");
retu
rn 0
;}
140
3.1
0 O
pera
tore
siz
eo
f (I
I)
ch
ar
1
sh
ort
2
int
4lo
ng
4u
nsig
ned
ch
ar
1
un
sig
ned
sh
ort
2
un
sig
ned
in
t
4u
nsig
ned
lo
ng
4fl
oat
4
do
ub
le 8
lon
g d
ou
ble
12
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
141

3.1
0 O
pera
tore
siz
eo
f (I
II)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
co
ut
<<
"co
sta
nte
cara
ttere
";
co
ut
<<
siz
eo
f 'c
' <
< e
nd
l;// 1
co
ut
<<
"co
sta
nte
cara
ttere
";
co
ut
<<
siz
eo
f('c
') <
< e
nd
l;// 1
ch
ar
c =
0;
co
ut
<<
"vari
ab
ile c
ara
ttere
" <
< s
izeo
f c <
< e
nd
l; // 1
//co
ut
<<
"ch
ar
" <
< s
izeo
f ch
ar
<<
en
dl;
ER
RO
RE
!
syste
m("
PA
US
E");
retu
rn 0
;} co
sta
nte
cara
ttere
1co
sta
nte
cara
ttere
1vari
ab
ile c
ara
ttere
1P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
142
4.1
Str
utt
ura
di
un
pro
gra
mm
a
basic
-main
-pro
gra
m
int
main
()
co
mp
ou
nd
-sta
tem
en
t
co
mp
ou
nd
-sta
tem
en
t
{sta
tem
en
t-seq
}
sta
tem
en
t
decla
rati
on
-sta
tem
en
t
defi
nit
ion
-sta
tem
en
t
exp
ressio
n-s
tate
men
t
str
uctu
red
-sta
tem
en
t
jum
p-s
tate
men
t
lab
ele
d-s
tate
men
t
Istr
uzio
ni d
i d
ich
iara
zio
ne/d
efi
niz
ion
e:
decla
rati
on
-sta
tem
en
t
defi
nit
ion
-sta
tem
en
t
han
no
la f
orm
a v
ista
in
pre
ced
en
za.
Sim
bo
li in
tro
do
tti d
al p
rog
ram
mato
re:
•d
evo
no
essere
dic
hia
rati
/defi
nit
i p
rim
a d
i essere
u
sati
;•
no
n è
necessari
o c
he l
e d
ich
iara
zio
ni/
defi
niz
ion
i p
reced
an
o l
e a
ltre
istr
uzio
ni.
143

4.2
Esp
ressio
ni
di
asseg
nam
en
to (
I)
Sin
tassi:
exp
ressio
n-s
tate
men
t
exp
ressio
n|o
pt
;
Esp
ressio
ne:
–fo
rmata
da lett
era
li, id
en
tifi
cato
ri, o
pera
tori
, ecc.,
e s
erv
e a
calc
ola
re u
n v
alo
re;
–o
pzio
nale
, p
erc
hé in
cert
i casi p
uò
essere
u
tile
u
sare
un
a istr
uzio
ne v
uo
ta (
ch
e n
on
co
mp
ie
alc
un
a o
pera
zio
ne)
ind
ican
do
il so
lo c
ara
ttere
‘;
’ .
Esp
ressio
ne c
om
un
e:
–asseg
nam
en
to (
nu
ovo
valo
re a
un
a v
ari
ab
ile);
–sin
tassi:
basic
-assig
nm
en
t-exp
ressio
n
vari
ab
le-n
am
e=
exp
ressio
n
Eff
ett
o:
–calc
ola
re il valo
re d
ell’e
sp
ressio
ne a
destr
a
dell’o
pera
tore
di asseg
nam
en
to (
‘=
‘);
–so
sti
tuir
lo a
l valo
re d
ella v
ari
ab
ile.
No
me a
sin
istr
a d
ell’o
pera
tore
di asseg
nam
en
to:
–in
div
idu
a u
na v
ari
ab
ile,
ossia
un
lvalu
e(l
eft
valu
e).
Esp
ressio
ne a
destr
a d
ell’o
pera
tore
di asseg
nam
en
to :
–ra
pp
resen
ta u
n v
alo
re,
ossia
un
rvalu
e(r
igh
t valu
e).
144
4.2
Esp
ressio
ni
di
asseg
nam
en
to (
II)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i =
0, j
= 1
, k;
i =
3;
co
ut
<<
i <
< e
nd
l;
// 3
j =
i;
co
ut
<<
j <
< e
nd
l;// 3
k =
j =
i =
5;
// a
ssocia
tivo a
destr
aco
ut
<<
i <
< '\t
' <
< j <
< '\t
' <
< k
<<
en
dl;
// 5
5 5
k =
j =
2 *
(i =
3);
co
ut
<<
i <
< '\t
' <
< j <
< '\t
' <
< k
<<
en
dl;
// 3
6 6
//k =
j +
1 =
2 *
(i =
100);
// E
RR
OR
E!
(j =
i)
= 1
0;
co
ut
<<
j <
< e
nd
l; // 10 (
restitu
isce u
n l-v
alu
e)
syste
m("
PA
US
E");
retu
rn 0
;} 3 3 5 5
5
3 6
6
10
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
145

4.2
.1 A
ltri
op
era
tori
di
asseg
nam
en
to
basic
-recu
rren
ce-a
ssig
nm
en
tvari
ab
le-n
am
e =
vari
ab
le-n
am
e ⊕
exp
ressio
n
basic
-co
mp
ou
nd
-as
sig
nm
en
tvari
ab
le-n
am
e ⊕
= e
xp
ressio
n
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i =
0, j
= 5
;
i +
= 5
;// i =
i +
5co
ut
<<
i <
< e
nd
l;// 5
i *=
j +
1;
// i =
i *
(j +
1);
co
ut
<<
i <
< e
nd
l;// 3
0
i -
= j -
= 1
;// a
ssocia
tivo a
destr
a;
co
ut
<<
i <
< e
nd
l;// 2
6
(i +
= 1
2)
= 2
;co
ut
<<
i <
< e
nd
l; // re
stitu
isce u
n l-v
alu
e
syste
m("
PA
US
E");
retu
rn 0
;} 5 30
26
2 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
146
4.2
.2 In
cre
men
to e
decre
men
to
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i, j;
i =
0;
j =
0;
++
i; -
-j;
// i +
= 1
; j -=
1;
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// 1
-1
i =
0;
j =
++
i;// i +
= 1
; j =
i;
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// 1
1
i =
0;
i++
;co
ut
<<
i <
< e
nd
l;// 1
i =
0;
j =
i+
+;
// j =
i; i +
= 1
;co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// 1
0
//j
= +
+i+
+;
// E
RR
OR
E!
j =
(+
+i)
++
;//
j
= i+
++
+;
// E
RR
OR
E!
int
k =
++
++
i;co
ut
<<
i <
< '\t
' <
< j <
< '\t
' <
< k
<<
en
dl;
// 5
2 5
syste
m("
PA
US
E");
retu
rn 0
;}
147

4.3
Esp
ressio
ni
ari
tmeti
ch
e e
lo
gic
he (
I)
Calc
olo
delle e
sp
ressio
ni:
–ven
go
no
ris
pett
ate
le p
reced
en
ze e
le
asso
cia
tivit
à d
eg
li o
pera
tori
ch
e v
i co
mp
aio
no
;
Pre
ced
en
za:
–p
er
pri
mi ven
go
no
valu
tati
i f
att
ori
, calc
ola
nd
o i
valo
ri d
elle f
un
zio
ni e a
pp
lican
do
gli o
pera
tori
un
ari
(p
rim
a in
cre
men
to e
decre
men
to
po
stf
issi, p
oi in
cre
men
to e
decre
men
to
pre
fissi, N
OT
lo
gic
o (
! )
, m
en
o u
nari
o (
-)
e p
iù
un
ari
o (
+))
;
–p
oi ven
go
no
valu
tati
i t
erm
ini, a
pp
lican
do
gli
op
era
tori
bin
ari
nel seg
uen
te o
rdin
e:
•q
uelli m
olt
iplicati
vi
( *,
/
, %
);
•q
uelli ad
dit
ivi
( +
, -
);
•q
uelli d
i re
lazio
ne (
<, K
);
•q
uelli d
i u
gu
ag
lian
za (
==
, !=
)
•q
uelli lo
gic
i (n
ell’o
rdin
e, &
&, || )
;
•q
uelli d
i asseg
nam
en
to (
= , K
);
Pare
nte
si to
nd
e (
co
pp
ia d
i sep
ara
tori
):
–fa
nn
o d
iven
tare
qu
alu
nq
ue e
sp
ressio
ne u
n
fatt
ore
, ch
e v
ien
e q
uin
di calc
ola
to p
er
pri
mo
.
148
4.3
Esp
ressio
ni
ari
tmeti
ch
e e
lo
gic
he (
II)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i =
2, j;
j =
3 *
i +
1;
co
ut
<<
j <
< e
nd
l;// 7
j =
3 *
(i +
1);
co
ut
<<
j <
< e
nd
l;// 9
syste
m("
PA
US
E");
retu
rn 0
;} 7 9 P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
149

4.3
Esp
ressio
ni
ari
tmeti
ch
e e
lo
gic
he (
III)
Asso
cia
tivit
à:
•g
li o
pera
tori
ari
tmeti
ci b
inari
so
no
asso
cia
tivi
a
sin
istr
a;
•g
li o
pera
tori
un
ari
so
no
asso
cia
tivi
a d
estr
a;
•g
li o
pera
tori
di asseg
nam
en
to s
on
o a
sso
cia
tivi
a
destr
a.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i =
8, j
= 4
, z;
z =
i / j / 2
;co
ut
<<
z <
< e
nd
l;// 1
z =
i / j *
2;
co
ut
<<
z <
< e
nd
l;// 4
z =
i / (
j *
2 )
;co
ut
<<
z <
< e
nd
l;// 1
z =
j *
2 / i;
co
ut
<<
z <
< e
nd
l;// 1
syste
m("
PA
US
E");
retu
rn 0
;} 1 4 1 1 P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
150
4.3
Esp
ressio
ni
ari
tmeti
ch
e e
lo
gic
he (
IV)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
bo
ol k;
int
i =
0, j
= 5
;k =
i >
= 0
&&
j <
= 1
;// (
i >
= 0
) &
& (
j <
= 1
)co
ut
<<
k <
< e
nd
l;// 0
k =
i &
& j || !k
;
// (
i &
& j)
|| (
!k)
co
ut
<<
k <
< e
nd
l;// 1
k =
0 <
j <
4;
// A
TT
EN
ZIO
NE
!co
ut
<<
k <
< e
nd
l;// 1
k =
0 <
j &
& j <
4;
co
ut
<<
k <
< e
nd
l;// 0
syste
m("
PA
US
E");
retu
rn 0
;} 0 1 1 0 P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
151

4.3
Esp
ressio
ni
ari
tmeti
ch
e e
lo
gic
he (
V)
Op
era
tori
&&
e ||:
•so
no
asso
cia
tivi
a s
inis
tra;
•il c
alc
olo
di u
n'e
sp
ressio
ne lo
gic
a c
on
ten
en
te q
uesti
o
pera
tori
term
ina a
pp
en
a s
i p
uò
decid
ere
se
l'esp
ressio
ne è
, ri
sp
ett
ivam
en
te,
fals
a o
vera
.
// C
ort
ocir
cu
ito
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
bo
ol k;
int
i =
0;
k =
(i >
= 0
) || (
i++
);co
ut
<<
k <
< '\t
' <
< i <
< e
nd
l;// 1
0
k =
(i >
0)
|| (
i++
);co
ut
<<
k <
< '\t
' <
< i <
< e
nd
l;
// 0
1
k =
(i >
= 0
) &
& (
i <
= 1
00);
co
ut
<<
k <
< e
nd
l;// 1
k =
(i !=
0)
&&
(10 / i >
= 1
0);
// O
Kco
ut
<<
k <
< e
nd
l;k =
(10 / i >
= 1
0)
&&
( i !
= 0
);// N
O!
co
ut
<<
k <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;}
152
4.4
Op
era
tore
co
nd
izio
nale
(I)
e1 ?
e2
: e3
e1
esp
ressio
ne lo
gic
aS
e e
1 è
vera
, il v
alo
re r
esti
tuit
o d
all’o
pera
tore
co
nd
izio
nale
è il valo
re d
i e2, alt
rim
en
ti d
ie3.
// L
eg
ge d
ue in
teri
e s
tam
pa s
u u
scit
a s
tan
dard
il m
ino
re
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i, j, m
in;
co
ut
<<
"In
seri
sci d
ue n
um
eri
in
teri
" <
< e
nd
l;
cin
>>
i >
> j;
// 2
4
min
= (
i <
j ?
i :
j);
co
ut
<<
"Il n
um
ero
min
ore
e':
" <
< m
in <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci d
ue n
um
eri
in
teri
2 4 Il n
um
ero
min
ore
e':
2P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
153

4.4
Op
era
tore
co
nd
izio
nale
(II
)
// L
eg
ge t
re in
teri
ed
in
cre
men
ta il m
ino
re
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i, j, z, m
in;
co
ut
<<
"In
seri
sci tr
e n
um
eri
in
teri
" <
< e
nd
l;cin
>>
i >
> j >
> z
;
// 2
3 4
min
= i <
j ?
(i<
z ?
i+
+ :
z+
+)
: (j
< z
? j+
+ :
z+
+);
co
ut
<<
"Il n
um
ero
min
ore
e':
" <
< m
in <
< e
nd
l;co
ut
<<
i <
< '\t
' <
< j <
< '\t
' <
< z
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci tr
e n
um
eri
in
teri
2 3 4 Il n
um
ero
min
ore
e':
23 3
4
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
154
6. Is
tru
zio
ni
str
utt
ura
te
Istr
uzio
ni str
utt
ura
te:
–co
nsen
ton
o d
i sp
ecif
icare
azio
ni co
mp
lesse.
str
uctu
red
-sta
tem
en
t
co
mp
ou
nd
-sta
tem
en
t
sele
cti
on
-sta
tem
en
t
itera
tio
n-s
tate
men
t
Istr
uzio
ne c
om
po
sta
:
–g
ià e
sam
inata
nella s
inta
ssi d
i p
rog
ram
ma;
–co
nsen
te, p
er
mezzo
della c
op
pia
di
delim
itato
ri {
e }
, d
i tr
asfo
rmare
un
a
qu
alu
nq
ue s
eq
uen
za d
i is
tru
zio
ni in
un
a
sin
go
la istr
uzio
ne.
–o
vu
nq
ue l
a s
inta
ssi p
reved
a u
n'istr
uzio
ne, si
pu
ò m
ett
ere
un
a s
eq
uen
za c
om
un
qu
e
co
mp
lessa d
i is
tru
zio
ni ra
cch
iusa t
ra i d
ue
delim
itato
ri.
Istr
uzio
ni co
nd
izio
nali:
sele
cti
on
-sta
tem
en
t
if-s
tate
men
t
sw
itch
-sta
tem
en
t
if-s
tate
men
t
if (
co
nd
itio
n )
sta
tem
en
t
if (
co
nd
itio
n )
sta
tem
en
t e
lse
sta
tem
en
t 155

6.3
.1 Istr
uzio
ne i
f (I
)
// T
rova i
l m
ag
gio
re t
ra d
ue in
teri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
a, b
, m
ax;
cin
>>
a >
> b
;// 4
6if
(a >
b)
max =
a;
els
e max =
b;
co
ut
<<
max <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;} 4 6 6 P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
156
6.3
.1 Istr
uzio
ne i
f (I
I)
// In
cre
men
ta o
decre
men
ta
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
a, b
;cin
>>
a >
> b
;if
(a >
= b
) {
a+
+;
b+
+;
} els
e
{a--
; b
--;
} co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} 4 6 3 5
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
157

6.3
.1 Istr
uzio
ne i
f (I
II)
// V
alo
re a
sso
luto
(if
sen
za p
art
e e
lse)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
a;
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
a;
if (
a <
0)
a =
-a;
co
ut
<<
"Il v
alo
re a
sso
luto
e' ";
co
ut
<<
a <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
-4 Il v
alo
re a
sso
luto
e' 4
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
158
6.3
.1 Istr
uzio
ne i
f (I
V)
// L
eg
ge u
n n
um
ero
, in
cre
men
ta il n
um
ero
e//
lo
scri
ve s
e è
div
ers
o d
a 0
// (
if s
en
za e
sp
ressio
ne r
ela
zio
nale
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
i;
if (
i++
) co
ut
<<
"N
um
ero
in
cre
men
tato
" <
< i <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
2 Nu
mero
in
cre
men
tato
3P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
Inseri
sci u
n n
um
ero
in
tero
0 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
N.B
.: L
’esp
ressio
ne n
ella c
on
diz
ion
e p
uò
resti
tuir
e u
n
valo
re a
ritm
eti
co
: se il valo
re è
0, la
co
nd
izio
ne è
fa
lsa;
alt
rim
en
ti è
vera
.
159

6.3
.1 Istr
uzio
ne i
f (V
)
// If
in c
ascata
// if
(a >
0 )
if
( b
> 0
) a
++
; els
e b
++
;
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
a, b
;co
ut
<<
"In
seri
sci d
ue n
um
eri
in
teri
" <
< e
nd
l;cin
>>
a >
> b
;if
(a >
0)
if (
b >
0)
a+
+;
els
e b+
+;
co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci d
ue n
um
eri
in
teri
3 5 4 5
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
NO
TA
BE
NE
la p
art
e e
lse
si ri
feri
sce a
lla c
on
diz
ion
e p
iù
vic
ina (
nell’e
sem
pio
, alla c
on
diz
ion
e b
> 0
); 160
6.3
.1 Istr
uzio
ne i
f (V
I)
// S
cri
ttu
ra f
uo
rvia
nte
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
a, b
;co
ut
<<
"In
seri
sci d
ue n
um
eri
in
teri
" <
< e
nd
l;cin
>>
a >
> b
;if
(a >
0)
if (
b >
0)
a+
+;
els
e b+
+;
co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci d
ue n
um
eri
in
teri
5 7 6 7
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
161

6.3
.1 Istr
uzio
ni
if (
VII
)
// S
cri
ve a
ste
risch
i
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
i;
if (
i =
= 1
)co
ut
<<
'*'
;els
e if (
i =
= 2
)co
ut
<<
"**
";
els
e if (
i =
= 3
)co
ut
<<
"**
*";
els
e co
ut
<<
'!'
;co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti a
ste
risch
i?2 ** P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
162
6.3
.1 Istr
uzio
ne i
f (V
III)
// E
qu
azio
ne d
i seco
nd
o g
rad
o#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>#in
clu
de <
cm
ath
>u
sin
g n
am
esp
ace s
td;
int
main
(){
do
ub
le a
, b
, c;
co
ut
<<
"C
oeff
icie
nti
? "
<<
en
dl;
cin
>>
a >
> b
>>
c;
if (
(a =
= 0
) &
& (
b =
= 0
))co
ut
<<
"E
qu
azio
ne d
eg
en
ere
" <
< e
nd
l;els
e if (
a =
= 0
) {
co
ut
<<
"E
qu
azio
ne d
i p
rim
o g
rad
o" <
< e
nd
l;co
ut
<<
"x:
" <
< -
c / b
<<
en
dl;
} els
e
{d
ou
ble
delt
a =
b *
b -
4 *
a *
c;
if (
delt
a <
0)
co
ut
<<
"S
olu
zio
ni im
mag
inari
e" <
< e
nd
l;els
e
{d
elt
a =
sq
rt(d
elt
a);
co
ut
<<
"x1:
" <
< (
-b +
delt
a)
/ (2
* a
) <
< e
nd
l;co
ut
<<
"x2:
" <
< (
-b -
delt
a)
/ (2
* a
) <
< e
nd
l;}
}
syste
m("
PA
US
E");
retu
rn 0
;}
163

6.3
.1 Istr
uzio
ne i
f (I
X)
Co
eff
icie
nti
?1 6 9 x1:
-3x2:
-3P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
164
6.3
.2 Istr
uzio
ni
sw
itch
e b
reak (
I)
Sin
tassi:
sw
itch
-sta
tem
en
t
sw
itch
(co
nd
itio
n)
sw
itch
-bo
dy
sw
itch
-bo
dy
{ a
ltern
ati
ve-s
eq
}
alt
ern
ati
ve
case-l
ab
el-
seq
sta
tem
en
t-seq
case-l
ab
el
case
co
nsta
nt-
exp
ressio
n:
defa
ult :
Co
nd
izio
ne:
–co
mu
nem
en
te c
osti
tuit
a d
a u
n’e
sp
ressio
ne,
ch
e p
rod
uce u
n r
isu
ltato
di ti
po
dis
cre
to;
Eti
ch
ett
e (
case-l
ab
el)
:
–co
nte
ng
on
o (
olt
re a
lla p
aro
la c
hia
ve c
ase)
esp
ressio
ni co
sta
nti
il cu
i valo
re d
eve e
ssere
del ti
po
del ri
su
ltato
dell’e
sp
ressio
ne;
–in
div
idu
an
o l
e v
ari
e a
ltern
ati
ve n
el co
rpo
dell’istr
uzio
ne s
wit
ch
;
–i valo
ri d
elle e
sp
ressio
ni co
sta
nti
devo
no
essere
dis
tin
ti.
Alt
ern
ati
va c
on
eti
ch
ett
a d
efa
ult
:
–se p
resen
te, d
eve e
ssere
un
ica.
165

6.3
.2 Istr
uzio
ni
sw
itch
e b
reak (
II)
Esecu
zio
ne d
ell’istr
uzio
ne s
wit
ch
:
–vie
ne v
alu
tata
l’e
sp
ressio
ne;
–vie
ne e
seg
uit
a l'a
ltern
ati
va c
on
l’e
tich
ett
a in
cu
i
co
mp
are
il valo
re c
alc
ola
to (
og
ni alt
ern
ati
va
pu
ò e
ssere
in
div
idu
ata
da p
iù e
tich
ett
e);
–se n
essu
na a
ltern
ati
va h
a u
n'e
tich
ett
a in
cu
i
co
mp
are
il valo
re c
alc
ola
to, allo
ra v
ien
e
eseg
uit
a, se e
sis
te, l’alt
ern
ati
va c
on
eti
ch
ett
a
defa
ult
;
•in
mancanza d
i etichetta d
efa
ult
l'esecuzio
ne
dell’
istr
uzio
ne s
witch
term
ina.
Alt
ern
ati
va:
–fo
rmata
da u
na o
più
istr
uzio
ni (e
ven
tualm
en
te
vu
ote
o s
tru
ttu
rate
).
Term
inazio
ne:
–p
uò
essere
ott
en
uta
co
n l’istr
uzio
ne b
reak
(rie
ntr
a n
ella c
ate
go
ria d
elle istr
uzio
ni d
i salt
o):
bre
ak-s
tate
men
t
bre
ak ;
Att
en
zio
ne:
•S
e l
’ult
ima istr
uzio
ne d
i u
n’a
ltern
ati
va n
on
fa
term
inare
l’i
str
uzio
ne s
wit
ch
, e s
e l
’alt
ern
ati
va
no
n e
’ l’
ult
ima, vie
ne e
seg
uit
a l
’alt
ern
ati
va
su
ccessiv
a.
166
6.3
.2 Istr
uzio
ni
sw
itch
e b
reak (
III)
// S
cri
ve a
ste
risch
i (u
so
istr
uzio
ne b
reak)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
i;
sw
itch
(i)
{
case 1
:co
ut
<<
'*'
;b
reak;
case 2
:co
ut
<<
"**
";
bre
ak;
case 3
:co
ut
<<
"**
*";
bre
ak;
defa
ult
:co
ut
<<
'!'
;} co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti a
ste
risch
i?2 ** P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
167

6.3
.2 Istr
uzio
ni
sw
itch
e b
reak (
IV)
// S
cri
ve a
ste
risch
i (i
n c
ascata
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
i;
sw
itch
(i)
{
case 3
:// in c
ascata
co
ut
<<
'*'
;case 2
:// in c
ascata
co
ut
<<
'*'
;case 1
:co
ut
<<
'*'
;b
reak;
defa
ult
:co
ut
<<
'!'
;} co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti a
ste
risch
i?2 ** P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
168
6.3
.2 Istr
uzio
ni
sw
itch
e b
reak (
V)
// C
reazio
ne m
en
ù//
Sele
zio
ne t
ram
ite c
ara
tteri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
co
ut
<<
"S
ele
zio
na u
n'a
ltern
ati
va" <
< e
nd
l;co
ut
<<
"A
-P
rim
a A
ltern
ati
va" <
< e
nd
l;co
ut
<<
"B
-S
eco
nd
a A
ltern
ati
va" <
< e
nd
l;co
ut
<<
"C
-T
erz
a A
ltern
ati
va" <
< e
nd
l;co
ut
<<
"Q
uals
iasi alt
ro t
asto
per
uscir
e" <
< e
nd
l;ch
ar
c;
cin
>>
c;
sw
itch
(c)
{case 'a':
case 'A
':
co
ut
<<
"P
rim
a a
ltern
ati
va" <
< e
nd
l;
bre
ak;
case 'b
': c
ase 'B
':
co
ut
<<
"S
eco
nd
a a
ltern
ati
va" <
< e
nd
l;b
reak;
case 'c':
case 'C
':
co
ut
<<
"T
erz
a a
ltern
ati
va" <
< e
nd
l;
// M
anca il caso d
i defa
ult
// S
e n
on è
una d
elle
altern
ative, non s
crive n
iente
}
syste
m("
PA
US
E");
retu
rn 0
;}
169

6.3
.2 Istr
uzio
ni
sw
itch
e b
reak (
VI)
// C
reazio
ne m
en
ù//
Sele
zio
ne t
ram
ite c
ara
tteri
Sele
zio
na u
n'a
ltern
ati
va
A -
Pri
ma A
ltern
ati
va
B -
Seco
nd
a A
ltern
ati
va
C -
Terz
a A
ltern
ati
va
Qu
als
iasi alt
ro t
asto
per
uscir
eB S
eco
nd
a a
ltern
ati
va
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
170
6.3
.2 Istr
uzio
ni
sw
itch
e b
reak (
VII
)
// S
cri
ttu
ra d
i en
um
era
zio
ni
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
en
um
{R
OS
SO
, G
IAL
LO
, V
ER
DE
} co
lore
;ch
ar
c;
co
ut
<<
"S
ele
zio
na u
n c
olo
re "
<<
en
dl;
co
ut
<<
"R
-ro
sso
" <
< e
nd
l;co
ut
<<
"G
-g
iallo
" <
< e
nd
l;co
ut
<<
"V
-verd
e "
<<
en
dl;
cin
>>
c;
sw
itch
(c)
{case 'r'
: case 'R
':
co
lore
= R
OS
SO
;b
reak;
case 'g
': c
ase 'G
':
co
lore
= G
IAL
LO
;b
reak;
case 'v':
case 'V
':
co
lore
= V
ER
DE
;} /*
... *
/
171

6.3
.2 Istr
uzio
ni
sw
itch
e b
reak (
VII
I)
// S
cri
ttu
ra d
i en
um
era
zio
ni (c
on
tin
ua)
sw
itch
(co
lore
) {
case R
OS
SO
: co
ut
<<
"R
OS
SO
";
bre
ak;
case G
IAL
LO
: co
ut
<<
"G
IAL
LO
";
bre
ak;
case V
ER
DE
: co
ut
<<
"V
ER
DE
";
} co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} S
ele
zio
na u
n c
olo
reR
-ro
sso
G -
gia
llo
V -
verd
ev V
ER
DE
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
172
6.4
.1 Istr
uzio
ne r
ipeti
tive
Sin
tassi:
itera
tio
n-s
tate
men
t
wh
ile-s
tate
men
t
do
-sta
tem
en
t
for-
sta
tem
en
t
wh
ile-s
tate
men
t
while
(
c
on
dit
ion
)
sta
tem
en
t
// S
cri
ve n
aste
risch
i, c
on
n d
ato
(i)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
n, i =
0;
co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
n;
wh
ile (
i <
n)
{co
ut
<<
'*'
; i+
+;
}// n
conserv
a il valo
re iniz
iale
co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti a
ste
risch
i?6 **
****
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
173

6.4
.1 Istr
uzio
ne w
hil
e (
I)
// S
cri
ve n
aste
risch
i, c
on
n d
ato
(ii)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
n;
co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
n;
wh
ile (
n >
0)
{co
ut
<<
'*'
; n
--;
}// a
l te
rmin
e, n v
ale
0co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti a
ste
risch
i?6 **
****
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
174
6.4
.1 Istr
uzio
ne w
hil
e (
II)
// S
cri
ve n
aste
risch
i, c
on
n d
ato
(iii)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
n;
co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
n;
wh
ile (
n--
> 0
) co
ut
<<
'*'
;// a
l te
rmin
e, n v
ale
-1
co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} //~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~//
// S
cri
ve n
aste
risch
i, c
on
n d
ato
(iv
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
n;
co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
n;
wh
ile (
n--
) // n
on term
ina s
e n
< 0
co
ut
<<
'*';
co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;}
175

6.4
.1 Istr
uzio
ne w
hil
e (
III)
// L
eg
ge, ra
dd
op
pia
e s
cri
ve i
nte
ri n
on
neg
ati
vi
// T
erm
ina a
l p
rim
o n
eg
ati
vo
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
i;
wh
ile (
i >
= 0
) {
co
ut
<<
2 *
i <
< e
nd
l;co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
i;
} syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
1 2 Inseri
sci u
n n
um
ero
in
tero
3 6 Inseri
sci u
n n
um
ero
in
tero
-2 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
176
6.4
.1 Istr
uzio
ne w
hil
e (
IV)
// C
alc
ola
il m
assim
o m
tale
ch
e la s
om
ma d
ei p
rim
i//
m in
teri
po
sit
ivi
e`
min
ore
o u
gu
ale
ad
un
dato
in
tero
//
po
sit
ivo
n
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
un
sig
ned
in
t so
mm
a =
0, m
= 0
, n
;co
ut
<<
"In
seri
sci n
" <
< e
nd
l;cin
>>
n;
wh
ile (
so
mm
a <
= n
)so
mm
a +
= +
+m
;m
--;
co
ut
<<
m <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci n
8 3 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
177

6.4
.1 Istr
uzio
ne w
hil
e (
V)
// C
alc
ola
il m
assim
o t
erm
ine d
ella s
uccessio
ne d
i //
Fib
on
acci m
ino
re o
ug
uale
al d
ato
in
tero
po
sit
ivo
n//
Seri
e d
i F
ibo
nacci:
Cu
rio
sit
à:
da d
ove n
asce la s
eri
e d
i F
ibo
nacci?
Su
pp
on
iam
o d
i avere
un
a c
op
pia
di co
nig
li (
masch
io e
fem
min
a).
I c
on
igli s
on
o in
gra
do
di ri
pro
du
rsiall'e
tà d
i
un
mese. S
up
po
nia
mo
ch
e i n
ostr
i co
nig
lin
on
mu
oia
no
mai e c
he la f
em
min
a p
rod
uca s
em
pre
un
a n
uo
va
co
pp
ia (
un
masch
io e
d u
na f
em
min
a)
og
ni m
ese d
al
seco
nd
o m
ese in
po
i. Il p
rob
lem
a p
osto
da F
ibo
nacci fu
:
qu
an
te c
op
pie
ci sara
nn
o d
op
o u
n a
nn
o?
Il n
um
ero
delle c
op
pie
di co
nig
li a
ll'in
izio
di cia
scu
n
mese s
arà
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
178
6.4
.1 Istr
uzio
ne w
hil
e (
V)
// C
alc
ola
il m
assim
o t
erm
ine d
ella s
uccessio
ne d
i //
Fib
on
acci m
ino
re o
ug
uale
al d
ato
in
tero
po
sit
ivo
n//
Seri
e d
i F
ibo
nacci:
//a
n =
an
-1 +
an
-2
//a
1 =
1
//a
0 =
0
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i =
0, j
= 1
, s, n
;
// i =
a0, j =
a1, s =
a2
co
ut
<<
"In
seri
sci n
" <
< e
nd
l;cin
>>
n;
if (
n<
=0)
co
ut
<<
"V
alo
re n
on
co
nsis
ten
te" <
< e
nd
l;els
e{
wh
ile (
(s =
j +
i)
<=
n)
{i =
j;
j =
s;
} co
ut
<<
j <
< e
nd
l;} s
yste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci n
7 5 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
179

6.4
.1 Istr
uzio
ne w
hil
e (
V)
// C
alc
ola
il m
assim
o t
erm
ine d
ella s
uccessio
ne d
i //
Fib
on
acci m
ino
re o
ug
uale
al d
ato
in
tero
po
sit
ivo
n//
Seri
e d
i F
ibo
nacci:
//S
olu
zio
ne c
on
du
e v
ari
ab
ili
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i =
0, j
= 1
,n;
// i =
a0, j =
a1
co
ut
<<
"In
seri
sci n
" <
< e
nd
l;cin
>>
n;
if (
n<
=0)
co
ut
<<
"V
alo
re n
on
co
nsis
ten
te" <
< e
nd
l;els
e{
wh
ile (
((i =
j+
i)<
= n
)&&
((j
= j+
i)<
=n
));
if (
j<i)
co
ut
<<
j <
< e
nd
l;els
e c
ou
t <
< i <
< e
nd
l;} s
yste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci n
7 5 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
180
6.4
.2 Istr
uzio
ne d
o (
I)
do
-sta
tem
en
t
do
sta
tem
en
tw
hile
( exp
ressio
n)
;
Esecu
zio
ne d
ell’istr
uzio
ne d
o:
–vie
ne e
seg
uit
a l'istr
uzio
ne r
acch
iusa t
ra d
oe
wh
ile
(co
rpo
del d
o);
–vie
ne v
alu
tata
l'e
sp
ressio
ne;
–se q
uesta
ris
ult
a v
era
l'istr
uzio
ne d
ovie
ne
rip
etu
ta;
–se q
uesta
ris
ult
a f
als
a l'istr
uzio
ne d
ote
rmin
a.
No
ta: –
il c
orp
o d
ell’istr
uzio
ne d
ovie
ne e
seg
uit
o
alm
en
o u
na v
olt
a,
pri
ma d
ella v
alu
tazio
ne d
ella
co
nd
izio
ne d
i te
rmin
azio
ne.
181

6.4
.2 Istr
uzio
ne d
o (
II)
// C
alc
ola
il m
assim
o t
erm
ine d
ella s
uccessio
ne d
i //
Fib
on
acci m
ino
re o
ug
uale
al d
ato
in
tero
po
sit
ivo
n
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i, j =
0, s =
1, n
;co
ut
<<
"In
seri
sci n
" <
< e
nd
l;cin
>>
n;
if (
n<
=0)
co
ut
<<
"V
alo
re n
on
co
nsis
ten
te" <
< e
nd
l;els
e{
do
{
i =
j;
j =
s;
} w
hile (
(s =
j +
i)
<=
n);
co
ut
<<
j <
< e
nd
l;} syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci n
7 5 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
182
6.4
.3 Istr
uzio
ne f
or
(I)
for-
sta
tem
en
tfo
r (
init
ializati
on
co
nd
itio
n-s
pecif
icati
on
ste
p)
sta
tem
en
t
init
ializati
on
exp
ressio
n-s
tate
men
td
efi
nit
ion
-sta
tem
en
t
co
nd
itio
n-s
pecif
icati
on
exp
ressio
n|o
pt
;
ste
pexp
ressio
n|o
pt
Istr
uzio
ne
for:
–vie
ne e
seg
uit
a c
om
e s
e f
osse s
cri
tta n
el
seg
uen
te m
od
o:
{in
izia
lizzazio
ne
wh
ile (
esp
ressio
ne c
on
diz
ion
ale
)
{// c
orp
o d
el fo
r
istr
uzio
ne
passo
;
}
}
183

6.4
.3 Istr
uzio
ne f
or
(II)
// S
cri
ve n
aste
risch
i, c
on
n d
ato
(i)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
n;
co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
n;
for
(in
t i =
0;
i <
n;
i++
) co
ut
<<
'*'
;// a
l te
rmin
e, i vale
nco
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti a
ste
risch
i?6 **
****
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
184
6.4
.3 Istr
uzio
ne f
or
(III
)
// S
cri
ve n
aste
risch
i, c
on
n d
ato
(ii)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
n;
co
ut
<<
"Q
uan
ti a
ste
risch
i? "
<<
en
dl;
cin
>>
n;
for
(; n
> 0
; n
--)
co
ut
<<
'*'
;// a
l te
rmin
e, n v
ale
0co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti a
ste
risch
i?6 **
****
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
185

6.4
.3 Istr
uzio
ne f
or
(IV
)
// S
cri
ve a
ste
risch
i e p
un
ti e
scla
mati
vi
(I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
n;
co
ut
<<
"Q
uan
ti?
" <
< e
nd
l;cin
>>
n;
for
(in
t i =
0;
i <
n;
i++
)co
ut
<<
'*'
;co
ut
<<
en
dl;
for
(in
t i =
0;
i <
n;
i++
) // v
isib
ilita
’ i lim
itata
co
ut
<<
'!'
; // b
locco for
co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti?
6 ****
**!!
!!!!
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
186
6.4
.3 Istr
uzio
ne f
or
(V)
// S
cri
ve a
ste
risch
i e p
un
ti e
scla
mati
vi
(II)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
n,i;
co
ut
<<
"Q
uan
ti?
" <
< e
nd
l;cin
>>
n;
for
(i =
0;
i <
n;
i++
)co
ut
<<
'*'
;co
ut
<<
en
dl;
for
(i =
0;
i <
n;
i++
) co
ut
<<
'!'
; co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} Q
uan
ti?
6 ****
**!!
!!!!
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
187

6.4
.3 Istr
uzio
ne f
or
(VI)
// S
cri
ve u
na m
atr
ice d
i aste
risch
i fo
rmata
da r
rig
he
// e
c c
olo
nn
e, co
n r
e c
dati
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
r, c
; co
ut
<<
"N
um
ero
di ri
gh
e?
" <
< e
nd
l;cin
>>
r;
co
ut
<<
"N
um
ero
di co
lon
ne?
" <
< e
nd
l;cin
>>
c;
for
(in
t i =
0;
i <
r;
i++
) {
for
(in
t j
= 0
; j
< c
; j+
+)
co
ut
<<
'*'
;co
ut
<<
en
dl;
} syste
m("
PA
US
E");
retu
rn 0
;} N
um
ero
di ri
gh
e?
3 Nu
mero
di co
lon
ne?
4 ****
****
****
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
188
6.5
Istr
uzio
ni
di
salt
o
jum
p-s
tate
men
t
bre
ak-s
tate
men
t
co
nti
nu
e-s
tate
men
t
go
to-s
tate
men
t
retu
rn-s
tate
men
t
•Is
tru
zio
ne
bre
ak
(già
vis
ta):
–salt
oall'istr
uzio
ne
imm
ed
iata
men
tesu
ccessiv
aal
co
rpo
del
cic
loo
dell’istr
uzio
ne
sw
itch
ch
eco
nte
ng
on
ol’is
tru
zio
ne
bre
ak:
wh
ile
(...)
{...
bre
ak;
...
} sw
itch
(....
)
{.... bre
ak;
...
}
189

6.5
.1 Istr
uzio
ne b
reak (
I)
// L
eg
ge e
scri
ve i
nte
ri n
on
neg
ati
vi
// T
erm
ina a
l p
rim
o n
eg
ati
vo
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
j;fo
r (;
;)
// c
iclo
infinito; altra
form
a: w
hile
(1)
{co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
j;
if (
j <
0)
bre
ak;
co
ut
<<
j <
< e
nd
l;} syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
3 3 Inseri
sci u
n n
um
ero
in
tero
5 5 Inseri
sci u
n n
um
ero
in
tero
-1 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
190
6.5
.1 Istr
uzio
ne b
reak (
II)
// L
eg
ge e
scri
ve a
l p
iu`
cin
qu
e in
teri
no
n n
eg
ati
vi
// T
erm
ina a
l p
rim
o n
eg
ati
vo
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
co
nst
int
N =
5;
for
(in
t i =
0, j;
i <
N;
i++
) {
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
j;
if (
j <
0)
bre
ak;
co
ut
<<
j <
< e
nd
l;} syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
3 3 Inseri
sci u
n n
um
ero
in
tero
5 5 Inseri
sci u
n n
um
ero
in
tero
-1 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
191

6.5
.2 Istr
uzio
ne c
on
tin
ue (
I)
co
nti
nu
e-s
tate
men
t
continue ;
–p
rovo
ca l
a t
erm
inazio
ne d
i u
n'ite
razio
ne d
el
cic
lo c
he la c
on
tien
e;
–salt
a a
lla p
art
e d
el cic
lo c
he v
alu
ta d
i n
uo
vo
la
co
nd
izio
ne d
i co
ntr
ollo
:
wh
ile (
... )
w
hile (
K.)
{ ...
{ K
co
nti
nu
e;
sw
itch
(K)
...
{ K
}co
nti
nu
e;
} K.
}
No
ta: –
le istr
uzio
ni b
reak e
co
nti
nu
e s
i co
mp
ort
an
o in
m
od
o d
ivers
o r
isp
ett
o a
l ti
po
di is
tru
zio
ne
str
utt
ura
ta in
cu
i ag
isco
no
;
–l'is
tru
zio
ne c
on
tin
ue “
ign
ora
” la p
resen
za d
i u
n
even
tuale
istr
uzio
ne s
wit
ch
.
Istr
uzio
ne s
wit
ch
:
–q
uan
do
è l'u
ltim
a d
i u
n c
iclo
, n
elle a
ltern
ati
ve s
i p
uò
usare
l'istr
uzio
ne c
on
tin
ue in
vece c
he
l'is
tru
zio
ne b
reak.
192
6.5
.2 Istr
uzio
ne c
on
tin
ue (
II)
// L
eg
ge c
inq
ue in
teri
e s
cri
ve i
so
li n
on
neg
ati
vi
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
co
nst
int
N =
5;
for
(in
t i =
0, j;
i <
N;
i++
) {
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
j;
if (
j <
0)
co
nti
nu
e;
co
ut
<<
j <
< e
nd
l;} syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
1 1 Inseri
sci u
n n
um
ero
in
tero
2 2 Inseri
sci u
n n
um
ero
in
tero
-2 Inseri
sci u
n n
um
ero
in
tero
-3 Inseri
sci u
n n
um
ero
in
tero
4 4 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
193

5.1
Co
ncett
o d
i str
eam
(I)
Pro
gra
mm
a:
–co
mu
nic
a c
on
l'e
ste
rno
tra
mit
e u
no
o p
iù f
lussi
(str
eam
);
Str
eam
:
–str
utt
ura
log
ica
co
sti
tuit
ad
au
na
seq
uen
za
di
caselle
(ocelle),
cia
scu
na
di
un
byte
,ch
e
term
ina
co
nu
na
marc
ad
ifi
ne
str
eam
(il
nu
mero
delle
caselle
èillim
itato
);
≅c
ba
int m
ain
()
{
char
c;
cin
>>
c;
U.
}
po
siz
ion
e c
asella
co
invo
lta
nella lett
ura
accesso
seq
uen
zia
le 194
5.2
Co
ncett
o d
i str
eam
(II
)
Gli s
tream
pre
defi
nit
i so
no
tre
:
–cin
, co
ut
e c
err
;
Fu
nzio
ni ch
e o
pera
no
su
qu
esti
str
eam
:
–si tr
ovan
o i
n u
na lib
reri
a d
i in
gre
sso
/uscit
a, e
per
il lo
ro u
so
occo
rre in
clu
dere
il fi
le d
i in
testa
zio
ne <
iostr
eam
>.
Osserv
azio
ne:
–q
uan
to v
err
à d
ett
o p
er
lo s
tream
co
ut
vale
an
ch
e p
er
lo s
tream
cerr
.
Str
eam
di in
gre
sso
sta
nd
ard
(cin
):
–p
er
pre
levarv
i d
ati
, si u
sa l'istr
uzio
ne d
i le
ttu
ra
(o d
i in
gre
sso
):
basic
-in
pu
t-exp
ressio
n-s
tate
men
t
inp
ut-
str
eam
>>
vari
ab
le-n
am
e
;
Azio
ni:
•p
relievo
dallo
str
eam
di u
na s
eq
uen
za d
i cara
tteri
, co
nsis
ten
te c
on
la s
inta
ssi d
elle c
osta
nti
asso
cia
te
al t
ipo
della v
ari
ab
ile (
tip
o in
tero
: even
tuale
seg
no
e
seq
uen
za d
i cif
re, e c
osì via
);
•la
co
nvers
ion
e d
i ta
le s
eq
uen
za in
un
valo
re c
he
vie
ne a
sseg
nato
alla v
ari
ab
ile.
195

5.2
Op
era
tore
di
Lett
ura
Op
era
tore
di le
ttu
ra d
efi
nit
o p
er:
•sin
go
li c
ara
tteri
;•
nu
meri
in
teri
;•
nu
meri
reali;
•seq
uen
ze d
i cara
tteri
(co
sta
nti
str
ing
a).
Esecu
zio
ne d
el p
rog
ram
ma:
•q
uan
do
vie
ne i
nco
ntr
ata
un
'istr
uzio
ne d
i le
ttu
ra, il
pro
gra
mm
a s
i arr
esta
in
att
esa d
i d
ati
;
•i cara
tteri
ch
e v
en
go
no
batt
uti
su
lla t
asti
era
van
no
a
riem
pir
e lo
str
eam
cin
;
•p
er
co
nsen
tire
even
tuali c
orr
ezio
ni, i c
ara
tteri
batt
uti
co
mp
aio
no
an
ch
e in
eco
su
l vid
eo
;
•ta
li c
ara
tteri
van
no
eff
ett
ivam
en
te a
far
part
e d
i cin
so
lo q
uan
do
vie
ne b
att
uto
il ta
sto
di ri
torn
o c
arr
ello
.
Rid
irezio
ne:
•co
l co
man
do
di esecu
zio
ne d
el p
rog
ram
ma, lo
str
eam
cin
pu
ò e
ssere
rid
irett
o s
u u
n f
ile f
ile.in
resid
en
te s
u m
em
ori
a d
i m
assa;
•co
man
do
DO
S/W
ind
ow
s (l
eg
gi.ex
eè u
n f
ile
eseg
uib
ile):
leg
gi.exe <
file.in
196
5.2
Lett
ura
di
Cara
tteri
(I)
ch
ar
c;
cin
>>
c;
Azio
ne:
•se il cara
ttere
co
nte
nu
to n
ella c
asella s
ele
zio
nata
dal
pu
nta
tore
no
n è
un
o s
pazio
bia
nco
:
–vie
ne p
rele
vato
;
–vie
ne a
sseg
nato
alla v
ari
ab
ile c
;
–il p
un
tato
re s
i sp
osta
su
lla c
asella s
uccessiv
a;
•se il cara
ttere
co
nte
nu
to n
ella c
asella s
ele
zio
nata
dal
pu
nta
tore
è u
no
sp
azio
bia
nco
:
–vie
ne i
gn
ora
to;
–il p
un
tato
re s
i sp
osta
su
lla c
asella s
uccessiv
a,
e c
osì via
, fi
nch
é n
on
vie
ne l
ett
o u
n c
ara
ttere
ch
e n
on
sia
un
o s
pazio
bia
nco
.
Lett
ura
di u
n c
ara
ttere
qu
als
ivo
glia (
an
ch
e d
i u
no
sp
azio
bia
nco
):
ch
ar
c;
cin
.get(
c);
No
ta: –
un
a f
un
zio
ne (
co
me g
et(
)), ap
plicata
ad
un
o
sp
ecif
ico
str
eam
(co
me c
in),
si d
ice f
un
zio
ne
mem
bro
.
197

5.2
Lett
ura
di
Cara
tteri
(II
)
// L
eg
ge c
ara
tteri
e li sta
mp
a s
u v
ideo
//
Term
ina a
l p
rim
o c
ara
ttere
‘q
’.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
ch
ar
c;
wh
ile (
tru
e)
// w
hile
(1)
{co
ut
<<
"In
seri
sci u
n c
ara
ttere
" <
< e
nd
l;cin
>>
c;
if (
c !
= 'q
')co
ut
<<
c <
< e
nd
l;els
eb
reak;
} syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n c
ara
ttere
a w
qa In
seri
sci u
n c
ara
ttere
w Inseri
sci u
n c
ara
ttere
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
198
5.2
Lett
ura
di
Cara
tteri
(II
I)
// L
eg
ge c
ara
tteri
e li sta
mp
a s
u v
ideo
//
Term
ina a
l p
rim
o c
ara
ttere
‘q
’.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
ch
ar
c;
wh
ile (
tru
e)
{co
ut
<<
"In
seri
sci u
n c
ara
ttere
" <
< e
nd
l;cin
.get(
c);
if (
c !
= 'q
')co
ut
<<
c <
< e
nd
l;els
eb
reak;
} syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n c
ara
ttere
a w
qa In
seri
sci u
n c
ara
ttere
Inseri
sci u
n c
ara
ttere
Inseri
sci u
n c
ara
ttere
w Inseri
sci u
n c
ara
ttere
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
199

5.2
Lett
ura
di
Inte
ri
int
i;cin
>>
i;
Azio
ne:
•il p
un
tato
re s
i sp
osta
da u
na c
asella a
lla s
uccessiv
a
fin
tan
to c
he t
rova c
ara
tteri
co
nsis
ten
ti c
on
la
sin
tassi d
elle c
osta
nti
in
tere
, salt
an
do
even
tuali
sp
azi b
ian
ch
i in
testa
, e s
i fe
rma s
ul p
rim
o c
ara
ttere
n
on
pre
vis
to d
alla s
inta
ssi ste
ssa;
•il n
um
ero
in
tero
co
rris
po
nd
en
te a
lla s
eq
uen
za d
i cara
tteri
lett
i vie
ne a
sseg
nato
alla v
ari
ab
ile i
.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i, j;
co
ut
<<
"In
seri
sci d
ue n
um
eri
in
teri
" <
< e
nd
l;cin
>>
i;
cin
>>
j;
co
ut
<<
i <
< e
nd
l <
< j <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci d
ue n
um
eri
in
teri
-10 3
-10
3 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
200
5.2
Lett
ura
di
Reali
flo
at
f;cin
>>
f;
Azio
ne:
•il p
un
tato
re s
i sp
osta
da u
na c
asella a
lla s
uccessiv
a
fin
tan
to c
he t
rova c
ara
tteri
co
nsis
ten
ti c
on
la
sin
tassi d
elle c
osta
nti
reali, salt
an
do
even
tuali s
pazi
bia
nch
i in
testa
, e s
i fe
rma s
ul p
rim
o c
ara
ttere
no
n
pre
vis
to d
alla s
inta
ssi ste
ssa;
•il n
um
ero
reale
co
rris
po
nd
en
te a
lla s
eq
uen
za d
i cara
tteri
lett
i vie
ne a
sseg
nato
alla v
ari
ab
ile f
.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
flo
at
f, g
;co
ut
<<
"In
seri
sci d
ue n
um
eri
reali "
<<
en
dl;
cin
>>
f;
cin
>>
g;
co
ut
<<
f <
< e
nd
l <
< g
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci d
ue n
um
eri
reali
-1.2
5e-3
.1
e4
-0.0
0125
1000
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
201

5.2
Lett
ure
Mu
ltip
le
Istr
uzio
ne d
i in
gre
sso
:–
rien
tra n
ella c
ate
go
ria d
elle i
str
uzio
ne e
sp
ressio
ne;
–l’esp
ressio
ne p
rod
uce c
om
e r
isu
ltato
lo
str
eam
co
invo
lto
;
–co
nsen
te d
i eff
ett
uare
più
lett
ure
in
seq
uen
za.
cin
>>
x >
> y
;
eq
uiv
ale
nte
a:
cin
>>
x;
cin
>>
y;
Infa
tti, e
ssen
do
l’o
pera
tore
>>
asso
cia
tivo
a s
inis
tra,
pri
ma v
ien
e c
alc
ola
ta la s
ub
esp
ressio
ne c
in >
>x, ch
e
pro
du
ce c
om
e r
isu
ltato
cin
, q
uin
di la
su
besp
ressio
ne
cin
>>
y.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
flo
at
f, g
;co
ut
<<
"In
seri
sci d
ue n
um
eri
reali "
<<
en
dl;
cin
>>
f>
>g
;co
ut
<<
f <
< e
nd
l <
< g
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci d
ue n
um
eri
reali
-1.2
5e-3
.1
e4
-0.0
0125
1000
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
202
5.3
Err
ori
su
llo
str
eam
di
ing
resso
(I)
Istr
uzio
ne d
i le
ttu
ra:
•il p
un
tato
re n
on
in
div
idu
a u
na s
eq
uen
za d
i cara
tteri
co
nsis
ten
te c
on
la s
inta
ssi d
elle c
osta
nti
asso
cia
te
al ti
po
della v
ari
ab
ile:
–l'o
pera
zio
ne d
i p
relievo
no
n h
a lu
og
o e
lo
str
eam
si p
ort
a in
un
o s
tato
di err
ore
;
Caso
tip
ico
:•
si vu
ole
leg
gere
un
nu
mero
in
tero
, e il p
un
tato
re
ind
ivid
ua u
n c
ara
ttere
ch
e n
on
sia
il seg
no
o u
na
cif
ra;
•caso
part
ico
lare
:
–si te
nta
di le
gg
ere
la m
arc
a d
i fi
ne s
tream
.
Str
eam
di in
gre
sso
in
sta
to d
i err
ore
:•
occo
rre u
n r
ipri
sti
no
, ch
e s
i o
ttie
ne c
on
la f
un
zio
ne
cin
.cle
ar(
).
Str
eam
di in
gre
sso
:•
pu
ò c
osti
tuir
e u
na
co
nd
izio
ne
(nelle istr
uzio
ni
co
nd
izio
nali o
rip
eti
tive);
•la
co
nd
izio
ne è
vera
se lo
str
eam
no
n è
in
un
o s
tato
d
i err
ore
, fa
lsa a
ltri
men
ti.
Tasti
era
del te
rmin
ale
:•
se u
n p
rog
ram
ma leg
ge d
ati
da t
erm
inale
fin
o a
d
inco
ntr
are
la m
arc
a d
i fi
ne s
tream
, l'u
ten
te d
eve
po
ter
intr
od
urr
e t
ale
marc
a;
•q
uesto
si o
ttie
ne p
rem
en
do
Co
ntr
ol e Z
n
ei sis
tem
i D
OS
/Win
do
ws (
Ctr
l-Z
).
203

5.3
Err
ori
su
llo
str
eam
di
ing
resso
(II
)
// L
eg
ge e
sta
mp
a n
um
eri
in
teri
.//
Term
ina q
uan
do
vie
ne i
nseri
to u
n c
ara
ttere
no
n//
co
nsis
ten
te c
on
la s
inta
ssi d
elle c
osta
nti
in
tere
//
Vers
ion
e 1
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;w
hile (
tru
e)
{co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
i;
if (
cin
)co
ut
<<
"N
um
ero
in
tero
: " <
< i <
< e
nd
l;els
e bre
ak;
}
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
3 Nu
mero
in
tero
: 3
Inseri
sci u
n n
um
ero
in
tero
x Pre
mere
un
tasto
per
co
nti
nu
are
. . .
204
5.3
Err
ori
su
llo
str
eam
di
ing
resso
(II
I)
// L
eg
ge e
sta
mp
a n
um
eri
in
teri
.//
Term
ina q
uan
do
vie
ne i
nseri
to u
n c
ara
ttere
no
n//
co
nsis
ten
te c
on
la s
inta
ssi d
elle c
osta
nti
in
tere
//
Vers
ion
e 2
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;w
hile (
cin
){
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
i;
if (
cin
)co
ut
<<
"N
um
ero
in
tero
: " <
< i <
< e
nd
l;}
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
3 Nu
mero
in
tero
: 3
Inseri
sci u
n n
um
ero
in
tero
x Pre
mere
un
tasto
per
co
nti
nu
are
. . .
205

5.3
Err
ori
su
llo
str
eam
di
ing
resso
(IV
)
// L
eg
ge e
sta
mp
a n
um
eri
in
teri
.//
Term
ina q
uan
do
vie
ne i
nseri
to u
n c
ara
ttere
no
n//
co
nsis
ten
te c
on
la s
inta
ssi d
elle c
osta
nti
in
tere
//
Vers
ion
e 3
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;w
hile (
cin
>>
i)
{co
ut
<<
"N
um
ero
in
tero
: " <
< i <
< e
nd
l;co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;}
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
3 Nu
mero
in
tero
: 3
Inseri
sci u
n n
um
ero
in
tero
x Pre
mere
un
tasto
per
co
nti
nu
are
. . .
206
5.3
Err
ori
su
llo
str
eam
di
ing
resso
(V
)
// L
eg
ge e
sta
mp
a n
um
eri
in
teri
.//
Term
ina q
uan
do
vie
ne i
nseri
to u
n c
ara
ttere
no
n//
co
nsis
ten
te c
on
la s
inta
ssi d
elle c
osta
nti
in
tere
//
Vers
ion
e 4
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
int
i;w
hile (
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l&
& c
in >
> i)
co
ut
<<
"N
um
ero
in
tero
: " <
< i <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
3 Nu
mero
in
tero
: 3
Inseri
sci u
n n
um
ero
in
tero
x Pre
mere
un
tasto
per
co
nti
nu
are
. . .
207

5.3
Err
ori
su
llo
str
eam
di
ing
resso
(V
I)
// L
eg
ge e
sta
mp
a c
ara
tteri
.//
Term
ina q
uan
do
vie
ne i
nseri
to il fi
ne s
tream
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
ch
ar
c;
wh
ile (
co
ut
<<
"In
seri
sci u
n c
ara
ttere
" <
< e
nd
l &
&cin
>>
c)
co
ut
<<
"C
ara
ttere
: " <
< c
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n c
ara
ttere
s e
Cara
ttere
: s
Inseri
sci u
n c
ara
ttere
Cara
ttere
: e
Inseri
sci u
n c
ara
ttere
a Cara
ttere
: a
Inseri
sci u
n c
ara
ttere
^Z
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
208
5.3
Err
ori
su
llo
str
eam
di
ing
resso
(V
II)
// L
eg
ge e
sta
mp
a c
ara
tteri
.//
Term
ina q
uan
do
vie
ne i
nseri
to il fi
ne s
tream
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
ch
ar
c;
wh
ile (
co
ut
<<
"In
seri
sci u
n c
ara
ttere
" <
< e
nd
l &
&
cin
.get(
c))
co
ut
<<
"C
ara
ttere
: " <
< c
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n c
ara
ttere
s e
Cara
ttere
: s
Inseri
sci u
n c
ara
ttere
Cara
ttere
:In
seri
sci u
n c
ara
ttere
Cara
ttere
:In
seri
sci u
n c
ara
ttere
Cara
ttere
: e
Inseri
sci u
n c
ara
ttere
Cara
ttere
:
Inseri
sci u
n c
ara
ttere
^Z
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
209

5.3
Err
ori
su
llo
str
eam
di
ing
resso
(V
III)
// U
so
della f
un
zio
ne m
em
bro
cle
ar(
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
ch
ar
c;
co
ut
<<
"In
seri
sci i cara
tteri
(te
rmin
a c
on
^Z
)\n
";
wh
ile (
cin
>>
c)
co
ut
<<
c <
< e
nd
l;co
ut
<<
"In
seri
sci i cara
tteri
(te
rmin
a c
on
^Z
)\n
";
wh
ile (
cin
>>
c)
co
ut
<<
c <
< e
nd
l;co
ut
<<
"S
tream
in
sta
to d
i err
ore
" <
< e
nd
l;cin
.cle
ar(
);co
ut
<<
"In
seri
sci i cara
tteri
(te
rmin
a c
on
^Z
)\n
";
wh
ile (
cin
>>
c)
co
ut
<<
c <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci i cara
tteri
(te
rmin
a c
on
^Z
)a a ^
ZIn
seri
sci i cara
tteri
(te
rmin
a c
on
^Z
)S
tream
in
sta
to d
i err
ore
Inseri
sci i cara
tteri
(te
rmin
a c
on
^Z
)^
ZP
rem
ere
un
tasto
per
co
nti
nu
are
. . .
210
5.3
Err
ori
su
llo
str
eam
di
ing
resso
(IX
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
in
t i;
ch
ar
c;
co
ut
<<
"In
seri
sci n
um
eri
in
teri
" <
< e
nd
l;w
hile (
cin
>>
i)co
ut
<<
i <
< e
nd
l;if
(!c
in)
co
ut
<<
"S
tream
in
sta
to d
i err
ore
" <
< e
nd
l;cin
.cle
ar(
);
co
ut
<<
"In
seri
sci n
um
eri
in
teri
" <
< e
nd
l;w
hile (
cin
>>
i)co
ut
<<
i <
< e
nd
l;if
(!c
in)
co
ut
<<
"S
tream
in
sta
to d
i err
ore
" <
< e
nd
l;cin
.cle
ar(
);w
hile (
cin
.get(
c)
&&
c!=
'\n
');
co
ut
<<
"In
seri
sci n
um
eri
in
teri
" <
< e
nd
l;w
hile (
cin
>>
i)co
ut
<<
i <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci n
um
eri
in
teri
p Str
eam
in
sta
to d
i err
ore
Inseri
sci n
um
eri
in
teri
Str
eam
in
sta
to d
i err
ore
Inseri
sci n
um
eri
in
teri
1 1 K211

5.4
Str
eam
di
uscit
a
Str
eam
di u
scit
a s
tan
dard
(co
ut)
:
•p
er
scri
vere
su
co
ut
si u
sa l'istr
uzio
ne d
i scri
ttu
ra (
o
di u
scit
a),
ch
e h
a la f
orm
a:
basic
-ou
tpu
t-exp
ressio
n-s
tete
men
t
ou
tpu
t-str
eam
<
<exp
ressio
n ;
Azio
ne:
•calc
olo
dell’e
sp
ressio
ne e
su
a c
on
vers
ion
e i
n u
na
seq
uen
za d
i cara
tteri
;
•tr
asfe
rim
en
to d
i q
uesti
nelle v
ari
e c
aselle d
ello
str
eam
, a p
art
ire d
alla p
rim
a;
•il p
un
tato
re e
la m
arc
a d
i fi
ne s
tream
si sp
osta
no
in
avan
ti,
e in
og
ni m
om
en
to il p
un
tato
re in
div
idu
a l
a
marc
a d
i fi
ne s
tream
.
Po
sso
no
essere
scri
tti:
–n
um
eri
in
teri
;
–n
um
eri
reali;
–sin
go
li c
ara
tteri
;
–seq
uen
ze d
i cara
tteri
(co
sta
nti
str
ing
a).
No
ta:
•u
n v
alo
re d
i ti
po
bo
ole
an
o o
di u
n t
ipo
en
um
era
to
vie
ne i
mp
licit
am
en
te c
on
vert
ito
in
in
tero
(co
dif
ica
del valo
re)
.
212
5.4
Istr
uzio
ne d
i scri
ttu
ra(I
)
Istr
uzio
ne d
i u
scit
a:
•è u
n’istr
uzio
ne e
sp
ressio
ne;
•il r
isu
ltato
è lo
str
eam
;
•an
alo
gam
en
te a
ll’istr
uzio
ne d
i in
gre
sso
, co
nsen
te d
i eff
ett
uare
più
scri
ttu
re in
seq
uen
za.
Fo
rmato
di scri
ttu
ra (
para
metr
i):
•am
pie
zza d
el cam
po
(nu
mero
to
tale
di cara
tteri
im
pie
gati
, co
mp
resi even
tuali s
pazi p
er
l'allin
eam
en
to);
•lu
ng
hezza d
ella p
art
e f
razio
nari
a(s
olo
per
i n
um
eri
re
ali);
Para
metr
i:•
valo
ri d
efa
ult
fis
sati
dall’im
ple
men
tazio
ne;
•p
osso
no
essere
cam
bia
ti d
al p
rog
ram
mato
re.
Rid
irezio
ne:
•co
l co
man
do
di esecu
zio
ne d
el p
rog
ram
ma, lo
str
eam
co
ut
pu
ò e
ssere
rid
irett
o s
u u
n f
ile f
ile.o
ut
resid
en
te s
u m
em
ori
a d
i m
assa;
•co
man
do
DO
S/W
ind
ow
s (s
cri
vi.ex
eè u
n f
ile
eseg
uib
ile):
scri
vi.exe >
file.o
ut
213

5.4
Istr
uzio
ne d
i scri
ttu
ra(I
I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>#in
clu
de <
iom
an
ip>
usin
g n
am
esp
ace s
td;
int
main
(){
do
ub
le d
= 1
.564e-2
,f=
1.2
345, i;
co
ut
<<
d <
< e
nd
l;co
ut
<<
setp
recis
ion
(2)
<<
d <
< '\t
' <
< f
<<
en
dl;
co
ut
<<
d <
< e
nd
l;co
ut
<<
setw
(10)
<<
d <
< ' ' <
< f
<<
en
dl;
co
ut
<<
d <
< e
nd
l;co
ut
<<
hex <
< 1
0 <
< '\t
' <
< 1
1 <
< e
nd
l;co
ut
<<
oct
<<
10 <
< '\t
' <
< 1
1 <
< e
nd
l;co
ut
<<
dec <
< 1
0 <
< '\t
' <
< 1
1 <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;} 0.0
1564
0.0
16 1
.20.0
16
0.0
16 1
.20.0
16
a b
12 13
10 11
Pre
ss a
ny k
ey t
o c
on
tin
ue . . .
214
5.5
Man
ipo
lazio
ne d
ei
file
(I)
Str
eam
asso
cia
ti a
i fi
le v
isti
dal sis
tem
a o
pera
tivo
:
•g
esti
ti d
a u
na a
pp
osit
a lib
reri
a;
•o
cco
rre in
clu
dere
il fi
le d
i in
testa
zio
ne <
fstr
eam
>.
Dic
hia
razio
ne:
basic
-file-s
tream
-defi
nit
ion
fstr
eam
iden
tifi
er-
list
;
Esem
pio
:
fstr
eam
in
gr,
usc;
Fu
nzio
ne o
pen
():
•asso
cia
un
o s
tream
ad
un
file;
•ap
re lo
str
eam
seco
nd
o o
pp
ort
un
e m
od
alità
;
•le
mo
dalità
di ap
ert
ura
so
no
rap
pre
sen
tate
da
op
po
rtu
ne c
osta
nti
–le
ttu
ra =
> c
osta
nte
io
s::
in;
–scri
ttu
ra =
> c
osta
nte
io
s::
ou
t;
–scri
ttu
ra a
lla f
ine d
el fi
le (
ap
pen
d)
=>
co
sta
nte
ios::
ou
t | io
s::
ap
p;
•il n
om
e d
el fi
le v
ien
e s
pecif
icato
co
me s
trin
ga (
in
part
ico
lare
, co
me c
osta
nte
str
ing
a).
215

5.5
Man
ipo
lazio
ne d
ei
file
(II
)
Esem
pio
:
ing
r.o
pen
("fi
le1.in
", io
s::
in);
usc.o
pen
("fi
le2.o
ut"
, io
s::
ou
t);
Str
eam
ap
ert
o in
lett
ura
:
–il f
ile a
sso
cia
to d
eve e
ssere
già
pre
sen
te;
–il p
un
tato
re s
i sp
osta
su
lla p
rim
a c
asella.
Str
eam
ap
ert
o in
scri
ttu
ra:
–il f
ile a
sso
cia
to, se n
on
pre
sen
te, vie
ne c
reato
;
–il p
un
tato
re s
i p
osiz
ion
a a
ll'in
izio
dello
str
eam
,
su
l q
uale
co
mp
are
so
lo la m
arc
a d
i fi
ne s
tream
(even
tuali d
ati
pre
sen
ti n
el fi
le v
en
go
no
perd
uti
).
Str
eam
ap
ert
o in
ap
pen
d:
–il f
ile a
sso
cia
to, se n
on
pre
sen
te, vie
ne c
reato
;
–il p
un
tato
re s
i sp
osta
alla f
ine d
ello
str
eam
, in
co
rris
po
nd
en
za d
ella m
arc
a d
i fi
ne s
tream
(even
tuali d
ati
pre
sen
ti n
el fi
le n
on
ven
go
no
perd
uti
).
216
5.5
Man
ipo
lazio
ne d
ei
file
(II
I)
Str
eam
ap
ert
o:
–u
tilizzato
co
n le s
tesse m
od
alità
e g
li s
tessi
op
era
tori
vis
ti p
er
gli s
tream
sta
nd
ard
;
–le
op
era
zio
ni eff
ett
uate
su
gli s
tream
co
invo
lgo
no
i f
ile a
cu
i so
no
sta
ti a
sso
cia
ti.
–S
cri
ttu
ra:
•u
sc <
< 1
0;
–L
ett
ura
:
•in
gr
>>
x
Fu
nzio
ne c
lose()
:
–ch
iud
e u
no
str
eam
ap
ert
o, u
na v
olt
a c
he è
sta
to
uti
lizzato
.
ing
r.clo
se()
;
usc.c
lose()
;
Str
eam
ch
iuso
:
–p
uò
essere
ria
pert
o, asso
cia
nd
olo
ad
un
q
ualu
nq
ue f
ile e
co
n u
na m
od
alità
arb
itra
ria.
Fin
e d
el p
rog
ram
ma:
–tu
tti g
li s
tream
ap
ert
i ven
go
no
au
tom
ati
cam
en
te
ch
iusi.
Err
ori
:
–q
uan
to d
ett
o p
er
lo s
tream
cin
vale
an
ch
e p
er
qu
alu
nq
ue a
ltro
str
eam
ap
ert
o in
lett
ura
.
217

5.5
Man
ipo
lazio
ne d
ei
file
(IV
)
// S
cri
ve 4
nu
meri
in
teri
nel fi
le “
esem
pio
”.
// A
pre
il fi
le in
lett
ura
e s
tam
pa s
u v
ideo
il su
o c
on
ten
uto
#in
clu
de <
cstd
lib
>#in
clu
de <
fstr
eam
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
fstr
eam
ff;
in
t n
um
;ff
.op
en
("esem
pio
", io
s::
ou
t);
if (
!ff)
{cerr
<<
"Il f
ile n
on
pu
o' essere
ap
ert
o" <
< e
nd
l;exit
(1);
// funzio
ne e
xit
} for
(in
t i =
0;
i <
4;
i++
)ff
<<
i <
< e
nd
l;
// A
TT
. separa
re n
um
eri
ff.c
lose()
;ff
.op
en
("esem
pio
", io
s::
in);
if (
!ff)
{cerr
<<
"Il f
ile n
on
pu
o' essere
ap
ert
o" <
< e
nd
l;exit
(1);
}
wh
ile (
ff >
> n
um
)
// fin
o a
lla fin
e d
el file
co
ut
<<
nu
m <
< '\t
';co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} 0 1
2
3
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
218
5.5
Man
ipo
lazio
ne d
ei
file
(V
)
// A
pre
in
lett
ura
il fi
le “
esem
pio
” e
leg
ge N
nu
meri
in
teri
. //
Co
ntr
olla c
he le istr
uzio
ni d
i le
ttu
ra n
on
po
rtin
o
// lo
str
eam
in
sta
to d
i err
ore
#in
clu
de <
cstd
lib
>#in
clu
de <
fstr
eam
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
fstr
eam
ff;
in
t i, n
um
;co
nst
int
N =
6;
ff.o
pen
("esem
pio
", io
s::
in);
if (
!ff)
{cerr
<<
"Il f
ile n
on
pu
o' essere
ap
ert
o" <
< e
nd
l;exit
(1);
}
for
(i=
0;
i <
N &
& f
f >
> n
um
; i+
+)
co
ut
<<
nu
m <
< '\t
';co
ut
<<
en
dl;
if (
i!=
N)
cerr
<<
"E
rro
re n
ella lett
ura
del fi
le "
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} 0
1
2
3
E
rro
re n
ella lett
ura
del fi
leP
rem
ere
un
tasto
per
co
nti
nu
are
. . .
219

5.5
Man
ipo
lazio
ne d
ei
file
(V
I)
// E
sem
pio
ap
ert
ura
in
ap
pen
d.
#in
clu
de <
cstd
lib
>#in
clu
de <
fstr
eam
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
(){
fstr
eam
ff;
in
t i;
ch
ar
c;
ff.o
pen
("esem
pio
", io
s::
ou
t);
if (
!ff)
{cerr
<<
"Il f
ile n
on
pu
o' essere
ap
ert
o" <
< e
nd
l;exit
(1);
}
for
(in
t i =
0;
i <
4;
i++
)ff
<<
i <
< '\t
';ff
.clo
se()
;ff
.op
en
("esem
pio
", io
s::
ou
t | io
s :
: ap
p);
ff <
< 5
<<
'\t
' <
< 6
<<
en
dl;
ff.c
lose()
;ff
.op
en
("esem
pio
", io
s::
in);
if (
!ff)
{cerr
<<
"Il f
ile n
on
pu
o' essere
ap
ert
o" <
< e
nd
l;exit
(1);
}
wh
ile (
ff.g
et(
c))
co
ut
<<
c;
syste
m("
PA
US
E");
retu
rn 0
;} 0
1
2
3
5
6
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
220
5.5
Man
ipo
lazio
ne d
ei
file
(V
II)
Vers
ion
i alt
ern
ati
ve
fstr
eam
ff;
ff
.op
en
("fi
le", io
s::
in); if
str
eam
ff(
"fi
le");
fstr
eam
ff;
ff
.op
en
("fi
le", io
s::
ou
t);
ofs
tream
ff(
"fi
le");
fstr
eam
ff;
ff
.op
en
("fi
le", io
s::
ou
t|io
s::
ap
p);
ofs
tream
ff(
"fi
le",io
s::
ap
p);
221

7.1
Co
ncett
o d
i fu
nzio
ne (
I)
// P
rob
lem
a
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
n;
int
main
(){
int
f;co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
:";
cin
>>
n;
f =
1;
for
(in
t i =
2;
i <
= n
; i+
+)
f *
= i;
co
ut
<<
"Il f
att
ori
ale
e':
" <
< f
<<
en
dl;
/* A
ltre
ela
bora
zio
ni */
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
";
cin
>>
n;
f =
1;
for
(in
t i =
2;
i <
= n
; i+
+)
f *=
i;
co
ut
<<
"Il f
att
ori
ale
e':
" <
< f
<<
en
dl;
/* A
ltre
ela
bora
zio
ni */
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
: 4
Il f
att
ori
ale
e':
24
Inseri
sci u
n n
um
ero
in
tero
: 5
Il f
att
ori
ale
e':
120
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
222
7.1
Co
ncett
o d
i fu
nzio
ne (
II)
// S
olu
zio
ne 1
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
n;
int
fatt
()
{in
t ri
s =
1;
for
(in
t i =
2;
i <
= n
; i+
+)
ris *
= i;
retu
rn r
is;
} int
main
()
{in
t f;
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
:";
cin
>>
n;
f =
fatt
();
co
ut
<<
"Il f
att
ori
ale
e':
" <
< f
<<
en
dl;
/* A
ltre
ela
bora
zio
ni */
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
:";
cin
>>
n;
f =
fatt
();
co
ut
<<
"Il f
att
ori
ale
e':
" <
< f
<<
en
dl;
/* A
ltre
ela
bora
zio
ni */
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
: 4
Il f
att
ori
ale
e':
24
Inseri
sci u
n n
um
ero
in
tero
: 5
Il f
att
ori
ale
e':
120
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
223

7.1
Co
ncett
o d
i fu
nzio
ne (
III)
// S
olu
zio
ne 2
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
fatt
(in
t n
) {
int
ris =
1;
for
(in
t i =
2;
i <
= n
; i+
+)
ris *
= i;
retu
rn r
is;
} int
main
()
{in
t i, f
;co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
:";
cin
>>
i;
f =
fatt
(i);
co
ut
<<
"Il f
att
ori
ale
e':
" <
< f
<<
en
dl;
/* A
ltre
ela
bora
zio
ni */
co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
:";
cin
>>
i;
f =
fatt
(i);
co
ut
<<
"Il f
att
ori
ale
e':
" <
< f
<<
en
dl;
/* A
ltre
ela
bora
zio
ni */
syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
: 4
Il f
att
ori
ale
e':
24
Inseri
sci u
n n
um
ero
in
tero
: 5
Il f
att
ori
ale
e':
120
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
224
7.1
Co
ncett
o d
i fu
nzio
ne (
IV)
Vari
ab
ili d
efi
nit
e in
un
a f
un
zio
ne:
•lo
cali
alla f
un
zio
ne;
No
mi d
i vari
ab
ili
locali e
di arg
om
en
ti f
orm
ali:
•asso
cia
ti a
d o
gg
ett
i ch
e a
pp
art
en
go
no
alla f
un
zio
ne
in c
ui so
no
defi
nit
i;
•se u
no
ste
sso
no
me v
ien
e u
tilizzato
in
fu
nzio
ni
div
ers
e,
si ri
feri
sce in
cia
scu
na f
un
zio
ne a
d u
n
og
gett
o d
ivers
o;
•in
qu
esto
caso
si d
ice c
he il n
om
e è
vis
ibile
so
lo
nella r
isp
ett
iva f
un
zio
ne.
Ch
iam
ata
:
•g
li a
rgo
men
ti f
orm
ali e
le v
ari
ab
ili
locali v
en
go
no
allo
cati
in
mem
ori
a;
•g
li a
rgo
men
ti f
orm
ali v
en
go
no
in
izia
lizzati
co
n i
valo
ri d
eg
li a
rgo
men
ti a
ttu
ali
(passag
gio
per
valo
re);
•g
li a
rgo
men
ti f
orm
ali e
le v
ari
ab
ili
locali v
en
go
no
u
tilizzati
per
le d
ovu
te e
lab
ora
zio
ni;
•al te
rmin
e d
ella f
un
zio
ne, essi ven
go
no
deallo
cati
, e
la m
em
ori
a d
a e
ssi o
ccu
pata
vie
ne r
esa d
isp
on
ibile
per
alt
ri u
si.
Ista
nza d
i fu
nzio
ne:
•n
uo
va c
op
ia d
eg
li a
rgo
men
ti f
orm
ali e
delle v
ari
ab
ili
locali (
nasco
no
e m
uo
ion
o c
on
l'in
izio
e la f
ine d
ella
esecu
zio
ne d
ella f
un
zio
ne);
•il v
alo
re d
i u
na v
ari
ab
ile l
ocale
ott
en
uto
du
ran
te u
na
cert
a e
secu
zio
ne d
ella f
un
zio
ne n
on
vie
ne
co
nserv
ato
per
le s
uccessiv
e i
sta
nze.
225

7.1
Co
ncett
o d
i fu
nzio
ne (
V)
•Q
uan
do
un
a f
un
zio
ne v
ien
e i
nvo
cata
, vie
ne c
reata
in
m
em
ori
a u
n’ista
nza d
ella f
un
zio
ne;
•L
’ista
nza h
a u
n t
em
po
di vit
a p
ari
al te
mp
o d
i esecu
zio
ne d
ella f
un
zio
ne
// Ista
nza d
i fu
nzio
ne
Valo
re d
i i
1in
t ris
int n
Arg
om
enti f
orm
ali
Variabili
locali
Esem
pio
: fu
nzio
ne int fa
tt(int n)
pre
cedente
UUin
t f
int i
Esem
pio
: fu
nzio
ne m
ain
() p
recedente
226
7.3
.1 Istr
uzio
ne r
etu
rn (
I)
// R
esti
tuis
ce il m
assim
o t
erm
ine d
ella s
uccessio
ne d
i //
Fib
on
acci m
ino
re o
ug
uale
al d
ato
in
tero
po
sit
ivo
n
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
un
sig
ned
in
t fi
bo
(un
sig
ned
in
t n
) {
un
sig
ned
in
t i =
0, j
= 1
, s;
for
(;;)
{
if (
(s =
i +
j)
> n
) re
turn
j;
i =
j;
j =
s;
}} in
t m
ain
()
{u
nsig
ned
in
t n
;co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
n;
co
ut
<<
"T
erm
ine s
uccessio
ne F
ibo
nacci:
";
co
ut
<<
fib
o(n
) <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
12
Term
ine s
uccessio
ne F
ibo
nacci:
8P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
Valo
re d
i n(m
ain
)
0in
t i
int n
1U
int j
int s
Ista
nza d
ella
funzio
ne fib
o()
Uin
t n
Ista
nza d
ella
funzio
ne m
ain
()
227

7.3
.1 Istr
uzio
ne r
etu
rn (
II)
// C
on
tro
lla s
e u
n in
tero
e’ p
osit
ivo
, n
eg
ati
vo
o n
ullo
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
en
um
val
{N, Z
, P
};
val
seg
no
(in
t n
) {
if (
n >
0)
retu
rn P
;if
(n
==
0)
retu
rn Z
;re
turn
N;
} int
main
()
{in
t i;
// term
ina s
e legge u
n v
alo
re ille
gale
per
iw
hile (
co
ut
<<
"N
um
ero
in
tero
? "
&&
cin
>>
i)
sw
itch
(seg
no
(i))
{
case N
:co
ut
<<
"V
alo
re n
eg
ati
vo
" <
< e
nd
l;co
nti
nu
e;
case Z
:co
ut
<<
"V
alo
re n
ullo
" <
< e
nd
l;co
nti
nu
e;
case P
:co
ut
<<
"V
alo
re p
osit
ivo
" <
< e
nd
l;} syste
m("
PA
US
E");
retu
rn 0
;}
228
7.3
.1 Istr
uzio
ne r
etu
rn (
III)
// C
on
tro
lla s
e u
n in
tero
e’ p
osit
ivo
, n
eg
ati
vo
o n
ullo
Nu
mero
in
tero
? -
10
Valo
re n
eg
ati
vo
Nu
mero
in
tero
? 3
Valo
re p
osit
ivo
Nu
mero
in
tero
? 0
Valo
re n
ullo
Nu
mero
in
tero
? ^
ZP
rem
ere
un
tasto
per
co
nti
nu
are
. . .
-10
int n
Prim
a ista
nza funzio
ne s
egno()
3in
t n
Seconda ista
nza funzio
ne s
egno()
0in
t n
Terz
a ista
nza funzio
ne s
egno()
229

7.4
Dic
hia
razio
ni
di
fun
zio
ni
(I)
// C
on
tro
lla s
e i c
ara
tteri
lett
i so
no
lett
ere
min
usco
le o
// n
um
eri
.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{ch
ar
c;
wh
ile (
co
ut
<<
"C
ara
ttere
:? "
<<
en
dl &
& c
in >
> c
)if
(!i
s_
low
_d
ig(c
))// E
RR
OR
E!
{syste
m("
PA
US
E");
retu
rn 0
;}
} bo
ol is
_lo
w_
dig
(ch
ar
c)
{re
turn
(c >
= '0' &
& c
<=
'9' ||
c >
= 'a' &
& c
<=
'z')
? t
rue :
fals
e;
} ER
RO
RE
SE
GN
AL
AT
O IN
FA
SE
DI C
OM
PIL
AZ
ION
E
9:
`is_
low
_d
ig' u
nd
ecla
red
(fi
rst
use t
his
fu
ncti
on
)
230
7.4
Dic
hia
razio
ni
di
fun
zio
ni
(II)
// C
on
tro
lla s
e i c
ara
tteri
lett
i so
no
lett
ere
min
usco
le o
// n
um
eri
.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
bo
ol is
_lo
w_
dig
(ch
ar
c);
// o
ppure
bo
ol is
_lo
w_
dig
(ch
ar)
;in
t m
ain
()
{ch
ar
c;
wh
ile (
co
ut
<<
"C
ara
ttere
:? "
<<
en
dl &
& c
in >
> c
)if
(!i
s_
low
_d
ig(c
)){
syste
m("
PA
US
E");
retu
rn 0
;}
} bo
ol is
_lo
w_
dig
(ch
ar
c)
{re
turn
(c >
= '0' &
& c
<=
'9' ||
c >
= 'a' &
& c
<=
'z')
? t
rue :
fals
e;
} Cara
ttere
:?r C
ara
ttere
:?3 C
ara
ttere
:?A P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
231

7.6
Arg
om
en
ti e
vari
ab
ili lo
cali
(I)
// S
om
ma g
li in
teri
co
mp
resi tr
a i d
ati
in
teri
n e
d m
,//
estr
em
i in
clu
si, c
on
n <
= m
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
so
mm
aIn
teri
(in
t n
, in
t m
) {
int
s =
n;
for
(in
t i =
n+
1;
i <
= m
; i+
+)
s +
= i;
retu
rn s
;} in
t m
ain
()
{in
t a, b
;w
hile (
co
ut
<<
"D
ue in
teri
? "
&&
cin
>>
a >
> b
)// term
ina s
e legge u
n v
alo
re ille
gale
per
a, b
co
ut
<<
so
mm
aIn
teri
(a, b
) <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;
} Du
e in
teri
? 1
23 D
ue in
teri
? 4
59 D
ue in
teri
? s
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
2in
t m
1in
t n
1in
t s
5in
t m
4in
t n
4in
t s
232
7.6
Arg
om
en
ti e
vari
ab
ili lo
cali
(II
)
// C
alc
ola
il m
assim
o f
ra t
re n
um
eri
in
teri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
massim
o(i
nt
a, in
t b
, in
t c)
{re
turn
((a
> b
) ?
((a
> c
) ?
a :
c)
: (b
> c
) ?
b :
c);
} int
main
()
{in
t i, j, k;
co
ut
<<
"In
seri
sci tr
e n
um
eri
: ";
cin
>>
i >
> j >
> k
;in
t m
= m
assim
o (
i, j, k);
co
ut
<<
m <
< e
nd
l;/*
...*
/d
ou
ble
x, y, z;
co
ut
<<
"In
seri
sci tr
e n
um
eri
: ";
cin
>>
x >
> y
>>
z;
do
ub
le w
= m
assim
o (
x, y, z);
// S
i applic
ano le r
egole
sta
ndard
per
la c
onvers
ione d
i tipo.
co
ut
<<
w <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci tr
e n
um
eri
: 3 4
55 In
seri
sci tr
e n
um
eri
: 3.3
4.4
5.5
5 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
233

7.7
Fu
nzio
ni
vo
id
// S
cri
ve a
ste
risch
i
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id s
cri
viA
ste
risch
i(in
t n
) {
for
(in
t i =
0;
i <
n;
i++
) co
ut
<<
'*'
;co
ut
<<
en
dl;
} int
main
()
{in
t i;
co
ut
<<
"Q
uan
ti a
ste
risch
i? "
;cin
>>
i;
scri
viA
ste
risch
i(i)
;syste
m("
PA
US
E");
retu
rn 0
;
} Qu
an
ti a
ste
risch
i? 2
0**
****
****
****
****
**P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
234
7.8
Fu
nzio
ni
sen
za a
rgo
men
ti
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
co
nst
int
N =
20;
vo
id s
cri
viA
ste
risch
i(vo
id)
// anche v
oid
scriviA
ste
rischi()
{fo
r (i
nt
i =
0;
i <
N;
i++
) co
ut
<<
'*'
;co
ut
<<
en
dl;
} int
main
()
{scri
viA
ste
risch
i();
syste
m("
PA
US
E");
retu
rn 0
;
} ****
****
****
****
****
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
235

7.9
Fu
nzio
ni
rico
rsiv
e (
I)
Fu
nzio
ne:
–p
uò
in
vo
care
, o
ltre
ch
e u
n'a
ltra
fu
nzio
ne,
an
ch
e s
e
ste
ssa;
–in
qu
esto
caso
si
ha u
na u
na f
un
zio
ne r
ico
rsiv
a.
F
un
zio
ne r
ico
rsiv
a:
–n
atu
rale
qu
an
do
il p
rob
lem
a r
isu
lta f
orm
ula
to i
n
man
iera
ric
ors
iva;
–esem
pio
(fa
tto
riale
di
un
nu
mero
natu
rale
n):
fatt
ori
ale
(n)
= 1
se n
= 0
n*f
att
ori
ale
(n-1
)
se n
> 0
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
fatt
(in
t n
){
if
(n =
= 0
) re
turn
1;
retu
rn n
* f
att
(n -
1);
} int
main
()
{co
ut
<<
"Il f
att
ori
ale
di 3 e
': "
<<
fatt
(3)
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
} Il f
att
ori
ale
di 3 e
': 6
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
236
7.9
Fu
nzio
ni
rico
rsiv
e (
II)
3re
turn
3*f
att(2
)
fatt(3
)
2re
turn
2*f
att(1
)
fatt(2
)
1re
turn
1*f
att(0
)
fatt(1
)
0re
turn
1
fatt(0
)
restitu
isce 1
restitu
isce 1
restitu
isce 2
restitu
isce 6
237

7.9
Fu
nzio
ni
rico
rsiv
e (
III)
Massim
o c
om
un
div
iso
re:
int
mcd
(in
t alf
a, in
t b
eta
)
{ if
(b
eta
==
0)
retu
rn a
lfa;
retu
rn m
cd
(beta
, alf
a %
beta
);
}
So
mm
a d
ei p
rim
i n
natu
rali:
int
so
mm
a(i
nt
n)
{ if
(n
==
0)
retu
rn 0
;
retu
rn n
+ s
om
ma(n
-1);
}
Reale
ele
vato
a u
n n
atu
rale
:
do
ub
le p
ot(
do
ub
le x
, in
t n
)
{
if (
n =
= 0
) re
turn
1;
retu
rn x
* p
ot(
x, n
-1);
}
Ele
men
ti d
ella s
eri
e d
i F
ibo
nacci:
int
fib
(in
t n
)
{ if
(n
==
1)
retu
rn 0
;
if (
n =
= 2
) re
turn
1;
retu
rn f
ib(n
-1)
+ f
ib(n
-2);
}
238
7.9
Fu
nzio
ni
rico
rsiv
e (
IV)
// L
eg
ge u
na p
aro
la t
erm
inata
da u
n p
un
to, e la s
cri
ve
// in
sen
so
in
vers
o.
Per
esem
pio
, "p
ipp
o"
div
en
ta
// "
op
pip
".
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id l
eg
giIn
vert
i()
{ch
ar
c;
cin
>>
c;
if (
c !
= '.')
{le
gg
iIn
vert
i();
co
ut
<<
c;
}} in
t m
ain
()
{le
gg
iIn
vert
i();
co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
} pip
po
.o
pp
ipP
rem
ere
un
tasto
per
co
nti
nu
are
. . .
239

7.9
Fu
nzio
ni
rico
rsiv
e (
V)
‘p’
c
leggiInvert
i()
cout <
< c
;
‘i’c
leggiInvert
i()
‘p’
c
leggiInvert
i()
‘p’
c
leggiInvert
i()
‘o’
c
leggiInvert
i()
‘.’
c
leggiInvert
i()
cout <
< c
;
cout <
< c
;
cout <
< c
;
oop
op
p
op
pi
op
pip
cout <
< c
;
240
7.9
Fu
nzio
ni
rico
rsiv
e (
VI)
Fo
rmu
lazio
ne r
ico
rsiv
a d
i u
na f
un
zio
ne:
–in
div
idu
azio
ne d
i u
no
o p
iù c
asi b
ase, n
ei q
uali
term
ina la s
uccessio
ne d
elle c
hia
mate
ric
ors
ive;
–d
efi
niz
ion
e d
i u
no
o, co
nd
izio
nata
men
te, d
i p
iù
passi ri
co
rsiv
i;
–ri
co
rsio
ne c
on
tro
llata
dal valo
re d
i u
n a
rgo
men
to d
i
co
ntr
ollo
, in
base a
l q
uale
si sceg
lie s
e s
i tr
att
a d
i
un
caso
base o
di u
n p
asso
ric
ors
ivo
;
–in
un
passo
ric
ors
ivo
, la
fu
nzio
ne v
ien
e c
hia
mata
nu
ovam
en
te p
assan
do
le u
n n
uo
vo
valo
re
dell’a
rgo
men
to d
i co
ntr
ollo
;
–il r
isu
ltato
di q
uesta
ch
iam
ata
, sp
esso
ult
eri
orm
en
te
ela
bo
rato
, vie
ne r
esti
tuit
o a
l ch
iam
an
te d
ell’ista
nza
co
rren
te;
–n
ei casi b
ase, il r
isu
ltato
vie
ne c
alc
ola
to s
en
za a
ltre
ch
iam
ate
ric
ors
ive.
Sch
em
a d
i calc
olo
:
–p
ara
llelo
a q
uello
usato
nelle c
om
pu
tazio
ni
itera
tive.
241

7.9
Fu
nzio
ni
rico
rsiv
e (
VII
)
NO
TA
BE
NE
:
–o
gn
i fu
nzio
ne p
uò
essere
fo
rmu
lata
sia
in
man
iera
rico
rsiv
a c
he i
n m
an
iera
ite
rati
va;
–sp
esso
, la
fo
rmu
lazio
ne i
tera
tiva è
più
co
nven
ien
te,
in
term
ini
di te
mp
o d
i esecu
zio
ne e
di
occu
pazio
ne d
i
mem
ori
a.
–in
div
ers
i casi
è p
iù a
gevo
le (
per
il p
rog
ram
mato
re)
esp
rim
ere
un
pro
ced
imen
to d
i calc
olo
in
man
iera
rico
rsiv
a;
–q
uesto
pu
ò r
ifle
tters
i in
un
a m
ag
gio
re c
on
cis
ion
e e
ch
iare
zza d
el
pro
gra
mm
a,
e q
uin
di
un
a m
ino
re
pro
bab
ilit
à d
i co
mm
ett
ere
err
ori
.
242
7.9
Fu
nzio
ni
rico
rsiv
e (
Esem
pio
)
Scri
vere
un
afu
nzio
ne
rico
rsiv
ach
esta
mp
isu
uscit
asta
nd
ard
un
tria
ng
olo
rett
an
go
loro
vescia
toco
mp
osto
di
aste
risch
i.I
du
ecate
tid
el
tria
ng
olo
co
nte
ng
on
olo
ste
sso
nu
mero
Nd
iaste
risch
i.N
ell’e
sem
pio
seg
uen
teN
=3.
* *
*
* *
*
243

7.9
Fu
nzio
ni
rico
rsiv
e (
Esem
pio
)
vo
idscri
vi(
int
n)
{if
(n=
=0)
retu
rn;
for
(in
ti=
0;
i<n
;i+
+)
co
ut
<<
'*';
co
ut
<<
en
dl;
scri
vi(
n-1
);}
244
3.1
1 L
ibre
rie
Lib
reri
a:
•in
sie
me d
i fu
nzio
ni (s
ott
op
rog
ram
mi)
pre
co
mp
ilate
;
•fo
rmata
da c
op
pie
di fi
le;
•p
er
og
ni co
pp
ia u
n f
ile c
on
tien
e a
lcu
ni
so
tto
pro
gra
mm
i co
mp
ilati
ed
un
o c
on
tien
e le
dic
hia
razio
ni d
ei so
tto
pro
gra
mm
i ste
ssi
(qu
est’
ult
imo
è d
ett
o f
ile d
i in
testa
zio
ne e
il su
o
no
me t
erm
ina t
ipic
am
en
te c
on
l'e
ste
nsio
ne h
).
Uti
lizzo
di fu
nzio
ni d
i lib
reri
a:
•n
ella f
ase d
i scri
ttu
ra d
el p
rog
ram
ma, in
clu
dere
il
file
di in
testa
zio
ne d
ella lib
reri
a u
san
do
la d
irett
iva
#in
clu
de;
•n
ella f
ase d
i co
lleg
am
en
to, sp
ecif
icare
la lib
reri
a d
a
usare
, seco
nd
o le c
on
ven
zio
ni
dell’a
mb
ien
te d
i svilu
pp
o u
tilizzato
.
Esem
pio
:
•p
rog
ram
ma c
on
ten
uto
nel fi
le m
iop
rog
.cp
p, ch
e u
sa
delle f
un
zio
ni d
ella lib
reri
a m
ate
mati
ca;
•d
eve c
on
ten
ere
la d
irett
iva:
#in
clu
de <
cm
ath
>
•A
lcu
ne lib
reri
e C
++
so
no
dis
po
nib
ili in
tu
tte le
imp
lem
en
tazio
ni e c
on
ten
go
no
gli s
tessi
so
tto
pro
gra
mm
i.
245

3.1
1 L
ibre
ria s
tan
dard
cstd
lib
•ab
s(n
)valo
re a
sso
luto
di n
;
•ra
nd
()in
tero
pseu
do
casu
ale
co
mp
reso
fra
0 e
la
co
sta
nte
pre
defi
nit
a R
AN
D_
MA
X;
•sra
nd
(n)
iniz
ializza la f
un
zio
ne
ran
d()
.
ccty
pe
Resti
tuis
co
no
un
valo
re b
oo
lean
o
•is
aln
um
(c)
lett
era
o c
ifra
;
•is
alp
ha(c
)le
ttera
;
•is
dig
it(c
)cif
ra;
•is
low
er(
c)
lett
era
min
usco
la;
•is
pri
nt(
c)
cara
ttere
sta
mp
ab
ile, co
mp
reso
lo
sp
azio
;
•is
sp
ace(c
)sp
azio
, salt
o p
ag
ina, n
uo
va r
iga,
rito
rno
carr
ello
, ta
bu
lazio
ne
ori
zzo
nta
le, ta
bu
lazio
ne v
ert
icale
;
•is
up
per(
c)
lett
era
maiu
sco
la;
246
3.1
1 L
ibre
ria s
tan
dard
cm
ath
•fu
nzio
ni tr
igo
no
metr
ich
e (
x è
un
do
ub
le)
–sin
(x)
sen
o d
i x;
–co
s(x
)co
sen
o d
i x;
–ta
n(x
)ta
ng
en
te d
i x;
–asin
(x)
arc
osen
o d
i x;
–aco
s(x
)arc
oco
sen
o d
i x
–ata
n(x
)arc
ota
ng
en
te d
i x
•fu
nzio
ni esp
on
en
zia
li e
lo
gari
tmic
he
–exp
(x)
eele
vato
alla x
;
–lo
g(x
)lo
gari
tmo
in
base e
di x;
–lo
g10(x
) lo
gari
tmo
in
base 1
0 d
i x;
•alt
re f
un
zio
ni (a
nch
e y
è u
n d
ou
ble
)
–fa
bs(x
)valo
re a
sso
luto
di x;
–ceil(x
)m
inim
o in
tero
mag
gio
re o
ug
uale
a x
;
–fl
oo
r(x)
massim
o in
tero
min
ore
o
ug
uale
a x
;
–p
ow
(x, y)
x e
levato
alla y
;
–sq
rt(x
)ra
dic
e q
uad
rata
di x;
247

8.1
Tip
i d
eri
vati
Tip
i fo
nd
am
en
tali:
•d
a q
uesti
si p
osso
no
deri
vare
alt
ri t
ipi;
•d
al t
ipo
in
tsi d
eri
va i
l ti
po
pu
nta
tore
a in
t.
–vari
ab
ile a
pp
art
en
en
te a
qu
esto
tip
o:
pu
ò
assu
mere
co
me v
alo
ri i
nd
iriz
zi d
i in
teri
.
•d
al ti
po
in
tsi d
eri
va i
l ti
po
arr
ay d
i 4 in
t:
–vari
ab
ile a
pp
art
en
en
te a
qu
esto
tip
o:
pu
ò
assu
mere
co
me v
alo
ri 4
in
teri
.
Meccan
ism
i d
i d
eri
vazio
ne:
•p
osso
no
essere
co
mp
osti
fra
di lo
ro, p
erm
ett
en
do
la
defi
niz
ion
e d
i ti
pi d
eri
vati
arb
itra
riam
en
te c
om
ple
ssi;
•p
ren
den
do
gli in
teri
co
me b
ase, si p
osso
no
defi
nir
e
arr
ay d
i p
un
tato
ri a
in
teri
, p
un
tato
ri a
d a
rray d
i in
teri
, arr
ay d
i arr
ay d
i in
teri
, eccete
ra.
Tip
i d
eri
vati
:
–ri
feri
men
ti;
–p
un
tato
ri;
–arr
ay;
–str
utt
ure
;
–u
nio
ni;
–cla
ssi.
248
8.2
Rif
eri
men
ti(I
)
Rif
eri
men
to:
–id
en
tifi
cato
re c
he in
div
idu
a u
n o
gg
ett
o;
–ri
feri
men
to d
efa
ult
: il n
om
e d
i u
n o
gg
ett
o,
qu
an
do
qu
esto
è u
n id
en
tifi
cato
re.
–o
ltre
a q
uello
defa
ult
, si p
osso
no
defi
nir
e a
ltri
rife
rim
en
ti d
i u
n o
gg
ett
o (
sin
on
imi o
alias).
Tip
o r
iferi
men
to:
–p
ossib
ili id
en
tifi
cato
ri d
i o
gg
ett
i d
i u
n d
ato
tip
o
(il ti
po
dell’o
gg
ett
o d
ete
rmin
a il ti
po
del
rife
rim
en
to).
Dic
hia
razio
ne d
i u
n t
ipo
rif
eri
men
to e
defi
niz
ion
e d
i u
n
rife
rim
en
to s
on
o c
on
testu
ali.
Sin
tassi:
basic
-refe
ren
ce-d
efi
nit
ion
refe
ren
ce-t
yp
e-i
nd
icato
r i
den
tifi
er
refe
ren
ce-i
nit
iali
zer|
op
t
refe
ren
ce-t
yp
e-i
nd
icato
r
typ
e-i
nd
icato
r &
refe
ren
ce-i
nit
iali
zer
=o
bje
ct-
nam
e
–in
dic
ato
re d
i ti
po
:
•sp
ecific
a tip
o d
ell’
ogg
ett
o r
iferito
;N
on
si p
osso
no
defi
nir
eri
feri
men
ti d
iri
feri
men
ti.
249

8.2
Rif
eri
men
ti(I
I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t i =
10;
int
&r
= i;
int
&s =
r;
//in
t &
s;
ER
RO
RE
, deve e
ssere
sem
pre
iniz
.//
int
&s =
10;
E
RR
OR
Eco
ut
<<
i <
< '\t
' <
< r
<<
'\t
' <
< s
<<
en
dl;
// 1
010 1
0r+
+;
co
ut
<<
i <
< '\t
' <
< r
<<
'\t
' <
< s
<<
en
dl;
// 1
111 1
1
int
h =
0, k =
1;
int
&r1
= h
, &
r2 =
k;
// d
ue r
iferim
enti
int
&r3
= h
, r4
;// u
n r
iferim
ento
ed u
n inte
ro
syste
m("
PA
US
E");
retu
rn 0
;
} 10 10
10
11 11
11
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
1 0 10
112
116
120
i, r, s
h,r
1,r
3
k,r
2
250
8.2
.1R
iferi
men
tico
nst
(I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t i =
1;
co
nst
int
&r
= i;
// N
ota
re: i non è
costa
nte
int
j =
10;
j =
r;
// O
Kco
ut
<<
j <
< e
nd
l;// 1
//r
= 1
;E
RR
OR
E!
i++
;co
nst
int
k =
10;
co
nst
int
&t
= k
;// O
Kco
ut
<<
t <
< e
nd
l;// 1
0//
int
&tt
= k
;E
RR
OR
E!
syste
m("
PA
US
E");
retu
rn 0
;
} 1 10
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
10
10 1
112
116
120
i, r
jk, t
251

8.2
.2R
iferi
men
ti c
om
e a
rgo
men
ti(I
)
// S
cam
bia
in
teri
(E
RR
AT
O)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id s
cam
bia
(in
t a, in
t b
) {
// s
cam
bia
gli
arg
om
enti a
ttuali
int
c =
a;
a =
b;
b =
c;
} int
main
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
// E
sem
pio
: 2
3scam
bia
(i, j);
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 2
3syste
m("
PA
US
E");
retu
rn 0
;
}
3 2 3 2
96
100
116
120
ijab2 3 3 2
96
100
116
120
ijab
Ista
nza (
scam
bia
)Is
tanza (
scam
bia
)
Ista
nza (
main
)Is
tanza (
main
) 252
8.2
.2R
iferi
men
ti c
om
e a
rgo
men
ti(I
I)
Arg
om
en
to d
i u
na f
un
zio
ne:
–p
uò
essere
di u
n t
ipo
rif
eri
men
to;
–in
qu
esto
caso
:
•l’a
rgom
ento
form
ale
corr
isp
onde a
un
conte
nitore
senza nom
e,
che h
a p
er
valo
re il
rife
rim
ento
;
•nel corp
o d
ella
funzio
ne, ogni op
era
zio
ne c
he
coin
volg
e l’a
rgom
ento
form
ale
agis
ce
sull’
entità
riferita
.
Ch
iam
ata
della f
un
zio
ne:
–il r
iferi
men
to a
rgo
men
to f
orm
ale
vie
ne
iniz
ializzato
co
n u
n r
iferi
men
to d
el
co
rris
po
nd
en
te a
rgo
men
to a
ttu
ale
;
Arg
om
en
ti r
iferi
men
to:
–d
evo
no
essere
uti
lizzati
qu
an
do
l’e
nti
tà a
ttu
ale
pu
ò e
ssere
mo
dif
icata
.
In s
inte
si:
–la
fu
nzio
ne a
gis
ce s
ulle e
nti
tà r
iferi
te d
ag
li
arg
om
en
ti a
ttu
ali.
253

8.2
.2R
iferi
men
ti c
om
e a
rgo
men
ti (
III)
// S
cam
bia
in
teri
(tr
asm
issio
ne m
ed
ian
te r
iferi
men
ti)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id s
cam
bia
(in
t &
a, in
t &
b)
{// s
cam
bia
i v
alo
ri d
egli
oggetti rife
riti
int
c =
a;
a =
b;
b =
c;
} int
main
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
// E
sem
pio
: 2
3scam
bia
(i,
j);
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 3
2syste
m("
PA
US
E");
retu
rn 0
;
}
rife
r j
rife
r i
3 2
96
100
116
120
ijabrife
r j
rife
r i
2 3
96
100
116
120
ijab
Ista
nza (
scam
bia
)Is
tanza (
scam
bia
)
Ista
nza (
main
)Is
tanza (
main
) 254
8.2
.3R
iferi
men
ti c
on
st
co
me a
rgo
men
ti (
I)
// C
alc
olo
dell’in
tere
sse
(tra
sm
issio
ne m
ed
ian
te//
rif
eri
men
ti d
i o
gg
ett
i co
sta
nti
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
flo
at
inte
resse(i
nt
imp
ort
o, co
nst
flo
at&
rate
o)
{fl
oat
inte
r =
rate
o*i
mp
ort
o;
//O
K//
rate
o+
= 0
.5;
ER
RO
RE
!re
turn
in
ter;
} int
main
(){
co
ut
<<
"In
tere
sse :
" <
< in
tere
sse(1
000,1
.2)
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} In
tere
sse :
1200
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
255

8.2
.2R
iferi
men
ti r
isu
ltato
di
fun
zio
ne (
I)
// R
iferi
men
ti c
om
e v
alo
ri r
esti
tuit
i (i
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int&
massim
o(i
nt
&a, in
t &
b)
{re
turn
a >
b ?
a :
b;
} int
main
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
// E
sem
pio
: 1 3
co
ut
<<
"V
alo
re m
assim
o "
;co
ut
<<
massim
o(i
, j)
<<
en
dl;
massim
o(i
, j)
= 5
;co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 1 5
massim
o(i
, j)
++
;
// l-v
alu
eco
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 1 6
syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci d
ue in
teri
:1 3
Valo
re m
assim
o 3
1 5
1 6
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
256
8.2
.2R
iferi
men
ti r
isu
ltato
di
fun
zio
ni
(II)
// R
iferi
men
tico
me v
alo
ri r
esti
tuit
i (i
i)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int&
massim
o(i
nt
&a, in
t &
b)
{in
t &
p =
a >
b ?
a :
b;
retu
rn p
;// O
K. R
estitu
isce u
n r
iferim
ento
} //~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~//
//
Rif
eri
men
tico
me v
alo
ri r
esti
tuit
i (i
ii)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int&
massim
o(i
nt
a, in
t b
) {
retu
rn a
> b
? a
: b
;// E
RR
OR
E. R
iferim
ento
ad u
n a
rgom
ento
attuale
che
// v
iene d
istr
utto
} NO
TA
BE
NE
: l’err
ore
no
n è
seg
nala
to d
al co
mp
ilato
re.
257

8.2
.3R
iferi
men
ti r
isu
ltato
di
fun
zio
ni
(III
)
// R
iferi
men
tico
nst
co
me v
alo
ri r
esti
tuit
i (i
ii)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
co
nst
int&
massim
o(c
on
st
int&
a, co
nst
int&
b)
{ re
turn
a >
b ?
a :
b;
} int
main
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
co
ut
<<
"V
alo
re m
assim
o "
;co
ut
<<
massim
o(i
, j)
<<
en
dl;
//m
assim
o(i
, j)
= 5
;
ER
RO
RE
syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci d
ue in
teri
:1 3
Valo
re m
assim
o 3
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
258
8.2
.3R
iferi
men
ti (I
V)
Arg
om
en
to f
orm
ale
di u
na f
un
zio
ne e
ris
ult
ato
pro
do
tto
d
a u
na f
un
zio
ne:
–p
osso
no
essere
rif
eri
men
ti c
on
l’a
ttri
bu
to c
on
st.
Arg
om
en
to f
orm
ale
co
n l'a
ttri
bu
to c
on
st:
–p
uò
avere
co
me c
orr
isp
on
den
te u
n a
rgo
men
to
att
uale
sen
za t
ale
att
rib
uto
, m
a n
on
è l
ecit
o i
l
co
ntr
ari
o.
Ris
ult
ato
co
n l'a
ttri
bu
to c
on
st:
–u
na i
str
uzio
ne r
etu
rnp
uò
co
nte
nere
un
'esp
ressio
ne s
en
za t
ale
att
rib
uto
, m
a n
on
è
lecit
o i
l co
ntr
ari
o.
Op
era
tore
co
nst_
cast:
–co
nvert
eu
n r
iferi
men
to c
on
st
in u
n r
iferi
men
to
no
n c
on
st.
259

8.2
.3R
iferi
men
ti (V
)
//R
iferi
men
ti c
om
e v
alo
ri r
esti
tuit
i (i
)#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int&
massim
o(c
on
st
int
&a, co
nst
int
&b
){
retu
rn c
on
st_
cast<
int&
>(
a >
b ?
a :
b);
} //E
RR
AT
O//in
t& m
assim
oE
rrato
(const in
t& a
, const in
t& b
)//{
// re
turn
a >
b ?
a : b
;//}
int
main
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
// E
sem
pio
: 1 3
co
ut
<<
"V
alo
re m
assim
o "
;co
ut
<<
massim
o(i
, j)
<<
en
dl;
massim
o(i
, j)
= 5
;
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;//
Esem
pio
: 1
5
syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci d
ue in
teri
:1 3
Valo
re m
assim
o 3
1 5
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
260
8.2
.3 R
iferi
men
ti (V
I)
Esem
pio
:
–il
ris
ult
ato
dell
a f
un
zio
ne è
di
tip
o in
t&;
–n
ell
a i
str
uzio
ne r
etu
rnco
mp
are
un
rif
eri
men
to
co
nst;
–si
ren
de o
pp
ort
un
a u
na c
on
vers
ion
e e
sp
licit
a d
i
tip
o:
int&
maxr1
(co
nst
int&
ra, co
nst
int&
rb
){
if (
ra >
= r
b)
retu
rn c
on
st_
cast<
int&
>(
ra);
retu
rn c
on
st_
cast<
int&
>(
rb);
} co
nst
int&
maxr1
(co
nst
int&
ra, co
nst
int&
rb
){
if (
ra >
= r
b)
retu
rn c
on
st_
cast<
int&
>(
ra);
retu
rn r
b;
}
261

8.3
Pu
nta
tori
(I)
Pu
nta
tore
:•
og
gett
o il cu
i valo
re r
ap
pre
sen
ta l'in
dir
izzo
di u
n
alt
ro o
gg
ett
o o
di u
na f
un
zio
ne.
Tip
o p
un
tato
re:
•in
sie
me d
i valo
ri:
ind
iriz
zi d
i o
gg
ett
i o
di fu
nzio
ni d
i u
n d
ato
tip
o (
il t
ipo
dell’o
gg
ett
o o
della f
un
zio
ne
dete
rmin
a il ti
po
del p
un
tato
re).
Dic
hia
razio
ne d
i u
n t
ipo
pu
nta
tore
e d
efi
niz
ion
e d
i u
n
pu
nta
tore
so
no
co
nte
stu
ali.
// D
efi
niz
ion
e d
i p
un
tato
ri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t *p
1;
// p
unta
tore
a inte
riin
t* p
2;
int
* p
3;
int
*p4, *p
5;
// d
ue p
unta
tori
int
*p6, i1
;// u
n p
unta
tore
ed u
n inte
roin
t i2
, *p
7;
// u
n inte
ro e
d u
n p
unta
tore
syste
m("
PA
US
E");
retu
rn 0
;
}
262
8.3
Pu
nta
tori
(II
)
128903789
120
1
100
104
108
112
116
120
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t i =
1;
int
*p1 =
&i;
// o
pera
tore
indiriz
zo
int
*p2;
K}
ip1
p2
Indiriz
zo
casuale 2
63

8.3
Pu
nta
tori
(II
I)
// O
pera
tore
ind
iriz
zo
e o
pera
tore
di in
dir
ezio
ne
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t i =
1;
int
*p1 =
&i;
// o
pera
tore
indiriz
zo
*p1 =
10;
// o
pera
tore
di in
direzio
ne
// r
estitu
isce u
n l-v
alu
ein
t *p
2 =
p1;
// D
ue p
unta
tori a
llo s
tesso o
ggetto
co
ut
<<
i <
< '\t
'<<
*p
1 <
< '\t
' <
< *
p2 <
< e
nd
l;
*p2 =
20;
co
ut
<<
i <
< '\t
'<<
*p
1 <
< '\t
' <
< *
p2 <
< e
nd
l;
co
ut
<<
p1 <
< '\t
' <
< p
2 <
< e
nd
l;
//p
2 =
*p
1;
// E
RR
OR
E: assegna u
n int ad u
n p
unt.
//*p
2 =
p1
// E
RR
OR
E: assegna u
n p
unt. a
d u
n int.
int
*p3;
*p3 =
2;
// A
TT
EN
ZIO
NE
: punta
tore
non iniz
.
syste
m("
PA
US
E");
retu
rn 0
;
} 10 10 10
20 20 20
0x22ff
6c 0x22ff
6c
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
264
8.3
Pu
nta
tori
(IV
)
// P
un
tato
ri a
llo
ste
sso
og
gett
o
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{ch
ar
a, b
;ch
ar
*p =
&a, *q
= &
b;
co
ut
<<
"In
seri
sci d
ue c
ara
tteri
" <
< e
nd
l;cin
>>
a >
> b
;// E
sem
pio
: 'a
''b
'*p
= *
q;
co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
// E
sem
pio
: 'b
''b
'co
ut
<<
*p
<<
'\t
' <
< *
q <
< e
nd
l;// E
sem
pio
: 'b
''b
'
co
ut
<<
"In
seri
sci d
ue c
ara
tteri
" <
< e
nd
l;cin
>>
a >
> b
;// E
sem
pio
: 'c
''f'
p =
q;
co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
// E
sem
pio
: 'c
''f'
co
ut
<<
*p
<<
'\t
' <
< *
q <
< e
nd
l;// E
sem
pio
: 'f'
'f'
syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci d
ue c
ara
tteri
ab
b b
b b
Inseri
sci d
ue c
ara
tteri
cf
c f
f f
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
265

8.3
Pu
nta
tori
(V
)
// P
un
tato
ri a
co
sta
nti
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t i =
0;
co
nst
int
*p;
// N
essuna iniz
ializ
zazio
ne
p =
&i;
// O
K// N
.B.: i n
on e
` costa
nte
int
j;j
= *
p;
// O
K//
*p =
1;
// E
RR
OR
E! Il v
alo
re d
i inon p
uo’
// e
ssere
modific
ato
attra
vers
o p
co
nst
int
k =
10;
co
nst
int
*q =
&k;
// O
K
int
;//
= &
k;
// E
RR
OR
E! in
t* =
const in
t*//
= q
;
// E
RR
OR
E! in
t* =
const in
t*
syste
m("
PA
US
E");
retu
rn 0
;
}
266
8.3
Pu
nta
tori
(V
I)
// P
un
tato
ri c
osta
nti
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{ch
ar
c =
'a';
ch
ar
*co
nst
p =
&c;
// S
em
pre
iniz
ializ
zato
co
ut
<<
*p
<<
en
dl;
// 'a'
*p =
'b
';co
ut
<<
*p
<<
en
dl;
// 'b'
ch
ar
d =
'c';
//p
= &
d;
// E
RR
OR
E!
ch
ar
*p1, *c
on
st
p2 =
&d
;p
1 =
p;
co
ut
<<
*p
1 <
< e
nd
l;// 'b'
//
p =
p1;
// E
RR
OR
E//
p =
p2;
// E
RR
OR
E!
syste
m("
PA
US
E");
retu
rn 0
;
} a b b Pre
mere
un
tasto
per
co
nti
nu
are
. . .
267

8.3
Pu
nta
tori
(V
II)
// P
un
tato
re a
pu
nta
tore
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t i =
1, j
= 1
0;
int
*pi =
&i, *
pj
= &
j;in
t **
q1 =
&p
i;co
ut
<<
**q
1 <
< e
nd
l;
// 1
*q1 =
pj;
co
ut
<<
**q
1 <
< e
nd
l;
// 1
0
int
**q
2;
*q2 =
pj;
// A
TT
EN
ZIO
NE
: nessun o
ggetto p
unta
to
syste
m("
PA
US
E");
retu
rn 0
;
} 1 10
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
268
8.3
Pu
nta
tori
(V
III)
// P
un
tato
ri n
ulli
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t *p
= N
UL
L;
// form
a e
quiv
ale
nte
: in
t *p
= 0
;
*p =
1;
// E
RR
OR
E IN
ES
EC
UZ
ION
E!
if (
p =
= N
UL
L)
co
ut
<<
"P
un
tato
re n
ullo
" <
< e
nd
l;if
(p
==
0)
co
ut
<<
"P
un
tato
re n
ullo
" <
< e
nd
l;if
(!p
) co
ut
<<
"P
un
tato
re n
ullo
" <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
;
}
269

8.3
Op
era
zio
ni
su
i p
un
tato
ri (
I)
Op
era
zio
ni p
ossib
ili:
•asseg
nam
en
to d
i u
n’e
sp
ressio
ne c
he p
rod
uce u
n
valo
re i
nd
iriz
zo
ad
un
pu
nta
tore
;
•u
so
di u
n p
un
tato
re p
er
rife
rirs
i all'o
gg
ett
o p
un
tato
;
•co
nfr
on
to f
ra p
un
tato
ri m
ed
ian
te g
li o
pera
tori
‘=
=’ e
‘!=
’;
•S
tam
pa s
u u
scit
a s
tan
dard
uti
lizzan
do
l’o
pera
tore
di
uscit
a ‘<
<‘. In
qu
esto
caso
, vie
ne s
tam
pato
il valo
re
in e
sad
ecim
ale
del p
un
tato
re o
ssia
l’in
dir
izzo
d
ell’o
gg
ett
o p
un
tato
.
Un
pu
nta
tore
pu
ò c
osti
tuir
e u
n a
rgo
men
to d
i u
na
fun
zio
ne:
•n
el co
rpo
della f
un
zio
ne, p
er
mezzo
di in
dir
ezio
ni, s
i p
osso
no
mo
dif
icare
gli o
gg
ett
i p
un
tati
.
270
8.3
.4P
un
tato
ri c
om
e a
rgo
men
ti(I
)
// S
cam
bia
in
teri
(E
RR
AT
O)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id s
cam
bia
(in
t a, in
t b
) {
// s
cam
bia
gli
arg
om
enti a
ttuali
int
c =
a;
a =
b;
b =
c;
} int
main
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
// E
sem
pio
: 2
3scam
bia
(i, j);
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 2
3syste
m("
PA
US
E");
retu
rn 0
;
}
3 2 3 2
96
100
116
120
ijab2 3 3 2
96
100
116
120
ijab
Ista
nza (
scam
bia
)Is
tanza (
scam
bia
)
Ista
nza (
main
)Is
tanza (
main
) 271

8.3
.4P
un
tato
ri c
om
e a
rgo
men
ti (
II)
// S
cam
bia
in
teri
(tr
asm
issio
ne m
ed
ian
te p
un
tato
ri)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id s
cam
bia
(in
t *a
, in
t *b
) {
// s
cam
bia
i v
alo
ri d
egli
oggetti punta
tiin
t c =
*a;
*a =
*b
;*b
= c
;} in
t m
ain
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
// E
sem
pio
: 2
3scam
bia
(&
i, &
j);
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 3
2syste
m("
PA
US
E");
retu
rn 0
;
}
116
120
3 2
96
100
116
120
ijab116
120
2 3
96
100
116
120
ijab
Ista
nza (
scam
bia
)Is
tanza (
scam
bia
)
Ista
nza (
main
)Is
tanza (
main
) 272
8.3
.4P
un
tato
ri c
om
e a
rgo
men
ti (
III)
// In
cre
men
ta il m
ag
gio
re t
ra d
ue in
teri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id i
ncre
men
ta(i
nt
*a, in
t *b
) {
if (
*a >
*b
)(*
a)+
+;
// A
TT
EN
ZIO
NE
*a+
+els
e (*b
)++
;} in
t m
ain
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
// E
sem
pio
: 2 3
incre
men
ta(&
i, &
j);
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 2 4
syste
m("
PA
US
E");
retu
rn 0
;
}
116
120
3 2
96
100
116
120
ijab116
120
4 2
96
100
116
120
ijab
Ista
nza (
incre
menta
)Is
tanza (
incre
menta
)
Ista
nza (
main
)Is
tanza (
main
)
273

8.3
.4P
un
tato
ri c
om
e r
isu
ltato
di
fun
zio
ni
(I)
// P
un
tato
rico
me v
alo
ri r
esti
tuit
i (i
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int*
massim
o(i
nt
*a, in
t *b
) {
retu
rn *
a >
*b
? a
: b
;} in
t m
ain
()
{in
t i, j;
co
ut
<<
"In
seri
sci d
ue in
teri
: " <
< e
nd
l;cin
>>
i >
> j;
// E
sem
pio
: 2 3
co
ut
<<
"V
alo
re m
assim
o "
;co
ut
<<
*m
assim
o(&
i, &
j) <
< e
nd
l;
*massim
o(&
i, &
j) =
5;
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 2 5
//m
assim
o(&
i, &
j)+
+;
// E
RR
OR
E: il
valo
re r
estitu
ito n
on e
' un l-v
alu
e
(*m
assim
o(&
i, &
j))+
+;
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// E
sem
pio
: 2 6
syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci d
ue in
teri
:2 3
Valo
re m
assim
o 3
2 5
2 6
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
274
8.3
.4P
un
tato
ri c
om
e r
isu
ltato
di
fun
zio
ni
(II)
// P
un
tato
ri c
om
e v
alo
ri r
esti
tuit
i (i
i)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int*
massim
o(i
nt
*a, in
t *b
) {
int
*p =
*a >
*b
? a
: b
;re
turn
p;
// R
estitu
isce u
n p
unta
tore
} //~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~//
//
Pu
nta
tori
co
me v
alo
ri r
esti
tuit
i (i
ii)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int*
massim
o(i
nt
*a, in
t *b
) {
int
i =
*a >
*b
? *
a :
*b
;re
turn
&i;
// A
TT
EN
ZIO
NE
: re
stitu
isce l'in
diriz
zo d
i una v
ariabile
// locale
// [W
arn
ing] addre
ss o
f lo
cal variable
'i'
retu
rned
}
275

8.3
.4P
un
tato
ri c
om
e a
rgo
men
ti c
osta
nti
(I)
// T
rasm
issio
ne d
ei p
ara
metr
i
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int*
massim
o(i
nt
*a, in
t *b
) {
retu
rn *
a >
*b
? a
: b
;} in
t m
ain
()
{in
t i =
2;
co
nst
int
N =
3;
co
ut
<<
"V
alo
re m
assim
o "
;co
ut
<<
*m
assim
o(&
i, &
N)
<<
en
dl;
// E
RR
OR
E: in
valid
convers
ion fro
m 'const in
t*' to
'in
t*'
syste
m("
PA
US
E");
retu
rn 0
;
}
276
8.3
.4P
un
tato
ri c
om
e a
rgo
men
ti c
osta
nti
(II
)
// T
rasm
issio
ne d
i p
ara
metr
i m
ed
ian
te p
un
tato
ri a
// c
osta
nti
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int*
massim
o(c
on
st
int
*a, co
nst
int
*b)
{re
turn
co
nst_
cast<
int*
> (
*a >
*b
? a
: b
);} /* in
t* m
assim
o(c
onst in
t *a
, const in
t *b
) {
retu
rn *
a >
*b ?
a : b
;// E
RR
OR
E: in
valid
convers
ion fro
m 'const in
t*' to
'in
t*'
} */ int
main
()
{in
t i =
2;
co
nst
int
N =
3;
co
ut
<<
"V
alo
re m
assim
o "
;co
ut
<<
*m
assim
o(&
i, &
N)
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
}
277

8.3
.4P
un
tato
ri c
om
e r
isu
ltato
di
fun
zio
ni
// P
un
tato
ri a
co
sta
nti
co
me v
alo
ri r
esti
tuit
i
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
co
nst
int*
massim
o(c
on
st
int
*a, co
nst
int
*b)
{re
turn
*a >
*b
? a
: b
;} in
t m
ain
()
{in
t i =
2;
co
nst
int
N =
3;
co
ut
<<
"V
alo
re m
assim
o "
;co
ut
<<
*m
assim
o(&
i, &
N)
<<
en
dl;
// in
t*p
1 =
m
assim
o(&
i, &
N);
ER
RO
RE
co
nst
int
*p2 =
massim
o(&
i, &
N);
//
*massim
o(&
i, &
N)
= 1
;
ER
RO
RE
syste
m("
PA
US
E");
retu
rn 0
;
} Valo
re m
assim
o 3
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
278
9.1
Tip
i e o
gg
ett
i arr
ay (
I)
Arr
ay d
i d
imen
sio
ne n
:•
n-u
pla
ord
inata
di ele
men
ti d
ello
ste
sso
tip
o, ai q
uali
ci si ri
feri
sce m
ed
ian
te u
n in
dic
e, ch
e r
ap
pre
sen
ta la
loro
po
siz
ion
e a
ll'in
tern
o d
ell’a
rray.
Tip
o d
ell’a
rray:
•d
ipen
de d
al ti
po
deg
li e
lem
en
ti.
Dic
hia
razio
ne d
i u
n t
ipo
arr
ay e
defi
niz
ion
e d
i u
n a
rray
so
no
co
nte
stu
ali.
// S
om
ma g
li e
lem
en
ti d
i u
n d
ato
vett
ore
di in
teri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{co
nst
int
N =
5;
int
v[N
];
// d
imensio
ne d
el vettore
costa
nte
co
ut
<<
"In
seri
sci 5 n
um
eri
in
teri
" <
< e
nd
l;fo
r (i
nt
i =
0;
i <
N;
i++
)cin
>>
v[i
];
// o
pera
tore
di sele
zio
ne c
on indic
ein
t s =
v[0
];// r
estitu
isce u
n l-v
alu
efo
r (i
nt
i =
1;
i <
N;
i++
)s +
= v
[i];
co
ut
<<
s <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci 5 n
um
eri
in
teri
1 2
3 4
515
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
279

9.1
Tip
i e o
gg
ett
i arr
ay (
II)
0 1 2 3 4
104
108
112
116
120
v[4
]
v[3
]
v[1
]
v[0
]
v[2
]
AT
TE
NZ
ION
E:
l’identificato
re d
ell’
arr
ay identifica
l’indiriz
zo d
el prim
o e
lem
ento
dell’
arr
ay
v =
&v[0
]
Nell’
esem
pio
, v =
104;
280
9.1
Tip
i e o
gg
ett
i arr
ay (
III)
// In
izia
lizzazio
ne d
eg
li a
rray
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{co
nst
int
N =
6;
int
a[]
= {
0, 1, 2, 3};
// a
rray d
i 4 e
lem
enti
int
b[N
] =
{0, 1, 2, 3};
// a
rray d
i N
ele
menti
co
ut
<<
"D
imen
sio
ni arr
ay:
";
co
ut
<<
siz
eo
f a <
< '\t
' <
< s
izeo
f b
<<
en
dl;
// 1
6 24
co
ut
<<
"N
um
ero
di ele
men
ti:
";
co
ut
<<
siz
eo
f a / s
izeo
f(in
t) <
< '\t
';// 4
co
ut
<<
siz
eo
f b
/ s
izeo
f(in
t) <
< e
nd
l;// 6
// E
RR
OR
E! N
ON
SE
GN
ALA
TO
IN
CO
MP
ILA
ZIO
NE
// N
essun c
ontr
ollo
sul valo
re d
egli
indic
i fo
r (i
nt
i =
0;
i <
N;
i++
)co
ut
<<
a[i
] <
< '\t
';co
ut
<<
en
dl;
for
(in
t i =
0;
i <
N;
i++
)co
ut
<<
b[i
] <
< '\t
';co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
} Dim
en
sio
ni arr
ay:
16 24
Nu
mero
di ele
men
ti:
4 6
0 1
2
3
3
7879712 2009179755
0 1
2
3
0
0
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
281

9.1
Tip
i e o
gg
ett
i arr
ay (
IV)
// A
TT
EN
ZIO
NE
: il D
EV
-C+
+ N
ON
SE
GU
E L
O S
TA
ND
AR
D//
Per
imp
orr
e il ri
sp
ett
o d
ello
sta
nd
ard
si d
eve u
sare
//
l’o
pzio
ne -
ped
an
tic-e
rro
rs.
// L
’op
zio
ne s
i p
uo
' in
seri
re s
ele
zio
nan
do
dal m
en
u’
// S
tru
men
ti, la
vo
ce "
Op
zio
ni d
i C
om
pilazio
ne“
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t n
= 2
;//
int
a[n
];
//E
RR
OR
E: num
ero
degli
ele
menti n
on c
osta
nte
syste
m("
PA
US
E");
retu
rn 0
;
} Il c
om
pilato
re u
sato
sen
za l’o
pzio
ne -
ped
an
tic-e
rro
rs
no
n s
eg
nala
l’e
rro
re.
Il c
od
ice s
cri
tto
no
n è
co
mu
nq
ue p
ort
ab
ile (
un
alt
ro
co
mp
ilato
re p
otr
eb
be n
on
co
mp
ilarl
o).
282
9.1
Tip
i e o
gg
ett
i arr
ay (
V)
// O
pera
zio
ni su
gli a
rray. N
ON
SO
NO
PE
RM
ES
SE
//
OP
ER
AZ
ION
I A
RIT
ME
TIC
HE
, D
I C
ON
FR
ON
TO
, D
I //
AS
SE
GN
AM
EN
TO
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{co
nst
int
N =
5;
int
u[N
] =
{0, 1, 2, 3, 4},
v[N
] =
{5, 6, 7, 8, 9};
//v =
u;
ER
RO
RE
: assegnam
ento
non p
erm
esso
co
ut
<<
"In
d. v:"
<<
v <
< "
\t In
d. u
: " <
< u
<<
en
dl;
if (
v =
= u
) // A
ttenzio
ne c
onfr
onta
gli
indiriz
zi
co
ut
<<
"A
rray u
gu
ali "
<<
en
dl;
els
e co
ut
<<
"A
rray d
ivers
i " <
< e
nd
l;if
(v >
u)
// o
pera
tori d
i confr
onto
agis
cono
sugli
indiriz
zi
co
ut
<<
"In
dir
izzo
v >
u "
<<
en
dl;
els
e co
ut
<<
"In
dir
izzo
v <
=u
" <
< e
nd
l;
// v
+ u
;opera
tori a
ritm
etici non d
efiniti
syste
m("
PA
US
E");
retu
rn 0
;
} Ind
. v:0
x22ff
18
Ind
. u
: 0x22ff
38
Arr
ay d
ivers
iIn
dir
izzo
v <
=u
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
283

// A
ritm
eti
ca d
ei p
un
tato
ri
Perm
ett
e d
i calc
ola
re in
dir
izzi co
n la r
eg
ola
seg
uen
te:
•se
l'esp
ressio
ne
pra
pp
resen
tau
nvalo
rein
dir
izzo
di
un
og
gett
od
iti
po
T,
allo
ral'esp
ressio
ne
(p+
1)
rap
pre
sen
tal'in
dir
izzo
di
un
og
gett
o,
sem
pre
di
tip
oT
,ch
esitr
ova
co
nsecu
tivam
en
tein
mem
ori
a.
In g
en
era
le:
•se
iè
un
inte
ro,
allo
ral'esp
ressio
ne
(p+
i)ra
pp
resen
tal'in
dir
izzo
di
un
og
gett
o,
sem
pre
di
tip
oT
,ch
esitr
ova
inm
em
ori
a,d
op
oip
osiz
ion
i.
No
ta:
•S
el'esp
ressio
ne
ph
aco
me
valo
read
dr
ese
To
ccu
pa
nlo
cazio
ni
di
me
mo
ria,
l'esp
ressio
ne
p+
ih
aco
me
valo
read
dr+
n*i
.
Ari
tmeti
ca d
ei p
un
tato
ri:
•si
uti
lizza
qu
an
do
si
han
no
deg
lio
gg
ett
id
ello
ste
sso
tip
oin
po
siz
ion
iad
iacen
tiin
mem
ori
a(a
rray).
8.3
.3 A
rray e
pu
nta
tori
(I)
p
(p+
1)
284
8.3
.3 A
rray e
pu
nta
tori
(II
)
// A
ritm
eti
ca d
ei p
un
tato
ri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t v[4
];
int
*p =
v;
// v
<=
> &
v[0
]
*p =
1;
*(p
+ 1
) =
10;
p +
= 3
;*(
p -
1)
= 1
00;
*p =
1000;
p =
v;
co
ut
<<
"v["
<<
4 <
< "
] =
[" <
< *
p;
for
(in
t i =
1;
i <
4;
i++
)co
ut
<<
'\t'
<<
*(p
+ i);
// v[4
] =
[1 1
0 1
00 1
000]
co
ut
<<
']'
<<
en
dl;
co
ut
<<
p +
1 -
p <
< e
nd
l;// 1
aritm
etica d
ei punta
tori
co
ut
<<
in
t(p
+ 1
) -
int(
p)
<<
en
dl;
// 4
(byte
)
ch
ar
c[5
];ch
ar*
q =
c;
co
ut
<<
in
t(q
+ 1
) -
int(
q)
<<
en
dl;
// 1
(byte
)
int*
p1 =
&v[1
];in
t* p
2 =
&v[2
];co
ut
<<
p2 -
p1 <
< e
nd
l;// 1
(ele
menti)
co
ut
<<
in
t(p
2)
-in
t(p
1)
<<
en
dl;
// 4
(byte
)syste
m("
PA
US
E");
retu
rn 0
;
}
285

8.3
.3 A
rray e
pu
nta
tori
(II
I)
// In
izia
lizza a
1
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{co
nst
int
N =
5;
int
v[N
];
int
*p =
v;
wh
ile (
p <
= &
v[N
-1])
*p+
+ =
1;
// *
(p+
+)
p =
v;
co
ut
<<
"v["
<<
N <
< "
] =
[" <
< *
p;
for
(in
t i =
1;
i <
N;
i++
)co
ut
<<
'\t'
<<
*(p
+ i);
// v
[5] =
[1 1
1 1
1]
co
ut
<<
']'
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
} v[5
] =
[1 1
1
1
1
]P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
286
9.2
Arr
ay m
ult
idim
en
sio
nali
(I)
// L
eg
ge e
scri
ve g
li e
lem
en
ti d
i u
na m
atr
ice d
i R
rig
he
// e
C c
olo
nn
e
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{co
nst
int
R =
2;
co
nst
int
C =
3;
int
m[R
][C
];
co
ut
<<
"In
seri
sci g
li e
lem
en
ti d
ella m
atr
ice" <
< e
nd
l;fo
r (i
nt
i =
0;
i <
R;
i++
)fo
r (i
nt
j =
0;
j <
C;
j++
)cin
>>
m[i
][j]
;
// 1
2 3
4 5
6
int*
p =
&m
[0][
0];
// a
nche: m
[0]
for
(in
t i =
0;
i <
R;
i++
){
// m
em
orizzazio
ne p
er
righe
for
(in
t j
= 0
; j
< C
; j+
+)
co
ut
<<
*(p
+ i*C
+ j)
<<
'\t
';co
ut
<<
en
dl;
} syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci g
li e
lem
en
ti d
ella m
atr
ice
1 2
3 4
5 6
1 2
3
4 5
6
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
1 2 3 4 5
104
108
112
116
120
m[0
][0]
m[0
][1]
m[0
][2]
m[1
][0]
m[1
][1]
m[1
][2]
6124
287

9.2
Arr
ay m
ult
idim
en
sio
nali
(II
)
// In
izia
lizzazio
ne d
i vett
ori
mu
ltid
imen
sio
nali
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t m
1[2
][3]
= {
1, 2, 3, 4, 5, 6};
// a
nche: in
t m
1[][3
]co
ut
<<
"M
atr
ice m
1 "
<<
en
dl;
for
(in
t i =
0;
i <
2;
i++
) {
for
(in
t j
= 0
; j
< 3
; j+
+)
co
ut
<<
m1[i
][j]
<<
'\t
';co
ut
<<
en
dl;
} int
m2[3
][3]
= {
{0, 1, 2},
{10, 11},
{100, 101, 102}}
;// a
nche: in
t m
2[][3
]. N
.B.: m
2[1
][2] in
izia
lizzato
a 0
co
ut
<<
"M
atr
ice m
2 "
<<
en
dl;
for
(in
t i =
0;
i <
3;
i++
) {
for
(in
t j
= 0
; j
< 3
; j+
+)
co
ut
<<
m2[i
][j]
<<
'\t
';co
ut
<<
en
dl;
} syste
m("
PA
US
E");
retu
rn 0
;
} Matr
ice m
11 2
3
4 5
6
Matr
ice m
20 1
2
10 11 0
100 1
01 1
02
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
288
9.4
Arr
ay c
om
e a
rgo
men
ti d
i fu
nzio
ni
(I)
// S
om
ma g
li e
lem
en
ti d
i u
n d
ato
vett
ore
di in
teri
(i)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
so
mm
a(i
nt
v[4
])// L
a d
imensio
ne n
on h
a s
ignific
ato
{// a
nche: (int v[])
// X
v[] <
=>
X *
vin
t s =
0;
for
(in
t i =
0;
i <
4;
i++
)s +
= v
[i];
retu
rn s
;} in
t m
ain
()
{in
t vett
[] =
{10, 11, 12, 13};
co
ut
<<
"L
a s
om
ma d
eg
li e
lem
en
ti e
': "
;co
ut
<<
so
mm
a(v
ett
) <
< e
nd
l;// 4
6syste
m("
PA
US
E");
retu
rn 0
;
}112
U 10
11
12
104
108
112
116
120
v =
&vett[0
]
vett[0
]
vett[1
]
vett[2
]
vett[3
]13
124
289

9.4
Arr
ay c
om
e a
rgo
men
ti d
i fu
nzio
ni
(II)
// S
om
ma g
li e
lem
en
ti d
i u
n d
ato
vett
ore
di in
teri
(ii)
// (
ER
RA
TO
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
so
mm
a(i
nt
v[]
){
int
s =
0;
int
n =
siz
eo
f v /
siz
eo
f(in
t);
// 1
for
(in
t i =
0;
i <
n;
i++
)s +
= v
[i];
retu
rn s
;} in
t m
ain
()
{in
t vett
[] =
{10, 11, 12, 13};
co
ut
<<
"L
a s
om
ma d
eg
li e
lem
en
ti e
': "
;co
ut
<<
so
mm
a(v
ett
) <
< e
nd
l;
// 1
0syste
m("
PA
US
E");
retu
rn 0
;
} La s
om
ma d
eg
li e
lem
en
ti e
':10
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
290
9.4
Arr
ay c
om
e a
rgo
men
ti d
i fu
nzio
ni
(III
)
// S
om
ma g
li e
lem
en
ti d
i u
n d
ato
vett
ore
di in
teri
(iii)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
so
mm
a(i
nt
v[]
, in
t n
)// D
imensio
ne c
om
e a
rgom
ento
{in
t s =
0;
for
(in
t i =
0;
i <
n;
i++
)s +
= v
[i];
retu
rn s
;} in
t m
ain
()
{in
t vett
[] =
{10, 11, 12, 13};
co
ut
<<
"L
a s
om
ma d
eg
li e
lem
en
ti e
': "
,co
ut
<<
so
mm
a(v
ett
, siz
eo
f vett
/ s
izeo
f(in
t))
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
} La s
om
ma d
eg
li e
lem
en
ti e
': 4
6P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
291

9.4
Arr
ay c
om
e a
rgo
men
ti d
i fu
nzio
ni
(IV
)
// In
cre
men
ta g
li e
lem
en
ti d
i u
n d
ato
vett
ore
di in
teri
(i)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id s
tam
pa(i
nt
v[]
, in
t n
){
if (
n >
0)
{co
ut
<<
'['
<<
v[0
];fo
r (i
nt
i =
1;
i <
n;
i++
)co
ut
<<
' ' <
< v
[i];
co
ut
<<
']'
<<
en
dl;
}} vo
id i
ncre
men
ta(i
nt
v[]
, in
t n
){
for
(in
t i =
0;
i <
n;
i++
)v[i
]++
;} in
t m
ain
()
{in
t vett
[] =
{10, 11, 12, 13};
sta
mp
a(v
ett
, 4);
incre
men
ta(v
ett
, 4);
sta
mp
a(v
ett
, 4);
syste
m("
PA
US
E");
retu
rn 0
;
} [10 1
1 1
2 1
3]
[11 1
2 1
3 1
4]
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
292
9.4
Arg
om
en
ti a
rray c
osta
nti
(I)
// S
om
ma g
li e
lem
en
ti d
i u
n d
ato
vett
ore
di in
teri
(iv
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
so
mm
a(c
on
st
int
v[]
, in
t n
)// g
li ele
menti d
ell’
arr
ay
{// n
on p
ossono e
ssere
int
s =
0;
//m
odific
ati
for
(in
t i =
0;
i <
n;
i++
)s +
= v
[i];
retu
rn s
;} in
t m
ain
()
{in
t vett
[] =
{10, 11, 12, 13};
co
ut
<<
"L
a s
om
ma d
eg
li e
lem
en
ti e
': "
,co
ut
<<
so
mm
a(v
ett
, siz
eo
f vett
/ s
izeo
f(in
t))
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
} La s
om
ma d
eg
li e
lem
en
ti e
': 4
6P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
293

9.4
Arg
om
en
ti a
rray c
osta
nti
(II
)
// In
cre
men
ta g
li e
lem
en
ti d
i u
n d
ato
vett
ore
di in
teri
(ii)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id s
tam
pa(c
on
st
int
v[]
, in
t n
)// O
K!!!
{if
(n
> 0
){
co
ut
<<
"["
<<
v[0
];fo
r (i
nt
i =
1;
i <
n;
i++
)co
ut
<<
' ' <
< v
[i];
co
ut
<<
']'
<<
en
dl;
}} vo
id i
ncre
men
ta(c
on
st
int
v[]
, in
t n
)// E
RR
OR
E{
for
(in
t i =
0;
i <
n;
i++
)v[i
]++
;} in
t m
ain
()
{in
t vett
[] =
{10, 11, 12, 13};
sta
mp
a(v
ett
, 4);
incre
men
ta(v
ett
, 4);
sta
mp
a(v
ett
, 4);
syste
m("
PA
US
E");
retu
rn 0
;
}
294
9.5
.3 A
rgo
men
ti a
rray c
osta
nti
(II
I)
// T
rova i
l m
assim
o v
alo
re i
n u
n d
ato
vett
ore
di in
teri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id l
eg
gi(
int
v[]
, in
t n
){
for
(in
t i =
0;
i <
n;
i++
) {
co
ut
<<
'['
<<
i <
< "
] =
";
cin
>>
v[i
];
}
} int
massim
o(c
on
st
int
v[]
, in
t n
){
int
m =
v[0
];fo
r (i
nt
i =
1;
i <
n;
i++
) m
= m
>=
v[i
] ?
m :
v[i
];re
turn
m;
} int
main
()
{co
nst
int
MA
X =
10;
int
v[M
AX
], n
Ele
m;
co
ut
<<
"Q
uan
ti e
lem
en
ti?
";
cin
>>
nE
lem
;le
gg
i(v,
nE
lem
);co
ut
<<
"M
assim
o:
" <
< m
assim
o(v
, n
Ele
m)
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
} Qu
an
ti e
lem
en
ti?
2[0
] =
13
[1]
= 4
5M
assim
o:
45
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
295

9.5
.3 A
rray m
ult
idim
en
sio
nali
(I)
// L
a d
ich
iara
zio
ne d
i u
n v
ett
ore
a p
iu’ d
imen
sio
ni co
me
// a
rgo
men
to f
orm
ale
deve s
pecif
icare
la g
ran
dezza d
i //
tu
tte le d
imen
sio
ni tr
an
ne la p
rim
a.
// S
e M
e’ il n
um
ero
delle d
imen
sio
ni, l’a
rgo
men
to
// f
orm
ale
e’ u
n p
un
tato
re a
d a
rray M
-1 d
imen
sio
nali
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
co
nst
int
C =
3;
vo
id i
niz
ializza(i
nt
m[]
[C],
in
t r)
{fo
r (i
nt
i =
0;
i <
r;
i++
)fo
r (i
nt
j =
0;
j <
C;
j++
)m
[i][
j] =
i +
j;
} vo
id d
im(c
on
st
int
m[]
[C])
{co
ut
<<
"D
imen
sio
ne (
ER
RA
TA
) ";
co
ut
<<
siz
eo
f m
/ s
izeo
f(in
t) <
< e
nd
l;} // v
oid
rie
mp
iErr
ata
(in
t m
[][]
);E
RR
OR
E! 296
9.5
.3 A
rray m
ult
idim
en
sio
nali
(II
)
vo
id s
tam
pa(c
on
st
int
m[]
[C],
in
t r)
{
for
(in
t i =
0;
i <
r;
i++
) {
for
(in
t j
= 0
; j
< C
; j+
+)
co
ut
<<
m[i
][j]
<<
'\t
';co
ut
<<
en
dl;
}} in
t m
ain
()
{in
t m
at1
[2][
C],
mat2
[2][
5];
iniz
ializza(m
at1
, 2);
dim
(mat1
);sta
mp
a(m
at1
, 2);
//in
izia
lizza(m
at2
,2);
E
RR
OR
E: tipo a
rg. div
ers
osyste
m("
PA
US
E");
retu
rn 0
;
} Dim
en
sio
ne (
ER
RA
TA
) 1
0 1
2
1 2
3
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
297

9.5
.3 A
rray m
ult
idim
en
sio
nali
(II
I)
// T
rasm
issio
ne m
ed
ian
te p
un
tato
ri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id i
niz
ializza(i
nt*
m, in
t r,
in
t c)
{fo
r (i
nt
i =
0;
i <
r;
i++
)fo
r (i
nt
j =
0;
j <
c;
j++
)*(
m +
i *
c +
j)
= i +
j;
} vo
id s
tam
pa(c
on
st
int*
m, in
t r,
in
t c)
{fo
r (i
nt
i =
0;
i <
r;
i++
) {
for
(in
t j
= 0
; j
< c
; j+
+)
co
ut
<<
*(m
+ i *
c +
j)
<<
'\t
';co
ut
<<
en
dl;
}} in
t m
ain
()
{in
t m
at1
[2][
3],
mat2
[2][
6];
//in
izia
lizza(m
at1
, 2, 3);
E
RR
OR
E passin
g 'in
t (*
)[3]' a
s//
a
rgum
ent 1 o
f 'in
izia
lizza(int *,
int, int)
'in
izia
lizza(&
mat1
[0][
0],
2, 3);
sta
mp
a((
int*
) m
at1
, 2, 3);
iniz
ializza((
int*
) m
at2
, 2, 6);
sta
mp
a(&
mat2
[0][
0],
2, 6);
syste
m("
PA
US
E");
retu
rn 0
;
}
298
9.3
Str
ing
he (
I)
Str
ing
a:
•S
eq
uen
za d
i cara
tteri
.
In C
++
no
n e
sis
te il ti
po
str
ing
a.
Vari
ab
ili str
ing
a:
•arr
ay d
i cara
tteri
, ch
e m
em
ori
zzan
o s
trin
gh
e (
un
cara
ttere
per
ele
men
to)
e il cara
ttere
nu
llo
('\0')
fi
nale
.
// L
un
gh
ezza e
d in
izia
lizzazio
ne d
i str
ing
he
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>#in
clu
de <
cstr
ing
>u
sin
g n
am
esp
ace s
td;
int
main
()
{ch
ar
c1[]
= "
C+
+";
// iniz
ializ
zazio
ne
co
ut
<<
siz
eo
f c1 <
< e
nd
l;// 4
co
ut
<<
str
len
(c1)
<<
en
dl;
// 3
ch
ar
c2[]
= {
'C', '+
', '+
'};
// M
anca il '\0'!
co
ut
<<
siz
eo
f c2 <
< e
nd
l;// 3
ch
ar
c3[]
= {
'C', '+
', '+
', '\0
'};
// O
Kco
ut
<<
siz
eo
f c3 <
< e
nd
l;// 4
ch
ar
c4[4
];//
c4 =
"C
++
";
ER
RO
RE
! A
ssegnam
ento
tra
arr
ay
syste
m("
PA
US
E");
retu
rn 0
;
} 4 3
3
4
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
299

9.3
Str
ing
he (
II)
Op
era
tori
di in
gre
sso
e d
i u
scit
a:
•accett
an
o u
na v
ari
ab
ile s
trin
ga c
om
e a
rgo
men
to.
Op
era
tore
di in
gre
sso
:
•le
gg
e c
ara
tteri
dallo
str
eam
di in
gre
sso
(salt
an
do
even
tuali c
ara
tteri
bia
nch
i d
i te
sta
) e li m
em
ori
zza in
seq
uen
za, fi
no
a c
he in
co
ntr
a u
n c
ara
ttere
sp
azio
: u
n t
ale
cara
ttere
(ch
e n
on
vie
ne l
ett
o)
cau
sa il
term
ine d
ell’o
pera
zio
ne e
la m
em
ori
zzazio
ne n
ella
vari
ab
ile s
trin
ga d
el cara
ttere
nu
llo
do
po
l'u
ltim
o
cara
ttere
lett
o;
•l'arr
ay c
he r
iceve i
cara
tteri
deve e
ssere
d
imen
sio
nato
ad
eg
uata
men
te.
Op
era
tore
di u
scit
a:
•scri
ve i
cara
tteri
della s
trin
ga (
esclu
so
il cara
ttere
n
ullo
fin
ale
) su
llo
str
eam
di u
scit
a.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{ch
ar
str
ing
a[1
2];
// a
l piu
` 11 c
ara
tteri o
ltre
a '\0
'co
ut
<<
"?
";
cin
>>
str
ing
a;
// E
sem
pio
: In
form
atica e
Calc
ola
tori
// A
ttenzio
ne n
essun c
ontr
ollo
sulla
dim
ensio
ne
co
ut
<<
str
ing
a <
< e
nd
l;// E
sem
pio
: In
form
atica
syste
m("
PA
US
E");
retu
rn 0
;
} ? In
form
ati
ca e
Calc
ola
tori
Info
rmati
ca
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
300
9.3
Str
ing
he (
III)
// S
trin
gh
e e
pu
nta
tori
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{ch
ar
s1[]
= "
Un
ivers
ita' ";
ch
ar
s2[]
= {
'd','i',' ','\0'}
;ch
ar
*s3 =
"P
isa";
ch
ar
*s4 =
"T
oscan
a";
co
ut
<<
s1 <
< s
2 <
< s
3 <
< s
4 <
< e
nd
l;// p
unta
tori a
cara
tteri inte
rpre
tati c
om
e s
trin
ghe
s4 =
s3;
co
ut
<<
s3 <
< e
nd
l;// P
isa
co
ut
<<
s4 <
< e
nd
l;// P
isa
ch
ar
*co
nst
s5 =
"o
gg
i";
ch
ar
*co
nst
s6 =
"d
om
an
i";
//s6 =
s5;
ER
RO
RE
!
co
ut
<<
(vo
id*)
s3 <
< e
nd
l;// P
er
sta
mpare
il punta
tore
syste
m("
PA
US
E");
retu
rn 0
;
} Un
ivers
ita' d
i P
isa T
oscan
aP
isa
Pis
a0x40121d
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
301

9.3
Str
ing
he (
IV)
// C
on
ta le o
cco
rren
ze d
i cia
scu
na lett
era
in
un
a s
trin
ga
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{co
nst
int
LE
TT
ER
E =
26;
ch
ar
str
[100];
int
co
nta
[LE
TT
ER
E];
for
(in
t i =
0;
i <
LE
TT
ER
E;
i++
)co
nta
[i]
= 0
;co
ut
<<
"In
seri
sci u
na s
trin
ga:
";
cin
>>
str
;
for
(in
t i =
0;
str
[i]
!= '\0
'; i+
+)
if (
str
[i]
>=
'a' &
& s
tr[i
] <
= 'z')
+
+co
nta
[str
[i]
-'a
'];
els
e if
(str
[i]
>=
'A
' &
& s
tr[i
] <
= 'Z
')+
+co
nta
[str
[i]
-'A
'];
for
(in
t i =
0;
i <
LE
TT
ER
E;
i++
)co
ut
<<
ch
ar(
'a' +
i)
<<
":
" <
< c
on
ta[i
] <
< '\t
';co
ut
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
} Inseri
sci u
na s
trin
ga:
pro
va
a:
1 b
: 0 c:
0 d
: 0 e:
0 f:
0 g
: 0 h
: 0 i:
0 j:
0k:
0 l:
0 m
: 0 n
: 0 o
: 1 p
: 1 q
: 0 r:
1 s:
0 t:
0u
: 0 v:
1 w
: 0 x:
0 y:
0 z:
0P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
302
9.6
Fu
nzio
ni
di
lib
reri
a s
ull
e s
trin
gh
e (
I)
Dic
hia
razio
nico
nte
nu
ten
elfi
le<
cstr
ing
>
ch
ar
*str
cp
y(c
har
*dest,
co
nst
ch
ar
*so
rg);
Copia
sorg
indest,
inclu
so
ilcara
ttere
nullo
(term
inato
re
distr
inga),
ere
stitu
isce
dest;
AT
TE
NZ
ION
E:
no
nvie
ne
eff
ett
uato
nessu
nco
ntr
ollo
per
ve
rifi
care
se
lad
imen
sio
ne
di
dest
èsu
ffic
ien
tep
er
co
nte
nere
so
rg.
ch
ar
*str
cat(
ch
ar
*dest,
co
nst
ch
ar
*so
rg);
Concate
na
sorg
al
term
ine
di
dest
ere
stitu
isce
dest
(il
cara
ttere
nullo
com
pare
solo
alla
fine
della
str
inga
risultante
);
AT
TE
NZ
ION
E:
no
nvie
ne
eff
ett
uato
nessu
nco
ntr
ollo
per
ve
rifi
care
se
lad
imen
sio
ne
di
dest
èsu
ffic
ien
tep
er
co
nte
nere
laco
ncate
nazio
ne
diso
rge
dest.
AT
TE
NZ
ION
E:
sia
so
rgch
ed
est
devo
no
essere
delle
str
ing
he.
303

9.6
Fu
nzio
ni
di
lib
reri
a s
ull
e s
trin
gh
e (
II)
int
str
len
(co
nst
ch
ar
*str
ing
);
Restitu
isce
lalu
nghezza
di
str
ing;
ilvalo
rere
stitu
ito
è
infe
riore
di
1al
num
ero
di
cara
tteri
effettiv
i,perc
hé
il
cara
ttere
nullo
che
term
ina
str
ing
non
vie
ne
conta
to.
int
str
cm
p(c
on
st
ch
ar
*s1,co
nst
ch
ar
*s2
);
Confr
onta
s1
con
s2:
–re
stitu
isce
un
valo
renegativo
se
s1
è
alfabeticam
ente
min
ore
dis2;
–un
valo
renullo
se
ledue
str
inghe
sono
uguali,
–un
valo
rep
ositiv
ose
s1
èalfabeticam
ente
maggio
redi
s2;
(la
funzio
ne
dis
tingue
tra
maiu
scole
em
inuscole
).
ch
ar
*str
ch
r(co
nst
ch
ar
*str
ing
,ch
ar
c);
Restitu
isce
ilpunta
tore
alla
prim
aoccorr
enza
di
cin
str
ing
oppure
0se
cnon
sitr
ova
instr
ing.
304
9.6
Fu
nzio
ni
di
lib
reri
a s
ull
e s
trin
gh
e (
III)
//E
SE
MP
IO
#in
clu
de
<cstd
lib
>
#in
clu
de
<io
str
eam
>
#in
clu
de
<cstr
ing
>
usin
gn
am
esp
ace
std
;
int
main
()
{
co
nst
int
N=
30;
ch
ar
s1[]
="C
ors
o";
ch
ar
s2[]
="d
i";
ch
ar
s3[]
="In
form
ati
ca\n
";
ch
ar
s4[N
]=
"C
ors
o";
co
ut
<<
"D
imen
sio
ne
deg
liarr
ay
s1
es4
"<
<en
dl;
co
ut
<<
siz
eo
fs1
<<
""
<<
siz
eo
fs4
<<
en
dl;
co
ut
<<
"D
imen
sio
ne
delle
str
ing
he
s1
es4
"<
<en
dl;
co
ut
<<
str
len
(s1)
<<
""
<<
str
len
(s4)
<<
en
dl;
if(!
str
cm
p(s
1,s
4))
co
ut
<<
"S
trin
gh
eu
gu
ali
"<
<en
dl;
els
eco
ut
<<
"S
trin
gh
ed
ivers
e"
<<
en
dl;
if(!
str
cm
p(s
1,s
2))
co
ut
<<
"S
trin
gh
eu
gu
ali
"<
<en
dl;
els
eco
ut
<<
"S
trin
gh
ed
ivers
e"
<<
en
dl<
<en
dl;
ch
ar
s5[N
];
str
cp
y(s
5,s
1);
str
cat(
s5,s
2);
str
cat(
s5,s
3);
305

9.6
Fu
nzio
ni
di
lib
reri
a s
ull
e s
trin
gh
e (
IV)
co
ut
<<
"C
on
cate
nazio
ne
dis1,s2
es3
"<
<en
dl;
co
ut
<<
s5
<<
en
dl;
ch
ar
*s=
str
ch
r(s5,'I');
co
ut
<<
"S
trin
ga
dalla
pri
ma
ista
nza
diI"
<<
en
dl;
co
ut
<<
s<
<en
dl;
syste
m("
PA
US
E");
retu
rn0;
} Dim
en
sio
ne
deg
liarr
ay
s1
es4
730
Dim
en
sio
ne
delle
str
ing
he
s1
es4
66
Str
ing
he
ug
uali
Str
ing
he
div
ers
e
Co
ncate
nazio
ne
dis1,s2
es3
Co
rso
diIn
form
ati
ca
Str
ing
ad
alla
pri
ma
ista
nza
diI
Info
rmati
ca
Pre
mere
un
tasto
per
co
nti
nu
are
...
306
9.7
Ord
inam
en
to d
ei
vett
ori
Ord
inam
en
to p
er
sele
zio
ne (
sele
cti
on
-so
rt)
•S
i cerc
a l’e
lem
en
to p
iù p
icco
lo e
si scam
bia
co
n
l’ele
men
to in
po
siz
ion
e i
=0
53
46
21
13
46
25
•S
icerc
al’ele
men
top
iùp
icco
lotr
ai
rim
an
en
tiN
-ie
si
scam
bia
co
nl’ele
men
toin
po
siz
ion
ei,
per
i=
1..N
-1
12
46
35
13
46
25
12
36
45
12
46
35
12
34
65
12
36
45
12
34
56
12
34
65
307

9.7
Ord
inam
en
to d
ei
vett
ori
(sele
cti
on
-so
rt)
Ord
inam
en
to p
er
sele
zio
ne (
sele
cti
on
-so
rt)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
typ
ed
ef
int
T;
// intr
oduce identificato
ri p
er
indiv
iduare
tip
i
vo
id s
tam
pa(c
on
st
Tv[]
, in
t n
){
if (
n !
= 0
){
co
ut
<<
"["
<<
v[0
];fo
r (i
nt
i =
1;
i <
n;
i++
)co
ut
<<
' ' <
< v
[i];
co
ut
<<
']'
<<
en
dl;
}} vo
id s
cam
bia
(T v
ett
ore
[],
int
x, in
t y)
{
T lavo
ro =
vett
ore
[x];
vett
ore
[x]
= v
ett
ore
[y];
vett
ore
[y]
= lavo
ro;
}
308
9.7
Ord
inam
en
to d
ei
vett
ori
(sele
cti
on
-so
rt)
Ord
inam
en
to p
er
sele
zio
ne (
sele
cti
on
-so
rt)
vo
id s
ele
cti
on
So
rt(T
vett
ore
[],
int
n)
{ in
tm
in;
for
(in
t i =
0 ;
i <
n-1
; i+
+)
{ m
in=
i;fo
r (i
nt
j =
i+
1;
j <
n;
j++
)if
(vett
ore
[j]
< v
ett
ore
[min
]) m
in=
j;scam
bia
(vett
ore
,i,m
in);
}} in
t m
ain
(){
T v
[] =
{2
, 26, 8, 2, 23};
sele
cti
on
So
rt(v
,5);
sta
mp
a(v
,5);
syste
m("
PA
US
E");
retu
rn 0
;
} [2 2
8 2
3 2
6]
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
•C
om
ple
ssit
à d
ell’a
lgo
ritm
o d
ell’o
rdin
e d
i n
2, d
ove n
è
il n
um
ero
di ele
men
ti n
el vett
ore
.
309

9.7
Ord
inam
en
to d
ei
vett
ori
(b
ub
ble
-so
rt)
Ord
inam
en
to b
ub
ble
-so
rt
•S
i sco
rre l’a
rray n
-1 v
olt
e,
do
ve n
è il n
um
ero
di
ele
men
ti n
ell’a
rray, d
a d
estr
a a
sin
istr
a, scam
bia
nd
o
du
e e
lem
en
ti c
on
tig
ui se n
on
so
no
nell’o
rdin
e
giu
sto
.
53
46
21
53
46
12
53
41
62
51
34
62
53
14
62
15
34
62
•P
rim
a v
olt
a
15
34
62
15
34
26
15
32
46
12
53
46
15
23
46
•S
eco
nd
a v
olt
a
N.B
.: i p
rim
i d
ue e
lem
en
ti r
isu
ltan
o o
rdin
ati
310
9.7
Ord
inam
en
to d
ei
vett
ori
(b
ub
ble
-so
rt)
Ord
inam
en
to b
ub
ble
-so
rt
vo
id b
ub
ble
(T v
ett
ore
[],
int
n)
{ fo
r (i
nt
i =
0 ;
i <
n-1
; i+
+)
for
(in
t j
= n
-1;
j >
i;
j--)
if(v
ett
ore
[j]
< v
ett
ore
[j-1
])scam
bia
(vett
ore
,j,
j-1);
} •C
om
ple
ssit
à d
ell’a
lgo
ritm
o d
ell’o
rdin
e d
i n
2, d
ove n
è
il n
um
ero
di ele
men
ti n
el vett
ore
.
12
53
46
12
35
46
•Terz
a v
olt
a
12
35
46
12
34
56
•Q
uart
a v
olt
a
•Q
uin
ta v
olt
a•
Nessu
n c
am
bia
men
to
N.B
.: i p
rim
i tr
e e
lem
en
ti r
isu
ltan
o o
rdin
ati
N.B
.: i p
rim
i q
uatt
ro e
lem
en
ti r
isu
ltan
o o
rdin
ati
311

9.7
Ord
inam
en
to d
ei
vett
ori
(b
ub
ble
-so
rt)
Ord
inam
en
to b
ub
ble
-so
rt o
ttim
izzato
Su
pp
on
iam
o c
he il vett
ore
sia
•Il v
ett
ore
do
po
il p
rim
o p
asso
ris
ult
a o
rdin
ato
.
•In
uti
le e
seg
uir
e t
utt
i i p
assi.
23
45
61
23
45
16
23
41
56
21
34
56
23
14
56
12
34
56
•P
rim
a v
olt
a
23
45
61
312
9.7
Ord
inam
en
to d
ei
vett
ori
(b
ub
ble
-so
rt)
Ord
inam
en
to b
ub
ble
-so
rt o
ttim
izzato
vo
id b
ub
ble
(T v
ett
ore
[],
int
n)
{ b
oo
l o
rdin
ato
= f
als
e;
for
(in
t i =
0 ;
i <
n-1
&&
!o
rdin
ato
; i+
+)
{o
rdin
ato
=tr
ue;
for
(in
t j
= n
-1;
j >
= i+
1;
j--)
if(v
ett
ore
[j]
< v
ett
ore
[j-1
]){
scam
bia
(vett
ore
,j,
j-1);
ord
inato
= f
als
e;
}}
} int
main
(){
T v
[] =
{2
, 1, 3, 4, 5};
bu
bb
le(v
,5);
sta
mp
a(v
,5);
syste
m("
PA
US
E");
retu
rn 0
;
} [1 2
3 4
5]
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
•L
’alg
ori
tmo
ott
imiz
zato
eseg
ue d
ue s
ole
ite
razio
ni
invece d
elle q
uatt
rod
ell’a
lgo
ritm
o n
on
ott
imiz
zato 313

9.7
Ric
erc
a lin
eare
(I)
Pro
ble
ma
•cerc
are
un
ele
men
to in
un
arr
ay t
ra l’e
lem
en
to in
p
osiz
ion
e in
fe e
qu
ello
in
po
siz
ion
e s
up
e.
Po
ssib
ile s
olu
zio
ne
•S
co
rrere
il vett
ore
in
seq
uen
za a
part
ire d
all’e
lem
en
to
in p
osiz
ion
e in
fe f
ino
all’e
lem
en
to c
erc
ato
op
pu
re
all’e
lem
en
to in
po
siz
ion
e s
up
e.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
typ
ed
ef
int
T;
bo
ol ri
cerc
a(T
vett
[],
int
infe
, in
t su
pe, T
k, in
t&
po
s)
{b
oo
l tr
ovato
= f
als
e;
wh
ile (
(!tr
ovato
) &
& (
infe
<=
su
pe))
{if
(vett
[in
fe]
==
k)
{p
os =
in
fe;
tro
vato
= t
rue;
} infe
++
;} re
turn
tro
vato
;}
53
46
21
infe
su
pe
53
46
21
infe
su
pe
314
9.7
Ric
erc
a lin
eare
(II
)
int
main
(){
T v
[] =
{1
, 2, 3, 4, 5};
int
i;
// indiv
idua la p
osiz
ione
if (
!ric
erc
a(v
, 0, 4, 5, i)
)cerr
<<
"E
lem
en
to c
erc
ato
no
n p
resen
te "
<<
en
dl;
els
e co
ut
<<
"P
osiz
ion
e e
lem
en
to c
erc
ato
" <
< i <
< e
nd
l;
if (
!ric
erc
a(v
, 0, 4, 10, i)
)cerr
<<
"E
lem
en
to c
erc
ato
no
n p
resen
te "
<<
en
dl;
els
e co
ut
<<
"P
osiz
ion
e e
lem
en
to c
erc
ato
" <
< i <
< e
nd
l;
syste
m("
PA
US
E");
retu
rn 0
; } P
osiz
ion
e e
lem
en
to c
erc
ato
4E
lem
en
to c
erc
ato
no
n p
resen
teP
rem
ere
un
tasto
per
co
nti
nu
are
. . .
N.B
: P
er
la r
icerc
a d
ell’e
lem
en
to 5
è n
ecessari
o e
sam
inare
5 e
lem
en
ti.
315

9.7
Ric
erc
a b
inari
a(I
)
PR
ER
EQ
UIS
ITO
: V
ett
ori
ord
inati
!!!!
Ric
erc
a b
inari
a (
vett
ori
ord
inati
in
ord
ine c
rescen
te)
Idea:
•S
i co
nfr
on
ta l’e
lem
en
to c
erc
ato
co
n l’e
lem
en
to in
p
osiz
ion
e c
en
trale
; se s
on
o u
gu
ali la r
icerc
a t
erm
ina;
•alt
rim
en
ti:
–se l’e
lem
en
to c
erc
ato
è m
ino
re d
ell’e
lem
en
to in
p
osiz
ion
e c
en
trale
la r
icerc
a p
roseg
ue n
ella p
rim
a
metà
del vett
ore
; alt
rim
en
ti p
roseg
ue n
ella
seco
nd
a m
età
del vett
ore
.
bo
ol ri
cb
in(T
ord
Vett
[], in
t in
fe, in
t su
pe, T
k, in
t&
po
s)
{w
hile (
infe
<=
su
pe)
{in
t m
ed
io =
(in
fe +
su
pe)
/ 2;
//calc
ola
l'in
dic
e c
entr
ale
if (
k >
ord
Vett
[med
io])
in
fe =
med
io +
1;
// r
icerc
a n
ella
meta
' superiore
els
e if (
k <
ord
Vett
[med
io])
su
pe =
med
io -
1;
// r
icerc
a n
ella
meta
' superiore
els
e{
po
s=
med
io;
// tro
vato
retu
rn t
rue;
}}
retu
rn f
als
e;
} N.B
: P
er
la r
icerc
a d
ell’e
lem
en
to 5
, esem
pio
pre
ced
en
te, è
necessari
o e
sam
inare
3 e
lem
en
ti s
ola
men
te.
316
9.7
Ric
erc
a b
inari
a(I
I)
Esem
pio
: ri
cerc
a in
un
vett
ore
di cara
tteri
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
typ
ed
ef
ch
ar
T;
bo
ol ri
cb
in(T
ord
Vett
[], in
t in
fe, in
t su
pe, T
k, in
t&
po
s)
{w
hile (
infe
<=
su
pe)
{in
t m
ed
io =
(in
fe +
su
pe)
/ 2;
//calc
ola
l'in
dic
e c
entr
ale
if (
k >
ord
Vett
[med
io])
in
fe =
med
io +
1;
// r
icerc
a n
ella
meta
' superiore
els
e if (
k <
ord
Vett
[med
io])
su
pe =
med
io -
1;
// r
icerc
a n
ella
meta
' superiore
els
e{
po
s=
med
io;
// tro
vato
retu
rn t
rue;
}}
retu
rn f
als
e;
} int
main
(){
T v
[] =
{'
a', 'b
', 'c', 'r'
, 's
', 't'
};in
t i;
// indiv
idua la p
osiz
ione
if (
!ric
bin
(v,
0, 5, 'c
', i))
cerr
<<
"E
lem
en
to c
erc
ato
no
n p
resen
te "
<<
en
dl;
els
e co
ut
<<
"P
osiz
ion
e e
lem
en
to c
erc
ato
" <
< i <
< e
nd
l;syste
m("
PA
US
E");
// 2
retu
rn 0
;
}
317

9.7
Esem
pio
(I)
Esem
pio
: o
rdin
am
en
to e
ric
erc
a in
un
vett
ore
di str
ing
he
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
co
nst
int
C=
20;
typ
ed
ef
ch
ar
T[C
];
vo
id s
cam
bia
(T v
ett
ore
[],
int
x, in
t y)
{
T lavo
ro;
str
cp
y(l
avo
ro,v
ett
ore
[x])
;str
cp
y(v
ett
ore
[x],
vett
ore
[y])
;str
cp
y(v
ett
ore
[y],
lavo
ro);
} vo
id s
tam
pa(c
on
st
T v
ett
ore
[],
int
n)
{if
(n
!=
0)
{co
ut
<<
'['
<<
vett
ore
[0];
for
(in
t i =
1;
i <
n;
i++
)co
ut
<<
' ' <
< v
ett
ore
[i];
co
ut
<<
']'
<<
en
dl;
}}
318
9.7
Esem
pio
(II)
vo
id b
ub
ble
(T v
ett
ore
[],
int
n)
{ b
oo
l o
rdin
ato
= f
als
e;
for
(in
t i =
0 ;
i <
n-1
&&
!o
rdin
ato
; i+
+)
{o
rdin
ato
= t
rue;
for
(in
t j
= n
-1;
j >
= i+
1;
j--)
if(s
trcm
p(v
ett
ore
[j],
vett
ore
[j-1
])<
0)
{scam
bia
(vett
ore
, j,
j-1
);o
rdin
ato
= f
als
e;
}}
} bo
ol ri
cb
in(T
ord
Vett
[], in
t in
fe, in
t su
pe, T
k, in
t &
po
s)
{w
hile (
infe
<=
su
pe)
{in
t m
ed
io =
(in
fe +
su
pe)
/ 2;
if (
str
cm
p(k
,ord
Vett
[med
io])
>0)
infe
= m
ed
io +
1;
els
e if (
str
cm
p(k
,ord
Vett
[med
io])
<0)
su
pe =
med
io -
1;
els
e{
po
s =
med
io;
re
turn
tru
e;
}}
retu
rn f
als
e;
}
319

9.7
Esem
pio
(III
)
int
main
()
{ T
s[4
];fo
r (i
nt
i=0;
i<4;
i++
){
co
ut
<<
'?
' <
< e
nd
l; cin
>>
s[i
]; }
sta
mp
a(s
,4);
bu
bb
le(s
,4);
sta
mp
a(s
,4);
int
i; T
m;
co
ut
<<
"R
icerc
a ?
" <
< e
nd
l;cin
>>
m;
if (
ricb
in(s
,0,4
,m,i))
co
ut
<<
"T
rovato
in
po
siz
ion
e "
<<
i <
< e
nd
l;els
e c
ou
t <
< "
No
n t
rovato
" <
< e
nd
l;co
ut
<<
"R
icerc
a ?
" <
< e
nd
l;cin
>>
m;
if (
ricb
in(s
,0,4
,m,i))
co
ut
<<
"T
rovato
in
po
siz
ion
e "
<<
i <
< e
nd
l;els
e c
ou
t <
< "
No
n t
rovato
" <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;
} ? mu
cca
? an
atr
a? zeb
ra? cavallo
[mu
cca a
natr
a z
eb
ra c
avallo
][a
natr
a c
avallo
mu
cca z
eb
ra]
Ric
erc
a ?
cavallo
Tro
vato
in
po
siz
ion
e 1
Ric
erc
a ?
bu
eN
on
tro
vato
Pre
ss a
ny k
ey t
o c
on
tin
ue . . ..
320
10.1
Str
utt
ure
(I)
Str
utt
ura
:
•n
-up
la o
rdin
ata
di ele
men
ti, d
ett
i m
em
bri
(o
cam
pi)
, cia
scu
no
dei q
uali h
a u
no
sp
ecif
ico
tip
o e
d u
no
sp
ecif
ico
no
me, e c
on
tien
e u
na d
ata
in
form
azio
ne;
•ra
pp
resen
ta u
na c
ollezio
ne d
i in
form
azio
ni su
un
d
ato
og
gett
o.
basic
-str
uctu
re-t
yp
e-d
ecla
rati
on
str
uctu
re-t
yp
esp
ecif
ier
;
str
uctu
re-t
yp
esp
ecif
ier
str
uct
iden
tifi
er|
op
t{
str
uctu
re-m
em
ber-
secti
on
-seq
}
Sezio
ne:
•m
em
bri
di u
n c
ert
o t
ipo
, cia
scu
no
desti
nato
a
co
nte
nere
un
dato
(cam
pi d
ati
);
•fo
rma s
inta
ttic
am
en
te e
qu
ivale
nte
alla d
efi
niz
ion
e d
i o
gg
ett
i n
on
co
sta
nti
e n
on
in
izia
lizzati
.
Esem
pio
:
str
uct
pers
on
a{
ch
ar
no
me[2
0];
ch
ar
co
gn
om
e[2
0];
int
g_
nascit
a, m
_n
ascit
a, a_
nascit
a;
};
321

10.1
Str
utt
ure
(II
)
// P
un
to
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
str
uct
pu
nto
{d
ou
ble
x;
do
ub
le y
;}; in
t m
ain
()
{p
un
to r
, s;
r.x =
3;
// s
ele
ttore
di m
em
bro
r.y =
10.5
;
s.x
= r
.x;
s.y
= r
.y +
10.0
;
co
ut
<<
'<
' <
< r
.x <
< "
, " <
< r
.y <
< "
>\n
";
co
ut
<<
'<
' <
< r
.x <
< "
, " <
< s
.y <
< "
>\n
";
pu
nto
*p
= &
r;co
ut
<<
'<
' <
< p
->x <
< "
, ";
// (
*p).
xco
ut
<<
p->
y <
< "
>\n
";
// (
*p).
y
pu
nto
t =
{1.0
, 2.0
};// iniz
ializ
zazio
ne
co
ut
<<
'<
' <
< t
.x <
< "
, " <
< t
.y <
< "
>\n
";
syste
m("
PA
US
E");
retu
rn 0
;
} <3, 10.5
><
3, 20.5
><
3, 10.5
><
1, 2>
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
322
10.1
Str
utt
ure
(II
I)
str
uct
pu
nto
{
/* ... *
/p
un
to s
;// E
RR
OR
E!
}; //~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~//
// S
tru
ttu
ra c
on
ten
en
te u
n r
iferi
men
to a
se s
tessa
str
uct
pu
nto
{/*
... *
/p
un
to*
p;
// O
K}; //~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~//
// S
tru
ttu
re c
on
rif
eri
men
ti in
treccia
ti.
// D
ich
iara
zio
ni in
co
mp
lete
str
uct
Part
e;
str
uct
Co
mp
on
en
te {
/* ... *
/P
art
e*
p;
};`
str
uct
Part
e {
/* ... *
/C
om
po
nen
te*
c;
};
323

10.1
Str
utt
ure
(IV
)
// A
rray d
i str
utt
ure
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
str
uct
pu
nto
{d
ou
ble
x;
do
ub
le y
;};
co
nst
int
MA
X =
30;
int
main
()
{str
uct
po
lig
on
o
{in
t q
uan
ti;
// n
um
ero
effettiv
o d
i punti
pu
nto
p[M
AX
];}
p;
p.q
uan
ti =
3;
p.p
[0].
x =
3.0
;p
.p[0
].y =
1.0
;
p.p
[1].
x =
4.0
;p
.p[1
].y =
10.0
;
p.p
[2].
x =
3.0
;p
.p[2
].y =
100.0
;
co
ut
<<
"S
tam
pa d
el p
olig
on
o "
<<
en
dl;
for
(in
t i=
0;
i <
p.q
uan
ti;
i++
)co
ut
<<
'<
' <
< p
.p[i
].x <
< "
, " <
< p
.p[i
].y <
< "
>\n
";
syste
m("
PA
US
E");
retu
rn 0
; } S
tam
pa d
el p
olig
on
o<
3, 1>
<4, 10>
<3, 100>
Pre
mere
un
tasto
per
co
nti
nu
are
. .
324
10.1
.1 O
pera
zio
ni
su
lle s
tru
ttu
re (
I)
// A
sseg
nam
en
to t
ra s
tru
ttu
re
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
str
uct
pu
nto
{d
ou
ble
x;
do
ub
le y
;}; in
t m
ain
()
{p
un
to r
1 =
{3.0
, 10.0
};// iniz
ializ
zazio
ne
pu
nto
r2;
r2 =
r1;
// c
opia
mem
bro
a m
em
bro
co
ut
<<
"r1
= <
" <
< r
1.x
<<
", " <
< r
1.y
<<
">
\n";
// <
3, 10>
co
ut
<<
"r2
= <
" <
< r
2.x
<<
", " <
< r
2.y
<<
">
\n";
// <
3, 10>
//if
(r2
!=
r1)
ER
RO
RE
syste
m("
PA
US
E");
retu
rn 0
; } r1
= <
3, 10>
r2 =
<3, 10>
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
N.B
.: N
on
so
no
defi
nit
e o
pera
zio
ni d
i co
nfr
on
to
su
lle s
tru
ttu
re.
325

10.1
.1 O
pera
zio
ni
su
lle s
tru
ttu
re (
II)
// S
tru
ttu
re c
om
e a
rgo
men
ti d
i fu
nzio
ni e r
esti
tuit
e d
a//
fu
nzio
ni
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>#in
clu
de <
cm
ath
>u
sin
g n
am
esp
ace s
td;
str
uct
pu
nto
{d
ou
ble
x;
do
ub
le y
; };
vo
id t
est(
pu
nto
p)
{co
ut
<<
"D
imen
sio
ne a
rgo
men
to "
<<
siz
eo
f p
<<
en
dl;
} vo
id t
est(
co
nst
pu
nto
* p
)
// O
verloadin
g{
co
ut
<<
"D
imen
sio
ne a
rgo
men
to "
<<
siz
eo
f p
<<
en
dl;
} do
ub
le d
ist(
co
nst
pu
nto
* p
1, co
nst
pu
nto
* p
2)
{re
turn
sq
rt((
p1->
x -
p2->
x)
* (p
1->
x -
p2->
x)
+
(p1->
y -
p2->
y)
* (p
1->
y -
p2->
y))
;} p
un
to v
icin
o(p
un
to i
ns[]
, in
t n
, co
nst
pu
nto
* p
) {
do
ub
le m
in =
dis
t(&
ins[0
],p
), t
;in
t in
dex =
0;
// M
em
orizza l’in
dic
efo
r (i
nt
i =
1;
i <
n;
i++
){
t =
dis
t(&
ins[i
], p
);if
(m
in >
t)
{ in
dex =
i;
min
= t
; };
} retu
rn in
s[i
nd
ex];
}
124
p.y
10.0
128
p.x
3.5
120
132
326
10.1
.1 O
pera
zio
ni
su
lle s
tru
ttu
re (
III)
// S
tru
ttu
re c
om
e a
rgo
men
ti d
i fu
nzio
ni e r
esti
tuit
e d
a//
fu
nzio
ni
int
main
()
{p
un
to in
s[]
= {
{3.0
, 10.0
}, {
2.0
, 9.0
}, {
1.0
, 1.0
}};
pu
nto
r =
{3.5
, 10.0
};te
st(
r);
// 1
6te
st(
&r)
;// 4
co
ut
<<
"D
ista
nza:
" <
< d
ist(
&r,
&in
s[0
]) <
< e
nd
l;p
un
to s
= v
icin
o(i
ns,
siz
eo
f in
s/s
izeo
f(p
un
to),
&r)
;co
ut
<<
"P
un
to p
iu' vic
ino
: ";
co
ut
<<
'<
' <
< s
.x <
< "
, " <
< s
.y <
< "
>\n
";
syste
m("
PA
US
E");
retu
rn 0
; } D
imen
sio
ne a
rgo
men
to 1
6D
imen
sio
ne a
rgo
men
to 4
Dis
tan
za:
0.5
Pu
nto
piu
' vic
ino
: <
3, 10>
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
327

10.1
.1 O
pera
zio
ni
su
lle s
tru
ttu
re (
IV)
// C
op
ia d
i vett
ori
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
co
nst
int
N =
3;
str
uct
vett
ore
{
int
vv[N
];};
vo
id s
tam
pa(c
on
st
vett
ore
& v
, in
t n
){
c
ou
t <
< '['
<<
v.v
v[0
];fo
r (i
nt
i =
1;
i <
n;
i++
)co
ut
<<
' ' <
< v
.vv[i
];co
ut
<<
']'
<<
en
dl;
} int
main
()
{vett
ore
v1 =
{1, 2, 3},
v2;
v2 =
v1;
co
ut
<<
"S
tam
pa d
el vett
ore
v1 "
<<
en
dl;
sta
mp
a(v
1,
N);
co
ut
<<
"S
tam
pa d
el vett
ore
v2 "
<<
en
dl;
sta
mp
a(v
2,
N);
syste
m("
PA
US
E");
retu
rn 0
; } S
tam
pa d
el vett
ore
v1
[1 2
3]
Sta
mp
a d
el vett
ore
v2
[1 2
3]
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
328
10.1
.1 O
pera
zio
ni
su
lle s
tru
ttu
re (
V)
// T
rasm
issio
ne d
i vett
ori
per
valo
re
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>
usin
g n
am
esp
ace s
td;
co
nst
int
N =
3;
str
uct
vett
ore
{in
t vv[N
];};
vo
id s
tam
pa(c
on
st
vett
ore
& v
, in
t n
){
c
ou
t <
< '['
<<
v.v
v[0
];fo
r (i
nt
i =
1;
i <
n;
i++
)co
ut
<<
' ' <
< v
.vv[i
];co
ut
<<
']'
<<
en
dl;
} vo
id i
ncre
men
ta(v
ett
ore
v,
int
n)
{ f
or
(in
t i =
0;
i <
n;
i++
) v
.vv[i
]++
;}
int
main
()
{vett
ore
v1 =
{1, 2, 3};
co
ut
<<
"S
tam
pa d
el vett
ore
v1 "
<<
en
dl;
sta
mp
a(v
1,
N);
incre
men
ta(v
1,
N);
// Incre
menta
la c
opia
co
ut
<<
"S
tam
pa d
el vett
ore
v1 "
<<
en
dl;
sta
mp
a(v
1,
N);
// [1 2
3]
syste
m("
PA
US
E");
retu
rn 0
; } S
tam
pa d
el vett
ore
v1
[1 2
3]
Sta
mp
a d
el vett
ore
v2
[1 2
3]
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
329

10.2
Un
ion
i (I
)
So
no
dic
hia
rate
e u
sate
co
n la s
tessa s
inta
ssi d
elle
str
utt
ure
:•
si u
tilizza la p
aro
la c
hia
ve u
nio
n a
l p
osto
di str
uct.
Rap
pre
sen
tan
o u
n’a
rea d
i m
em
ori
a c
he in
tem
pi d
ivers
i p
uò
co
nte
nere
dati
di ti
po
dif
fere
nte
:•
i m
em
bri
di u
n'u
nio
ne c
orr
isp
on
do
no
a d
ivers
e
“in
terp
reta
zio
ni”
di u
n'u
nic
a a
rea d
i m
em
ori
a.
Mem
bri
di u
na u
nio
ne n
on
della s
tessa d
imen
sio
ne:
•vie
ne r
iserv
ato
sp
azio
per
il p
iù g
ran
de.
Esem
pio
:str
uct
{ in
t i;
do
ub
le d
; }
x;
un
ion
{ in
t i;
do
ub
le d
; }
y;
–la
str
utt
ura
xo
ccu
pa 9
6 b
it d
i m
em
ori
a (
32 p
er
i
e 6
4 p
er
d);
–l'u
nio
ne y
occu
pa 6
4 b
it d
i m
em
ori
a, ch
e
po
sso
no
essere
ded
icati
ad
un
valo
re i
nte
ro
(lascia
nd
on
e 3
2 in
uti
lizzati
) o
ad
un
valo
re
reale
.
Op
era
zio
ni:
–q
uelle v
iste
per
le s
tru
ttu
re.
Valo
ri in
izia
li d
elle u
nio
ni:
–so
lo p
er
il p
rim
o m
em
bro
;
–esem
pio
:u
nio
n {
ch
ar
c;
int
i; d
ou
ble
f;
} a =
{ 'X
' };
330
10.2
Un
ion
i (I
I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
un
ion
Un
i {
ch
ar
c;
in
t i;
};
str
uct
Str
{
ch
ar
c;
int
i; }
;
int
main
()
{co
ut
<<
siz
eo
f(ch
ar)
<<
'\t
' <
< s
izeo
f(in
t) <
< e
nd
l;// 1
4co
ut
<<
siz
eo
f(U
ni)
<<
'\t
' <
< s
izeo
f(S
tr)
<<
en
dl;
// 4
8
Un
i u
= {
'a'}
;//
Un
i u
1 =
{'a
', 1
0000};
ER
RA
TO
u.i =
0xF
F7A
;
// 7
A e
' la c
odific
a A
SC
II d
i z
co
ut
<<
u.c
<<
'\t
' <
< u
.i <
< e
nd
l;// z
65402
Str
s =
{'a
', 0
xF
F7A
};
co
ut
<<
s.c
<<
'\t
' <
< s
.i <
< e
nd
l;// a
65402
syste
m("
PA
US
E");
retu
rn 0
; } 1 4
4 8
z 6
5402
a 6
5402
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
331

10.3
.1 P
ila (
I)
•In
sie
me o
rdin
ato
di d
ati
di ti
po
ug
uale
, in
cu
i è
po
ssib
ile e
ffett
uare
op
era
zio
ni d
i in
seri
men
to e
di
estr
azio
ne s
eco
nd
o la s
eg
uen
te r
eg
ola
di accesso
: l’u
ltim
o d
ato
in
seri
to è
il p
rim
o a
d e
ssere
estr
att
o
(LIF
O:
Last
In F
irst
Ou
t).
•S
e t
op
==
-1, la
pila è
vu
ota
. S
e t
op
==
DIM
-1, d
ove
DIM
è il n
um
ero
massim
o d
i ele
men
ti n
ella p
ila, la
p
ila è
pie
na.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
typ
ed
ef
in
t T
;co
nst
int
DIM
= 5
;
str
uct
pila
{in
t to
p;
T s
tack[D
IM];
}; //in
izia
lizzazio
ne d
ella
pila
vo
id i
nip
(pila&
pp
){
pp
.to
p=
-1;
}
top
0D
IM-
1
332
10.3
.1 P
ila (
II)
bo
ol em
pty
(co
nst
pila&
pp
)// p
ila v
uota
?{
if (
pp
.to
p=
=-1
) re
turn
tru
e;
retu
rn f
als
e;
} bo
ol fu
ll(c
on
st
pila&
pp
)// p
ila p
iena?
{ if
(p
p.t
op
==
DIM
-1)
retu
rn t
rue;
retu
rn f
als
e;
} bo
ol p
ush
(pila&
pp
, T
s)
// inserisce u
n e
lem
ento
in p
ila{
if (
full(p
p))
retu
rn f
als
e;
pp
.sta
ck[+
+(p
p.t
op
)] =
s;
retu
rn t
rue;
} bo
ol p
op
(pila&
pp
, T
& s
)// e
str
ae u
n e
lem
ento
dalla
pila
{ if
(em
pty
(pp
)) r
etu
rn f
als
e;
s=
pp
.sta
ck[(
pp
.to
p)-
-];
retu
rn t
rue;
} vo
id s
tam
pa(c
on
st
pila&
pp
) // s
tam
pa g
li ele
menti
{co
ut
<<
"E
lem
en
ti c
on
ten
uti
nella p
ila:
" <
< e
nd
l;fo
r (i
nt
i =
pp
.to
p;
i >
= 0
; i-
-)co
ut
<<
'['
<<
i <
< "
] " <
< p
p.s
tack[i
] <
< e
nd
l;}
333

10.3
.1 P
ila (
III)
int
main
(){
pila s
t;in
ip(s
t);
T n
um
;if
(em
pty
(st)
) co
ut
<<
"P
ila v
uo
ta" <
< e
nd
l;fo
r (i
nt
i=
0;
i <
DIM
;i+
+)
if (
pu
sh
(st,
DIM
-i)
)co
ut
<<
"In
seri
to "
<<
DIM
-i <
<
". V
alo
re d
i to
p:
" <
<st.
top
<<
en
dl;
els
e c
err
<<
"In
seri
men
to d
i " <
< i <
< "
fallit
o" <
< e
nd
l;if
(fu
ll(s
t))
co
ut
<<
"P
ila p
ien
a" <
< e
nd
l;sta
mp
a(s
t);
for
(in
t i=
0;
i <
DIM
-2;
i++
)if
(p
op
(st,
nu
m))
co
ut
<<
"E
str
att
o "
<<
nu
m <
<". V
alo
re d
i to
p:
"
<<
st.
top
<<
en
dl;
els
e c
err
<<
"E
str
azio
ne f
allit
a" <
<en
dl;
for
(in
t i=
0;
i <
DIM
;i+
+)
if (
pu
sh
(st,
i))
co
ut
<<
"In
seri
to "
<<
i <
< "
. V
alo
re d
i to
p:
"
<<
st.
top
<<
en
dl;
els
e c
err
<<
"In
seri
men
to d
i " <
< i <
< "
fallit
o" <
< e
nd
l;sta
mp
a(s
t);
for
(in
t i=
0;
i <
2;
i++
)if
(p
op
(st,
nu
m))
co
ut
<<
"E
str
att
o "
<<
nu
m <
<". V
alo
re d
i to
p:
" <
< s
t.to
p <
< e
nd
l;els
e c
err
<<
"E
str
azio
ne f
allit
a" <
<en
dl;
sta
mp
a(s
t);
syste
m("
PA
US
E");
retu
rn 0
; }
334
10.3
.1 P
ila (
IV)
Pila v
uo
taIn
seri
to 5
. V
alo
re d
i to
p:
0In
seri
to 4
. V
alo
re d
i to
p:
1In
seri
to 3
. V
alo
re d
i to
p:
2In
seri
to 2
. V
alo
re d
i to
p:
3In
seri
to 1
. V
alo
re d
i to
p:
4P
ila p
ien
aE
lem
en
ti c
on
ten
uti
nella p
ila:
[4]
1[3
] 2
[2]
3[1
] 4
[0]
5E
str
att
o 1
. V
alo
re d
i to
p:
3E
str
att
o 2
. V
alo
re d
i to
p:
2E
str
att
o 3
. V
alo
re d
i to
p:
1In
seri
to 0
. V
alo
re d
i to
p:
2In
seri
to 1
. V
alo
re d
i to
p:
3In
seri
to 2
. V
alo
re d
i to
p:
4In
seri
men
to d
i 3 f
allit
oIn
seri
men
to d
i 4 f
allit
oE
lem
en
ti c
on
ten
uti
nella p
ila:
[4]
2[3
] 1
[2]
0[1
] 4
[0]
5E
str
att
o 2
. V
alo
re d
i to
p:
3E
str
att
o 1
. V
alo
re d
i to
p:
2E
lem
en
ti c
on
ten
uti
nella p
ila:
[2]
0[1
] 4
[0]
5P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
335

10.3
.2 C
od
a (
I)
•In
sie
me o
rdin
ato
di d
ati
di ti
po
ug
uale
, in
cu
i è
po
ssib
ile e
ffett
uare
op
era
zio
ni d
i in
seri
men
to e
di
estr
azio
ne s
eco
nd
o la s
eg
uen
te r
eg
ola
di accesso
: il
pri
mo
dato
in
seri
to è
il p
rim
o a
d e
ssere
estr
att
o
(FIF
O:
Fir
st
In F
irst
Ou
t).
•R
ealizzata
co
n u
n a
rray c
irco
lare
e d
ue p
un
tato
ri:
–fr
on
t –
po
siz
ion
e d
a c
ui avvie
ne l
’estr
azio
ne;
–b
ack –
po
siz
ion
e i
n c
ui
avvie
ne l
’in
seri
men
to.
•fr
on
t=
=b
ack
co
da v
uo
ta•
fro
nt
==
(back +
1)
% D
IMco
da p
ien
a
–(A
TT
EN
ZIO
NE
al
massim
o D
IM -
1 e
lem
en
ti
back
fro
nt
fro
nt
back
fro
nt
back
fro
nt
Inseri
men
tod
iu
nele
men
to
Inseri
men
tod
iu
nele
men
to
Inseri
men
tod
iu
nele
men
toN
on
sare
bb
ep
ossib
ile
dis
cri
min
are
tra
co
da
vu
ota
eco
da
pie
na
back
336
10.3
.2 C
od
a (
II)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
typ
ed
ef
int
T;
co
nst
int
DIM
= 5
;
str
uct
co
da
{in
t fr
on
t, b
ack;
T q
ueu
e[D
IM];
}; vo
id i
nic
(co
da&
cc)
// iniz
ializ
zazio
ne d
ella
coda
{ cc.f
ron
t =
cc.b
ack
=0;
} bo
ol em
pty
(co
nst
co
da&
cc)
// c
oda v
uota
?{
if (
cc.f
ron
t =
= c
c.b
ack)
retu
rn t
rue;
retu
rn f
als
e;
} bo
ol fu
ll(c
on
st
co
da&
cc)
//coda p
iena?
{ if
(cc.f
ron
t =
= (
cc.b
ack +
1)%
DIM
) re
turn
tru
e;
retu
rn f
als
e;
}
337

10.3
.2 C
od
a (
III)
bo
ol in
sq
ueu
e(c
od
a&
cc, T
s)
// inserisce
un e
lem
ento
{ if
(fu
ll(c
c))
retu
rn f
als
e;
cc.q
ueu
e[c
c.b
ack]
= s
;cc.b
ack =
(cc.b
ack+
1)%
DIM
;re
turn
tru
e;
} bo
ol esq
ueu
e(c
od
a&
cc, T
& s
) // e
str
ae u
n e
lem
ento
{ if
(em
pty
(cc))
retu
rn f
als
e;
s =
cc.q
ueu
e[c
c.f
ron
t];
cc.f
ron
t =
(cc.f
ron
t +
1)%
DIM
;re
turn
tru
e;
} vo
id s
tam
pa(c
on
st
co
da&
cc)
// s
tam
pa g
li ele
menti
{fo
r (i
nt
i =
cc.f
ron
t; i%
DIM
!=
cc.b
ack;
i++
)co
ut
<<
cc.q
ueu
e[i
%D
IM]
<<
en
dl;
}
338
10.3
.2 C
od
a (
IV)
int
main
(){ c
od
a q
u;
T n
um
;in
ic(q
u);
if (
em
pty
(qu
)) c
ou
t <
< "
Co
da v
uo
ta" <
< e
nd
l;fo
r (i
nt
i =
0;
i <
DIM
;i+
+)
if (
insq
ueu
e(q
u,i)
)co
ut
<<
"In
seri
to l'e
lem
en
to "
<<
i <
< "
in
po
siz
ion
e "
<<
(q
u.b
ack +
DIM
-1)%
DIM
<<
en
dl;
els
e c
err
<<
"C
od
a p
ien
a" <
< e
nd
l;if
(fu
ll(q
u))
co
ut
<<
"C
od
a p
ien
a" <
< e
nd
l;sta
mp
a(q
u);
for
(in
t i =
0;
i <
DIM
-2;
i++
)if
(esq
ueu
e(q
u,n
um
))co
ut
<<
"E
str
att
o l'e
lem
en
to "
<<
nu
m <
< "
in
po
siz
ion
e "
<<
(q
u.f
ron
t +
DIM
-1)%
DIM
<<
en
dl;
els
e c
ou
t <
< "
Co
da v
uo
ta "
<<
en
dl;
for
(in
t i =
0;
i <
DIM
;i+
+)
if (
insq
ueu
e(q
u,i)
)co
ut
<<
"In
seri
to l'e
lem
en
to "
<<
i <
< "
in
po
siz
ion
e "
<<
(qu
.back +
DIM
-1)%
DIM
<<
en
dl;
els
e c
err
<<
"C
od
a p
ien
a"
<<
en
dl;
sta
mp
a(q
u);
for
(in
t i =
0;
i <
2;
i++
)if
(esq
ueu
e(q
u,n
um
))co
ut
<<
"E
str
att
o l'e
lem
en
to "
<<
nu
m <
< "
in
po
siz
ion
e "
<
< (
qu
.fro
nt
+ D
IM -
1)%
DIM
<<
en
dl;
els
e c
ou
t <
< "
Co
da v
uo
ta"
<<
en
dl;
sta
mp
a(q
u);
syste
m("
PA
US
E");
retu
rn 0
;}
339

10.3
.2 C
od
a (
V)
Co
da v
uo
taIn
seri
to l'e
lem
en
to 0
in
po
siz
ion
e 0
Inseri
to l'e
lem
en
to 1
in
po
siz
ion
e 1
Inseri
to l'e
lem
en
to 2
in
po
siz
ion
e 2
Inseri
to l'e
lem
en
to 3
in
po
siz
ion
e 3
Co
da p
ien
aC
od
a p
ien
a0 1 2 3 E
str
att
o l'e
lem
en
to 0
in
po
siz
ion
e 0
Estr
att
o l'e
lem
en
to 1
in
po
siz
ion
e 1
Estr
att
o l'e
lem
en
to 2
in
po
siz
ion
e 2
Inseri
to l'e
lem
en
to 0
in
po
siz
ion
e 4
Inseri
to l'e
lem
en
to 1
in
po
siz
ion
e 0
Inseri
to l'e
lem
en
to 2
in
po
siz
ion
e 1
Co
da p
ien
aC
od
a p
ien
a3 0 1 2 E
str
att
o l'e
lem
en
to 3
in
po
siz
ion
e 3
Estr
att
o l'e
lem
en
to 0
in
po
siz
ion
e 4
1 2 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
340
11.1
Tip
i fu
nzio
ne
Dic
hia
razio
ne d
i u
na f
un
zio
ne d
i n
arg
om
en
ti:
•asso
cia
ad
un
id
en
tifi
cato
re u
n t
ipo
, d
ete
rmin
ato
d
alla n
-up
la o
rdin
ata
dei ti
pi d
eg
li a
rgo
men
ti e
dal
tip
o d
el ri
su
ltato
.
Valo
ri a
sso
cia
ti a
i ti
pi fu
nzio
ne:
•tu
tte le f
un
zio
ni co
rris
po
nd
en
ti (
no
n v
alg
on
o l
e
co
nvers
ion
i im
plicit
e).
#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
qu
ad
rato
(in
t n
)// Ista
nza d
i tipo funzio
ne int(
int)
{ r
etu
rn n
*n;
}
int
cu
bo
(in
t n
)// Ista
nza d
i tipo funzio
ne int(
int)
{ r
etu
rn n
*n*n
; }
do
ub
le m
ed
ia(i
nt
fp(i
nt)
, in
t a, in
t b
)// funzio
ne a
rg.
{in
t s =
0;
for
(in
t n
= a
; n
<=
b;
n+
+)
s +
= f
p(n
);re
turn
sta
tic_
cast<
do
ub
le>
(s)
/ (b
-a+
1);
} int
main
(){
co
ut
<<
med
ia(q
uad
rato
, 1, 2)
<<
en
dl;
co
ut
<<
med
ia(c
ub
o, 1, 2)
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} 2.5
4.5
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
341

11.2
Pu
nta
tori
a f
un
zio
ne
(I)
I p
un
tato
ri p
osso
no
co
nte
nere
an
ch
e in
dir
izzi d
i fu
nzio
ne.
Defi
niz
ion
e d
i u
n p
un
tato
re a
fu
nzio
ne:
result-t
ype (
*id
entifier
)(a
rgum
ent-
port
ion|o
pt
) ;
Ch
iam
ata
di fu
nzio
ne a
ttra
vers
o i
l p
un
tato
re:
identifier
(expre
ssio
n-lis
t|o
pt
)
(*
identifier
)(
expre
ssio
n-lis
t|o
pt
)
#in
clu
de <
cstd
lib
>
#in
clu
de <
iostr
eam
>
usin
g n
am
esp
ace s
td;
int
qu
ad
rato
(in
t n
) {
retu
rn n
*n;
}
int
cu
bo
(in
t n
) {
retu
rn n
*n*n
; }
do
ub
le m
ed
ia(i
nt
(*p
f)(i
nt)
, in
t a, in
t b
)
{in
t s =
0;
for
(in
t n
= a
; n
<=
b;
n+
+)
s +
= (
*pf)
(n);
// form
a a
ltern
ativa s
+=
pf(
n)
retu
rn s
tati
c_
cast<
do
ub
le>
(s)
/ (b
-a+
1);
} int
main
()
{ co
ut
<<
med
ia(q
uad
rato
, 1, 2)
<<
en
dl;
co
ut
<<
med
ia(c
ub
o, 1, 2)
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;
}
342
11.2
Pu
nta
tori
a f
un
zio
ne
(II)
#in
clu
de <
cstd
lib
>
#in
clu
de <
iostr
eam
>
usin
g n
am
esp
ace s
td;
vo
id f
1()
{
co
ut
<<
"u
no
" <
< e
nd
l; }
vo
id f
2()
{
co
ut
<<
"d
ue" <
< e
nd
l; }
vo
id f
3(v
oid
(*&
pf)
(vo
id))
{in
t a;
cin
>>
a;
if (
a=
=0)
pf
= f
1;
els
e p
f =
f2;
} int
main
()
{
vo
id(*
p1)(
vo
id);
f3(p
1);
(*p
1)(
);
f3(p
1);
(*p
1)(
);
syste
m("
PA
US
E");
retu
rn 0
;
} 5 du
e
0 un
o
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
343

11.3
Arg
om
en
ti d
efa
ult
(I)
Arg
om
en
ti f
orm
ali d
i u
na f
un
zio
ne:
–p
osso
no
avere
in
izia
lizzato
ri;
–co
sti
tuis
co
no
il valo
re d
efa
ult
deg
li a
rgo
men
ti
att
uali (
ven
go
no
in
seri
ti d
al co
mp
ilato
re n
elle
ch
iam
ate
della f
un
zio
ne in
cu
i g
li a
rgo
men
ti a
ttu
ali
so
no
om
essi)
;
–se il valo
re d
efa
ult
vie
ne i
nd
icato
so
lo p
er
alc
un
i arg
om
en
ti, q
uesti
devo
no
essere
gli u
ltim
i;
–g
li in
izia
lizzato
ri n
on
po
sso
no
co
nte
nere
né
vari
ab
ili
locali n
é a
rgo
men
ti f
orm
ali d
ella f
un
zio
ne.
Ch
iam
ata
di fu
nzio
ne:
–p
osso
no
essere
om
essi tu
tti o
so
lo a
lcu
ni
arg
om
en
ti d
efa
ult
: in
og
ni caso
gli a
rgo
men
ti
om
essi d
evo
no
essere
gli u
ltim
i.
Esem
pio
(peso
di u
n c
ilin
dro
):
do
ub
le p
eso
(do
ub
le lu
ng
, d
ou
ble
dia
m =
10,d
ou
ble
d
en
s =
15)
{
dia
m /=
2;
retu
rn (
dia
m*d
iam
* 3
.14 *
lu
ng
* d
en
s);
} int
main
()
{ //
...
p =
peso
(125);
// e
quiv
ale
a p
eso(1
25, 10, 15)
p =
peso
(35, 5);
// e
quiv
ale
a p
eso(3
5, 5, 15)
// ...
}
344
11.3
Arg
om
en
ti d
efa
ult
(II
)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
do
ub
le p
eri
metr
o(i
nt
nL
ati
, d
ou
ble
lu
ng
hL
ato
= 1
.0)
{re
turn
nL
ati
* lu
ng
hL
ato
;} vo
id f
() {
//d
ou
ble
p =
peri
metr
o()
;E
RR
OR
E//
co
ut
<<
p <
< e
nd
l;} d
ou
ble
peri
metr
o(i
nt
nL
ati
= 3
, d
ou
ble
lu
ng
hL
ato
= 1
.0);
vo
id g
()
{d
ou
ble
p =
peri
metr
o()
;//O
Kco
ut
<<
p <
< e
nd
l;} in
t m
ain
()
{f(
);g
();
syste
m("
PA
US
E");
retu
rn 0
;} 3 P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
345

11.4
Overl
oad
ing
(I)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
massim
o(i
nt
a, in
t b
) {
co
ut
<<
"M
assim
o p
er
inte
ri "
<<
en
dl;
retu
rn a
> b
? a
: b
;} d
ou
ble
massim
o(d
ou
ble
a, d
ou
ble
b)
{co
ut
<<
"M
assim
o p
er
do
ub
le" <
< e
nd
l;re
turn
a >
b ?
a :
b;
} /* in
t m
assim
o(d
ou
ble
a, d
ou
ble
b)
E
RR
OR
E!
{re
turn
in
t(a >
b ?
a :
b);
}*/
int
main
()
{co
ut
<<
massim
o(1
0, 15)
<<
en
dl;
co
ut
<<
massim
o(1
2.3
, 13.5
) <
< e
nd
l;//
co
ut
<<
massim
o(1
2.3
, 13)
<<
en
dl;
// E
RR
OR
E: am
big
uo
co
ut
<<
massim
o('
a','r
') <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} M
assim
o p
er
inte
ri 1
5M
assim
o p
er
do
ub
le 1
3.5
Massim
o p
er
inte
ri 1
14
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
346
11.4
Overl
oad
ing
(II
)
// S
ovra
pp
osiz
ion
e c
on
st
-n
on
co
nst
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
massim
o(c
on
st
int
v[]
, in
t n
) {
co
ut
<<
"A
rray c
on
st
";
int
m =
v[0
];fo
r (i
nt
i =
1;
i <
n;
i++
) m
= m
>=
v[i
] ?
m :
v[i
];re
turn
m;
} int
massim
o(i
nt
v[]
, in
t n
) {
co
ut
<<
"A
rray n
on
co
nst
";
int
m =
v[0
];fo
r (i
nt
i =
1;
i <
n;
i++
) m
= m
>=
v[i
] ?
m :
v[i
];re
turn
m;
} int
main
()
{co
nst
int
N =
5;
co
nst
int
cv[N
] =
{1, 10, 100, 10, 1};
co
ut
<<
massim
o(c
v,
N)
<<
en
dl;
int
v[N
] =
{1, 10, 100, 10, 1};
co
ut
<<
massim
o(v
, N
) <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} A
rray c
on
st
100
Arr
ay n
on
co
nst
100
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
347

12.4
Dic
hia
razio
ni ty
ped
ef
(I)
Paro
la c
hia
ve t
yp
ed
ef:
•d
efi
nis
ce d
eg
li id
en
tifi
cato
ri (
dett
i n
om
i ty
ped
ef)
ch
e
ven
go
no
usati
per
rife
rirs
i a t
ipi n
elle d
ich
iara
zio
ni.
Le d
ich
iara
zio
ni ty
ped
ef
no
n c
rean
o n
uo
vi ti
pi
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
main
()
{in
t i =
1;
typ
ed
ef
int*
in
tP;
intP
p =
&i;
co
ut
<<
*p
<<
en
dl;
// 1
typ
ed
ef
int
vett
[5];
// v
ettore
di 5 inte
rivett
v =
{1, 10, 100, 10, 1};
co
ut
<<
"v =
[" <
< v
[0];
for
(in
t j
= 1
; j
< 5
; j+
+)
co
ut
<<
' ' <
< v
[j];
co
ut
<<
']'
<<
en
dl;
typ
ed
ef
int
inte
ro;
int
a =
4;
inte
ro b
= a
; // O
K, ty
pedef non intr
oduce u
n n
uovo tip
o
co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
// 4
4
syste
m("
PA
US
E");
retu
rn 0
;} 1 v =
[1 1
0 1
00 1
0 1
]4 4
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
348
13.1
Mem
ori
a d
inam
ica (
I)
•Pro
gra
mm
ip
reced
en
ti:
–il
pro
gra
mm
ato
resp
ecif
ica,
uti
lizzan
do
defi
niz
ion
i,n
um
ero
eti
po
delle
vari
ab
ili
uti
lizzate
.
•Sit
uazio
nico
mu
ni:
–il
pro
gra
mm
ato
ren
on
èin
gra
do
di
sta
bilir
ea
pri
ori
iln
um
ero
diva
riab
ili
di
un
cert
oti
po
ch
eserv
iran
no
du
ran
tel'esecu
zio
ne
delp
rog
ram
ma.
–P
er
vari
ab
ili
di
tip
oarr
ay,
per
esem
pio
,d
over
sp
ecif
icare
led
imen
sio
ni(c
osta
nti
)è
lim
itati
vo
.
–V
orr
em
mo
po
ter
dim
en
sio
nare
un
arr
ay
do
po
ave
rsco
pert
od
ura
nte
l’esecu
zio
ne
del
pro
gra
mm
a,
qu
an
tod
eve
essere
gra
nd
e.
–P
er
esem
pio
,so
mm
ad
iN
nu
meri
inseri
tid
ata
sti
era
,co
nN
lett
od
ata
sti
era
.
•Meccan
ism
od
ella
mem
ori
alib
era
(om
em
ori
ad
inam
ica):
–ri
su
lta
po
ssib
ile
allo
care
delle
are
ed
im
em
ori
ad
ura
nte
l'esecu
zio
ne
del
pro
gra
mm
a,
ed
acced
ere
ata
liare
em
ed
ian
tep
un
tato
ri;
–g
lio
gg
ett
ico
sì
ott
en
uti
so
no
dett
id
inam
ici,
ed
allo
cati
nella
mem
ori
alib
era
.
349

•A
llo
cazio
ne
dio
gg
ett
id
inam
ici:
–o
pera
tore
pre
fisso
new
:
»h
aco
me
arg
om
en
toil
tip
od
ell’o
gg
ett
od
aallo
care
;
»re
sti
tuis
ce
l’in
dir
izzo
della
mem
ori
ao
tten
uta
,ch
ep
uò
essere
asseg
nato
au
np
un
tato
re;
»se
no
nè
po
ssib
ile
ott
en
ere
lam
em
ori
ari
ch
iesta
,re
sti
tuis
ce
l’in
dir
izzo
0.
#in
clu
de
<cstd
lib
>
#in
clu
de
<io
str
eam
>
usin
gn
am
esp
ace
std
;
int
main
()
{
int*
q;
q=
new
int;
*q=
10;
co
ut
<<
*q<
<en
dl;
//10
int
*p
;
int
n;
cin
>>
n;
p=
new
int
[n];
//n
>0
for
(in
ti=
0;
i<
n;
i++
)
p[i
]=
i;//
anche
*(p+
i)=
i;
syste
m("
PA
US
E");
retu
rn0;
}
13.1
Mem
ori
a d
inam
ica (
II)
350
•B
uo
nesit
od
ell’o
pera
tore
new
:
–p
uò
essere
co
ntr
ollato
usan
do
lafu
nzio
ne
di
lib
reri
aset_
new
_h
an
dle
r(),
dic
hia
rata
nelfi
le<
new
>:
»q
uesta
fun
zio
ne
ha
co
me
arg
om
en
tou
na
fun
zio
ne
vo
idsen
za
arg
om
en
ti,
ch
evie
ne
eseg
uit
ase
l’o
pera
tore
new
fallis
ce
(se
l'allo
cazio
ne
no
nè
po
ssib
ile).
#in
clu
de
<cstd
lib
>
#in
clu
de
<io
str
eam
>
#in
clu
de
<n
ew
>
usin
gn
am
esp
ace
std
;
vo
idm
yh
an
dle
r()
{
cerr
<<
"M
em
ori
alib
era
no
nd
isp
on
ibile"
<<
en
dl;
exit
(1);
} int
main
()
{
int
n;
set_
new
_h
an
dle
r(m
yh
an
dle
r);
co
ut
<<
"In
seri
scila
dim
en
sio
ne
"<
<en
dl;
cin
>>
n;
int*
*m
=n
ew
int*
[n];
for
(in
ti=
0;
i<n
;i+
+)
m[i
]=
new
int[
n];
syste
m("
PA
US
E");
retu
rn0;
}
13.1
Mem
ori
a d
inam
ica (
III)
351

•O
gg
ett
iallo
cati
nella
mem
ori
alib
era
:
–esis
ton
ofi
nch
én
on
ve
ng
on
od
istr
utt
id
all’o
pera
tore
pre
fisso
dele
te:
»esso
ha
co
me
arg
om
en
tou
np
un
tato
reall'o
gg
ett
od
ad
istr
ug
gere
;
»p
uò
essere
ap
plicato
so
load
un
pu
nta
tore
ch
ein
dir
izza
un
og
gett
oallo
cato
med
ian
tel’o
pera
tore
new
(in
caso
co
ntr
ari
osico
mm
ett
eu
nerr
ore
).
•S
el’o
pera
tore
dele
ten
on
vie
ne
uti
lizzato
:
–g
lio
gg
ett
iallo
cati
ven
go
no
dis
tru
tti
al
term
ine
del
pro
gra
mm
a.
int
main
()
{in
tn
=12;
int*
p=
new
int(
10);
co
ut
<<
*p<
<en
dl;
dele
tep
;
//cout<
<*p
<<
endl;
//S
BA
GLIA
TO
,N
ON
SE
GN
ALA
ER
RO
RE
p=
0;
//cout<
<*p
<<
endl;
//S
EG
NA
LA
ER
RO
RE
AT
EM
PO
DIE
SE
CU
ZIO
NE
int*
m=
new
int
[n];
dele
te[]
m;
//dele
ten;
//E
RR
OR
E-
oggetto
non
allo
cato
din
am
icam
ente
syste
m("
PA
US
E");
retu
rn0;
}
Mem
ori
a d
inam
ica (
IV)
352
13.2
Lis
te (
I)
Pro
ble
ma:
mem
ori
zzare
nu
meri
in
seri
ti d
a t
asti
era
fin
ch
è n
on
vie
ne in
seri
to il cara
ttere
‘.’.
Str
utt
ura
dati
,fo
rmata
da
ele
men
tid
ello
ste
sso
tip
oco
lleg
ati
incate
na,
lacu
ilu
ng
hezza
vari
ad
inam
icam
en
te.
•Lis
ta:
–o
gn
iele
men
toè
un
astr
utt
ura
,co
sti
tuit
ad
au
no
op
iùcam
pi
co
nte
nen
tiin
form
azio
ni,
ed
au
ncam
po
pu
nta
tore
co
nte
nen
tel'in
dir
izzo
dell’e
lem
en
tosu
ccessiv
o;
–il
pri
mo
ele
men
toè
ind
iriz
zato
da
un
pu
nta
tore
(pu
nta
tore
della
lista
);
–il
cam
po
pu
nta
tore
dell’u
ltim
oele
men
toco
nti
en
eil
pu
nta
tore
nu
llo
.
typ
ed
ef
int
T;
str
uct
ele
m
{
Tin
f;
ele
m*
pu
n;
};
3
p0
p0->
inf
p0->
pun
912
0
heap
353

13.2
Lis
te (
II)
Cre
azio
ne d
i u
na l
ista
1. Leggere
l’in
form
azio
ne
2. A
llocare
un n
uovo e
lem
ento
con l’in
form
azio
ne d
a
inserire
3. C
olle
gare
il nuovo e
lem
ento
al prim
o e
lem
ento
della
lis
ta
4. A
ggio
rnare
il punta
tore
di te
sta
della
lis
ta a
punta
re
al nuovo e
lem
ento
typ
ed
ef
ele
m*
lista
;// tip
o lis
ta
lista
cre
alista
(in
t n
)
{
lista
p0 =
0;
ele
m*
p;
for
(in
t i =
0;
i <
n;
i++
)
{
p =
new
ele
m;
cin
>>
p->
inf;
p->
pu
n =
p0;
p0 =
p;
} retu
rn p
0;
}
dato
3
p0
dato
2dato
10
dato
4
p
354
13.2
Lis
te (
III)
Sta
mp
a lis
ta
1. S
candire la lis
ta d
all’
iniz
io a
lla f
ine e
per
ogni
ele
mento
sta
mpare
su v
ideo il cam
po info
rmazio
ne
vo
id s
tam
palista
(lis
ta p
0)
{
ele
m*
p =
p0;
wh
ile (
p !
= 0
)
{
co
ut
<<
p->
inf
<<
' ';
p =
p->
pu
n;
}
}
p0p
355

13.2
Lis
te(I
V)
Inseri
men
to in
testa
1.
Allo
care
un n
uovo e
lem
ento
con l’in
form
azio
ne d
a
inserire
2.
Co
lleg
are
il n
uo
vo
ele
men
to a
l p
rim
o e
lem
en
to d
ella
lista
3.
Ag
gio
rnare
il p
un
tato
re d
i te
sta
della lis
ta
vo
id i
nste
sta
(lis
ta&
p0, T
a)
{
ele
m*
p =
new
ele
m;
p->
inf
= a
;
p->
pu
n =
p0;
p0 =
p;
}
p0
0
a
p
356
13.2
Lis
te(V
)
Estr
azio
ne d
alla t
esta
Se la lis
ta n
on è
vuota
1.
Aggio
rnare
il punta
tore
di te
sta
della
lis
ta
2.
Deallo
care
l’e
lem
ento
bo
ol estt
esta
(lis
ta&
p0, T
& a
)
{ele
m*
p =
p0;
if (
p0 =
= 0
)
retu
rn f
als
e;
a =
p0->
inf;
p0 =
p0->
pu
n;
dele
te p
;
retu
rn t
rue;
}
p0
0
p
357

13.2
Lis
te(V
I)
Inseri
men
to in
fo
nd
o
1.
Scandire la lis
ta fin
o a
ll’ultim
o e
lem
ento
(m
em
bro
pun =
0)
2.
Allo
care
un n
uovo e
lem
ento
con l’in
form
azio
ne d
a
inserire
3.
Colle
gare
l’u
ltim
o e
lem
ento
al nuovo e
lem
ento
vo
id i
nsfo
nd
o(l
ista
& p
0, T
a)
{ele
m*
p;
ele
m*
q;
for
(q =
p0;
q !
= 0
; q
= q
->p
un
)
p =
q;
q =
new
ele
m;
q->
inf
= a
;
q->
pu
n =
0;
if (
p0 =
= 0
)
p0 =
q;
els
e p
->p
un
= q
;
}
p0
0
pq00
a
358
13.2
Lis
te(V
II)
Estr
azio
ne d
al fo
nd
o
AT
TE
NZ
ION
E:
necessita d
i due p
unta
tori p
er
scandire
la lis
ta
bo
ol estf
on
do
(lis
ta&
p0, T
& a
)
{
ele
m*
p =
0;
ele
m*
q;
if (
p0 =
= 0
)
retu
rn f
als
e;
for
(q =
p0;
q->
pu
n !
= 0
; q
= q
->p
un
)
p =
q;
a =
q->
inf;
// c
ontr
olla
se s
i estr
ae il prim
o e
lem
ento
if (
q =
= p
0)
p0 =
0;
els
e
p->
pu
n =
0;
dele
te q
;
retu
rn t
rue;
}
p0
0
pq
0
359

13.2
Lis
te(V
III)
vo
id i
nseri
men
to(l
ista
& p
0, T
a)
{ele
m*
p =
0;
ele
m*
q;
ele
m*
r;
for
(q =
p0;
q !
= 0
&&
q->
inf
< a
; q
= q
->p
un
)
p =
q;
r =
new
ele
m;
r->
inf
= a
; r-
>p
un
= q
;
// c
ontr
olla
se s
i deve inserire
in testa
if (
q =
= p
0)
p0 =
r;
els
e p
->p
un
= r
;
}Inseri
men
to in
un
a lis
ta o
rdin
ata
1.
Scandire la lis
ta fin
chè s
i in
contr
a u
n e
lem
ento
conte
nente
nel cam
po inf un v
alo
re m
aggio
re d
i
quello
da inserire
oppure
fin
e lis
ta
2. A
llocare
un n
uovo e
lem
ento
con l’in
form
azio
ne d
a
inserire
3. In
serire
il nuovo e
lem
ento
U.
3
p0
p0->
inf
p0->
pun
59
0
pq
r6
360
13.2
Lis
te(I
X)
bo
ol estr
azio
ne(l
ista
& p
0, T
a)
{ele
m*
p =
0;
ele
m*
q;
for
(q =
p0;
q !
= 0
&&
q->
inf
!= a
; q
= q
->p
un
)
p =
q;
if (
q =
= 0
) re
turn
fals
e;
if (
q =
= p
0)
p0 =
q->
pu
n;
els
e p
->p
un
= q
->p
un
;
dele
te q
;
retu
rn t
rue;
}Estr
azio
ne d
i u
n e
lem
en
to d
a u
na lis
ta
1. S
candire la lis
ta fin
chè s
i in
contr
a u
n e
lem
ento
conte
nente
l’in
form
azio
ne c
erc
ata
2. S
e tro
vato
, colle
gare
i d
ue n
odi adia
centi
3. D
eallo
care
l’e
lem
ento
23
912
0
361

13.2
Lis
te(X
)
bo
ol estr
azio
ne_
ord
inata
(lis
ta&
p0, T
a)
{ele
m*
p =
0;
ele
m*
q;
for
(q =
p0;
q !
= 0
&&
q->
inf
< a
; q
= q
->p
un
)
p =
q;
if (
(q =
= 0
)||(
q->
info
>a))
retu
rn f
als
e;
if (
q =
= p
0)
p0 =
q->
pu
n;
els
e p
->p
un
= q
->p
un
;
dele
te q
;
retu
rn t
rue;
}Estr
azio
ne d
i u
n e
lem
en
to d
a u
na lis
ta o
rdin
ata
1. S
candire la lis
ta fin
chè s
i in
contr
a u
n e
lem
ento
conte
nente
l’in
form
azio
ne c
erc
ata
o m
aggio
re
2. S
e tro
vato
, colle
gare
i d
ue n
odi adia
centi
3. D
eallo
care
l’e
lem
ento
39
12
0
362
13.2
Lis
te c
on
pu
nta
tore
au
sil
iari
o (
I)
lista
_n
cre
alista
1(i
nt
n)
{ele
m*
p;
lista
_n
li =
{0, 0};
if (
n >
= 1
)
{
p =
new
ele
m;
cin
>>
p->
inf;
p->
pu
n =
0;
li.p
0 =
p;
li.p
1 =
p;
for
(in
t i =
2;
i <
= n
; i+
+)
{
p =
new
ele
m;
cin
>>
p->
inf;
p->
pu
n =
li.p
0;
li.p
0 =
p;
}
} retu
rn li;
}str
uct
lista
_n
{
ele
m*
p0;
ele
m*
p1;
};
dato
a
li.p0
p0->
inf
p0->
pun
dato
bdato
c0
li.p1
363

13.2
Lis
te c
on
pu
nta
tore
au
sil
iari
o (
II)
bo
ol estt
esta
1(l
ista
_n
& li, T
& a
){
ele
m*
p =
li.p
0;
if (
li.p
0 =
= 0
) re
turn
fals
e;
a =
li.p
0->
inf;
li.p
0 =
li.p
0->
pu
n;
dele
te p
;if
(li.p
0 =
= 0
) li.p
1 =
0;
retu
rn t
rue;
} vo
id i
nsfo
nd
o1(l
ista
_n
& li, T
a)
{ele
m*
p =
new
ele
m;
p->
inf
= a
; p
->p
un
= 0
;if
(li.p
0 =
= 0
) {
li.p
0 =
p;
li.p
1 =
p;
} els
e
{
li.p
1->
pu
n =
p;
li.p
1 =
p;
}
}
dato
a
li.p0
p0->
inf
p0->
pun
dato
bdato
c0
li.p1
364
13.3
Lis
te c
om
ple
sse
str
uct
nu
_ele
m
{
T in
f;
ele
m*
pre
c;
ele
m*
su
cc;
}; str
uct
lista
_c
{
nu
_ele
m*
p0;
nu
_ele
m*
p1;
};
p0
p1
0
0
365

14.2
.1 V
isib
ilit
à
Pro
gra
mm
i sem
plici:
•fo
rmati
da p
och
e f
un
zio
ni, t
utt
e c
on
ten
ute
in
un
u
nic
o f
ile, ch
e s
i scam
bia
no
in
form
azio
ni att
ravers
o
arg
om
en
ti e
ris
ult
ati
.
Pro
gra
mm
i p
iù c
om
ple
ssi:
•si u
tilizzan
o t
ecn
ich
e d
i p
rog
ram
mazio
ne m
od
ula
re:
–su
dd
ivis
ion
e d
i u
n p
rog
ram
ma in
div
ers
e p
art
i ch
e v
en
go
no
scri
tte, co
mp
ilate
(veri
ficate
e
mo
dif
icate
) sep
ara
tam
en
te;
–scam
bio
di in
form
azio
ni fr
a f
un
zio
ni u
tilizzan
do
o
gg
ett
i co
mu
ni.
Vis
ibilit
à (
sco
pe):
•cam
po
di vis
ibil
ità d
i u
n i
den
tifi
cato
re (
part
e d
i p
rog
ram
ma i
n c
ui
l'id
en
tifi
cato
re p
uò
essere
u
sato
);
Reg
ole
ch
e d
efi
nis
co
no
la v
isib
ilit
à d
eg
li id
en
tifi
cato
ri
(reg
ole
di vis
ibilit
à):
•serv
on
o a
co
ntr
ollare
la c
on
div
isio
ne d
elle
info
rmazio
ni fr
a i v
ari
co
mp
on
en
ti d
i u
n p
rog
ram
ma:
–p
erm
ett
on
o a
più
part
i d
el p
rog
ram
ma d
i ri
feri
rsi ad
un
a s
tessa e
nti
tà (
il n
om
e d
ell’e
nti
tà
deve e
ssere
vis
ibile a
lle p
art
i d
el p
rog
ram
ma
inte
ressate
);
–im
ped
isco
no
ad
alc
un
e p
art
i d
i u
n p
rog
ram
ma
di ri
feri
rsi ad
un
a e
nti
tà (
il n
om
e d
ell’e
nti
tà n
on
d
eve e
ssere
vis
ibile a
tali p
art
i).
366
14.3
Blo
cch
i
// S
eq
uen
za d
i is
tru
zio
ni ra
cch
iuse t
ra p
are
nte
si g
raff
e
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
vo
id f
()
{in
t i =
2;
// v
isib
ilita
’ lo
cale
co
ut
<<
i <
< e
nd
l;// 2
} int
main
()
{ //co
ut
<<
i <
< e
nd
l;E
RR
OR
E!
int
i =
1, j
= 5
;co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// 1
5{
// b
locco
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;// 1
5in
t i =
10;
// n
asconde l’o
ggetto i d
el blo
cco s
uper.
co
ut
<<
i <
< e
nd
l;// 1
0} co
ut
<<
i <
< e
nd
l;// 1
f();
co
ut
<<
i <
< e
nd
l;// 1
for
(in
t a =
0;
a <
2;
a+
+)
{ in
t b
= 2
* a
; co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
// 0
0 1
2}
//co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
ER
RO
RE
!syste
m("
PA
US
E");
retu
rn 0
;}
367

14.4
Un
ità d
i co
mp
ilazio
ne (
I)
Un
ità d
i co
mp
ilazio
ne:
•co
sti
tuit
a d
a u
n f
ile s
org
en
te e
dai fi
le in
clu
si
med
ian
te d
irett
ive #
inclu
de;
•se il fi
le d
a in
clu
dere
no
n è
di lib
reri
a, il s
uo
no
me v
a
racch
iuso
tra
vir
go
lett
e (
e n
on
fra
pare
nte
si
an
go
lari
).
Esem
pio
:// file
header.
hin
t f1
(in
t);
in
t f2
(in
t);
// file
main
.cpp
#in
clu
de "
head
er.
h"
int
main
(){
f1
(3);
f2(5
);
retu
rn 0
;} // U
nità d
i com
pila
zio
ne r
isultante
int
f1(i
nt)
; in
t f2
(in
t);
int
main
(){
f1(3
);f2
(5);
re
turn
0;
}
368
14.4
Un
ità d
i co
mp
ilazio
ne (
II)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
i;
// v
isib
ilita
’ a liv
ello
di file
vo
id l
eg
gi(
) // v
isib
ilita
’ a liv
ello
di file
{co
ut
<<
"In
seri
sci u
n n
um
ero
in
tero
" <
< e
nd
l;cin
>>
i;
} vo
id s
cri
vi(
) // v
isib
ilita
’ a liv
ello
di file
{co
ut
<<
i <
< e
nd
l;} in
t m
ain
()
{le
gg
i();
scri
vi(
);syste
m("
PA
US
E");
retu
rn 0
;} In
seri
sci u
n n
um
ero
in
tero
2 2 Pre
mere
un
tasto
per
co
nti
nu
are
. . .
•Id
en
tifi
cato
ri d
i o
gg
ett
i co
n v
isib
ilit
à a
liv
ello
di f
ile
ind
ivid
uan
o o
gg
ett
i co
nd
ivis
i d
a t
utt
e le f
un
zio
ni
defi
nit
e n
el fi
le.
369

14.4
Un
ità d
i co
mp
ilazio
ne (
III)
// O
pera
tore
::
un
ari
o (
riso
luzio
ne d
i vis
ibilit
a')
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
i=
1;
//vis
ibili
ta'a
livello
difile
int
main
(){
co
ut
<<
i <
< e
nd
l;// 1
{in
t i =
5;
// v
isib
ilita
' locale
co
ut
<<
::i
<<
'\t
' <
< i <
< e
nd
l;// 1
5{
int
i =
10;
// v
isib
ilita
' locale
co
ut
<<
::i
<<
'\t
' <
< i <
< e
nd
l; // 1 1
0}
} co
ut
<<
::i
<<
en
dl;
// 1
syste
m("
PA
US
E");
retu
rn 0
;} 1 1 5
1 1
01 P
rem
ere
un
tasto
per
co
nti
nu
are
. . .
370
14.5
Sp
azio
di
no
mi
(I)
Sp
azio
di n
om
i:•
Insie
me d
i d
ich
iara
zio
ni e d
efi
niz
ion
i ra
cch
iuse t
ra
pare
nte
si g
raff
e, o
gn
un
a d
elle q
uali in
tro
du
ce
dete
rmin
ate
en
tità
dett
e m
em
bri
.•
Pu
ò e
ssere
dic
hia
rato
so
lo a
liv
ello
di fi
le o
all’in
tern
o d
i u
n a
ltro
sp
azio
dei n
om
i.•
Gli id
en
tifi
cato
ri r
ela
tivi
ad
un
o s
pazio
dei n
om
i so
no
vis
ibili
dal p
un
to in
cu
i so
no
dic
hia
rati
fin
o a
lla f
ine
dello
sp
azio
dei n
om
i.
nam
esp
ace u
no
{str
uct
st
{in
t a;
do
ub
le d
; };
int
n;
vo
id f
f(in
t a)
{/*U
*/}
//U
} nam
esp
ace d
ue
{str
uct
st
{in
t a;
do
ub
le d
;};
} int
main
(){
un
o::
st
ss1;
usin
g n
am
esp
ace d
ue;
//direttiv
ast
ss2;
}
371

14.5
Sp
azio
di
no
mi
(II)
nam
esp
ace u
no
{str
uct
st
{in
t a;
do
ub
le d
; };
int
n;
vo
id f
f(in
t a)
{/*U
*/}
//U
} nam
esp
ace d
ue
{str
uct
st
{in
t a;
do
ub
le d
;};
} int
main
(){
un
o::
st
ss1;
usin
g n
am
esp
ace u
no
;u
sin
g n
am
esp
ace d
ue;
//st
ss2;
ER
RO
RE
un
o::
st
ss2;
} L’u
so
della d
irett
iva u
sin
g n
am
esp
ace p
uò
gen
era
re
delle a
mb
igu
ità.
372
14.5
Sp
azio
di
no
mi
(III
)
Lo
sp
azio
dei n
om
i è a
pert
o, cio
è è
po
ssib
ile u
sare
più
vo
lte l
o s
tesso
id
en
tifi
cato
re d
i sp
azio
dei n
om
i in
su
ccessiv
e d
ich
iara
zio
ni, p
er
inclu
derv
i n
uo
vi
mem
bri
.
Sp
azio
dei n
om
i g
lob
ali:
co
sti
tuit
o d
alle d
efi
niz
ion
i e
dic
hia
razio
ni a liv
ello
di fi
le.
Per
usare
un
o s
pecif
ico
id
en
tifi
cato
re s
i p
uò
usare
la
dic
hia
razio
ne u
sin
g.
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
nam
esp
ace u
no
{in
t i =
2, j
= 3
;} in
t i =
4, j
= 5
; //S
pazio
glo
bale
int
main
(){
usin
g :
: i;
usin
g u
no
::
j;co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;//
usin
g u
no
::i;
E
RR
OR
E: ri-d
ichia
razio
ne d
i i
{u
sin
g u
no
::i;
co
ut
<<
i <
< '\t
' <
< :
:j <
< e
nd
l;} syste
m("
PA
US
E");
retu
rn 0
;} 4 3
2 5
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
373

14.6
Co
lleg
am
en
to (
I)
Pro
gra
mm
a:
•p
uò
essere
fo
rmato
da p
iù u
nit
à d
i co
mp
ilazio
ne,
ch
e v
en
go
no
svilu
pp
ate
sep
ara
tam
en
te e
su
ccessiv
am
en
te c
olleg
ate
per
form
are
un
file
eseg
uib
ile.
Co
lleg
am
en
to:
•u
n id
en
tifi
cato
re h
a c
olleg
am
en
to in
tern
ose s
i ri
feri
sce a
un
a e
nti
tà a
ccessib
ile s
olo
da q
uella u
nit
à
di co
mp
ilazio
ne;
–u
no
ste
sso
id
en
tifi
cato
re c
he h
a c
olleg
am
en
to
inte
rno
in
più
un
ità d
i co
mp
ilazio
ne s
i ri
feri
sce
in o
gn
un
a a
un
a e
nti
tà d
ivers
a;
•in
un
a u
nit
à d
i co
mp
ilazio
ne, u
n id
en
tifi
cato
re h
a
co
lleg
am
en
to e
ste
rno
se s
i ri
feri
sce a
un
a e
nti
tà
accessib
ile a
nch
e a
d a
ltre
un
ità d
i co
mp
ilazio
ne;
–ta
le e
nti
tà d
eve e
ssere
un
ica in
tu
tto
il
pro
gra
mm
a.
Reg
ola
defa
ult
:
•g
li id
en
tifi
cato
ri c
on
vis
ibilit
à l
ocale
han
no
co
lleg
am
en
to in
tern
o;
•g
li id
en
tifi
cato
ri c
on
vis
ibilit
à a
liv
ello
di fi
le h
an
no
co
lleg
am
en
to e
ste
rno
(a m
en
o c
he n
on
sia
no
d
ich
iara
ti c
on
la p
aro
la c
hia
ve c
on
st)
.
374
14.6
Co
lleg
am
en
to (
II)
Og
gett
i e f
un
zio
ni c
on
co
lleg
am
en
to e
ste
rno
:
•p
osso
no
essere
uti
lizzati
in
alt
re u
nit
à d
i co
mp
ilazio
ne;
•in
cia
scu
na u
nit
à in
cu
i ven
go
no
uti
lizzati
devo
no
essere
dic
hia
rati
(an
ch
e p
iù v
olt
e).
Og
gett
o:
•vie
ne s
olo
dic
hia
rato
se s
i u
sa la p
aro
la c
hia
ve
ex
tern
(e s
e n
on
vie
ne s
pecif
icato
nessu
n v
alo
re
iniz
iale
);
•vie
ne a
nch
e d
efi
nit
o s
e n
on
vie
ne u
sata
la p
aro
la
ch
iave e
xte
rn(o
se v
ien
e s
pecif
icato
un
valo
re
iniz
iale
).
Fu
nzio
ne:
•vie
ne s
olo
dic
hia
rata
se s
i sp
ecif
ica s
olo
l'in
testa
zio
ne (
si p
uò
an
ch
e u
tilizzare
la p
aro
la
ch
iave e
xte
rn, n
el caso
in
cu
i la
defi
niz
ion
e s
i tr
ovi
in
un
alt
ro f
ile);
•vie
ne a
nch
e d
efi
nit
a s
e s
i sp
ecif
ica a
nch
e il co
rpo
.
Osserv
azio
ne:
•an
alo
gam
en
te a
gli o
gg
ett
i co
n v
isib
ilit
à a
liv
ello
di
file
(o
gg
ett
i co
nd
ivis
i),
an
ch
e g
li o
gg
ett
i co
n
co
lleg
am
en
to e
ste
rno
(o
gg
ett
ig
lob
ali)
perm
ett
on
o la
co
nd
ivis
ion
e d
i in
form
azio
ni fr
a f
un
zio
ni.
375

14.6
Co
lleg
am
en
to (
III)
// -
----
----
----
----
----
----
-fi
le f
ile1.c
pp
----
----
----
----
----
----
-//
int
a =
1;
// c
olle
gam
ento
este
rno
co
nst
int
N =
0;
// c
onst, c
olle
gam
ento
inte
rno
sta
tic in
t b
= 1
0;
// s
tatic, colle
gam
ento
inte
rno
// c
olle
gam
ento
este
rno
vo
id f
1(i
nt
a)
{// a
-colle
gam
ento
inte
rno
int
k;
// k
-colle
gam
ento
inte
rno
/* ... *
/} // s
tatic, colle
gam
ento
inte
rno
sta
tic v
oid
f2()
{
/* ... *
/} str
uct
pu
nto
// c
olle
gam
ento
inte
rno (
dic
hia
razio
ne)
{d
ou
ble
x;
do
ub
le y
;}; p
un
to p
1;
// c
olle
gam
ento
este
rno (c
on
tin
ua ...) 3
76
14.6
Co
lleg
am
en
to (
IV)
// -
----
----
----
----
----
----
---
file
file2.c
pp
----
----
----
----
----
----
----
//#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
exte
rn in
t a;
// s
olo
dic
hia
razio
ne
vo
id f
1(i
nt)
;// s
olo
dic
hia
razio
ne
vo
id f
2()
; // s
olo
dic
hia
razio
ne
vo
id f
3()
; // s
olo
dic
hia
razio
ne
do
ub
le f
4(d
ou
ble
, d
ou
ble
);// d
efiniz
ione m
ancante
// O
K, non u
tiliz
zata
int
main
(){
co
ut
<<
a <
< e
nd
l;// O
K, 1
exte
rn in
t b
;// d
ichia
razio
ne
//co
ut
<<
b <
< e
nd
l;E
RR
OR
E!
f1(a
);// O
K//
f2()
;E
RR
OR
E!
//f3
();
ER
RO
RE
!//
pu
nto
p2;
E
RR
OR
E! punto
non d
ichia
rato
//
p1.x
= 1
0;
ER
RO
RE
! P
1 n
on d
ichia
rato
syste
m("
PA
US
E");
retu
rn 0
;} S
tesso
tip
o in
più
un
ità d
i co
mp
ilazio
ne:
•vie
ne v
eri
ficata
so
lo l’u
gu
ag
lian
za t
ra g
li
iden
tifi
cato
ri d
el ti
po
;
•se l’o
rgan
izzazio
ne in
tern
a n
on
èla
ste
ssa, si h
an
no
err
ori
lo
gic
i a t
em
po
di esecu
zio
ne.
377

14.8
Cla
ssi d
i m
em
ori
zzazio
ni
// O
gg
ett
i d
i cla
sse a
uto
mati
ca e
di cla
sse s
tati
ca
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
sta
tic in
t m
;
// iniz
ializ
zato
a z
ero
int
co
nta
Ch
iam
ate
Err
ata
()
{// E
RR
AT
A!
int
n =
0;
// d
i cla
sse a
uto
matica
retu
rn +
+n
;} in
t co
nta
Ch
iam
ate
()
{sta
tic in
t n
= 0
;// d
i cla
sse s
tatica
++
m;
retu
rn +
+n
;} in
t m
ain
(){
for
(in
t i =
0;
i <
3;
i++
)co
ut
<<
co
nta
Ch
iam
ate
Err
ata
() <
< e
nd
l;fo
r (i
nt
i =
0;
i <
3;
i++
){
co
ut
<<
co
nta
Ch
iam
ate
() <
< '\t
'; c
ou
t <
< m
<<
en
dl;
}syste
m("
PA
US
E");
retu
rn 0
;} 1 1 1 1 1
2 2
3 3
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
378
14.8
Cla
ssi d
i m
em
ori
zzazio
ni
// A
tten
zio
ne:
ord
ine (
pu
nti
di seq
uen
za)
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
sta
tic in
t m
;
// iniz
ializ
zato
a z
ero
int
co
nta
Ch
iam
ate
Err
ata
()
{// E
RR
AT
A!
int
n =
0;
// d
i cla
sse a
uto
matica
retu
rn +
+n
;} in
t co
nta
Ch
iam
ate
()
{sta
tic in
t n
= 0
;// d
i cla
sse s
tatica
++
m;
retu
rn +
+n
;} in
t m
ain
(){
for
(in
t i =
0;
i <
3;
i++
)co
ut
<<
co
nta
Ch
iam
ate
Err
ata
() <
< e
nd
l;fo
r (i
nt
i =
0;
i <
3;
i++
)co
ut
<<
m <
< '\t
' <
< c
on
taC
hia
mate
() <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 1 1 1 1 1
2 2
3 3
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
379

14.1
0 E
ffett
i co
llate
rali
(I)
// V
ari
ab
ili g
lob
ali
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
int
a =
10, b
= 1
00;
// Incre
menta
il m
aggio
re.R
estitu
isce il m
aggio
renon
// incre
menta
to.
int
incre
mM
ag
(){
if (
a >
b)
re
turn
a+
+;
els
e
retu
rn b
++
;} in
t m
ain
(){
co
ut
<<
in
cre
mM
ag
() <
< e
nd
l;co
ut
<<
a <
< '\t
' <
< b
<<
en
dl;
syste
m("
PA
US
E");
retu
rn 0
;} 100
10 101
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
380
14.1
0 E
ffett
i co
llate
rali
(II
)
// A
rgo
men
ti d
i ti
po
pu
nta
tore
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
// Incre
menta
il m
aggio
re.R
estitu
isce il m
aggio
renon
// incre
menta
to.
int
incre
mM
ag
(in
t*p
a, in
t*p
b)
{if
(*p
a >
*p
b)
re
turn
(*p
a)+
+;
els
e re
turn
(*p
b)+
+;
} int
main
(){
int
i =
10, j
= 1
00;
co
ut
<<
in
cre
mM
ag
(&i, &
j) <
< e
nd
l;co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 100
10 101
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
381

14.1
0 E
ffett
i co
llate
rali
(II
I)
// P
rob
lem
a:
pro
pri
eta
' asso
cia
tiva
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
// Incre
menta
il m
aggio
re.R
estitu
isce il m
aggio
renon
// incre
menta
to.
int
incre
mM
ag
(in
t*p
a, in
t*p
b)
{if
(*p
a >
*p
b)
re
turn
(*p
a)+
+;
els
e re
turn
(*p
b)+
+;
} int
main
(){
int
i =
10, j
= 1
00;
co
ut
<<
in
cre
mM
ag
(&i, &
j) +
in
cre
mM
ag
(&i, &
j);
co
ut
<<
en
dl;
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;i =
10, j
= 1
00;
co
ut
<<
in
cre
mM
ag
(&i, &
j) -
incre
mM
ag
(&i, &
j);
co
ut
<<
en
dl;
co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 201
10 102
-1 10 102
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
382
14.1
0 E
ffett
i co
llate
rali
(IV
)
// P
rob
lem
a:
ord
ine d
i valu
tazio
ne d
eg
li o
pera
nd
i
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
// Incre
menta
il m
aggio
re.R
estitu
isce il m
aggio
renon
// incre
menta
to.
int
incre
mM
ag
(in
t*p
a, in
t*p
b)
{if
(*p
a >
*p
b)
re
turn
(*p
a)+
+;
els
e re
turn
(*p
b)+
+;
} int
main
(){
int
i =
10, j
= 1
00;
co
ut
<<
i +
j +
in
cre
mM
ag
(&i, &
j) <
< e
nd
l;co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;i =
10, j
= 1
00;
co
ut
<<
in
cre
mM
ag
(&i, &
j) +
i +
j <
< e
nd
l;co
ut
<<
i <
< '\t
' <
< j <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 210
10 101
211
10 101
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
383

14.1
0 E
ffett
i co
llate
rali
(V
)
// P
rob
lem
a:
ott
imiz
zazio
ne
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>u
sin
g n
am
esp
ace s
td;
// Incre
menta
il m
aggio
re.R
estitu
isce il m
aggio
renon
// incre
menta
to.
int
incre
mM
ag
(in
t*p
a, in
t*p
b)
{if
(*p
a >
*p
b)
re
turn
(*p
a)+
+;
els
e re
turn
(*p
b)+
+;
} int
main
(){
int
i =
10, j
= 1
00, r1
, r2
;r1
= i +
j +
in
cre
mM
ag
(&i, &
j);
// 2
10
r2 =
i +
j +
in
cre
mM
ag
(&i, &
j);
// 2
12
co
ut
<<
r1 <
< '\t
' <
< r
2 <
< e
nd
l;i =
10, j
= 1
00;
r1 =
i +
j +
in
cre
mM
ag
(&i, &
j);
r2 =
r1;
// 2
10 2
10
co
ut
<<
r1 <
< '\t
' <
< r
2 <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
;} 210 2
12
210 2
10
Pre
mere
un
tasto
per
co
nti
nu
are
. . .
384
14.1
1 M
od
uli
(I)
Mo
du
lo:
•p
art
e d
i p
rog
ram
ma c
he s
vo
lge u
na p
art
ico
lare
fu
nzio
nalità
e c
he r
isie
de s
u u
no
o p
iùfi
le;
•m
od
uli s
erv
ito
rie m
od
uli c
lien
ti.
Mo
du
lo s
erv
ito
re:
•o
ffre
(esp
ort
a)
riso
rse d
i vari
a n
atu
ra, co
me f
un
zio
ni,
vari
ab
ili
(glo
bali)
e t
ipi.
•co
sti
tuit
o n
orm
alm
en
te d
a d
ue f
ile (
co
n e
ste
nsio
ne h
e c
pp
,ri
sp
ett
ivam
en
te):
–in
testa
zio
ne o
in
terf
accia
(d
ich
iara
zio
ne
dei
serv
izi
off
ert
i);
–re
ali
zzazio
ne.
Sep
ara
zio
ne f
ra in
terf
accia
e r
ealizzazio
ne:
•h
a p
er
sco
po
l’o
ccu
ltam
en
to d
ell’in
form
azio
ne
(in
form
ati
on
hid
ing
);
–sem
pli
fica l
e d
ipen
den
ze f
ra i m
od
uli
;
–p
erm
ett
e d
i m
od
ific
are
la r
eali
zzazio
ne d
i u
n
mo
du
lo
sen
za i
nfl
uen
zare
il fu
nzio
nam
en
to d
ei
su
oi
cli
en
ti.
Mo
du
lo c
lien
te:
•u
tilizza (
imp
ort
a)
riso
rse o
ffert
e d
ai m
od
uli
serv
ito
ri
(in
clu
de il fi
le d
i in
testa
zio
ne d
i q
uesti
);•
vie
ne s
cri
tto
sen
za c
on
oscere
i d
ett
ag
li r
ela
tivi
alla
realizzazio
ne d
ei m
od
uli s
erv
ito
ri.
385

14.1
1 M
od
uli
(II)
// E
SE
MP
IO P
ILA
// M
OD
ULO
SE
RV
ER
// file
p
ila.h
typ
ed
ef
in
t T
;co
nst
int
DIM
= 5
;str
uct
pila
{in
t to
p;
T s
tack[D
IM];
}; vo
id i
nip
(pila&
pp
);b
oo
l em
pty
(co
nst
pila&
pp
);b
oo
l fu
ll(c
on
st
pila&
pp
);b
oo
l p
ush
(pila&
pp
, T
s);
bo
ol p
op
(pila&
pp
, T
& s
);vo
id s
tam
pa(c
on
st
pila&
pp
);
// file
pila
.cpp
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>#in
clu
de "
pila.h
"u
sin
g n
am
esp
ace s
td;
//in
izia
lizzazio
ne d
ella
pila
vo
id i
nip
(pila&
pp
){
pp
.to
p =
-1;
} K.
386
14.1
1 M
od
uli
(III
)
// E
SE
MP
IO P
ILA
// M
OD
ULO
CLIE
NT
// file
p
ilaM
ain
.cpp
#in
clu
de <
cstd
lib
>#in
clu
de <
iostr
eam
>#in
clu
de "
pila.h
"u
sin
g n
am
esp
ace s
td;
int
main
(){
pila s
t;in
ip(s
t);
T n
um
;if
(em
pty
(st)
) co
ut
<<
"P
ila v
uo
ta" <
< e
nd
l;fo
r (i
nt
i=
0;
i <
DIM
;i+
+)
if (
pu
sh
(st,
DIM
-i)
)co
ut
<<
"In
seri
to "
<<
DIM
-i <
<
". V
alo
re d
i to
p:
" <
<st.
top
<<
en
dl;
els
e
cerr
<<
"In
seri
men
to d
i " <
< i <
< "
fallit
o" <
<
en
dl;
if (
full(s
t))
co
ut
<<
"P
ila p
ien
a" <
< e
nd
l;syste
m("
PA
US
E");
retu
rn 0
; }
387

14.1
1.1
Astr
azio
ni p
roced
ura
li
Astr
azio
ni p
roced
ura
li.
–i m
od
uli s
erv
ito
ri m
ett
on
o a
dis
po
siz
ion
e d
ei
mo
du
li c
lien
tiu
n in
sie
me d
i fu
nzio
ni;
–le
dic
hia
razio
ni d
i ta
li f
un
zio
ni si tr
ovan
o i
n u
n
file
di in
testa
zio
ne c
he v
ien
e i
nclu
so
dai m
od
uli
clien
ti;
–la
realizzazio
ne d
i ta
li f
un
zio
ni si tr
ova i
n u
n f
ile
div
ers
o (
ch
e n
on
vie
ne i
nclu
so
).
–ta
li f
un
zio
ni ven
go
no
usate
sen
za c
he s
ia
necessari
a a
lcu
na c
on
oscen
za d
ella lo
ro
str
utt
ura
in
tern
a.
Esem
pio
:
–le
fu
nzio
ni d
i lib
reri
a p
er
l’ela
bo
razio
ne d
elle
str
ing
he s
on
o c
on
ten
ute
in
un
mo
du
lo il cu
i fi
le
di in
testa
zio
ne è
<cstr
ing
>, e il lo
ro u
tilizzo
no
n
rich
ied
e a
lcu
na c
on
oscen
za s
ulla lo
ro
realizzazio
ne.
388
14.1
1.1
Tip
i d
i d
ato
astr
att
o
Tip
i d
i d
ato
astr
att
i:•p
rin
cip
io d
ell’o
ccu
ltam
en
to d
ell’in
form
azio
ne:
–l’o
rgan
izzazio
ine in
tern
a d
elti
po
no
n d
eve e
ssere
accessib
ile a
i m
od
uli c
lien
ti;
–i m
od
uli c
lien
ti p
osso
no
defi
nir
e o
gg
ett
i d
i q
uel
tip
o, e a
cced
erv
iso
ltan
to a
ttra
vers
o l
e f
un
zio
ni
dic
hia
rate
nell’in
testa
zio
ne,
sen
za p
ossib
ilit
à d
i acced
ere
alla lo
ro
org
an
izzazio
ne in
tern
a.
Le s
ole
regole
di vis
ibili
tà e
colle
gam
ento
del lin
guaggio
non
consento
no d
i avere
moduli
che r
ealiz
zano c
om
piu
tam
ente
tipi di dato
astr
atti.
#in
clu
de "
pila.h
"in
t m
ain
()
{p
ila s
t;in
ip(s
t);
pu
sh
(st,
1);
co
ut
<<
st.
top
<<
en
dl;
// A
TT
EN
ZIO
NE
!st.
top
= 1
0;
// A
TT
EN
ZIO
NE
!// U
} #in
clu
de "
pila.h
"in
t f(
pila&
p)
{p.t
op
= 5
;}
// A
TT
EN
ZIO
NE
!in
t m
ain
()
{p
ila s
t;in
ip(s
t);
f(st)
;//
...
}
389

390
16.2
Tip
i cla
sse (
I)
Nell
’esem
pio
pre
ced
en
te,
la s
tru
ttu
ra i
nte
rna d
ell
a p
ila è
vis
ibil
e a
i m
od
uli
ch
e u
tili
zzan
o ista
nze d
ell
a p
ila. In
q
uesto
mo
do
no
n s
i ri
esce a
reali
zzare
co
mp
iuta
men
te i
l ti
po
di d
ato
astr
att
o.
Per
ovvia
re a
qu
esto
pro
ble
ma,
il C
++
mett
e a
d
isp
osiz
ion
e le c
lassi.
#in
clu
de <
iostr
eam
>u
sin
gn
am
esp
ace
std
;
typ
ed
ef
int
T;
co
nst
int
DIM
= 5
;cla
ss
pil
a
{
int
top
; T
sta
ck[D
IM];
pu
bli
c:
vo
idin
ip()
;b
oo
lem
pty
();
bo
olfu
ll()
;b
oo
lp
ush
(T s
);b
oo
lp
op
(T&
s);
vo
idsta
mp
a()
;}; in
tm
ain
()
{p
ila s
t;st.
inip
();
st.
pu
sh
(1);
st.
top
= 1
0;
// E
RR
OR
E!
// 'i
ntpila
::to
p' is
private
within
this
conte
xt
}
391
16.2
Tip
i cla
sse (
II)
basic
-cla
ss-t
ype-d
ecla
ration
cla
ss-t
ype-s
pecifie
r ;
cla
ss-t
ype-s
pecifie
r
cla
ss
identifier|
op
t{
cla
ss-e
lem
ent-
seq
}
cla
ss-e
lem
ent
access-indic
ato
r|o
pt
cla
ss-m
em
ber-
section
access-indic
ato
r
access-s
pecifie
r :
access-s
pecifie
r
pri
vate
pro
tecte
d
pu
bli
c
In g
en
ere
uti
lizzere
mo
la f
orm
a s
em
pli
ficata
seg
uen
te:
cla
ss n
om
e
{p
art
e p
rivata
pro
tecte
d:
part
e p
rote
tta
pu
bli
c:
part
e p
ub
bli
ca
}; Un
mem
bro
di u
na c
lasse p
uò
essere
:
-u
n t
ipo
(en
um
era
zio
ne o
str
utt
ura
);
-u
n c
am
po
dati
(o
gg
ett
o n
on
in
izia
lizzato
);
-u
na f
un
zio
ne (
dic
hia
razio
ne o
defi
niz
ion
e);
-u
na c
lasse (
div
ers
a d
a q
uell
a d
ell
a c
lasse a
cu
i
ap
part
ien
e).

392
16.2
Tip
i cla
sse (
III)
// N
um
eri C
om
ple
ssi(p
art
e r
eale
, part
e im
magin
aria)
#in
clu
de<
iostr
eam
>u
sin
g n
am
esp
ace s
td;
cla
ss c
om
ple
sso
{d
ou
ble
re,
im;
pu
bli
c:
vo
id i
niz
_co
mp
l(d
ou
ble
r,
do
ub
le i)
{re =
r;
im=
i;}
do
ub
le r
eale
() {
retu
rn r
e;}
do
ub
le im
mag
() {
retu
rn i
m;}
/* .
.. *
/vo
id s
cri
vi(
) {c
ou
t<
< '('
<<
re <
< "
, " <
< im
<<
')'
;}}; in
tm
ain
()
{co
mp
lesso
c1,
c2;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
//in
izia
lizzazio
ne
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
c2.i
niz
_co
mp
l(10.0
, -1
0.0
);c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(10,
-10)
co
mp
lesso
* cp
= &
c1;
cp
->scri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
retu
rn 0
;} (1
, -1
)(1
0,
-10)
(1,
-1)
// E
sem
pio
Num
eri C
om
ple
ssi
#in
clu
de<
iostr
eam
>u
sin
g n
am
esp
ace s
td;
cla
ss c
om
ple
sso
{ pu
bli
c:
vo
id i
niz
_co
mp
l(d
ou
ble
r,
do
ub
le i)
{re =
r;
im=
i;}
do
ub
le r
eale
() {
retu
rn r
e;}
do
ub
le im
mag
() {
retu
rn i
m;}
/* .
.. *
/vo
id s
cri
vi(
) {c
ou
t<
< '('
<<
re <
< "
, " <
< im
<<
')'
;}p
rivate
:d
ou
ble
re,
im;
}; int
main
()
{co
mp
lesso
c1,
c2;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
c2.i
niz
_co
mp
l(10.0
, -1
0.0
);c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(10,
-10)
co
mp
lesso
* cp
= &
c1;
cp
->scri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
retu
rn 0
;} (1
, -1
)(1
0,
-10)
(1,
-1)
393
16.2
Tip
i cla
sse (
IV)

394
16.2
Tip
i cla
sse (
V)
// N
um
eri C
om
ple
ssi(r
appre
senta
zio
ne
pola
re)
#in
clu
de<
iostr
eam
>#in
clu
de<
cm
ath
>u
sin
g n
am
esp
ace s
td;
cla
ss c
om
ple
sso
{d
ou
ble
mo
d, arg
;p
ub
lic:
vo
id i
niz
_co
mp
l(d
ou
ble
r,
do
ub
le i)
{mo
d =
sq
rt(r
*r +
i*i
); a
rg=
ata
n(i
/r);
}d
ou
ble
reale
() {
retu
rn m
od
*co
s(a
rg);
}d
ou
ble
im
mag
() {
retu
rn m
od
*sin
(arg
);}
/* .
.. *
/vo
id s
cri
vi(
) {c
ou
t<
< '('
<<
reale
() <
< "
, " <
< im
mag
() <
< ')'
;}}; in
tm
ain
()
{co
mp
lesso
c1,
c2;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
c2.i
niz
_co
mp
l(10.0
, -1
0.0
);c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(10,
-10)
co
mp
lesso
* cp
= &
c1;
cp
->scri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
retu
rn 0
;} (1
, -1
)(1
0,
-10)
(1,
-1)
395
16.2
Tip
i cla
sse (
VI)
Le f
un
zio
nim
em
bro
defi
nit
e n
ell
ad
ich
iara
zio
ne
di u
na
cla
sse
so
no
fun
zio
niin
lin
e.
Le f
un
zio
nim
em
bro
po
sso
no
an
ch
eessere
defi
nit
e
este
rnam
en
teu
tili
zzan
do
l’o
pera
tore
di ri
so
luzio
ne
di
vis
ibil
ita’.
#in
clu
de<
iostr
eam
>u
sin
g n
am
esp
ace s
td;
cla
ss c
om
ple
sso
{ pu
bli
c:
vo
id i
niz
_co
mp
l(d
ou
ble
r,
do
ub
le i);
d
ou
ble
reale
();
do
ub
le im
mag
();
/* .
.. *
/vo
id s
cri
vi(
);p
rivate
:d
ou
ble
re,
im;
}; vo
id c
om
ple
sso
:: i
niz
_co
mp
l(d
ou
ble
r,
do
ub
le i)
{re =
r;
im=
i;}
do
ub
le c
om
ple
sso
:: r
eale
()
{retu
rn r
e;}
do
ub
le c
om
ple
sso
::im
mag
()
{retu
rn i
m;}
vo
id c
om
ple
sso
::scri
vi(
) {c
ou
t<
< '('
<<
re <
< "
, " <
< im
<<
')'
;}

396
16.3
Op
era
zio
ni
su
og
gett
i cla
sse
Un
og
gett
oap
part
en
en
tead
un
acla
sse
sich
iam
ao
gg
ett
ocla
sse
o ista
nza
dell
a c
lasse
cla
ss c
om
ple
sso
{/*&
*/};
int
main
()
{co
mp
lesso
c1;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
co
mp
lesso
c2 =
c1,
c3(c
2);
//
Iniz
ializ
zazio
ne
-ricopia
tura
mem
bro
a m
em
bro
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
co
mp
lesso
*pc1 =
new
co
mp
lesso
(c1);
pc1->
scri
vi(
); c
ou
t<
< e
nd
l;
// (
1,-
1)
co
mp
lesso
* p
c2 =
&c1;
pc2->
scri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
retu
rn 0
;} (1
, -1
)(1
, -1
)(1
, -1
)(1
, -1
)(1
, -1
)
cla
ss c
om
ple
sso
{/*&
*/};
co
mp
lesso
so
mm
a(c
om
ple
sso
a,
co
mp
lesso
b)
{ co
mp
lesso
s;
s.i
niz
_co
mp
l(a.r
eale
()+
b.r
eale
(),
a.i
mm
ag
() +
b.i
mm
ag
());
retu
rn s
;} in
tm
ain
()
{co
mp
lesso
c1,
c2,
c3;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
c2 =
c1;
//A
ssegnam
ento
-ricopia
tura
mem
bro
a m
em
bro
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
c3 =
so
mm
a(c
1,c
2);
// o
ggett
iarg
om
ento
di fu
nzio
ni
// e
restitu
itida f
unzio
ni
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(2,
-2)
retu
rn 0
;} (1
, -1
)(1
, -1
)(2
, -2
)
AT
TE
NZ
ION
E:
no
n e
sis
ton
oalt
reo
pera
zio
nip
red
efi
nit
e
397
16.3
Op
era
zio
ni
su
og
gett
i cla
sse

398
16.4
Pu
nta
tore
th
is (
I)
Nell
a d
efi
niz
ion
ed
i u
na
fun
zio
ne
mem
bro
, il
gen
eri
co
og
gett
oa c
ui la
fu
nzio
ne
vie
ne
ap
pli
cata
pu
ò e
ssere
ri
feri
to t
ram
ite i
l p
un
tato
re c
osta
nte
pre
defi
nit
o t
his
cla
ss c
om
ple
sso
{/*&
*/ co
mp
lesso
scala
(do
ub
le s
)//
restitu
isce
un v
alo
re{
re *
= s
; im
*= s
; re
turn
*th
is;
}}; in
tm
ain
()
{co
mp
lesso
c1;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
c1.s
cala
(2);
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(2,
-2)
co
mp
lesso
c2;
c2.i
niz
_co
mp
l(1.0
, -1
.0);
c2.s
cala
(2).
scala
(2);
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(2,
-2)
retu
rn 0
;} (2
, -2
)(2
, -2
)
399
16.4
Pu
nta
tore
th
is (
II)
cla
ss c
om
ple
sso
{/*&
*/ co
mp
lesso
& s
cala
(do
ub
le s
) //
restitu
isce
un r
iferim
ento
{re
*=
s;
im*=
s;
retu
rn *
this
;}
}; int
main
()
{co
mp
lesso
c1;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
c1.s
cala
(2);
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(2,
-2)
co
mp
lesso
c2;
c2.i
niz
_co
mp
l(1.0
, -1
.0);
c2.s
cala
(2).
scala
(2);
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(4,
-4)
retu
rn 0
;} (2
, -2
)(4
, -4
)

400
16.5
Vis
ibil
ità a
liv
ell
o d
i cla
sse
(I)
Un
a c
lasse i
nd
ivid
ua u
n c
am
po
di vis
ibil
ità.
–G
li id
en
tifi
cato
ri d
ich
iara
ti a
ll’i
nte
rno
di u
na c
lasse
so
no
vis
ibil
i d
al
pu
nto
dell
a lo
ro d
ich
iara
zio
ne f
ino
all
a f
ine d
ell
a c
lasse s
tessa.
–N
el
co
rpo
dell
e f
un
zio
ni m
em
bro
so
no
vis
ibil
i tu
tti
gli
id
en
tifi
cato
ri p
resen
ti n
ell
a c
lasse (
an
ch
e q
uell
i
no
n a
nco
ra d
ich
iara
ti).
–S
e n
ell
a c
lasse v
ien
e r
iuti
lizzato
un
id
en
tifi
cato
re
dic
hia
rato
all
’este
rno
dell
a c
lasse,
la d
ich
iara
zio
ne
fatt
a n
ell
a c
lasse n
asco
nd
e q
uell
a p
iù e
ste
rna.
–A
ll’e
ste
rno
dell
a c
lasse p
osso
no
essere
resi
vis
ibil
i
med
ian
te l
’op
era
tore
di ri
so
luzio
ne d
i vis
ibil
ità :
:
ap
pli
cato
al
no
me d
ell
a c
lasse:
•L
e f
un
zio
ni m
em
bro
, q
uan
do
ven
go
no
defi
nit
e;
•U
n t
ipo
o u
n e
nu
mera
tore
, se d
ich
iara
ti n
ell
a
part
e p
ub
bli
ca d
ell
a c
lasse
•M
em
bri
sta
tici
–L
’op
era
tore
di vis
ibil
ità n
on
pu
ò e
ssere
uti
lizzato
per
i cam
pi
dati
no
n s
tati
ci.
401
16.5
Vis
ibil
ità a
liv
ell
o d
i cla
sse
(II)
cla
ss g
rafi
ca
{//
...
pu
bli
c:
en
um
co
lore
{ r
osso
, verd
e,
blu
};
}; cla
ss t
raff
ico
{//
...
pu
bli
c:
en
um
co
lore
{ r
osso
, g
iall
o, verd
e }
;co
lore
sta
to()
;//
...
}; traff
ico
::co
lore
tra
ffic
o::
sta
to()
{ /
* ..
. */
}
// ...
gra
fica::
co
lore
pu
nto
;tr
aff
ico
::co
lore
sem
afo
ro;
int
main
(){
// ...
pu
nto
= g
rafi
ca::
rosso
;sem
afo
ro =
tra
ffic
o::
rosso
;//
&}

402
16.5
Vis
ibil
ità a
liv
ell
o d
i cla
sse
(III
)
Nell
ad
ich
iara
zio
ne
di
un
acla
sse
si
pu
òd
ich
iara
reu
n’a
ltra
cla
sse
(cla
sse
an
nid
ata
).In
qu
esto
caso
,p
er
rife
rire
me
mb
rid
ell
acla
sse
an
nid
ata
este
rnam
en
teall
acla
sse
ch
ela
co
nti
en
ed
evo
no
essere
us
ati
du
eo
pera
tori
diri
so
luzio
ne
divis
ibil
ità.
Nessu
na
dell
ed
ue
cla
ssi
ha
dir
itti
di
acces
so
all
ap
art
ep
rivata
dell
’alt
ra.
cla
ss A
{
cla
ss B
{in
t x;
pu
bli
c:
vo
id i
niz
_B
(in
t);
}; int
y;
pu
bli
c:
vo
id i
niz
_A
();
}; vo
id A
::in
iz_
A()
{ y =
0;
}vo
id A
::B
::in
iz_B
(in
t n
){x
= n
;}
//vo
id A
::in
iz_
A()
{x =
3;
} E
RR
OR
E:
A n
on p
uò a
ccedere
// a
lla p
art
e p
rivata
di B
// v
oid
A::
B::
iniz
_B
(in
t n
){y =
n;}
// E
RR
OR
E:
B n
on p
uo’
// a
ccedere
alla
part
e p
rivata
//
di A
403
16.6
Mo
du
lari
tà e
ric
om
pil
azio
ne (
I)
L’u
so
dell
e c
lassi
perm
ett
e d
i scri
vere
pro
gra
mm
i in
cu
i l’
inte
razio
ne t
ra m
od
uli
è l
imit
ata
all
e i
nte
rfacce.
Qu
an
do
si
mo
dif
ica la p
art
e d
ati
di u
na c
lasse,
an
ch
e s
e
gli
alt
ri m
od
uli
uti
lizzan
o s
olo
l’i
nte
rfaccia
, si
ren
de
necessari
a l
a r
ico
mp
ilazio
ne d
ei m
od
uli
. In
fatt
i, s
e i
n u
n
mo
du
lo c
lien
te v
ien
e d
efi
nit
o u
n o
gg
ett
o c
lasse,
il
co
mp
ilato
re h
a b
iso
gn
o d
i sap
ere
la d
imen
sio
ne
dell
’og
gett
o.
Ai
fin
i d
ell
a r
ico
mp
ila
zio
ne
no
n è
ap
pro
pri
ato
s
ep
ara
re u
na
cla
ss
e i
n in
terf
ac
cia
e s
tru
ttu
ra i
nte
rna
, m
a p
iutt
os
to e
ffe
ttu
are
un
a s
ud
div
isio
ne
in
fil
e.
Un
fil
e d
i in
tes
tazio
ne
ch
e c
on
tie
ne
la
dic
hia
razio
ne
d
ell
a c
las
se
e d
eve
es
se
re i
nc
lus
o i
n t
utt
i i m
od
uli
c
lie
nte
.
Un
fil
e d
i re
ali
zza
zio
ne
ch
e c
on
tie
ne
tu
tte
le
d
efi
niz
ion
i d
ell
e f
un
zio
ni m
em
bro
.
La
mo
dif
ica
di u
n f
ile
di in
tes
tazio
ne
ric
hie
de
la
ri
co
mp
ila
zio
ne
di
tutt
i i
file
ch
e l
o i
nc
lud
on
o.
La
mo
dif
ica
di u
n f
ile
di re
ali
zza
zio
ne
ric
hie
de
so
lo l
a
ric
om
pil
azio
ne
di
qu
es
to f
ile
.

404
16.6
Mo
du
lari
tà e
ric
om
pil
azio
ne
(II)
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{d
ou
ble
re,
im;
pu
bli
c:
vo
id i
niz
_co
mp
l(d
ou
ble
r,
do
ub
le i);
d
ou
ble
reale
();
do
ub
le im
mag
();
/* .
.. *
/vo
id s
cri
vi(
);co
mp
lesso
& s
cala
(do
ub
le s
);}; //
file
com
ple
sso.c
pp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
usin
g n
am
esp
ace s
td;
vo
id c
om
ple
sso
:: i
niz
_co
mp
l(d
ou
ble
r,
do
ub
le i)
{re =
r;
im=
i;}
do
ub
le c
om
ple
sso
:: r
eale
() {
retu
rn r
e;}
do
ub
le c
om
ple
sso
::im
mag
() {
retu
rn i
m;}
vo
id c
om
ple
sso
::scri
vi(
) {c
ou
t<
< '('
<<
re <
< "
, " <
< im
<<
')'
;}
co
mp
lesso
& c
om
ple
sso
::scala
(do
ub
le s
){
re
*=
s;
im
*= s
;
retu
rn *
this
;}
405
16.6
Mo
du
lari
tà e
ric
om
pil
azio
ne
(III
)
// file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
usin
g n
am
esp
ace s
td;
int
main
()
{co
mp
lesso
c1;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
c1.s
cala
(2);
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(2,
-2)
co
mp
lesso
c2;
c2.i
niz
_co
mp
l(1.0
, -1
.0);
c2.s
cala
(2).
scala
(2);
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(4,
-4)
retu
rn 0
;}

406
16.7
Fu
nzio
ne g
lob
ali
Fu
nzio
ni g
lob
ali
: fu
nzio
ni ch
e n
on
so
no
mem
bro
di
alc
un
a c
lasse.
No
n p
osso
no
acced
ere
all
a p
art
e p
rivata
dell
e c
lassi
e
no
n p
osso
no
usare
il p
un
tato
re t
his
.
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
co
mp
lesso
so
mm
a(c
on
st
co
mp
lesso
& a
, co
nst
co
mp
lesso
& b
){
co
mp
lesso
s;
s.i
niz
_co
mp
l(a.r
eale
()+
b.r
eale
(),
a.i
mm
ag
() +
b.i
mm
ag
());
retu
rn s
;} u
sin
g n
am
esp
ace s
td;
int
main
()
{co
mp
lesso
c1,
c2,
c3;
c1.i
niz
_co
mp
l(1.0
, -1
.0);
c2.i
niz
_co
mp
l(2.0
, -2
.0);
c3 =
so
mm
a(c
1,c
2);
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(3,
-3)
retu
rn 0
;} (3
, -3
)
407
16.8
Co
str
utt
ori
(I)
Co
str
utt
ore
: fu
nzio
ne m
em
bro
il cu
i n
om
e è
il n
om
e d
ell
a
cla
sse.
Se d
efi
nit
a v
ien
e i
nvo
cata
au
tom
ati
cam
en
te t
utt
e
le v
olt
e c
he v
ien
e c
reata
un
’ista
nza d
i cla
sse (
su
bit
o
do
po
ch
e è
sta
ta r
iserv
ata
la m
em
ori
a p
er
i cam
pi
dati
)
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
, d
ou
ble
i);
d
ou
ble
reale
();
do
ub
le im
mag
();
/* .
.. *
/vo
id s
cri
vi(
);}; //
file
com
ple
sso.c
pp
/*&
.*/
co
mp
lesso
:: c
om
ple
sso
(do
ub
le r
, d
ou
ble
i)
{re =
r;
im =
i;}
// file
main
.cpp
/*&
.*/
int
main
()
{co
mp
lesso
c1(1
.0,
-1.0
);c1.s
cri
vi(
); c
ou
t <
< e
nd
l;//
(1,
-1)
co
mp
lesso
c2;
// E
RR
OR
E:
non e
sis
te c
om
ple
sso()
co
mp
lesso
c3(1
);//
ER
RO
RE
: non e
sis
te c
om
ple
sso(int)
}

408
16.8
Co
str
utt
ori
defa
ult
(I)
Per
defi
nir
e o
gg
ett
i sen
za i
niz
iali
zzato
rio
cco
rre d
efi
nir
e
un
co
str
utt
ore
di d
efa
ult
ch
e p
uò
essere
ch
iam
ato
sen
za
arg
om
en
ti. D
ue m
eccan
ism
i.
1)
Meccan
ism
o d
ell
’overl
oad
ing
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{d
ou
ble
re,
im;
pu
bli
c:
co
mp
lesso
();
co
mp
lesso
(do
ub
le r
, d
ou
ble
i);
d
ou
ble
reale
();
do
ub
le im
mag
();
/* .
.. *
/vo
id s
cri
vi(
);}; //
file
com
ple
sso.c
pp
/*&
.*/
co
mp
lesso
:: c
om
ple
sso
()
// c
ostr
utt
ore
di defa
ult
{re =
0;
im=
0;}
co
mp
lesso
:: c
om
ple
sso
(do
ub
le r
, d
ou
ble
i)
{re =
r;
im=
i;}
// file
main
.cpp
/*&
.*/
int
main
()
{co
mp
lesso
c1(1
.0,
-1.0
);c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(1,
-1)
co
mp
lesso
c2;
co
mp
lesso
c3(3
.0);
// E
RR
AT
O}
409
16.8
Co
str
utt
ori
defa
ult
(II)
2)
Meccan
ism
o d
eg
li a
rgo
men
ti d
efa
ult
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i =
0);
d
ou
ble
reale
();
do
ub
le im
mag
();
/* .
.. *
/vo
id s
cri
vi(
);}; //
file
com
ple
sso.c
pp
/*&
.*/
co
mp
lesso
::
co
mp
lesso
(do
ub
le r
, d
ou
ble
i)
{re =
r;
im =
i;}
// file
main
.cpp
/*&
.*/
int
main
()
{co
mp
lesso
c1(1
.0,
-1.0
);//
(1,
-1)
co
mp
lesso
c2;
// (
0,
0)
co
mp
lesso
c3(3
.0);
// (
3,
0)
co
mp
lesso
c4 =
3.0
; //
(3,
0)
// p
ossib
ile q
uando il costr
utt
ore
puo’ essere
//
invocato
con u
n s
olo
arg
om
ento
} AT
TE
NZ
ION
E:
I d
ue m
eccan
ism
i n
on
po
sso
no
essere
u
tili
zzati
co
nte
mp
ora
neam
en
te.

410
16.8
Co
str
utt
ori
per
all
ocare
mem
ori
a
Sp
esso
un
co
str
utt
ore
ric
hie
de l
’all
ocazio
ne d
i m
em
ori
a
lib
era
per
alc
un
i m
em
bri
dell
’og
gett
o d
a c
ostr
uir
e
// file
str
inga.h
cla
ss s
trin
ga
{ch
ar*
str
;p
ub
lic:
str
ing
a(c
on
st
ch
ar
s[]
);//
...
}; // file
str
inga.c
pp
str
ing
a::
str
ing
a(c
on
st
ch
ar
s[]
){
str
= n
ew
ch
ar[
str
len
(s)+
1];
str
cp
y(s
tr,
s);
/
/ copia
la s
trin
ga s
nella
str
inga s
tr} //
...
// file
main
.cpp
int
main
(){
str
ing
a i
nf(
"F
on
dam
en
ti d
i in
form
ati
ca
I");
/*..
.*/
} Qu
an
do
defi
nia
mo
un
a v
ari
ab
ile d
i ti
po
str
ing
a,
vie
ne
riserv
ata
mem
ori
a p
er
str
e q
uin
di vie
ne r
ich
iam
ato
il
co
str
utt
ore
ch
e a
llo
ca u
n a
rray d
ell
a d
imen
sio
ne
rich
iesta
.
411
16.8
Co
str
utt
ori
per
og
gett
i d
inam
ici
I co
str
utt
ori
defi
nit
i p
er
un
a c
lasse v
en
go
no
ch
iam
ati
im
pli
cit
am
en
te a
nch
e q
uan
do
un
og
gett
o v
ien
e a
llo
cato
d
inam
icam
en
te
// file
main
.cpp
#in
clu
de<
iostr
eam
>
#in
clu
de "
co
mp
lesso
.h"
int
main
()
{co
mp
lesso
* p
c1 =
new
co
mp
lesso
(3.0
, 4.0
);co
mp
lesso
* p
c2 =
new
co
mp
lesso
(3.0
);co
mp
lesso
* p
c3 =
new
co
mp
lesso
;/*
&*/
}

412
16.9
Dis
tru
tto
ri
Dis
tru
tto
re:
fun
zio
ne m
em
bro
ch
e v
ien
e i
nvo
cata
au
tom
ati
cam
en
te q
uan
do
un
og
gett
o t
erm
ina i
l su
o
tem
po
di vit
a.
Un
dis
tru
tto
re n
on
ha a
rgo
men
ti.
Ob
bli
gato
ri q
uan
do
il co
str
utt
ore
all
oca m
em
ori
a
din
am
ica.
// file
str
inga.h
cla
ss
str
ing
a
{ch
ar*
str
;p
ub
lic:
str
ing
a(c
on
st
ch
ar
s[]
);~
str
ing
a()
;//
dis
trutt
ore
// ...
}; // file
str
inga.c
pp
str
ing
a::
str
ing
a(c
on
st
ch
ar
s[]
){
str
= n
ew
ch
ar[
str
len
(s)+
1];
str
cp
y(s
tr,
s);
/
/ copia
la s
trin
ga s
nella
str
inga s
tr} str
ing
a::
~str
ing
a()
{d
ele
te[]
str
;}/*
&*/
// file
main
.cpp
/*&
*/in
tm
ain
(){
str
ing
a*
ps
= n
ew
str
ing
a("
Fo
nd
am
en
ti d
i In
f.");
/*..
.*/
dele
te p
s;
}
413
16.9
Reg
ole
di
ch
iam
ata
I co
str
utt
ori
ven
go
no
ric
hia
mati
co
n le r
eg
ole
seg
uen
ti:
1.
Pe
r g
li o
gg
ett
i s
tati
ci, a
ll’in
izio
de
l p
rog
ram
ma
;
2.
Pe
r g
li o
gg
ett
i a
uto
ma
tic
i, q
ua
nd
o v
ien
e i
nc
on
tra
ta la
de
fin
izio
ne
;
3.
Pe
r g
li o
gg
ett
i d
ina
mic
i, q
ua
nd
o v
ien
e i
nc
on
tra
to
l’o
pe
rato
re n
ew
;
4.
Pe
r g
li o
gg
ett
i m
em
bri
di a
ltri
og
ge
tti, q
ua
nd
o q
ue
sti
ult
imi
ve
ng
on
o c
os
tru
iti.
I d
istr
utt
ori
ven
go
no
ric
hia
mati
co
n le r
eg
ole
seg
uen
ti:
1.
Pe
r g
li o
gg
ett
i s
tati
ci, a
l te
rmin
e d
el
pro
gra
mm
a;
2.
Pe
r g
li o
gg
ett
i a
uto
ma
tic
i, a
ll’u
sc
ita
da
l b
loc
co
in
cu
i
so
no
de
fin
iti;
3.
Pe
r g
li o
gg
ett
i d
ina
mic
i, q
ua
nd
o v
ien
e i
nc
on
tra
to
l’o
pe
rato
re d
ele
te;
4.
Pe
r g
li o
gg
ett
i m
em
bri
di a
ltri
og
ge
tti, q
ua
nd
o q
ue
sti
ult
imi
ve
ng
on
o d
istr
utt
i.
Gli o
gg
ett
i c
on
lo
ste
ss
o t
em
po
di
vit
a v
en
go
no
dis
tru
tti
ne
ll’o
rdin
e i
nve
rso
a q
ue
llo
in
cu
i s
on
o d
efi
nit
i.

414
16.9
Co
str
utt
ori
/Dis
tru
tto
ri E
sem
pio
// file
str
inga.c
pp
/*&
*/str
ing
a::
str
ing
a(c
on
st
ch
ar
s[]
){
str
= n
ew
ch
ar[
str
len
(s)+
1];
str
cp
y(s
tr,
s);
/
/ copia
la s
trin
ga s
nella
str
inga s
trco
ut
<<
"C
" <
< s
tr<
< e
nd
l;
} str
ing
a::
~str
ing
a()
{co
ut
<<
"D
" <
< s
tr<
< e
nd
l;d
ele
te[]
str
;} //
file
main
.cpp
#in
clu
de <
cstd
lib
>#in
clu
de "
str
ing
a.h
"in
tm
ain
(){
str
ing
a*
ps
= n
ew
str
ing
a("
Fo
nd
am
en
ti d
i In
f.");
{str
ing
a s
("R
eti
Lo
gic
he");
} dele
te p
s;
/*..
.*/
retu
rn0;
} C F
on
dam
en
ti d
i In
f.C
Reti
Lo
gic
he
D R
eti
Lo
gic
he
D F
on
dam
en
ti d
i In
f.
415
16.1
0C
ostr
utt
ori
di
co
pia
(I)
Co
str
utt
ore
di co
pia
pre
defi
nit
o:
co
str
utt
ore
ch
e a
gis
ce
fra d
ue o
gg
ett
i d
ell
a s
tessa c
lasse e
ffett
uan
do
un
a
rico
pia
tura
mem
bro
a m
em
bro
dei
cam
pi
dati
.
Vie
ne a
pp
licato
:
1.
Qu
an
do
un
og
ge
tto
cla
ss
e v
ien
e i
niz
ializza
to c
on
un
alt
ro o
gg
ett
o d
ella
ste
ss
a c
las
se
2.
Qu
an
do
un
og
ge
tto
cla
ss
e v
ien
e p
as
sa
to a
d u
na
fun
zio
ne
co
me
arg
om
en
to v
alo
re;
3.
Qu
an
do
un
a f
un
zio
ne
re
sti
tuis
ce
co
me
va
lore
un
og
ge
tto
cla
ss
e (
me
dia
nte
l’is
tru
zio
ne
re
turn
)
Nel
caso
dell
a c
lasse c
om
ple
sso
il co
str
utt
ore
di co
pia
p
red
efi
nit
o h
a la s
eg
uen
te f
orm
a:
co
mp
lesso
(co
nst
co
mp
lesso
& c
) {
re =
c.r
e;
im =
c.i
m;}
;

416
16.1
0C
ostr
utt
ori
di
co
pia
(II
)
// file
main
.cpp
#in
clu
de "
co
mp
lesso
.h"
co
mp
lesso
fun
(co
mp
lesso
c)
{
/*&
.*/
retu
rn c
;
} int
main
()
{
co
mp
lesso
c1 (
3.2
, 4);
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
<3.2
, 4>
co
mp
lesso
c2 (
c1);
//
costr
utt
ore
di copia
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
<3.2
, 4>
co
mp
lesso
c3 =
c1;
//
costr
utt
ore
di copia
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
<3.2
, 4>
c3 =
fu
n(c
1);
//
ista
nza
di fu
nzio
ne
// c
ostr
utt
ore
di copia
applic
ato
2 v
olte:
// c
hia
mata
di fu
nzio
ne
// r
estitu
zio
ne
del valo
re
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
<3.2
, 4>
retu
rn 0
;
}
417
16.1
0C
ostr
utt
ori
di
co
pia
(II
I)
Per
osserv
are
qu
an
do
ilco
str
utt
ore
di co
pia
vie
ne
eff
ett
ivam
en
teri
ch
iam
ato
, ri
defi
nia
mo
ilco
str
utt
ore
di
co
pia
nell
acla
sse
co
mp
lesso
ed
eseg
uia
mo
lo s
tesso
pro
gra
mm
ap
rin
cip
ale
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{d
ou
ble
re,
im;
pu
bli
c:
co
mp
lesso
(co
nst
co
mp
lesso
&);
/
/ costr
utt
ore
di copia
/* .
.. *
/}; //
file
com
ple
sso.c
pp
/*&
.*/
co
mp
lesso
:: c
om
ple
sso
(co
nst
co
mp
lesso
& c
) {
re
= c
.re;
im=
c.i
m;
co
ut
<<
"C
ostr
utt
ore
di co
pia
" <
< e
nd
l;} (3
.2,
4)
Co
str
utt
ore
di co
pia
(3.2
, 4)
Co
str
utt
ore
di co
pia
(3.2
, 4)
Co
str
utt
ore
di co
pia
Co
str
utt
ore
di co
pia
(3.2
, 4)

418
16.1
0C
ostr
utt
ori
di
co
pia
(IV
)
Il c
ostr
utt
ore
di co
pia
deve e
ssere
rid
efi
nit
o p
er
qu
ell
e
cla
ssi
ch
e u
tili
zzan
o m
em
ori
a l
ibera
e p
reved
on
o u
n
dis
tru
tto
re.
// file
str
inga.h
cla
ss
str
ing
a
{ch
ar*
str
;p
ub
lic:
str
ing
a(c
on
st
ch
ar
s[]
);~
str
ing
a()
;//
dis
trutt
ore
// ...
}; // file
main
.cpp
#in
clu
de <
cstd
lib
>#in
clu
de "
str
ing
a.h
"in
tm
ain
(){
str
ing
a s
1("
og
gi"
);str
ing
a s
2(s
1);
// c
ostr
utt
ore
di copia
pre
definito
retu
rn0;
}
s1.str
s2.str
ogg
i\0
419
16.1
0C
ostr
utt
ori
di
co
pia
(V
)
Co
nsid
eri
am
ol’
esem
pio
seg
uen
te.
// file
main
.cpp
#in
clu
de <
cstd
lib
>#in
clu
de "
str
ing
a.h
"
vo
id f
f(str
ing
asg
){
// U
} int
main
(){
str
ing
as1("
og
gi"
);ff
(s1);
retu
rn 0
;}
s1.str
sg.str
ogg
i\0
Termine
esecuzione
funzione

420
16.1
0C
ostr
utt
ori
di
co
pia
(V
I)
// file
str
inga.h
cla
ss s
trin
ga
{ch
ar*
str
;p
ub
lic:
str
ing
a(c
on
st
str
ing
a &
);//
...
}; // file
str
inga.c
pp
/*&
*/str
ing
a::
str
ing
a(c
on
st
str
ing
a&
s)
{str
= n
ew
ch
ar[
str
len
(s.s
tr)
+ 1
];str
cp
y(s
tr,
s.s
tr);
} // file
main
.cpp
/*&
*/in
t m
ain
(){
str
ing
a s
1("
og
gi"
);ff
(s1);
/*&
*/}
s1.str
sg.str
ogg
i\0
Termine
esecuzione
funzione
ogg
i\0
421
16.1
0C
ostr
utt
ori
di
co
pia
(V
I)
Se i
l co
str
utt
ore
di co
pia
no
n v
ien
e r
idefi
nit
o, vie
ne
usato
il co
str
utt
ore
di co
pia
pre
fefi
nit
o.
Per
imp
ed
irn
e l
’uti
lizzo
, o
cco
rre i
nseri
re l
a s
ua
dic
hia
razio
ne n
ell
a p
art
e p
rivata
dell
a c
lasse s
tessa
sen
za a
lcu
na r
idefi
niz
ion
e.
Nel
caso
in
cu
i il
co
str
utt
ore
di co
pia
ven
ga n
asco
sto
, n
on
si p
osso
no
avere
fu
nzio
ni ch
e a
bb
ian
o a
rgo
men
ti
valo
re d
el
tip
o d
ell
a c
lasse o
un
ris
ult
ato
valo
re d
el ti
po
d
ell
a c
lasse.
// file
str
inga.h
cla
ss s
trin
ga
{ch
ar*
str
;str
ing
a(c
on
st
str
ing
a &
);p
ub
lic:
// ...
}; // file
main
.cpp
/*&
*/vo
id f
f(str
ing
a s
g)
// E
RR
OR
E{
// &
} vo
id f
f(str
ing
a&
sg
)//
OK
{//
&}

422
16.1
1F
un
zio
ni
frie
nd
(I)
Un
a f
un
zio
ne è
fri
en
d (
am
ica)
di u
na c
lasse s
e u
na s
ua
dic
hia
razio
ne, p
reced
uta
dall
a p
aro
la c
hia
ve f
rien
d,
ap
pare
nell
a d
ich
iara
zio
ne d
i ta
le c
lasse.
Un
a f
un
zio
ne
frie
nd
pu
ò a
cced
ere
ai m
em
bri
pu
bb
lici e p
rivati
dell
a
cla
sse,
usan
do
i s
ele
tto
ri d
i m
em
bro
.
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
do
ub
le r
eale
();
do
ub
le im
mag
();
/* .
.. *
/}; //
file
main
.cpp
co
mp
lesso
so
mm
a(c
on
st
co
mp
lesso
& a
, co
nst
co
mp
lesso
& b
){ c
om
ple
sso
s(a
.reale
()+
b.r
eale
(),
a.i
mm
ag
() +
b.i
mm
ag
());
retu
rn s
;//
Non s
ipuo’ accedere
ai
}//
mem
bri
privati
della
cla
sse
int
main
()
{ co
mp
lesso
c1 (
3.2
, 4);
co
mp
lesso
c2 (
c1);
co
mp
lesso
c3 =
so
mm
a(c
1,c
2);
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(6.4
, 8)
retu
rn 0
;}
423
16.1
1F
un
zio
ni
frie
nd
(II
)
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
do
ub
le r
eale
();
do
ub
le im
mag
();
frie
nd
co
mp
lesso
so
mm
a(c
on
st
co
mp
lesso
& a
, co
nst
co
mp
lesso
& b
);/*
...
*/
}; // file
main
.cpp
co
mp
lesso
so
mm
a(c
on
st
co
mp
lesso
& a
, co
nst
co
mp
lesso
& b
){ c
om
ple
sso
s(a
.re+
b.r
e,
a.i
m +
b.i
m);
retu
rn s
;//
Si puo’ accedere
ai
}//
mem
bri
privati
della
cla
sse
int
main
()
{ co
mp
lesso
c1 (
3.2
, 4);
co
mp
lesso
c2 (
c1);
co
mp
lesso
c3 =
so
mm
a(c
1,c
2);
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(6.4
, 8)
retu
rn 0
;}

424
16.1
1F
un
zio
ni
frie
nd
(II
I)
// E
sem
pio
di u
tili
zzo
dell
a F
RIE
ND
nel caso
di u
na c
lasse
// c
he u
tili
zza u
n'a
ltra
cla
sse:
//
CA
SO
A)
cla
ss
e u
tili
zza
tric
e F
RIE
ND
(p
er
inte
ro)
de
lla
cla
ss
e u
tili
zza
ta
#in
clu
de<
iostr
eam
>
usin
gn
am
esp
ace
std
;
cla
ss
co
mp
lesso
{ //
dic
hia
razio
ne d
ell
a c
lasse u
tili
zzata
do
ub
le r
e, im
;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i =
0){
re=
r; im
=i;
}
/* s
eg
uo
no
le a
ltre
fu
nzio
ni m
em
bro
dell
a c
lasse c
om
ple
sso
... */
frie
nd
cla
ss
vett
ore
Co
mp
lesso
; //
FR
IEN
D t
utt
a la c
lasse u
tili
zzatr
ice
}; cla
ss
vett
ore
Co
mp
lesso
// d
ich
iara
zio
ne d
ell
a c
lasse u
tili
zzatr
ice
{co
mp
lesso
*vett
; i
nt
siz
e;
pu
bli
c:
vett
ore
Co
mp
lesso
(in
tsz){
if(
sz
<=
0 )
sz
= 1
0;
// in
alt
ern
ati
va, p
rovo
care
la t
erm
inazio
ne (
co
n la 'exit
')
siz
e=
sz;
vett
= n
ew
co
mp
lesso
[siz
e];
// ch
iam
ata
al co
str
utt
ore
di d
efa
ult
// s
u o
gn
i co
mp
lesso
del vett
ore
} do
ub
le m
od
ulo
Qu
ad
ro()
{
do
ub
le m
Q=
0;
for
(in
ti=
0;
i<siz
e;
i++
){
// e
ssen
do
fri
en
d v
ett
ore
Co
mp
lesso
pu
o'acced
ere
a .re
e .im
// s
en
za d
over
ch
iam
are
le f
un
zio
ni d
i accesso
reale
() e
im
mag
()
mQ
+=
vett
[i].
re*v
ett
[i].
re +
vett
[i].
im*v
ett
[i].
im;
} retu
rnm
Q;
}
}; int
main
(){
vett
ore
Co
mp
lesso
v(5
); co
ut<
<"M
od
ulo
qu
ad
ro d
i v:
";
co
ut<
<v.m
od
ulo
Qu
ad
ro()
<<
en
dl;
r
etu
rn0;
}
425
16.1
1F
un
zio
ni
frie
nd
(IV
)
// E
sem
pio
di
uti
lizzo
della F
RIE
ND
nel
caso
di
un
a c
lasse
// c
he u
tilizza u
n'a
ltra
cla
sse:
//
C
AS
O B
) s
olo
alc
un
i m
eto
di
della c
lasse u
tilizzatr
ice
//
so
no
FR
IEN
D d
i q
uella u
tilizzata
#in
clu
de<
ios
tream
>
usin
gn
am
esp
ace
std
;
cla
ss
co
mp
lesso
;
// d
ich
iara
zio
ne i
nco
mp
leta
della c
lasse u
tilizzata
cla
ss
vett
ore
Co
mp
less
o// d
ich
iara
zio
ne (
co
mp
leta
) d
ella c
lasse u
tilizzatr
ice
{
co
mp
lesso
*vett
;
in
tsiz
e;
pu
blic:
vett
ore
Co
mp
less
o(i
nt)
;
do
ub
le m
od
ulo
Qu
ad
ro()
;
}; cla
ss
co
mp
lesso
{ //
dic
hia
razio
ne (
co
mp
leta
) d
ella c
lasse u
tilizzata
do
ub
le r
e, im
;
pu
blic:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i =
0){
re=
r; i
m=
i;}
frie
nd
do
ub
le v
ett
ore
Co
mp
less
o::
mo
du
loQ
ua
dro
();
//
FR
IEN
D u
n m
eto
do
so
lo
}; // d
efi
niz
ion
e d
elle f
un
zio
ni
mem
bro
della c
lasse u
tilizzatr
ice
vett
ore
Co
mp
less
o::
vett
ore
Co
mp
less
o(i
nt
sz){
siz
e=
sz;
v
ett
= n
ew
co
mp
lesso
[siz
e];
//
ch
iam
ata
al co
str
utt
ore
di
defa
ult
} do
ub
le v
ett
ore
Co
mp
les
so
::m
od
ulo
Qu
ad
ro()
{
do
ub
le m
Q=
0;
for
(in
ti=
0;
i<siz
e;
i++
){
mQ
+=
vett
[i].
re*v
ett
[i].
re +
vett
[i].
im*v
ett
[i].
im;
} retu
rnm
Q;
} int
main
(){
vett
ore
Co
mp
les
so
v(5
);
co
ut<
<"M
od
ulo
qu
ad
ro d
i v:
";
co
ut<
<v.m
od
ulo
Qu
ad
ro()
<<
en
dl;
retu
rn0;
}

426
17.1
Overl
oad
ing
di
op
era
tori
(I)
–T
ipo
di d
ato
as
tra
tto
: p
uò
ric
hie
de
re c
he
ve
ng
an
o
de
fin
ite
de
lle
op
era
zio
ni ti
po
so
mm
a,
pro
do
tto
, e
tc.
–O
pp
ort
un
o u
tilizza
re g
li s
tes
si
op
era
tori
us
ati
pe
r le
o
pe
razio
ni a
na
log
he
su
i ti
pi
fon
da
me
nta
li.
–N
ec
es
sa
ria
la
rid
efi
niz
ion
e d
eg
li o
pe
rato
ri
–L
a r
ide
fin
izio
ne
di
un
op
era
tore
ha
la
fo
rma
di
un
a
de
fin
izio
ne
di
fun
zio
ne
, il c
ui
ide
nti
fic
ato
re è
co
sti
tuit
o
da
lla
pa
rola
ch
iave
op
era
tor
se
gu
ita
da
ll’o
pe
rato
re c
he
si
vu
ole
rid
efi
nir
e,
e o
gn
i o
cc
orr
en
za
de
ll’o
pe
rato
re
eq
uiv
ale
ad
un
a c
hia
ma
ta a
lla
fu
nzio
ne
.
–U
n o
pe
rato
re p
uò
de
sig
na
re u
na
fu
nzio
ne
me
mb
ro o
un
a f
un
zio
ne
glo
ba
le.
Se Θ
è u
n o
pera
tore
un
ari
o
1.
Fu
nzio
ne
me
mb
ro o
pe
rato
rΘ()
2.
Fu
nzio
ne
glo
ba
le o
pe
rato
rΘ(x
)
Se Θ
è u
n o
pera
tore
bin
ari
o
1.
Fu
nzio
ne
me
mb
ro o
pe
rato
rΘ(x
)
2.
Fu
nzio
ne
glo
ba
le o
pe
rato
rΘ(x
,y)
AT
TE
NZ
ION
E:
si
po
sso
no
usare
so
lo o
pera
tori
già
d
efi
nit
i n
el
lin
gu
ag
gio
e n
on
se n
e p
osso
no
cam
bia
re l
e
pro
pri
età
AT
TE
NZ
ION
E:
un
a n
uo
va d
efi
niz
ion
e d
i u
n o
pera
tore
d
eve a
vere
fra
gli
arg
om
en
ti a
lmen
o u
n a
rgo
men
to d
i u
n
tip
o d
efi
nit
o d
all
’ute
nte
427
17.1
Overl
oad
ing
di
op
era
tori
(II
)
Rid
efi
niz
ion
ed
ell
’op
era
tore
so
mm
ap
er
in
um
eri
co
mp
lessi
co
me f
un
zio
ne
mem
bro
//file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0);
co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
& )
;/*
U*/
}; // file
com
ple
sso.c
pp
/*&
*/co
mp
lesso
co
mp
lesso
::o
pera
tor+
(co
nst
co
mp
lesso
& x
){
co
mp
lesso
z(r
e+
x.r
e,i
m+
x.i
m);
retu
rn z
;} //
file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
int
main
()
{co
mp
lesso
c1 (
3.2
, 4);
co
mp
lesso
c2 (
c1);
co
mp
lesso
c3 =
c1 +
c2;
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(6.4
, 8)
retu
rn 0
;}

428
17.1
Overl
oad
ing
di
op
era
tori
(II
I)
Rid
efi
niz
ion
ed
ell
’op
era
tore
so
mm
ap
er
in
um
eri
co
mp
lessi
co
me f
un
zio
ne
glo
bale
//file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0);
fr
ien
d c
om
ple
sso
op
era
tor+
(co
nst
co
mp
lesso
&,
co
nst
co
mp
lesso
&);
/*&
*/}; //
file
com
ple
sso.c
pp
/*&
*/co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
& x
,co
nst
co
mp
lesso
& y
){
co
mp
lesso
z(x
.re+
y.r
e,
x.i
m+
y.i
m);
retu
rn z
;} //
file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
int
main
()
{co
mp
lesso
c1 (
3.2
, 4);
co
mp
lesso
c2 (
c1);
co
mp
lesso
c3 =
c1 +
c2;
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(6.4
, 8)
retu
rn 0
;}
429
17.1
Overl
oad
ing
di
op
era
tori
(IV
)
Op
era
tori
in
cre
men
to
//file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
& o
pera
tor+
+()
;co
mp
lesso
op
era
tor+
+(i
nt)
;
//
arg
om
ento
fittizio
che indiv
idua l’o
pera
tore
postf
isso
/*&
*/}; //
file
com
ple
sso.c
pp
/*&
*/co
mp
lesso
& c
om
ple
sso
::o
pera
tor+
+()
{ re
++
; i
m+
+;
retu
rn *
this
;} co
mp
lesso
co
mp
lesso
::o
pera
tor+
+(i
nt)
{co
mp
lesso
ap
p =
*th
is;
re+
+;
im
++
;re
turn
ap
p;
}

430
17.1
Overl
oad
ing
di
op
era
tori
(V
)
Op
era
tori
incre
men
to
// file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
int
main
()
{co
mp
lesso
c1 (
3.2
, 4);
co
mp
lesso
c2 (
c1);
co
mp
lesso
c3 =
c1 +
c2;
c3.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(6.4
, 8)
c1+
+;
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(4.2
, 5)
++
c2;
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(4.2
, 5)
c1+
++
++
+;
c1.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(5.2
, 6)
++
++
++
c2;
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(7.2
, 8)
retu
rn 0
;}
431
17.1
Overl
oad
ing
di
op
era
tori
(V
I)
Tu
tti g
li o
pera
tori
di asseg
nam
en
to s
i ri
defi
nis
co
no
co
me
fun
zio
ni m
em
bro
e r
esti
tuis
co
no
un
rif
eri
men
to
all
’og
gett
o
Nell
a s
celt
a f
ra l
e d
ivers
e v
ers
ion
i d
i u
na f
un
zio
ne
so
vra
pp
osta
(o
di u
n o
pera
tore
so
vra
pp
osto
), i
l co
mp
ilato
re t
ien
e c
on
to d
ell
e p
ossib
ili co
nvers
ion
i d
i ti
po
: q
ueste
po
sso
no
essere
co
nvers
ion
i fr
a t
ipi
fon
dam
en
tali
(im
pli
cit
e o
in
dic
ate
dal p
rog
ram
mato
re),
o
co
nvers
ion
i d
efi
nit
e d
al
pro
gra
mm
ato
re c
he c
oin
vo
lgo
no
ti
pi cla
sse.
No
n c
i so
no
pri
ori
tà f
ra l
e p
ossib
ili co
nvers
ion
i. S
e
esis
ton
o d
ivers
e p
ossib
ilit
à, il
co
mp
ilato
re s
eg
nala
q
uesta
am
big
uit
à.
AT
TE
NZ
ION
E:
no
n a
sseg
nate
ad
un
op
era
tore
un
sig
nif
icato
no
n in
tuit
ivo
AT
TE
NZ
ION
E:
le v
ers
ion
i p
red
efi
nit
e d
eg
li o
pera
tori
assic
ura
no
alc
un
e e
qu
ivale
nze.
Per
esem
pio
, +
+x è
eq
uiv
ale
nte
a x
+=
1. Q
uan
do
si
rid
efi
nis
ce u
n o
pera
tore
, le
eq
uiv
ale
nze t
ra g
li o
pera
tori
no
n v
alg
on
o
au
tom
ati
cam
en
te.
Sarà
co
mp
ito
del
pro
gra
mm
ato
re f
are
in
mo
do
ch
e t
ali
eq
uiv
ale
nze v
en
gan
o r
isp
ett
ate
.

432
17.1
Overl
oad
ing
di
op
era
tori
(V
II)
Am
big
uit
à n
on
ris
olt
a d
al
co
mp
ilato
re.
//file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0);
co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
& )
;o
pera
tor
do
ub
le()
{ re
turn
re+
im;}
/*
&*/
}; // file
com
ple
sso.c
pp
/*&
*/co
mp
lesso
co
mp
lesso
::o
pera
tor+
(co
nst
co
mp
lesso
& x
){
co
mp
lesso
z(r
e+
x.r
e,i
m+
x.i
m);
retu
rn z
;} //
file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
int
main
()
{co
mp
lesso
c1 (
3.2
, 4),
c2;
co
ut
<<
do
ub
le(c
1)
<<
en
dl;
// 7
.2c2 =
c1 +
3.0
;//
ER
RO
RE
: am
big
uous o
verload f
or
'opera
tor+
' in 'c1 +
//
3.0
e+
0'
candid
ate
s a
re:
// o
pera
tor+
(double
, double
) <
built
-in>
//
com
ple
sso
com
ple
sso::
opera
tor+
(const
com
ple
sso&
)
retu
rn 0
;}
433
17.2
Sim
metr
ia t
ra g
li o
pera
tori
(I)
Gli
op
era
tori
rid
efi
nit
ico
me f
un
zio
nim
em
bro
no
n s
on
osim
metr
ici.
//file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0);
co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
& )
;/*
U*/
}; // file
com
ple
sso.c
pp
/*&
*/co
mp
lesso
co
mp
lesso
::o
pera
tor+
(co
nst
co
mp
lesso
& x
){
co
mp
lesso
z(r
e+
x.r
e,i
m+
x.i
m);
retu
rn z
;} //
file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
int
main
()
{co
mp
lesso
c1 (
3.2
, 4),
c2;
c2 =
c1 +
3.0
;
// c
hia
mata
implic
ita
al costr
utt
ore
pre
fefinito
con
// a
rgom
ento
att
uale
3. S
om
ma
tra
num
eri c
om
ple
ssi
c2 =
3.0
+ c
1;
// E
RR
OR
E
retu
rn 0
;}

434
17.2
Sim
metr
ia t
ra g
li o
pera
tori
(II
)
Per
man
ten
ere
la s
imm
etr
ia d
eg
li o
pera
tori
(il
pri
mo
o
pera
nd
o p
ossa e
ssere
qu
als
ivo
gli
a e
no
n l’o
gg
ett
o a
cu
i si
ap
pli
ca l’o
pera
tore
) si d
evo
no
uti
lizzare
fu
nzio
ni
glo
bali
.
//file
com
ple
sso.h
cla
ss c
om
ple
sso
{
do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i =
0);
fr
ien
d c
om
ple
sso
op
era
tor+
(co
nst
co
mp
lesso
& x
, co
nst
co
mp
lesso
& y
);fr
ien
d c
om
ple
sso
op
era
tor+
(co
nst
co
mp
lesso
& x
, d
ou
ble
d);
frie
nd
co
mp
lesso
op
era
tor+
(do
ub
le d
, co
nst
co
mp
lesso
& y
);/*
&*/
}; // file
com
ple
sso.c
pp
/*&
*/co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
& x
, co
nst
co
mp
lesso
& y
){
co
mp
lesso
z(x
.re+
y.r
e,x
.im
+y.i
m);
retu
rn z
;} co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
& x
,do
ub
le d
){
co
mp
lesso
z(x
.re+
d,x
.im
+d
);re
turn
z;
}
435
17.2
Sim
metr
ia t
ra g
li o
pera
tori
(II
I)
// file
com
ple
sso.c
pp
co
mp
lesso
op
era
tor+
(do
ub
le d
, co
nst
co
mp
lesso
& x
){
co
mp
lesso
z(x
.re+
d,x
.im
+d
);re
turn
z;
} // file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
int
main
()
{co
mp
lesso
c1 (
3.2
, 4);
co
mp
lesso
c2 =
c1 +
4.0
;c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(7.2
, 8)
c2 =
3.0
+ c
1;
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(6.2
, 7)
c2 =
4.0
+ 3
.0;
//
Costr
utt
ore
pre
fefinito
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
(7,
0)
retu
rn 0
;}

436
17.3
Op
era
tore
di
asseg
nam
en
to (
I)
Op
era
tore
di asseg
nam
en
to:
pre
defi
nit
o n
el li
ng
uag
gio
. E
seg
ue u
na c
op
ia m
em
bro
a m
em
bro
. D
eve e
ssere
ri
defi
nit
o in
pre
sen
za d
i all
ocazio
ne d
inam
ica d
ell
a
mem
ori
a.
// file
str
inga.h
cla
ss s
trin
ga
{ch
ar*
str
;p
ub
lic:
str
ing
a(c
on
st
ch
ar
s[]
);~
str
ing
a()
;//
dis
trutt
ore
str
ing
a(c
on
st
str
ing
a &
);
// c
ostr
utt
ore
di copia
// ...
}; // file
main
.cpp
vo
id f
un
(){
str
ing
a s
1("
og
gi"
);str
ing
a s
2("
ieri
");
s1 =
s2;
// o
pera
tore
di assegnam
ento
//&
} // A
l te
rmin
e d
ella
funzio
ne v
iene r
ichia
mato
il dis
trutt
ore
due
// v
olte.
Com
port
am
ento
dell’
opera
tore
dele
te q
uando
// a
pplic
ato
ad u
n’a
rea g
ia’ lib
era
ta n
on d
efinito!!!!
s1.str
s2.str
ogg
i\0
ieri\0
437
17.3
Op
era
tore
di
asseg
nam
en
to (
II)
Op
era
tore
di asseg
nam
en
to d
eve:
1.d
eall
ocare
la m
em
ori
a d
inam
ica d
ell
’op
era
nd
o a
sin
istr
a
2.a
llo
care
la m
em
ori
a d
ell
a d
imen
sio
ne u
gu
ale
all
’op
era
nd
o d
estr
o
3.c
op
iare
i m
em
bri
dato
e g
li e
lem
en
ti d
ell
o h
eap
PR
OB
LE
MA
DI
AL
IAS
ING
: arg
om
en
to i
mp
licit
o u
gu
ale
all
’arg
om
en
to e
sp
licit
os1 =
s1
// file
str
inga.h
cla
ss s
trin
ga
{ch
ar*
str
;p
ub
lic:
str
ing
a(c
on
st
ch
ar
s[]
);~
str
ing
a()
;//
dis
trutt
ore
str
ing
a(c
on
st
str
ing
a &
); /
/ costr
utt
ore
di copia
str
ing
a&
op
era
tor=
(co
nst
str
ing
a&
s);
// oper.
ass
// ...
}; // file
str
inga.c
pp
str
ing
a&
str
ing
a::
op
era
tor=
(co
nst
str
ing
a&
s)
{if
(th
is !
= &
s)
// C
ON
TR
OLLO
ALIA
SIN
G{
dele
te[]
str
;str
= n
ew
ch
ar[
str
len
(s.s
tr)+
1];
str
cp
y(s
tr,
s.s
tr);
} retu
rn *
this
;}

438
17.3
Op
era
tore
di
asseg
nam
en
to (
III)
OT
TIM
IZZ
AZ
ION
E:
Se l
a m
em
ori
a d
inam
ica h
a l
a g
iusta
dim
en
sio
ne
po
ssia
mo
evit
are
di d
eall
ocare
e r
iall
ocare
la m
em
ori
a
// file
str
inga.c
pp
str
ing
a&
str
ing
a::
op
era
tor=
(co
nst
str
ing
a&
s)
{if
(th
is !
= &
s)
{
if (
str
len
(str
) !=
str
len
(s.s
tr))
{
dele
te[]
str
;str
= n
ew
ch
ar[
str
len
(s.s
tr)+
1];
} str
cp
y(s
tr,
s.s
tr);
} retu
rn *
this
;}
s1.str
s2.str
ieri\0
ieri\0
439
17.3
Op
era
tori
ch
e s
i p
osso
no
rid
efi
nir
e (
I)
Si p
osso
no
rid
efi
nir
e t
utt
i g
li o
pera
tori
tra
nn
e:
–L
’op
era
tore
ris
olu
zio
ne
di
vis
ibil
ità
(::
)
–L
’op
era
tore
se
lezio
ne
di
me
mb
ro (
.)
–L
’op
era
tore
se
lezio
ne
di
me
mb
ro a
ttra
ve
rso
un
pu
nta
tore
a m
em
bro
(.*
)
AT
TE
NZ
ION
E:
gli
op
era
tori
di asseg
nam
en
to (
‘=’)
, d
i in
dic
izzazio
ne (
‘[]’
), d
i ch
iam
ata
di fu
nzio
ne (
‘()’
) e d
i sele
zio
ne d
i m
em
bro
tra
mit
e u
n p
un
tato
re (
‘->
*’)
devo
no
essere
rid
efi
nit
i sem
pre
co
me f
un
zio
ni m
em
bro
.
AT
TE
NZ
ION
E:
olt
re a
ll’o
pera
tore
di asseg
nam
en
to,
so
no
p
red
efi
nit
i an
ch
e q
uell
o d
i in
dir
izzo
(‘&
’) e
di seq
uen
za
(‘,’
).

440
18.1
Co
sta
nti
e r
iferi
men
ti n
ell
e c
lassi
(I)
Il c
am
po
dati
di u
na c
lasse p
uò
avere
l’a
ttri
bu
to c
on
st:
in
q
uesto
caso
il cam
po
deve e
ssere
in
izia
lizzato
nel
mo
men
to i
n c
ui vie
ne d
efi
nit
o u
n o
gg
ett
o a
pp
art
en
en
te
all
a c
lasse s
tessa
INIZ
IAL
IZZ
AZ
ION
E:
avvie
ne t
ram
ite l
a lis
ta d
i in
izia
lizzazio
ne d
el co
str
utt
ore
.
// file
com
ple
sso.h
cla
ss
co
mp
lesso
{
co
nst
do
ub
le r
e;
do
ub
le im
;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i =
0);
co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
&);
/*&
*/
}; // file
com
ple
sso.c
pp
co
mp
lesso
:: c
om
ple
sso
(do
ub
le r
, d
ou
ble
i)
: re
(r)
{ im
= i;}
// a
nche p
erm
essa la s
critt
ura
seguente
// c
om
ple
sso::
com
ple
sso(d
ouble
r, double
i)
: re
(r),
im
(i)
{}
co
mp
lesso
::
co
mp
lesso
(co
nst
co
mp
lesso
& c
) :
re(c
.re)
{ im
= c
.im
;}
AT
TE
NZ
ION
E:
in u
na c
lasse s
i p
osso
no
dic
hia
rare
ri
feri
men
ti n
on
in
izia
lizzati
, p
urc
hé s
ian
o in
izia
lizzati
co
n
la l
ista
di in
izia
lizzazio
ne
441
18.2
Mem
bro
cla
sse a
ll’i
nte
rno
di
cla
ssi (I
)
In u
na c
lasse (
cla
sse p
rin
cip
ale
) p
osso
no
essere
p
resen
ti m
em
bri
di ti
po
cla
sse (
cla
sse s
eco
nd
ari
a)
div
ers
a d
all
a c
lasse p
rin
cip
ale
.
// file
record
.hcla
ss r
eco
rd//
cla
sse p
rincip
ale
{str
ing
a n
om
e, co
gn
om
e;
pu
bli
c:
//&
.}; Q
uan
do
vie
ne d
ich
iara
to u
n o
gg
ett
o a
pp
art
en
en
te a
lla
cla
sse p
rin
cip
ale
:
1.
ve
ng
on
o r
ich
iam
ati
i c
os
tru
tto
ri d
elle
cla
ss
i
se
co
nd
ari
e,
se
de
fin
iti, n
ell’o
rdin
e i
n c
ui
qu
es
te
co
mp
aio
no
ne
lla
dic
hia
razio
ne
de
i m
em
bri
de
lla
cla
ss
e
pri
nc
ipa
le;
2.
qu
ind
i, v
ien
e e
se
gu
ito
il
co
rpo
de
l c
os
tru
tto
re d
ella
cla
ss
e p
rin
cip
ale
, s
e d
efi
nit
o.
Qu
an
do
un
og
gett
o a
pp
art
en
en
te a
lla c
lasse p
rin
cip
ale
vie
ne
dis
tru
tto
:
1.
vie
ne
es
eg
uit
o il
co
rpo
de
l d
istr
utt
ore
de
lla
cla
ss
e
pri
nc
ipa
le,
se
de
fin
ito
;
2.
Qu
ind
i, v
en
go
no
ric
hia
ma
ti i
dis
tru
tto
ri d
elle
cla
ss
i
se
co
nd
ari
e,
se
de
fin
iti, n
ell’o
rdin
e i
nve
rso
in
cu
i q
ue
ste
co
mp
aio
no
ne
lla
dic
hia
razio
ne
de
i m
em
bri
de
lla
cla
ss
e
pri
nc
ipa
le.

442
18.2
Mem
bro
cla
sse a
ll’i
nte
rno
di
cla
ssi (I
I)
Se a
lcu
ne c
lassi
seco
nd
ari
e p
ossie
do
no
co
str
utt
ori
co
n
arg
om
en
ti f
orm
ali
, an
ch
e p
er
la c
lasse p
rin
cip
ale
deve
essere
defi
nit
o u
n c
ostr
utt
ore
e q
uesto
deve p
reved
ere
u
na lis
ta d
i in
izia
lizzazio
ne
// file
record
.h#in
clu
de "
str
ing
a.h
"cla
ss r
eco
rd//
cla
sse p
rincip
ale
{str
ing
a n
om
e, co
gn
om
e;
pu
bli
c:
reco
rd(c
on
st
ch
ar
n[]
, co
nst
ch
ar
c[]
);//
&}; //
file
record
.cpp
reco
rd::
reco
rd(c
on
st
ch
ar
n[]
, co
nst
ch
ar
c[]
):
no
me(n
), c
og
no
me(c
){/
*U.*
/}//
&
// file
main
.cpp
#in
clu
de "
reco
rd.h
"in
t m
ain
(){
reco
rd p
ers
("M
ari
o",
"R
ossi"
);//
&}
443
18.2
Mem
bro
cla
sse a
ll’i
nte
rno
di
cla
ssi (I
II)
Se a
lcu
ne c
lassi
seco
nd
ari
e p
reved
on
o c
ostr
utt
ori
d
efa
ult
, q
uesti
ven
go
no
ric
hia
mati
.S
e t
utt
e l
e c
lassi
seco
nd
ari
e h
an
no
co
str
utt
ori
defa
ult
, an
ch
e q
uell
o d
ell
a c
lasse p
rin
cip
ale
pu
ò e
ssere
un
co
str
utt
ore
defa
ult
o m
an
care
(vie
ne u
sato
il co
str
utt
ore
p
red
efi
nit
o).
// file
str
inga.h
cla
ss s
trin
ga
{ch
ar*
str
;p
ub
lic:
str
ing
a(c
on
st
ch
ar
s[]
="");
//&
}; // file
record
.h#in
clu
de "
str
ing
a.h
"cla
ss r
eco
rd//
cla
sse p
rincip
ale
{str
ing
a n
om
e, co
gn
om
e;
pu
bli
c:
// &
}; // file
main
.cpp
#in
clu
de "
reco
rd.h
"in
t m
ain
(){
reco
rd p
ers
;//
&}

444
18.3
Arr
ay d
i o
gg
ett
i cla
sse (
I)
Un
arr
ay p
uò
avere
co
me e
lem
en
ti o
gg
ett
i cla
sse:
se
nell
a c
lasse s
on
o d
efi
nit
i co
str
utt
ore
e d
istr
utt
ore
, q
uesti
ven
go
no
ric
hia
mati
per
og
ni ele
men
to d
ell
’arr
ay
//file
com
ple
sso.h
cla
ss
co
mp
lesso
{
d
ou
ble
re,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i =
0);
//
&.
}; // file
com
ple
sso.c
pp
co
mp
lesso
:: c
om
ple
sso
(do
ub
le r
, d
ou
ble
i)
{re =
r;
im=
i;}
/*&
*/
// file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
usin
gn
am
esp
ace
std
;in
tm
ain
()
{co
mp
lesso
vc[3
];fo
r (i
nt
i=0;
i<3;
i++
)vc[i
].scri
vi(
); c
ou
t<
< e
nd
l;
re
turn
0;
} (0,
0)
(0,
0)
(0,
0)
445
18.3
Arr
ay d
i o
gg
ett
i cla
sse (
II)
Inzia
lizzazio
ne
esp
licit
a
// file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
usin
gn
am
esp
ace
std
;in
tm
ain
()
{co
mp
lesso
vc[5
] =
{co
mp
lesso
(1.1
,2.2
),
co
mp
lesso
(1.5
,1.5
), c
om
ple
sso
(4.1
,2.5
)};
for
(in
ti=
0;
i<5;
i++
){
v
c[i
].scri
vi(
); c
ou
t<
< e
nd
l;}
retu
rn0;
} (1.1
, 2.2
)(1
.5,
1.5
)(4
.1,
2.5
)(0
, 0)
(0,
0)
AT
TE
NZ
ION
E:
se l
a l
ista
di co
str
utt
ori
no
n è
co
mp
leta
, n
ell
a c
lasse d
eve e
ssere
defi
nit
o u
n c
ostr
utt
ore
defa
ult
, ch
e v
ien
e r
ich
iam
ato
per
gli
ele
men
ti n
on
esp
licit
am
en
te
iniz
iali
zzati
.
AT
TE
NZ
ION
E:
se l
’arr
ay d
i o
gg
ett
i è a
llo
cato
in
mem
ori
a
din
am
ica, se n
ell
a c
lasse è
defi
nit
o u
n c
ostr
utt
ore
, q
uesto
deve e
ssere
necessari
am
en
te d
efa
ult
, in
qu
an
to
no
n s
on
o p
ossib
ili in
izia
lizzazio
ni esp
licit
e.

446
18.4
Mem
bri
sta
tici
(I)
Mem
bri
dati
sta
tici:
mo
dell
an
o in
form
azio
ni g
lob
ali
, ap
part
en
en
ti a
lla c
lasse n
el
su
o c
om
ple
sso
e n
on
all
e
sin
go
le ista
nze.
// file
entity
.hcla
ss
en
tity
{in
td
ato
;p
ub
lic:
// ... en
tity
(in
tn
);sta
tic
int
co
nto
;//
dic
hia
razio
ne
della
var.
conto
}; // file
entity
.cpp
#in
clu
de "
en
tity
.h"
int
en
tity
::co
nto
= 0
;//
definiz
ione
della
var.
conto
en
tity
::en
tity
(in
tn
){
co
nto
++
; d
ato
= n
; }
// file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
en
tity
.h"
usin
gn
am
esp
ace
std
;in
tm
ain
(){
en
tity
e1(1
), e
2(2
);co
ut
<<
"N
um
ero
ista
nze:
" <
< e
nti
ty::
co
nto
<<
en
dl;
retu
rn0;
} Nu
mero
ista
nze:
2
447
18.4
Mem
bri
sta
tici
(II)
Fu
nzio
ne m
em
bro
sta
tica:
op
era
zio
ne c
he n
on
vie
ne
ap
pli
cata
ad
un
a s
ing
ola
ista
nza d
ell
a c
lasse,
ma s
vo
lge
ela
bo
razio
ni su
lla c
lasse i
n q
uan
to t
ale
.
// file
entity
1.h
cla
ss
en
tity
1{
int
dato
;sta
tic
int
co
nto
;p
ub
lic:
// ... e
nti
ty1(i
nt
n);
sta
tic
int
nu
mero
();
// F
unzio
ne m
em
bro
sta
tica
}; // file
entity
1.c
pp
#in
clu
de "
en
tity
1.h
"in
ten
tity
1::
co
nto
= 0
;
en
tity
1::
en
tity
1(i
nt
n)
{ c
on
to+
+;
dato
= n
; }
int
en
tity
1::
nu
mero
(){
retu
rnco
nto
;}
// file
main
.cpp
//&
int
main
(){
en
tity
1 e
1(1
), e
2(2
);co
ut
<<
"N
um
. is
tan
ze:
" <
< e
nti
ty1::
nu
mero
() <
< e
nd
l;co
ut
<<
"N
um
. is
tan
ze:
" <
< e
1.n
um
ero
() <
< e
nd
l;
retu
rn0;
} Nu
m.
ista
nze:
2N
um
.is
tan
ze:
2

448
18.4
Mem
bri
sta
tici
(III
)
Un
a f
un
zio
ne m
em
bro
sta
tica n
on
pu
ò a
cced
ere
im
pli
cit
am
en
te a
nessu
n m
em
bro
no
n s
tati
co
né u
sare
il
pu
nta
tore
th
is.
// file
entity
2.h
cla
ss e
nti
ty2
{in
t d
ato
;in
t id
en
t;sta
tic i
nt
co
nto
;p
ub
lic:
// ... e
nti
ty2(i
nt
n);
sta
tic i
nt
nu
mero
();
// F
unzio
ne m
em
bro
sta
tica
sta
tic v
oid
avan
zaC
on
to(i
nt
n);
}; // file
entity
2.c
pp
#in
clu
de "
en
tity
2.h
"in
t en
tity
2::
co
nto
= 0
;
en
tity
2::
en
tity
2(i
nt
n)
{ c
on
to+
+;
dato
= n
; id
en
t =
co
nto
;}
int
en
tity
2::
nu
mero
(){
retu
rn c
on
to;}
vo
id e
nti
ty2::
avan
za
Co
nto
(in
t n
){
co
nto
+=
n;
iden
t =
co
nto
++
;//
ER
RO
RE
: in
valid
use o
f m
em
ber
`entity
2::
ident' in
// s
tatic m
em
ber
function
}
449
18.5
Fu
nzio
ni
co
nst
(I)
Fu
nzio
ne
mem
bro
co
nst:
fu
nzio
nich
en
on
po
sso
no
mo
dif
icare
l’o
gg
ett
oa c
ui so
no
ap
pli
cate
.Im
po
rtan
tip
erc
hé
ad
og
gett
i cla
sse c
osta
nti
po
sso
no
essere
ap
pli
cate
so
lo f
un
zio
ni m
em
bro
co
sta
nti
.
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{ do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0);
d
ou
ble
reale
();
do
ub
le im
mag
();
//&
}; // file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
usin
g n
am
esp
ace s
td;
int
main
()
{ co
nst
co
mp
lesso
c1 (
3.2
, 4);
co
ut
<<
"P
art
e R
eale
" <
< c
1.r
eale
() <
< e
nd
l;//
ER
RO
RE
: c1 e
’ costa
nte
retu
rn 0
;}

450
18.5
Fu
nzio
ni
co
nst
(II)
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{ do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0);
d
ou
ble
reale
() c
on
st;
do
ub
le im
mag
() c
on
st;
//&
}; // file
com
ple
sso.c
pp
do
ub
le c
om
ple
sso
:: r
eale
() c
on
st
{retu
rn r
e;}
do
ub
le c
om
ple
sso
::im
mag
() c
on
st
{retu
rn i
m;}
//&
// file
main
.cpp
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
usin
g n
am
esp
ace s
td;
int
main
()
{co
nst
co
mp
lesso
c1 (
3.2
, 4);
co
ut
<<
"P
art
e R
eale
" <
< c
1.r
eale
() <
< e
nd
l;
retu
rn 0
;} P
art
e R
eale
3.2
451
18.5
Fu
nzio
ni
co
nst
(III
)
Il m
eccan
ism
od
i o
verl
oad
ing
dis
tin
gu
e d
ue v
ers
ion
id
i u
na
fun
zio
ne
ch
ed
iffe
risco
no
so
lo p
er
la p
rop
rietà
di
essere
co
sta
nti
cla
ss c
om
ple
sso
{ double
re, im
;public
:com
ple
sso(d
ouble
r =
0,
double
i=
0):
re(r
),im
(i){
};
double
reale
() c
onst;
double
reale
();
//&
}; // file
com
ple
sso.c
pp
double
com
ple
sso::
reale
() c
onst
{cout
<<
"[ chim
ata
a c
om
ple
sso::
reale
()const
]" <
< e
ndl;
retu
rn r
e;}
double
com
ple
sso::
reale
(){c
out
<<
"[ chim
ata
a c
om
ple
sso::
reale
() ]
" <
< e
ndl; r
etu
rn r
e;}
// file
main
.cpp
int
main
()
{const
com
ple
sso
c1 (
3.2
, 4);
com
ple
sso
c2(7
.8,
5);
cout<
< c
1.r
eale
() <
< e
ndl;
cout<
< c
2.r
eale
() <
< e
ndl;
//&
NO
TA
RE
L’U
SC
ITA
retu
rn 0
;} [
ch
imata
a c
om
ple
sso
::re
ale
()co
nst
]3.2
[ ch
imata
a c
om
ple
sso
::re
ale
() ]
7.8

452
18.7
Esp
ressio
ni le
ttera
li
No
n è
po
ssib
ile d
efi
nir
e e
sp
ressio
ni
lett
era
li p
er
i ti
pi
defi
nit
i d
all
’ute
nte
. I co
str
utt
ori
po
sso
no
co
mu
nq
ue
svo
lgern
e l
a f
un
zio
ne
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{ do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0);
co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
& x
);//
&}; //
file
com
ple
sso.c
pp
co
mp
lesso
co
mp
lesso
::o
pera
tor+
(co
nst
co
mp
lesso
& x
){
co
mp
lesso
z(r
e+
x.r
e,i
m+
x.i
m);
retu
rn z
;} //
&.
// file
main
.cpp
//&
int
main
()
{co
mp
lesso
c1 (
3.2
, 4),
c2;
c2 =
co
mp
lesso
(0.3
,3.0
) +
c1;
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
&} (3
.5,
7)
453
18.8
Co
nvers
ion
i m
ed
ian
te c
ostr
utt
ori
Un
co
str
utt
ore
ch
ep
uò
essere
ch
iam
ato
co
n u
n s
olo
arg
om
en
to v
ien
e u
sato
per
co
nvert
ire v
alo
ri d
el ti
po
d
ell
’arg
om
en
to n
el ti
po
dell
a c
lasse a
cu
i ap
part
ien
e i
l co
str
utt
ore
.
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{ do
ub
le r
e,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0);
co
mp
lesso
op
era
tor+
(co
nst
co
mp
lesso
& x
);//
&}; //
file
main
.cpp
//&
int
main
()
{co
mp
lesso
c1 (
3.2
, 4),
c2;
c2 =
c1 +
2.5
;//
Il costr
utt
ore
trasfo
rma
ilre
ale
2.5
nelcom
ple
sso
(2.5
,0)
c2.s
cri
vi(
); c
ou
t<
< e
nd
l;//
&} (5
.7,
4)

454
18.8
Op
era
tori
di
co
nvers
ion
e
Op
era
tore
di co
nvers
ion
e:
co
nvert
eu
n o
gg
ett
ocla
sse
in
un
valo
red
i u
n a
ltro
tip
o.
// file
com
ple
sso.h
cla
ss c
om
ple
sso
{ do
ub
le r
e,
im;
pu
bli
c:
op
era
tor
do
ub
le()
;o
pera
tor
int(
);//
&}; //
file
com
ple
sso.c
pp
co
mp
lesso
::o
pera
tor
do
ub
le()
{ re
turn
re+
im;}
co
mp
lesso
::o
pera
tor
int(
){
retu
rn s
tati
c_cast<
int>
(re+
im);
}
// file
main
.cpp
//&
int
main
()
{co
mp
lesso
c1 (
3.2
, 4);
co
ut
<<
(d
ou
ble
)c1 <
< e
nd
l;co
ut
<<
(in
t)c1 <
< e
nd
l;//
&} 7.2
7
455
20.
Cla
ssi p
er
l’in
gre
sso
e l
’uscit
a (
I)
Le l
ibre
rie d
i in
gre
sso
/uscit
a f
orn
isco
no
cla
ssi
per
ela
bo
rare
vari
e c
ate
go
rie d
i str
eam
Cla
sse p
er
l’in
gre
sso
dati
cla
ss i
str
eam
{//
sta
to: configura
zio
ne d
i bit
pu
bli
c:
istr
eam
(){U
};is
tream
& o
pera
tor>
>(i
nt&
);is
tream
& o
pera
tor>
>(d
ou
ble
&);
istr
eam
& o
pera
tor>
>(c
har&
);is
tream
& o
pera
tor>
>(c
har*
);
int
get(
);//
(1)
istr
eam
& g
et(
ch
ar&
c);
// (
2)
istr
eam
& g
et(
ch
ar*
bu
f, in
t d
im , c
har
deli
m =
'\n
');
//
(3)
istr
eam
& r
ead
(ch
ar*
s, in
t n
)//
(4)
//&
}; L’o
gg
ett
o c
in e
un
’ista
nza p
red
efi
nit
a d
ell
a c
lasse
istr
eam
.
(1)L
a f
un
zio
ne g
et(
)p
rele
va u
n c
ara
ttere
e l
o
resti
tuis
ce c
on
vert
ito
in
in
tero
(2)L
a f
un
zio
ne g
et(
c)
pre
leva u
n c
ara
ttere
e l
o a
sseg
na
all
a v
ari
ab
ile c
(3)L
a f
un
zio
ne g
et(
bu
f,d
im,d
eli
m)
leg
ge c
ara
tteri
dall
o
str
eam
di in
gre
sso
e l
i tr
asfe
risce i
n b
uf
ag
giu
ng
en
do
il cara
ttere
nu
llo
fin
ale
fin
ch
é n
el
bu
ffer
no
n v
i so
no
dim
cara
tteri
o n
on
si in
co
ntr
a i
l cara
ttere
deli
m (
ch
e n
on
vie
ne l
ett
o).
(4)L
a f
un
zio
ne r
ead
(s,n
) le
gg
e n
byte
e l
i m
em
ori
zza a
p
art
ire d
all
’in
dir
izzo
co
nte
nu
to in
s.

456
20.
Cla
ssi p
er
l’in
gre
sso
e l
’uscit
a (
II)
Cla
sse p
er
l’u
scit
a d
ati
cla
ss o
str
eam
{//
sta
to: configura
zio
ne d
i bit
// &
.p
ub
lic:
ostr
eam
(){U
};o
str
eam
& o
pera
tor<
<(i
nt)
;o
str
eam
& o
pera
tor<
<(d
ou
ble
);o
str
eam
& o
pera
tor<
<(c
har)
;o
str
eam
& o
pera
tor<
<(c
on
st
ch
ar*
);
ostr
eam
& p
ut(
ch
ar
c)
ostr
eam
& w
rite
(co
nst
ch
ar*
s, in
t n
)o
str
eam
& o
pera
tor<
< (
ostr
eam
& (
*p
f )(
ostr
eam
&))
;
//&
}; Gli
og
gett
i co
ut
e c
err
so
no
ista
nze p
red
efi
nit
e d
ell
a
cla
sse o
str
eam
.
La f
un
zio
ne p
ut(
)tr
asfe
risce i
l cara
ttere
csu
llo
str
eam
di
uscit
aL
a f
un
zio
ne w
rite
()tr
asfe
risce l
a s
eq
uen
za d
i n
cara
tteri
co
nte
nu
ti in
s s
ull
o s
tream
di u
scit
a.
457
20.
Co
ntr
oll
o d
el
form
ato
(I)
Co
ntr
oll
o d
el
form
ato
: p
uò
avven
ire a
ttra
vers
o i
m
an
ipo
lato
ri
Man
ipo
lato
ri:
pu
nta
tori
a f
un
zio
ne.
Gli
op
era
tori
di le
ttu
ra e
scri
ttu
ra s
on
o r
idefi
nit
i p
er
overl
oad
ing
in
mo
do
da a
ccett
are
tali
pu
nta
tori
.
iostr
eam
en
dl
\\ostr
eam
& e
ndl (
ostr
eam
& o
s )
;in
serisce ‘\n
’ e s
vuota
il buff
er
co
ut
<<
x <
< e
nd
l;d
ec,
hex, o
ct
sele
zio
nano la b
ase d
i num
era
zio
ne
co
ut
<<
16 <
< ' ' <
< o
ct
<<
16 <
< e
nd
l;b
oo
lalp
ha
inserisce o
estr
ae o
ggett
i di tipo b
oole
ano c
om
e n
om
i (t
rue o
fals
e)
piu
ttosto
che c
om
e v
alo
ri n
um
erici
co
ut
<<
bo
ola
lph
a <
< t
rue <
< e
nd
l;
iom
an
ipsetw
(in
t)n
um
ero
min
imo
di cara
tteri
usati
per
la s
tam
pa
di alc
un
e r
ap
pre
sen
tazio
ni (w
sta
per
wid
th)
setf
ill(
ch
ar)
sp
ecif
ica q
uale
cara
ttere
pre
pen
dere
per
arr
ivare
all
a
lun
gh
ezza d
esid
era
ta (
defa
ult
: sp
azio
bia
nco
).
setp
recis
ion
(in
t)
nu
mero
di cif
re s
ign
ific
ati
ve (
part
e in
tera
+ p
art
e
decim
ale
) p
er
la s
tam
pa d
i n
um
eri
reali
I m
an
ipo
lato
ri h
an
no
eff
ett
o f
ino
all
a n
uo
va o
cco
rren
za
del m
an
ipo
lato
re;
eccett
o s
etw
() c
he h
a e
ffett
o s
olo
su
ll’i
str
uzio
ne d
i scri
ttu
ra i
mm
ed
iata
men
te s
uccessiv
a

458
20.
Co
ntr
oll
o d
el
form
ato
(II
)
#in
clu
de <
iostr
eam
>#in
clu
de <
iom
an
ip>
usin
g n
am
esp
ace s
td;
int
main
(){
d
ou
ble
d =
1.5
64e-2
; in
t i;
bo
ol b
;co
ut
<<
d <
< e
nd
l;co
ut
<<
setp
recis
ion
(2)
<<
d <
< e
nd
l;co
ut
<<
setw
(10)
<<
d <
< e
nd
l;co
ut
<<
setf
ill(
'0')
<<
setw
(10)
<<
d <
< e
nd
l;cin
>>
hex >
> i;
// s
up
po
nen
do
di in
seri
re 'b
'co
ut
<<
hex <
< i <
< '\t
' <
< d
ec <
< i <
< e
nd
l;cin
>>
oct
>>
i;
// s
up
po
nen
do
di in
seri
re “
12”
co
ut
<<
oct
<<
i <
< '\t
' <
< d
ec <
< i <
< e
nd
l;cin
>>
bo
ola
lph
a >
> b
; //
su
pp
on
en
do
di in
s. “fa
lse”
co
ut
<<
b <
< b
oo
lalp
ha <
< ' ' <
< b
<<
en
dl;
co
ut
<<
tru
e <
< e
nd
l;re
turn
0;
}
0.01564
0.016
0.016
000000.016
b b 11
12
12 10
false
0 false
true
459
20.2
Co
ntr
oll
i su
gli
str
eam
Sta
to d
i u
no
str
eam
: co
nfi
gu
razio
ne d
i b
it, d
ett
i b
it d
i sta
to.
Lo
sta
to è
co
rrett
o (
go
od
) se t
utt
i i b
it d
i sta
to
valg
on
o 0
.
�B
it f
ail
–p
osto
ad
1 o
gn
iqu
alv
olt
a s
i veri
fica u
n
err
ore
recu
pera
bil
e
�B
it b
ad
–d
iscri
min
a s
e l
’err
ore
è r
ecu
pera
bil
e (
0)
o
men
o (
1)
�B
it e
of
–p
osto
ad
1 q
uan
do
vie
ne l
ett
a l
a m
arc
a d
i fi
ne s
tream
I b
it p
osso
no
essere
esam
inati
co
n le f
un
zio
ni seg
uen
ti,
ch
e r
esti
tuis
co
no
valo
ri b
oo
ela
ni:
�fa
il()
–re
sti
tuis
ce t
rue s
e a
lmen
o u
no
dei d
ue b
it f
ail
e b
ad
so
no
ad
1
�b
ad
() –
resti
tuis
ce t
rue s
e i
l b
it b
ad
è a
d 1
�eo
f()
–re
sti
tuis
ce t
rue s
e i
l b
it e
of
è a
d 1
�g
oo
d()
–re
sti
tuis
ce t
rue
se t
utt
i i
bit
so
no
a 0
I b
it p
osso
no
essere
man
ipo
lati
via
so
ftw
are
co
n la
fun
zio
ne c
lear(
), c
he h
a p
er
arg
om
en
to (
di d
efa
ult
è 0
) u
n
valo
re i
nte
ro c
he r
ap
pre
sen
ta i
l n
uo
vo
valo
re d
ell
o s
tato
.
Po
sso
no
essere
usati
i s
eg
uen
ti e
nu
mera
tori
:
�io
s::
fail
bit
–co
rris
po
nd
e a
l b
it f
ail
ad
1
�io
s::
bad
bit
–co
rris
po
nd
e a
l b
it b
ad
ad
1
�io
s::
eo
fbit
–co
rris
po
nd
e a
l b
it e
of
ad
1
Og
ni valo
re d
ell
o s
tato
pu
ò e
ssere
ott
en
uto
ap
pli
can
do
l’
op
era
tore
OR
bit
a b
it c
on
op
era
nd
i ta
li e
nu
mera
tori
.
NO
TA
BE
NE
: Q
uan
do
un
o s
tream
vie
ne p
osto
in
un
a
co
nd
izio
ne, vie
ne r
esti
tuit
o il co
mp
lem
en
to d
el ri
su
ltato
d
ell
a f
un
zio
ne f
ail
().

460
20.3
Uso
dei
file
Le c
lassi
fstr
eam
, if
str
eam
e o
fstr
eam
han
no
un
astr
utt
ura
sim
ile a
qu
ell
avis
ta p
er
gli
str
eam
di
ing
resso
/uscit
a.
#in
clu
de<
iostr
eam
>#in
clu
de<
fstr
eam
>u
sin
gn
am
esp
ace
std
;in
tm
ain
()
{if
str
eam
inp
ut(
"n
on
Esis
te.t
xt"
); c
har
in;
co
ut
<<
in
pu
t.fa
il()
<<
' ' <
< in
pu
t.b
ad
() <
< ' '
<<
in
pu
t.eo
f()
<<
' ' <
< in
pu
t.g
oo
d()
<<
en
dl;
inp
ut.
cle
ar(
);co
ut
<<
in
pu
t.fa
il()
<<
' ' <
< in
pu
t.b
ad
() <
< ' '
<<
in
pu
t.eo
f()
<<
' ' <
< in
pu
t.g
oo
d()
<<
en
dl;
inp
ut.
cle
ar(
ios::
bad
bit
);co
ut
<<
in
pu
t.fa
il()
<<
' ' <
< in
pu
t.b
ad
() <
< ' '
<<
in
pu
t.eo
f()
<<
' ' <
< in
pu
t.g
oo
d()
<<
en
dl;
inp
ut.
cle
ar(
);in
pu
t.o
pen
("E
sis
te.t
xt"
);w
hil
e(i
np
ut>
>in
);co
ut
<<
in
pu
t.fa
il()
<<
' ' <
< in
pu
t.b
ad
() <
< ' '
<<
in
pu
t.eo
f()
<<
' ' <
< in
pu
t.g
oo
d()
<<
en
dl;
retu
rn0;
} 1 0
0 0
0 0
0 1
1 1
0 0
1 0
1 0
461
20.4
Rid
ef.
op
era
tori
in
gre
sso
/uscit
a(I
)
Il m
eccan
ism
od
i o
verl
oad
ing
perm
ett
ed
i ri
defi
nir
e g
li
op
era
tori
di le
ttu
ra e
di scri
ttu
ra p
er
i ti
pi d
efi
nit
i d
all
’ute
nte
.
AT
TE
NZ
ION
E:
Tali
op
era
tori
devo
no
essere
rid
efi
nit
ico
me f
un
zio
nig
lob
ali
.
// file
com
ple
sso.h
#in
clu
de<
iostr
eam
>cla
ss c
om
ple
sso
{d
ou
ble
re,
im;
pu
bli
c:
co
mp
lesso
(do
ub
le r
= 0
, d
ou
ble
i=
0){
re=
r;im
=i;
};
do
ub
le r
eale
() c
on
st
{retu
rn r
e;}
do
ub
le im
mag
() c
on
st
{retu
rn i
m;}
//U
}; usin
g n
am
esp
ace s
td;
ostr
eam
& o
pera
tor<
<(o
str
eam
& o
s, co
mp
lesso
z);
istr
eam
& o
pera
tor>
>(i
str
eam
& i
s, co
mp
lesso
& z
);

462
20.5
Rid
ef.
op
era
tori
in
gre
sso
/uscit
a(I
I)
// file
com
ple
sso.c
pp
#in
clu
de "
co
mp
lesso
.h"
ostr
eam
& o
pera
tor<
<(o
str
eam
& o
s, co
nst
co
mp
lesso
& z
){
os <
< '('
<<
z.r
eale
() <
< ',' <
< z
.im
mag
() <
< ')'
;re
turn
os;
} istr
eam
& o
pera
tor>
>(i
str
eam
& i
s, co
mp
lesso
& z
) {
d
ou
ble
re =
0, im
= 0
; ch
ar
c =
0;
is >
> c
;if
(c !
= '('
) is
.cle
ar(
ios::
fail
bit
);els
e{
is >
> r
e >
> c
;if
(c !
= ',')
is.c
lear(
ios::
fail
bit
);els
e
{is
>>
im
>>
c;
if (
c !
= ')'
) is
.cle
ar(
ios::
fail
bit
);}
} z =
co
mp
lesso
(re,
im);
retu
rn i
s;
}
463
20.5
Rid
ef.
op
era
tori
in
gre
sso
/uscit
a(I
II)
#in
clu
de<
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
usin
g n
am
esp
ace s
td;
int
main
()
{co
mp
lesso
c1(1
.0,
10.0
);co
mp
lesso
c2(1
.1,
10.1
);co
ut
<<
c1 <
< '\t
' <
< c
2 <
< e
nd
l;if
(!(
cin
>>
c2))
{
cerr
<<
"E
rro
ren
ell
ale
ttu
rad
i u
n n
um
ero
co
mp
lesso
" <
< e
nd
l;exit
(1);
} co
ut
<<
c1 <
< '\t
' <
< c
2 <
< e
nd
l;
retu
rn 0
;} (1
,10)
(1.1
,10.1
)(2
,12)
(1,1
0)
(2,1
2)

464
21
Pre
pro
cesso
re (
I)
Pre
pro
cesso
re:
part
e d
i co
mp
ilato
re c
he e
lab
ora
il te
sto
d
el p
rog
ram
ma p
rim
a d
ell
’an
ali
si le
ssic
ale
e s
inta
ttic
a
-P
uò
in
clu
dere
nel
testo
alt
ri f
ile
-E
sp
an
de i
sim
bo
li d
efi
nit
i d
all
’ute
nte
seco
nd
o le
loro
defi
niz
ion
i
-In
clu
de o
esclu
de p
art
i d
i co
dic
e d
al
testo
ch
e v
err
à
co
mp
ilato
Qu
este
op
era
zio
ni so
no
co
ntr
oll
ate
dall
e d
irett
ive p
er
il
pre
pro
cesso
re (
il p
rim
o c
ara
ttere
è #
)
Inclu
sio
ne d
i fi
le h
ead
er.
Du
e p
ossib
ilit
à:
-P
erc
ors
o a
part
ire d
a c
art
ell
e s
tan
dard
#in
clu
de <
file
.h>
-P
erc
ors
o a
part
ire d
all
a c
art
ell
a i
n c
ui avvie
ne l
a
co
mp
ilazio
ne o
perc
ors
o a
sso
luto
#in
clu
de "
file
.h"
Esem
pio
:#in
clu
de "
su
bd
ir\f
ile.h
"#in
clu
de "
c:\
su
bd
ir\f
ile.h
"
465
21
Pre
pro
cesso
re (
II)
Macro
Sim
bo
lo c
he v
ien
e s
osti
tuit
o c
on
un
a s
eq
uen
za d
i ele
men
ti l
essic
ali
co
rris
po
nd
en
ti a
lla s
ua d
efi
niz
ion
e
#d
efi
ne C
ON
ST
123
#d
efi
ne L
INU
X#d
efi
ne M
AX
(A,B
) ((
A)>
(B)
? (
A)
: (B
))
int
main
(){
int
z =
10;
X =
CO
NS
T;
// X
= 1
23
Y =
MA
X(4
, (z
+2))
// Y
= (
(4)
> (
z+
2)
? (
4)
: (z
+2))
} AT
TE
NZ
ION
E a
lle p
are
nte
si!
!!!
#d
efi
ne M
AX
(A,B
) (A
)>(B
)?
(A
) :
(B)
int
main
(){
Y =
1 +
MA
X(1
, 3)
// Y
= 1
+ (
1)
> (
3)
? (
1)
: (3
)} D
iven
tere
bb
e
int
main
(){
Y =
1 +
(1)
> (
3)
? (
1)
: (3
)//
3 invece d
i 4,
per
via
della
// m
aggio
re p
riorita
’ dell’
op.
+
// r
ispett
o a
ll’op.
>
}

466
21
Co
mp
ilazio
ne c
on
diz
ion
ale
(I)
Co
mp
ilazio
ne c
on
diz
ion
ale
#if
, #eli
f, #
els
e,
#en
dif
#if
consta
nt-
expre
ssio
n(c
ode if-
part
)#eli
fconsta
nt-
expre
ssio
n(c
ode e
lif-p
art
s)
#eli
fconsta
nt-
expre
ssio
n(c
ode e
lif-p
art
s)
#els
e(c
ode e
lse-p
art
)#en
dif
I valo
ri d
ell
e e
sp
ressio
ni
co
sta
nti
ven
go
no
in
terp
reta
ti
co
me v
alo
ri l
og
ici ed
in
base a
essi
ven
go
no
co
mp
ilati
o
no
i f
ram
men
ti t
esto
(te
xt)
seg
uen
ti.
Esem
pio
:
#d
efi
ne D
EB
UG
_L
EV
EL
1 /
/ all
’in
izio
del fi
le
int
main
(){
#if
DE
BU
G_L
EV
EL
==
2co
ut<
<i<
<j;
//
deb
ug
di i
e j
#eli
f D
EB
UG
_L
EV
EL
==
1co
ut<
<i;
// d
eb
ug
dell
a s
ola
vari
ab
ile i
#els
e
// D
EB
UG
_L
EV
EL
==
0(n
essu
na c
ou
t)#en
dif
retu
rn 0
;}
467
21
Co
mp
ilazio
ne c
on
diz
ion
ale
(II
)
FO
RM
E C
ON
CIS
E
#if
de
f id
en
tifi
er
pe
r#
if d
efi
ne
d i
de
nti
fie
r
#if
nd
ef
ide
nti
fie
r p
er
#if
!d
efi
ne
d i
de
nti
fie
r
ES
EM
PIO
// f
ile
ma
in.c
pp
#d
efi
ne
LIN
UX
/
/ c
om
me
nta
re q
ue
sta
rig
a e
// #
de
fin
e W
IND
OW
S
//
s
co
mm
en
tare
qu
es
ta//
pe
r c
om
pil
are
so
tto
Win
do
ws
#in
clu
de
<c
std
lib
>#
inc
lud
e <
ios
tre
am
>u
sin
g n
am
es
pa
ce
std
;
int
ma
in()
#if
de
f L
INU
X
//
eq
uiv
ale
a ‘
#if
de
fin
ed
LIN
UX
’s
ys
tem
(" C
LE
AR
");
#e
lif
de
fin
ed
WIN
DO
WS
sys
tem
("C
LS
");
#e
lse
co
ut<
<"S
iste
ma
op
era
tivo
no
n s
up
po
rta
to"<
<e
nd
l;e
xit
(1);
#e
nd
ifre
turn
0;
}
DE
FIN
E A
RIG
A D
I C
OM
AN
DO
Alt
ern
ati
vam
en
te,
gli
id
en
tifi
cato
ri p
er
il p
rocesso
re s
i p
osso
no
defi
nir
e in
vece c
he i
n m
ain
.cp
p d
irett
am
en
teall
a c
hia
mata
del
co
mp
ilato
re:
// P
er
co
mp
ilare
so
tto
LIN
UX
g+
+ -
DL
INU
X m
ain
.cp
p –
o m
ain
.ex
e
// P
er
co
mp
ila
re s
ott
o W
IND
OW
S
g+
+ -
DW
IND
OW
S m
ain
.cp
p –
o m
ain
.ex
e

468
21
Co
mp
ilazio
ne c
on
diz
ion
ale
(II
I)
Alt
ro u
tilizzo
de
lla
co
mp
ila
zio
ne
co
nd
izio
na
le:
evit
are
ch
e u
no
ste
ss
o f
ile
ve
ng
a i
nc
lus
o p
iù v
olt
e i
n u
na
un
ità
di
co
mp
ila
zio
ne
. O
gn
i fi
le d
i in
tes
tazio
ne
, p
er
es
em
pio
co
mp
les
so
.h,
do
vre
bb
e i
niz
iare
co
n le
se
gu
en
ti
dir
ett
ive
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
-//
file
com
ple
sso.h
#if
nd
ef
CO
MP
LE
SS
O_H
#d
efi
ne
CO
MP
LE
SS
O_H
// q
ui va il conte
nuto
vero
e p
roprio d
el file
cla
ss
com
ple
sso{
double
re, im
;public
://
funzio
ni della
cla
sse c
om
ple
sso
};#en
dif
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
-//
file
main
.cpp
#in
clu
de "
co
mp
lesso
.h"
#in
clu
de <
iostr
eam
>#in
clu
de "
co
mp
lesso
.h"
int
main
(){
co
mp
lesso
c;
retu
rn0;
} ----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
-
l’aggiunta
erronea
di
questo
secondoinclude
ora
noncausa
più
il
problemadiridefinizione
della
classe
complesso,
perchéladefinizionedella
classe
complessoviene
inclusasololaprimavolta

Università di Pisa
Corso di Laurea in Ingegneria Informatica
Note sull’ambiente di lavoro utilizzato nei
Laboratori di Fondamenti di Informatica I
a cura di
Marco Cococcioni
Un po’ di terminologia (1/2)
Processore (anche detto CPU-
Central Processing Unit)
Unità di calcolo centrale del calcolatore. Si tratta del cuore di un personal computer, perché è
l’unità che effettua tutte le operazioni fondamentali: lettura/scrittura in memoria, operazioni
aritmetiche e logiche, esecuzioni di istruzioni, ecc… I processori possono essere significativamente
diversi fra logo e generare incompatibilità di software. Alcuni dei principali produttori di processori
sono: Intel, AMD, ARM e NVIDIA.
Memoria centrale (anche detta
RAM)
Dispositivo che permette la memorizzazione temporanea dell’informazione, in unità elementari
delle celle, ciascuna delle quali è dotata di un proprio indirizzo.
Memoria di massa (anche detto
disco rigido – hard disk)
Dispositivo che consente di salvare dell’informazione in maniera persistente nel calcolatore, in
modo che sia disponibile anche dopo lo spegnimento del calcolatore.
Periferiche di ingresso e uscita Sono i dispositivi utilizzati per inserire informazioni dentro al calcolatore (tastiera, mouse, ecc…) e
per portare verso l’esterno i risultati dell’elaborazione (monitor, casse audio, ecc…)
Sistema operativo Software che serve a rendere facilmente utilizzabili al programmatore le risorse di calcolo (CPU,
memoria centrale, ecc…) e le periferiche di ingresso e uscita disponibili, senza doversi preoccupare
dei relativi dettagli hardware. In questo laboratorio si utilizzerà il sistema operativo Linux Debian.
Altri sistemi operativi popolari sono: Windows 7/8 (Microsoft), Mac Os X (Apple) (Linux e Mac Os X
sono basati sullo stesso predecessore: Unix).
File (anche detto archivio) In un calcolatore le informazioni (sequenze di bit) vengono memorizzate all’interno di archivi logici
detti file. I file si distinguono in file ASCII (sequenza di caratteri) e file binari (sequenza di
numeri/codici). Un’altra distinzione possibile è in file eseguibili e file non eseguibili. Scopo della
programmazione è scrivere file eseguibili dal calcolatore partendo da file ASCII contenenti
istruzioni di un particolare linguaggio di programmazione.
Directory (anche detta cartella o
folder)
Contenitore logico di file. Utilizzato per organizzare i file in maniera gerarchica, all’interno della
directory principale (directory root: “/”)
File System Meccanismo fornito dal sistema operativo per la creazione di file e di directory, per la gestione
della loro organizzazione logica all’interno di una struttura ad albero, per il controllo degli accessi, il
controllo dell’integrità, ecc… 2 /16

Un po’ di terminologia (2/2) Directory root (‘/ ‘) Directory principale del File System (radice, letteralmente). Tutte le altre sono sotto-directory di root. Per spostarsi
nella directory di root dare il seguente comando: cd /
Directory home
Per accedere al sistema operativo occorre autenticarsi con nome utente e password. Ad ogni utente corrisponde una
directory speciale, detta directory home, dove può creare e cancellare file e directory a piacimento (infatti le
directory di sistema non sono modificabili). Tale directory è /home/nomeUtente (/home/studenti, nel nostro caso).
File Manager (anche detto file browser, o
esplora risorse)
Si tratta di un programma dotato di interfaccia grafica (GUI-Graphical User Interface) che permette di gestire i file e le
cartelle (creazione, cancellazione, spostamento) comodamente utilizzando il mouse. Linux Debian mette a
disposizione thunar come FM (thunar nomeDir).
Programma (detto anche file eseguibile o
applicazione)
Sequenza di operazioni eseguibili da un certo calcolatore (ossia da uno specifico sistema operativo ed uno specifico
processore).
GUI (Graphical User Interface) I programmi dotati di GUI sono quelli che sono dotati di una interfaccia grafica che facilita l’interazione con il
programma attraverso bottoni ed altri elementi grafici.
Console (anche detta finestra terminale,
terminal window, finestra di comando,
riga di comando)
Si tratta di un particolare programma eseguibile che permette di inviare comandi al sistema operativo (esempi: ls,
pwd, cat nomeFile). Inoltre possono essere posti in esecuzioni dei file eseguibili creati dall’utente, lanciando il
comando: ./nomeFileEseguibile
Quando si apre una finestra di comando essa ci posiziona in un punto preciso del file system (tipicamente la directory
home). La directory corrente può essere visualizzata con il comando pwd e cambiata con il comando:
cd nomeNuovaDirectory.
Ambiente Desktop Si tratta di un insieme di programmi che fornisce una interfaccia grafica al sistema operativo, presentandolo come
una sorta di scrivania (Desktop), dotata di un menu start.
In laboratorio viene utilizzato Xfce versione 4 (si avvia con il comando startxfce4).
Editor Programma che consente di creare, modificare e salvare file ASCII. L’editor di riferimento del corso è gedit. Un editor
alternativo è Mousepad, ma ne viene sconsigliato l’uso.
Compilatore e Linker Sono i due programmi chiave con cui è possibile generare un file eseguibile partendo da un file ASCII. Nel caso di
programmi C++ la compilazione ed il collegamento (linking) avvengono mediante la chiamata al programma g++.
Debugger Programma per la verifica della correttezza di un programma scritto dall’utente. In laboratorio verrà utilizzato il Data
Display Debugger.
3 /16
Ambiente di sviluppo utilizzato a laboratorio
Sistema operativo utilizzato Linux (distribuzione Debian)
Compilatore g++, versione 4.4.5
Debugger gdb (gnu debugger)
Debugger Grafico Data Display Debugger (ddd) -
interfaccia grafica per gdb
Ambiente Desktop Xfce versione 4 (startxfce4)
File Manager Grafico thunar
L’immagine «iso» di un DVD «bootable», ossia avviabile,
può essere scaricata al seguente link:
http://www.iet.unipi.it/m.cococcioni/FondamentiDiInformatica/debian.iso
Le istruzioni su come effettuare la masterizzazione dell’immagine affinché
risulti «bootable» si possono reperire qui:
http://www.iet.unipi.it/m.cococcioni/FondamentiDiInformatica
L’ambiente di sviluppo utilizzato a laboratorio
4 /16

Un’occhiata al sistema operativo Linux Debian
ed al desktop manager Xfce
Browser web
File Manager
(thunar)
Desktop
Mostra
Desktop
Per uscire
(logout)
Ora
Terminale
Menu Start
5 /16
Il Menu Start (di Xfce)
Menu start, sottomenu
impostazioni
(Xfce4 settings)
Cliccando su Keyboard è
possibile cambiare il
layout della tastiera, da
americana ad italiana
6 /16

Organizzazione delle directory (1/4)
Linux Debian implementa molto fedelmente in File System
Standard dei sistemi unix-like. Questo standard definisce il
nome e la posizione delle directory del File System
Directory root (‘/’)
Contenuto della
directory root
7 /16
Organizzazione delle directory (2/4)
Pennina usb di nome
ad esempio «marco»:
viene montata su
/media/marco
Home directory
(/home/studenti)
8 /16

Organizzazione delle directory (3/4)
Directory home per
l’utente root
(amministratore di sistema)
Directory delle periferiche
(device). Ad esempio:
/dev/null
Configurazione del sistema
(etc sta per etcetera)
Directory bin
Contiene i file eseguibili:
pwd, ls, cd, cat, ecc…
9 /16
Organizzazione delle directory (4/4)
Eseguibili per
l’amministrazione del
sistema (system binary:
init, route, ecc…)
File per il boot loader
(kernel, initrd)
File Variabili come log,
database, siti web e file
temporanei delle e-mail
10 /16

La console (finestra terminale)
Comando da eseguire (in
questo caso g++ -c es1.cpp)
Prompt dei
comandi
11 /16
Comandi base per la console Comandi base
pwd Mostra il percorso (path) della directory corrente, ossia della working directory
(pwd sta per path of the working directory)
ls
Mostra i file e le directory presenti nella directory corrente. ls –al mostra anche i file
nascosti e altre informazioni sui file/directory (dimensione, data, ecc…)
cd percorso Fa sic he la nuova directory corrente sia percorso.
Esempio: ‘cd /media’ ci porta su ‘/media’.
Invece ‘cd ..’ ci sposta nella directory superiore.
cp file1 file2 Copia file1 in file2.
mv file1 file2 Rinomina file1 come file2. Vale anche per directory.
rm nomeFile Cancella il file nomeFile. Il file non può più essere recuperato, in quanto non finisce nel
cestino.
cat nomeFile Mostra a video il file nomeFile.
mkdir nomeDir Crea la nuova directory nomeDir.
rmdir nomeDir Cancella la directory nomeDir, purché sia vuota.
rm -r nomeDir Rimuove la directory dopo averla svuotata.
./nomeFile Esegue nomeFile, qualora esso sia un file eseguibile presente nella directory corrente
(per renderlo eseguibile: chmod +x nomeFile).
clear Pulisce lo schermo.
g++ -c esX.cpp Compila esX.cpp (produce file binario in codice oggetto esX.o).
g++ esX.o Collega (linking) il file esX.o e produce l’eseguibile a.out (per eseguirlo: ./a.out).
12 /16

Altri comandi per la console
Comandi avanzati
more nomeFile Alternativa a cat: mostra a video nomeFile, una pagina per volta. Si passa alla
pagina successiva premendo la barra spaziatrice. Si esce con q.
PS1=“nuovo prompt” Comando per cambiare il prompt (es.: PS1=“$ ”).
Contrl + C Interrompe il processo in esecuzione (utile per terminare programmi errati che
vanno in ciclo o quando un programma non risponde)
ps
Visualizza i programmi attualmente in esecuzione (i così detti processi). Ad ogni
processo è assegnato un numero univoco X.
ps -A Visualizza tutti i processi, compresi quelli di sistema.
kill X Termina il processo avente numero X.
tree Visualizza il sotto-albero della directory corrente in maniera grafica.
find –name nomeFile Mostra il percorso del file nomeFile qualora si trovi nella directory corrente o in
una delle sue sottodirectory (equivale al comando windows dir /s nomeFile)
Esempi: find –name *.cpp, find /home/studenti –name main.cpp
chmod +x nomeFile Rende eseguibile il file nomeFile (x sta per eXecutable). Altre opzioni
interessanti del comando sono: chmod +w nomeFile (lo rende modificabile),
chmod –w nomeFile rende il file accessibile in sola lettura.
iceweasel sitoWeb Apre la pagina web http://sitoWeb usando il browser iceweasel
epdfview nomeFilePdf Visualizza il file pdf nomeFilePdf (ePDFViewer è una alternativa ad Acrobat
Reader)
cmd --help Fornisce l’help per il comando cmd (Es: ls --help)
soffice -impress filePpt Visualizza il file Power Point filePpt , mediante Open Office Impress
13 /16
L’editor (gedit)
Può essere avviato anche da riga di comando:
gedit nomefile
Un modo molto conveniente di avviare gedit è il seguente:
gedit main.cpp compito.cpp compito.h & >/dev/null 14 /16

Cambiare le impostazioni di gedit
Visualizza il
numero di riga
(molto utile in
fase di debug)
Visualizza la parentesi chiusa
(aperta) corrispondente ogni volta
che il mouse si trova sopra una
parentesi aperta (chiusa)
15 /16
Il Debugger Grafico (ddd)
Può essere avviato anche da riga di comando:
ddd esercizio.exe
purché l’eseguibile contenga le informazioni di debug, ossia sia stato compilato
con opzione –g: g++ -g –o esercizio.exe esercizio.cpp
16 /16

Università di Pisa
Corso di Laurea in Ingegneria Informatica
Guida al Debugging
di programmi C, C++ e Assembler utilizzando il Data Display Debugger
(DDD)
a cura di Marco Cococcioni
Cos’è DDD
• DDD sta per Data Display Debugger
• DDD è una intefaccia grafica (GUI) per lo GNU debugger, un programma di debug disponibile alla riga di comando.
• Come si avvia DDD alla diga di comando?
• Passo 1: compilare e linkare inserendo le informazioni per il debugger (opzione -g):
$ g++ -g es1.cpp –o es1.exe
• Passo 2: avviare ddd: $ ddd es1.exe &

Come appare DDD
Customizzazione di DDD
• Numero di riga: Source à Display Line Numbers
• Ancoraggio della barra degli strumenti: Edit à Preferences

Come impostare i punti di interruzione
• Prima di mettere in esecuzione il programma occorre impostare uno o più punti di interruzione (breakpoints), altrimenti una volta avviato andrebbe immediatamente alla fine
• Per impostare un breakpoint: – click-pulsante-destro alla linea in cui si desidera impostare
l’interruzione
– Selezione dell’opzione Set Breakpoint
– (ora dovrebbe comparire un segnale di stop all’inizio di quella linea)
Avvio del programma da debuggare
• In cima allo schermo, selezionare il bottone “Run” per
avviare il programma – Run può anche essere trovato nel menu ‘program’
• Il programma si arresterà in corrispondenza della riga in cui è posizionato il brackpoint – (La linea nera indica la prossima riga che verrà eseguita)

Next, Hover, e Step
• Usare Next per muoversi nel programma una riga alla volta
• Dopo ogni Next è possibile posizionare il cursore sopra una variabile per vederne il valore – Questa operazione è chiamata hovering
• Step può essere usata in alternativa a Next
– Step fa andare il programma una riga avanti, ma nel caso di chiamata di funzioni ci fa eseguire passo passo anche la funzione
– Next fa andare il programma una riga avanti. Nel caso di chiamata di funzione, salta la chiamata e ci porta alla riga successiva alla chiamata stessa.
Correzione del programma (Bug Fixing)
• Per correggere il programma, una volta rilevato l’errore (baco):
– chiudere DDD
– aprire il file sorgente usando l’editor (gedit es1.cpp)
– correggere il programma
– ricompilare e rilinkare con opzione -g
– riaprire l’eseguibile con DDD

Inspezione delle variabili (1/2)
• Fare click sul pulsante destro sopra una variabile e poi scegliere Display nomeVariabile
– questo provoca l’apertura del display editor
• Fare ancora click sul pulsante destro sopra al nome della variable e scegliere
Display *nomeVariabile
(notare l’asterisco)
Inspezione delle variabili (2/2)
• Le variabili possono essere visualizzate nell’area di display in
diverse rappresentazioni:
– /t nomeVar : binario
– /d nomeVar : decimale
– /x nomeVar : esadecimale
– /o nomeVar : ottale
• Nel caso di programmi assembler si può visualizzare nella finestra di display (quella in alto) il contenuto dei registri come fossero variabili:
– /t $eax: mostra eax in bin
– /d $ebx: mostra ebx in decimale, ecc…
• Il contenuto dei registri può essere visualizzato anche nella finestra console di dello GNU debugger (GDB), nel seguente modo:
– i r eax (che sta per info register eax)
• NB1: qui non serve $, né %, prima del nome del registro
• NB2: esiste una limitazione: il contenuto dei registri a 8 e 16 bit (al, ah, ax, bl, …) non può essere visualizzato

Per tornare indietro nell’esecuzione
• Per andare indietro rispetto alla linea di interruzione – clickare e trascinare la freccia in alto, alla linea desiderata