Fondamenti di Programmazione Argomenti del corso Rappresentazione dell’informazione. Architettura...

250
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.

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

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

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

sem

plice

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

*qq

;//

qq

= &

k;

// E

RR

OR

E! in

t* =

const in

t*//

qq

= 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

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

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

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

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

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

essere

asseg

nato

au

np

un

tato

re;

»se

no

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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