Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture...

250
Materiale didattico di supporto alle lezioni del corso di Fondamenti di Informatica I Corso di Laurea in Ingegneria Informatica Prof. Cinzia Bernardeschi Ing. Marco Cococcioni Dipartimento di Ingegneria dell’Informazione Anno Accademico 2015-2016 Il corso è composto da due moduli da 6 CFU: Fondamenti di Informatica (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/FondamentiDiInformatica.html Modalità di esame: prova pratica e prova orale.

Transcript of Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture...

Page 1: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

Materiale didattico di supporto alle lezioni del corso di

Fondamenti di Informatica I

Corso di Laurea in Ingegneria Informatica

Prof. Cinzia Bernardeschi

Ing. Marco Cococcioni

Dipartimento di Ingegneria dell’Informazione

Anno Accademico 2015-2016

Il corso è composto da due moduli da 6 CFU:

• Fondamenti di Informatica (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/FondamentiDiInformatica.html

Modalità di esame: prova pratica e prova orale.

Page 2: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.

Page 3: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 ripetizionedi due oggetti (0 ed 1) in n caselle (gli n bit), ossia 2n

Esempio: n=2.00011011

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

testodisegni

immagininumerimusica

...

Calcolatore

sequenzedi bit

dispositivi di conversione

OUT

IN

Page 4: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

5

Rappresentazione del testo (1/2)

Sequenze00110000

00110001

00110010

...

00111001

...

01000001

01000010

01000011

...

01100001

01100010

...

Caratteri0

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

Page 5: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

7

Base dieci

� Cifre: 0, 1, 2, 3, 4, 6, 7, 8, 9

� Rappresentazione posizionale

(123)dieci significa 1×102 + 2×101 + 3×100

Base due

� Cifre: 0, 1

� 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 β ≥ due

Ogni numero naturale N minore di β (N < β) è 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

Page 6: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9

I numeri naturali maggiori o uguali a β possono essere rappresentati da una sequenza di cifre secondo la rappresentazione posizionale

Se un numero naturale N ≥ β è rappresentato in base β dalla sequenza di cifre:

allora N può essere espresso come segue:

dove a0 è detta «cifra meno significativa» e ap-1 «cifra più significativa»

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 β, a quale numero naturale corrisponde?

Rappresentazione dei numeri naturali (4/11)

Sequenzedi simboli(in base β)

Sequenzedi 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 256313

p -1 p - 2 1 0a a … a a

Page 7: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

11

Data la base β ed un numero naturale N, trovare la sequenza di cifre che rappresenta N in base β

Rappresentazione dei numeri naturali (5/11)

Sequenzedi simboli(in base β)

Sequenzedi 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)duea4a3a2a1a0

N = 23

che in base dieci vale 1*24+…+1=(23)dieci, cvd

Page 8: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 β a0 = q0 mod β

q2 = q1 div β a1 = q1 mod β

...

qp-1 = qp-2 div β ap-1 = qp-2 mod β

fino a che qp è uguale a 0;

Il procedimento si arresta quando qp = 0 (più precisamente

subito dopo aver calcolato ap-1). p è proprio il numero di cifre

necessario per rappresentare N in base β

Rappresentazione dei numeri naturali (7/11)

Esempio:23 div 2 = 1123 mod 2 = 1

NB: Il risultatodella mod è sempreuna cifra valida in base β,

perché restituisce sempreun numero fra 0 e β -1(estremi inclusi).

14

Rappresentazione dei numeri naturali (8/11)

Inizio q0 = N

fine

div β

div β

div β

div β

div β

QUOZIENTE RESTO q0 = N - q1 = q0 / β a0 q2 = q1 / β a1 q3 = q2 / β a2 q4 = q3 / β a3 q5 = q4 / β a4 q6 = q5 / β a5 q7 = 0 a6

div β

N = a6 ·β 6 + a5 ·β 5 + a4 ·β 4 + a3 ·β 3 + a2 ·β 2 + a1 ·β 1 + a0 ·β 0

Page 9: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 β,

l’intervallo di rappresentabilità con p cifre è [0, β p

-1]

16

Calcolatore lavora con un numero finito di bit

� Supponiamo che p = 16 bit

� A = 0111011011010101 (30421)B = 1010100001110111 (43127)

� 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

� 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)

Page 10: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 =

11 +1 =

111+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

NumeriNaturali

Rappresentazionibase X

Rappresentazionibase Y

2

Trovare la rappresentazione in base 9 di (1023)cinque

1) Trasformo in base 10 ed ottengo 1382) Applico il procedimento mod/div ed ottengo (163)nove

Da base X a base Y

Page 11: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

19

Casi particolari (potenze di 2)

Numeri naturali - Cambio di base (2/2)

β =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

β = 16

0

1

2

3

4

5

6

7

000

001

010

011

100

101

110

111

β = 8

β =2β =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 asu 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=0011a= -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

Page 12: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

A a{ }4

0,1

Rappresentazione di interi

in modulo e segno su

calcolatore con p=4 bit

Page 13: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 = 9ma 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

Page 14: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

A a{ }4

0,1

Rappresentazione di interi

in complemento a due su

calcolatore con p=4 bit

Page 15: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 biasTrasformazione 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 comeun naturale su p bit. La quantità (2p-1 - 1) è detta 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 = 0111a = 1 => 1+(24-1-1) = 8, e il naturale 8 ha rappr. 1000 su 4 bit => A = 1000a = 8 => 8+(24-1-1) = 15, e il naturale 15 ha rappr. 1111 su 4 bit => A = 1111a = -1 => -1+(24-1-1) = 6, e il naturale 6 ha rappr. 0110 su 4 bit => A = 0110a = -2 => -2+(24-1-1) = 5, e il naturale 5 ha rappr. 0101 su 4 bit => A = 0101a = -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 o rappresentazione con traslazione

NB2: come si vedrà nelle prossime slides, questa rappresentazione vieneutilizzata nella rappresentazione dei numeri reali in virgola mobile

28

Page 16: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

29

Terza Rappresentazione: rappresentazione con biasTrasformazione A => a

Sia A (es. 1010, 0100, …) il numero intero che si vuole rappresentare in rappresentazione con bias su p bit. La rappresentazione a (es. a=+3, a=-3, …) di a è data da:

a = A-(2p-1 - 1)

dove A viene visto come numero naturale su p bit.

Ad esempio, per p = 4 si ha:

A = 0111 => 7-(24-1-1) = 0 => a = 0A = 1000 => 8-(24-1-1) = 1 => a = 1A = 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!

Page 17: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

0001compl.a due

Sommatore pernaturali

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!

Page 18: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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=120111 +

0101

----------------

1100 => -4

7-1=60111 +

1111

----------------

10110 => 6

Overflow Ok

NB: L’1 più significativo viene scartato.

0110 su 4 bit è il risultato corretto cercato

34

Numeri Reali

Sottoinsiemediscreto dei Numeri

Razionali

Sequenzedi bit

0

Densità che dipende dal numero di bit usati

Overflow OverflowUnderflow

Page 19: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

35

Numeri Reali – Virgola fissa (1/5)

� Si usa un numero fisso di bit per la parte intera ed un numero fisso di bit per la parte frazionaria.

� 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

� 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

� NB: La virgola non si rappresenta

� La parte intera I(r) si rappresenta con le tecniche note

� 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 = 5r = +331,6875

Page 20: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 21: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.010011r’ = 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(0.6)=0 f-6=F(0.6*2=1.2)=0.2 a-6=I(0.8)=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

β= ± ⋅ 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

Page 22: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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!

Page 23: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 = 2.0009765625 · due+zero =2.0009765625

r = + 2.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

Page 24: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 ]

Page 25: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 = 23Intervallo 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 = 52Intervallo 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

Page 26: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

RETE di INTERCONNESSIONE

INTERFACCE

TRASDUTTORI

PROCESSORE

Page 27: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

012...

...2h-22h-1

k bit

• 2h celle di k bit ognuna• Ogni cella ha un indirizzo

Page 28: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

53

Struttura logica del processore (1)

CLOCK

Spazio di I/OSpazio di Memoria

01

216-2

216-1

01

65534232-1

ALU

232-2

EIP

EF

Registri di stato

ESP

Puntatore di pila

ALAH

EAX

AX

BLBH

EBX

BX

CLCH

ECX

CX

DLDH

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

Page 29: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 codicedel programma

eseguibile

Esempio di programma in memoria

← istruzione di fineprogramma (RET )

← identificativo del registro %AL

← immediato 64 (in esadecimale)

← istruzione MOV (imm. 8 bit su reg. 8 bit)

Page 30: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 OUTtastiera

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 %ALimmediato 0x64

Codice Operativo Operandi

Esempio

Page 31: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

59

OPCODEsize source destination

OPCODEsize source

OPCODEsize destination

Dove size può essere:

B (byte): 8 bitW (word): 16 bitL (Long): 32 bit

Esempi:

MOVB (%EBX), %ALMOVW (%EBX), %AXMOVL (%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 AL40B1A203 MOV (3F0D0100), %DX Copia in DX il dato da elaborare40B1A207 CMP %DX, $0 Confronta il contenuto di DX con 040B1A211 JE 40B1A232 Salta se uguale40B1A215 SHL %DX Trasla a sinistra il contenuto di DX40B1A217 JC 40B1A225 Salta se CF è settato all’indirizzo 22540B1A221 JMP 40B1A207 Salta incondizionatamente a 20740B1A225 ADD $1, %AL Incrementa il contatore AL40B1A228 JMP 40B1A207 Salta incondizionatamente40B1A232 MOV %AL, (3F0D0102) Memorizza il risultato40B1A236 HLT ALT…

Page 32: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

61

Istruzioni per il trasferimento di datiMOV Movimento (ricopiamento)IN Ingresso datiOUT Uscita datiPUSH Immissione di una word nella pilaPOP Estrazione di una word dalla pila

Istruzioni aritmeticheADD 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 logicheNOT Not logico bit a bitAND And logico bit a bitOR Or logico bit a bit

Istruzioni di traslazione/rotazioneSHL Traslazione a sinistraSHR Traslazione a destraROL Rotazione a sinistraROR Rotazione a destra

Istruzioni operative (2)

Page 33: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

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

Page 34: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

65

Labels

Ogni istruzione assembler inizia ad un certo indirizzo in memoria (l’indirizzodella 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 essereutilizzate dal programmatore per indicare l’indirizzo di una istruzione. Saràcompito dell’assemblatore e del linker sostituire l’etichetta con l’indirizzo fisicoassoluto.

Esempio di un programma che stampa 5 asterischi a video (il sottoprogrammaoutchar stampa a video il carattere la cui codifica ASCII si trova in %AL):

_main: MOV $5, %AH

MOV $’*’, %AL

label: CALL outchar # label conterrà l’indirizzo dell’istruzione

DEC %AH # CALL outchar

JNZ label

RET

.INCLUDE "utility"

66

Le direttive .BYTE, .FILL e .ASCII

In assembler si può allocare memoria «statica» per delle «variabili». Si trattadell’equivalente C/C++ delle variabili globali.

Una «variabile» assembler è una etichetta (che corrisponde all’indirizzo dellaprima cella di memoria in cui inizia la «variabile») seguita da una direttivaassembler che riserva area di memoria.

v1: .BYTE 0x6F,‘k’ # alloca un vettore di 2 byte ad "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 allocareed inoltre provvedono anche alla loro inizializzazione. La .FILL non inizializza.

Page 35: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

67

Lo Stack (1/7)

• Lo STACK è un’area di memoria a disposizione dei programmi (sia Assembler che C/C++)

• Viene gestita mediante strategia FIFO (first 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 Staticistr: .ASCII "Ciao mondo!"

vett: .FILL 14, 4

←ESP (punta alla prima cellavuota)

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 nota STACK)

Struttura di un programma eseguibile in memoria

Page 36: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

Page 37: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

71

L’istruzione CALL

• L’istruzione CALL permette di andare ad eseguire un sottoprogramma

• Esempio di chiamata del sottoprogramma inchar:

04AAFFB3 CALL inchar

04AAFFB8 INC %EAX

...

• Concettualmente la CALL equivale alle seguenti istruzioni:

PUSH %EIP # salva 04AAFFB8 sullo STACK

JMP 1E22AF0C # se inchar 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 inchar: IN (0AFB), %AL

...

RET

• Concettualmente, effettua le seguenti operazioni:POP %EIP

JMP %EIP

Lo Stack (6/7)

Page 38: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

73

Lo Stack (7/7)

Sintetizzando, le istruzioni che utilizzano lo STACK sono:

CALL, PUSH, POP, 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 labele 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 outchar

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 outchar # stampa il carattere messo in %AL dal chiamante

CALL inchar # legge un nuovo carattere e lo restituisce in %AL

RET

Page 39: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

75

Sottoprogrammi (2/3)

Il sottoprogramma principale: _main

Ogni programma Assembler deve prevedere un sottoprogrammaprincipale, denominato _main.

Quando il file ascii (con estensione .s) viene compilato pergenerare il file oggetto file.o e poi linkato in un .exe, la primaistruzione assembler che verrà eseguita sarà quella che si trovaall’indirizzo dell’etichetta _main

76

Sottoprogrammi (3/3)

Alcuni sottoprogrammi di utilità, contenuti nel file assembler "utility"

Input ed output di caratteri e stringheinchar aspetta un carattere dalla tastiera e mette il suo codice ASCII in ALoutchar stampa a video il carattere contenuto in %ALoutmess 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 bitinbyte 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 vienestampata la stringa "6A"

newline Porta il cursore all’inizio della linea seguente(CALL newline equivale al cout<<endl)

Page 40: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.

Page 41: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

79

Algoritmo: sequenza precisa (non ambigua) e finita di operazioni, che portanoalla 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’operazionesuccessiva.

2. Operazioni condizionali

Controllano una condizione. In base al valore della condizione, selezionanol’operazione successiva da eseguire.

3. Operazioni iterative

Ripetono l’esecuzione di un blocco di operazioni, finchè non è verificata unadeterminata 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)

datirisultati

algoritmo

esecutore

Page 42: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 Qallora 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)

Page 43: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

� hanno lo stesso dominio di ingresso

� hanno lo stesso dominio di uscita

� in corrispondeza degli stessi valori del dominio di ingressso producono gli stessi valori del dominio di uscita

� 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)

Page 44: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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=kxn=hxm-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 (6bis)

86

Algoritmo (7)

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.

Page 45: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

87

La formulazione testuale di un algoritmo in un linguaggio comprensibile ad uncalcolatore è 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 combinaretali 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ò essereusata per descrivere algoritmi.

Si può stabilire quali sono gli elementi linguistici primitivi, quali sono le frasilecite e se una frase appartiene al linguaggio.

Linguaggi di Programmazione (1)

Page 46: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 47: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 terminaleA 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)

Page 48: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 Pfrase ::= soggetto verbo .soggetto ::= articolo nome

articolo ::= il lo

nome ::= lupocanarinobosco cielo

verbo ::= mangiavolacanta

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

mangialupoil

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

.

Page 49: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

� ANALISI programma sorgente

analisi lessicale

analisi sintattica

� TRADUZIONE

generazione del codice

ottimizzazione del codice

Esempi: C, C++, Pascal…

Approccio compilato

Page 50: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

97

Sviluppo di un programma (approccio interpretato):

- editing: scrivere il testo e memorizzarlo su supporti di memoria permanenti

- interpretazione

� ANALISI programma sorgente

analisi lessicale

analisi sintattica

� ESECUZIONE

ESEMPIO: Basic, Java

Approccio Interpretato

Page 51: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

•P

er

defi

nir

es

inta

ss

ie

sem

an

tic

ad

iu

nlin

gu

ag

gio

oc

co

rre

uti

lizza

reu

na

ltro

lin

gu

ag

gio

,o

ss

iau

nm

eta

lin

gu

ag

gio

•M

eta

lin

gu

ag

gio

pe

rla

sin

tas

siC

++

:

–in

sie

me

di

no

tazio

ni

(no

na

mb

igu

e),

ch

ep

os

so

no

es

se

res

pie

ga

tec

on

po

ch

ep

aro

led

ellin

gu

ag

gio

na

tura

le.

•M

eta

lin

gu

ag

gio

pe

rla

se

ma

nti

ca

C+

+:

–ri

su

lta

as

sai

co

mp

les

so

,p

er

cu

is

iri

co

rre

dir

ett

am

en

tea

llin

gu

ag

gio

na

tura

le.

•N

ota

zio

ne

uti

lizza

tap

er

las

inta

ss

iC

++

:

–d

eri

va

tad

alc

las

sic

ofo

rma

lis

mo

diB

ac

ku

se

Na

ur

(BN

F,B

ac

ku

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

oall

asin

tassi

uff

icia

le,

reg

ole

sem

pli

ficate

,

cara

tteri

zzate

dalp

refi

sso

basic

;

div

ers

ao

rgan

izzazio

ne

dell

ecate

go

rie

sin

tatt

ich

e.

Re

go

le-

un

are

go

lad

escri

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.

Ca

teg

ori

es

inta

ttic

he

:–

scri

tte

inco

rsiv

o.

Co

str

utt

id

im

eta

lin

gu

ag

gio

:–

scri

tti

co

nso

tto

lin

eatu

ra.

Sim

bo

lite

rmin

ali:

–scri

tti

co

ncara

tteri

norm

ali.

2.1

Meta

lin

gu

ag

gio

per

il C

++

(I)

99

Page 52: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

•E

se

mp

iofr

ase

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

ras

is

inta

ttic

am

en

tec

orr

ett

e(s

ec

on

do

las

em

plic

es

inta

ss

iin

tro

do

tta

)il

can

ari

no

vo

la.

illu

po

man

gia

.

illu

po

can

ta.

ilsco

iatt

olo

vo

la.

•A

TT

EN

ZIO

NE

:

Un

as

inta

ss

ic

orr

ett

an

on

imp

lic

au

na

se

ma

nti

ca

co

rre

tta

.

2.1

Meta

lin

gu

ag

gio

per

il C

++

(II

)

100

Ele

me

nti

diu

na

ca

teg

ori

as

inta

ttic

a:

–p

osso

no

essere

op

zio

nali

:

»ven

go

no

co

ntr

ass

eg

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.

Ca

teg

ori

e s

inta

ttic

he

ag

giu

nti

ve

1.

Seq

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.

Lis

ta d

i 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-li

st

so

me-e

lem

en

t

so

me-e

lem

en

t

,so

me-e

lem

en

t-li

st

2.1

Meta

lin

gu

ag

gio

per

il C

++

(II

I)

101

Page 53: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

f0

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

deli

mit

ate

da

sp

azi

bia

nch

i(w

hit

esp

ace).

•P

aro

le:

–co

sti

tuit

ed

ai

seg

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

.z

AB

...

Z

sp

ecia

l

on

eo

f

!%

^..

./

2.2

Sin

tassi C

++

(I)

103

Page 54: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

•S

pa

zib

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

ell

o.

•C

om

me

nti

:–

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

dell

ari

ga;

–h

an

no

losco

po

di

do

cu

men

tare

un

pro

gra

mm

a;

–p

osso

no

esse

rein

seri

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

pa

zib

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

ee

lem

en

tari

(ele

me

nti

les

sic

ali):

–o

pp

ort

un

eseq

uen

ze

di

cara

tte

ri(t

oken

-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

ss

ica

li:

–id

en

tifi

cato

ri(i

den

tifi

er)

;

–p

aro

lech

iave

(keyw

ord

);

–esp

ressio

ni

lett

era

li(l

itera

l);

–o

pera

tori

(op

era

tor)

;

–sep

ara

tori

(sep

ara

tor)

.

2.2

Sin

tassi C

++

(II

I)

105

Page 55: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

•E

nti

tàu

sa

tein

un

pro

gra

mm

a:

–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

ca

ratt

ere

dis

ott

olin

ea

tura

un

ale

tte

ra.

–la

do

pp

iaso

tto

lin

eatu

raall

'in

tern

od

eg

liid

en

tifi

cato

riè

sco

nsig

liata

,p

erc

riserv

ata

all

eim

ple

men

tazio

nied

all

eli

bre

rie.

•Il

C+

+d

isti

ng

ue

fra

ma

ius

co

lee

min

us

co

le(è

ca

se

se

ns

itiv

e).

•E

se

mp

i:

iden

t

_id

en

t

Iden

t

2.2

.1 Id

en

tifi

cato

ri

106

•N

ota

:–

ite

rmin

in

om

ee

iden

tifi

cato

resp

esso

ve

ng

on

ou

sati

inte

rca

mb

iab

ilm

en

te,

ma

èn

ece

ssari

od

isti

ng

uerl

i:

»u

nn

om

ep

essere

un

iden

tifi

cato

re,

op

pu

reu

nid

en

tifi

cato

rec

on

alt

risim

bo

liag

giu

nti

vi.

•P

aro

lec

hia

ve

:–

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

bil

ito

dalli

ng

uag

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

res

sio

nile

tte

rali:

–ch

iam

ate

sem

pli

cem

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 L

ett

era

li 107

Page 56: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

•O

pe

rato

ri:

–cara

tteri

sp

ecia

lie

loro

co

mb

inazio

ni;

–serv

on

oa

den

ota

reo

pera

zio

ni

nel

calc

olo

dell

eesp

ressio

ni;

–esem

pi:

�cara

ttere

+

�cara

ttere

-

�…

•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

ili

ste

,ra

gg

rup

pan

ois

tru

zio

ni

oesp

ressio

ni,

eccete

ra;

–esem

pi:

�cara

ttere

;

�co

pp

iad

icara

tteri

()

�…2.2

.4O

pera

tori

e s

ep

ara

tori

108

–p

os

izio

ne

ris

pett

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’

op

era

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

dia

rgo

me

nti

(oa

rie

tà):

Es

em

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

Page 57: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

–p

rec

ed

en

za

(op

rio

rità

)n

ell’o

rdin

ed

ie

se

cu

zio

ne

:

�g

lio

pera

tori

co

np

rio

rità

più

alt

ave

ng

on

oeseg

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

red

ell

’op

era

tore

so

mm

a)

–a

ss

oc

iati

vit

à(o

rdin

ein

cu

ive

ng

on

oe

se

gu

iti

op

era

tori

de

lla

ste

ss

ap

rio

rità

):

�o

pera

tori

as

so

cia

tivi

asin

istr

a:

ven

go

no

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

ass

ocia

tivi

ad

estr

a:

ven

go

no

eseg

uit

id

ad

estr

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

plic

e p

rog

ram

ma

C+

+

int

main

(){

}

Un

pa

ss

o a

va

nti

#in

clu

de <

cstd

lib

>//

dirett

ive p

er

il pre

pocessore

usin

g n

am

esp

ace s

td;

/*dirett

iva c

he indic

a a

l com

pila

tore

che t

utt

i i nom

iusati n

el pro

gra

mm

a s

i rife

riscono a

llo s

tandard

A

NS

I-C

++

*/

int

main

()//

dic

hia

razio

ne d

ella

funzio

ne m

ain

{

syste

m("

PA

US

E")

;/*

consente

di blo

ccare

l’e

secuzio

ne in a

ttesa c

he

l’ute

nte

dig

iti un t

asto

*/

retu

rn 0

; // r

estitu

isce 0

ovverr

o t

utt

o O

K!!!!

}

3.

Un

sem

pli

ce p

rog

ram

ma

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

111

Page 58: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

3.1

Og

gett

i (I

)

Og

ge

tto

: g

rup

po

di ce

lle c

on

se

cu

tive

ch

e v

en

go

no

co

nsid

era

te d

al p

rog

ram

ma

tore

co

me

un

’un

ica

ce

lla

info

rma

tiva

.

Att

rib

uti

di u

n o

gg

etto

:In

dir

izzo

de

lla p

rim

a c

ella

Va

lore

(co

nte

nu

to d

i tu

tte

le

ce

lle)

Ce

lla

Og

ge

tto

Ind

iriz

zo

Va

lore

Me

mo

ria

: in

sie

me

di c

elle

.C

ella

: in

ge

ne

re d

ime

ns

ion

e d

i u

n b

yte

(8

bit

) 112

•O

gg

ett

ic

osta

nti

(co

sta

nti

co

nn

om

e)

eo

gg

ett

iva

ria

bili:

–l’

ind

iriz

zo

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

ma

tore

:–

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

va

lori

(dett

iele

men

tio

co

sta

nti

del

tip

o);

–in

sie

me

di

op

era

zio

ni

defi

nit

esu

gli

ele

men

ti(c

on

risu

ltato

ap

part

en

en

teall

oste

sso

tip

oo

ad

un

alt

roti

po

).

•A

ss

oc

iare

un

tip

oa

un

og

ge

tto

:–

perm

ett

ed

iri

leva

rein

man

iera

au

tom

ati

ca

valo

rich

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

Page 59: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

•C

os

tru

ttic

he

intr

od

uc

on

on

uo

ve

en

tità

:–

dic

hia

razio

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

ns

en

tita

inC

++

:–

sp

esso

no

sem

pli

ce

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

ve

rae

pro

pri

asia

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

va

ti

•T

ipifo

nd

am

en

tali:

–ti

pip

red

efi

nit

i;

–ti

pien

um

era

zio

ne.

Tip

ip

red

efi

nit

i:–

tip

oin

tero

(in

t)e

tip

on

atu

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

va

ti:

–si

ott

en

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

Page 60: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 (

sott

razio

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;

// lett

era

le int

sh

ort

s2 =

2;

// tip

o long int

lon

g in

t ln

1 =

6543;

// lett

era

le int

lon

g ln

2 =

6543L

;//

lett

era

le long int

(suff

isso L

)lo

ng

ln

3 =

6543l;

//

lett

era

le long int

(suff

isso l)

// lett

era

le int

ott

ale

, pre

fisso 0

(zero

)in

t o

tt =

011;

// o

tt =

9 (

lett

era

le inte

ro o

ttale

)

// lett

era

le int

esadecim

ale

, pre

fisso 0

x o

0X

int

esad

1 =

0xF

;//

esad1 =

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")

;re

turn

0;

} 9 15

15

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

117

Page 61: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

3.3

Tip

o i

nte

ro (

III)

De

fin

izio

ne

di

un

in

tero

co

n i

l fo

rma

lis

mo

di

Ba

ck

us

e N

au

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

iali

zer|

op

t

int-

init

iali

zer

=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

Page 62: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

; //

lett

era

le u

nsig

ned,

suff

isso U

un

sig

ned

u2 =

2u

; /

/ le

ttera

le u

nsig

ned,

suff

isso 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;

// lett

era

le u

nsig

ned long,

suff

isso 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")

;re

turn

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

è i

l 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

tip

o u

nsig

ned

èu

tili

zzato

pri

ncip

alm

en

te p

er

op

era

zio

ni a b

asso

liv

ell

o:

–il

co

nte

nu

to d

i alc

un

e c

ell

e 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:

|

OR

bit

a b

it

&

AN

D b

it a

bit

^ 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

Page 63: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;//

0000 0

000 0

001 1

000 (

24)

b2 =

b >

> 1

;//

0000 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")

;re

turn

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

Page 64: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 f

loat

flo

at

f =

-2.2

;fl

oat

g =

f -

12.1

2F

;//

lett

era

le f

loat,

suff

isso F

(f)

lon

g d

ou

ble

h =

+0.1

;lo

ng

do

ub

le k

= 1

.23e+

12L

;//

lett

era

le long d

ouble

, suff

isso 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")

;re

turn

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

)

Le

tte

rale

re

ale

(fo

rma

es

tes

a):

10 .

56 E

-3

•la

part

e i

nte

ra o

la p

art

e f

razio

nari

a,

se v

alg

on

o z

ero

,

po

sso

no

essere

om

esse.

Le

op

era

zio

ni s

ug

li in

teri

e s

ui re

ali s

i in

dic

an

o

co

n g

li s

tes

si s

imb

oli (

so

vra

pp

os

izio

ne

o

ov

erl

oa

din

g),

ma

so

no

op

era

zio

ni d

ive

rse

.

#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;

int

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")

;re

turn

0;

} 0

0

.5

0

0

.5P

rem

ere

un

tasto

per

co

nti

nu

are

. . .

Pa

rte

In

tera

Pa

rte

Fra

zio

na

ria

Co

mp

on

en

te in

vir

go

la fis

sa

125

Page 65: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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,

risp

ett

ivam

en

te).

Op

era

zio

ni:

|| O

R l

og

ico

o d

isg

iun

zio

ne

&&

A

ND

lo

gic

o o

co

ng

iun

zio

ne

!

NO

T lo

gic

o o

neg

azio

ne

p

q

p ||q

p&

&q

!p--

----

----

----

----

----

----

----

----

----

----

----

----

----

--fa

lse

fals

efa

lse

fals

etr

ue

fals

e

tru

etr

ue

fals

etr

ue

tru

e

fals

etr

ue

fals

efa

lse

tru

e

tru

etr

ue

tru

efa

lse

126

#in

clu

de

<c

std

lib

>

#in

clu

de

<io

str

ea

m>

us

ing

na

me

sp

ac

e s

td;

int

ma

in()

{

bo

ol b

1 =

tru

e,

b2

= f

als

e;

bo

ol b

3 =

b1

&&

b2

;

//

b3

= f

als

e

bo

ol b

4 =

b1

||

b2

;

// b

4 =

tru

e

bo

ol b

5 =

b1

||

b2

&&

fa

lse

;

// b

5 =

tru

e (

AN

D p

rece

de

nza

ma

gg

iore

di O

R)

bo

ol b

6 =

!b

2||

b2

&&

fa

lse

;

// b

6 =

tru

e (

NO

T p

rec.

ma

gg

iore

di A

ND

e O

R)

co

ut

<<

b3

<<

'\t

' <

< b

4 <

< '\t

' <

< b

5;

co

ut

<<

'\t

' <

< b

6 <

< e

nd

l;

sys

tem

("P

AU

SE

");

retu

rn 0

;

} 0

1

1

1P

rem

ere

un

ta

sto

pe

r c

on

tin

ua

re .

. .

3.5

Tip

o b

oo

l (I

I)

127

Page 66: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

3.5

Op

era

tori

di

co

nfr

on

to e

lo

gic

i (I

)

I ti

pi ari

tmeti

ci

po

sso

no

uti

lizzare

gli

op

era

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

ris

ult

ato

è u

n b

oo

lean

o, ch

e v

ale

fals

ese l

a

co

nd

izio

ne e

sp

ressa d

all

’op

era

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,

b2, b

3, b

4,

b5;

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")

;re

turn

0;

} 0

0

1

1

0

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

129

Page 67: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

3.6

Tip

o c

ara

ttere

(I)

•in

sie

me

di va

lori

: 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

pe

razio

ni s

ui c

ara

tteri

:so

no

po

ssib

ili tu

tte l

e 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

ell

a A

SC

II.

Lett

era

le c

ara

ttere

:

–cara

ttere

racch

iuso

fra

ap

ici;

–esem

pio

:

•Il le

tte

rale

'a

' ra

pp

rese

nta

il ca

ratte

re a

.

Cara

tteri

di co

ntr

oll

o:

–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 i

nvert

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

ell

o (

CR

)\r

–b

arr

a i

nvert

ita

\\

–ap

ice

\'

–vir

go

lett

e

\"

130

3.6

Tip

o c

ara

ttere

(II

)

Ord

inam

en

to:

–tu

tte l

e c

od

ific

he r

isp

ett

an

o l

'ord

ine a

lfab

eti

co

fr

a l

e l

ett

ere

, e l

'ord

ine n

um

eri

co

fra

le c

ifre

;

–la

rela

zio

ne f

ra l

ett

ere

maiu

sco

le e

lett

ere

m

inu

sco

le, o

fra

cara

tteri

no

n a

lfab

eti

ci,

no

n è

p

resta

bil

ita (

per

esem

pio

, in

AS

CII

si

ha 'A

' <

'a

').

Cara

ttere

:

–p

essere

scri

tto

usan

do

il su

o v

alo

re n

ell

a

co

dif

ica a

do

ttata

dall

’im

ple

men

tazio

ne (

per

esem

pio

AS

CII

). I

l 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

pre

ced

ute

da u

na b

arr

a

invert

ita.

Valo

ri e

sad

ecim

ali

:

–fo

rmati

da c

ifre

esad

ecim

ali

pre

ced

ute

da u

na

barr

a i

nvert

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

Page 68: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

decim

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")

;re

turn

0;

} c

c

c

c

d

a

+

21 0 P

rem

ere

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

di co

sta

nti

in

tere

, d

efi

nit

e

dal p

rog

ram

mato

re,

cia

scu

na i

nd

ivid

uata

da u

n

iden

tifi

cato

re e

dett

a e

nu

mera

tore

;

–u

tili

zzati

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

n

um

eri

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 l

a

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,

qu

ell

e d

i co

nfr

on

to;

–so

no

po

ssib

ili tu

tte l

e 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

Page 69: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

; //

ER

RO

RE

! 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;//

2co

ut

<<

og

gi <

< e

nd

l;//

2,

conv.

implic

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")

;re

turn

0;

} 2 2 1 10

11

9

10

Pre

mere

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;fl

oat

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

;//

5co

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")

;re

turn

0;

} 3.5

5

11

13.5

3 Pre

mere

un

tasto

per

co

nti

nu

are

. . .

135

Page 70: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

3.8

.1 C

on

vers

ion

i im

pli

cit

e (

II)

Osserv

azio

ne:

•n

ell

a c

on

vers

ion

e d

a d

ou

ble

a i

nt

si

pu

ò a

vere

un

a

perd

ita d

i in

form

azio

ne, p

oic

hé a

vvie

ne u

n

tro

ncam

en

to d

ell

a p

art

e d

ecim

ale

;

•in

alc

un

i casi,

nell

a c

on

vers

ion

e d

a i

nt

a 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

reali

so

no

rap

pre

sen

tati

in

fo

rma

ap

pro

ssim

ata

.

•E

sem

pi:

–il

reale

1588.5

co

nvert

ito

nell

’in

tero

1588;

–l’

inte

ro 0

X7F

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

op

era

tori

bin

ari

(a

ritm

eti

ci)

:

–se u

n o

pera

tore

ha e

ntr

am

bi

gli

op

era

nd

i in

teri

o

reali

, m

a d

i lu

ng

hezza d

ivers

a,

qu

ell

o d

i lu

ng

hezza m

ino

re v

ien

e c

on

vert

ito

al

tip

o d

i q

uell

o d

i 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

valo

re d

ell

’op

era

nd

o in

tero

vie

ne

co

nvert

ito

nell

a r

ap

pre

sen

tazio

ne r

eale

, ed

il

risu

ltato

dell

’op

era

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

b

oo

lean

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

b

oo

lean

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

pli

cit

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

(c

on

vers

ion

e d

a c

ara

ttere

a i

nte

ro, q

uin

di d

a

inte

ro a

reale

).

137

Page 71: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

3.8

.2 C

on

vers

ion

i esp

licit

e

Op

era

tore

sta

tic_cast:

–e

ffe

ttu

a u

na

co

nve

rsio

ne

di

tip

o q

ua

nd

o e

sis

te l

a

co

nve

rsio

ne

im

pli

cit

a i

nve

rsa

;

–p

uo

es

se

re u

sa

to p

er

eff

ett

ua

re c

on

ve

rsio

ni

di

tip

o

pre

vis

te d

all

a c

on

ve

rsio

ne

im

pli

cit

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,

g2, g

3;

i =

g1;

g1 =

sta

tic_cast<

Gio

rni>

(i);

g2 =

(G

iorn

i) i;

//

cast

g3 =

Gio

rni (i

);

// n

ota

zio

ne f

unzio

nale

co

ut

<<

g1 <

< '\t

' <

< g

2 <

< '\t

' <

< g

3 <

< e

nd

l;

int

j =

(in

t) 1

.1;

// c

ast,

1fl

oat

f =

flo

at(

2);

// n

ota

zio

ne f

unzio

nale

co

ut

<<

j <

< '\t

' <

< f

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} 1

1

1

1

2

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

138

3.9

Dic

hia

razio

ni d

i o

gg

ett

i co

sta

nti

Og

gett

o c

osta

nte

:

–si

usa l

a p

aro

la c

on

st

nell

a 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;//

ER

RO

RE

!

syste

m("

PA

US

E")

;re

turn

0;

} 0

3

.5

7

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

139

Page 72: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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"

<<

siz

eo

f(ch

ar)

<<

en

dl;

// 1

co

ut

<<

"sh

ort

\t"

<<

siz

eo

f(sh

ort

) <

< e

nd

l;//

2co

ut

<<

"in

t \t

" <

< s

izeo

f(in

t) <

< e

nd

l;//

4co

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;//

2co

ut

<<

"u

nsig

ned

in

t \t

";co

ut

<<

siz

eo

f(u

nsig

ned

in

t) <

< e

nd

l;//

4co

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"

<<

siz

eo

f(fl

oat)

<<

en

dl;

// 4

co

ut

<<

"d

ou

ble

\t"

;co

ut

<<

siz

eo

f(d

ou

ble

) <

< e

nd

l;//

8co

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")

;re

turn

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

Page 73: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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;//

1co

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")

;re

turn

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

ba

sic

-ma

in-p

rog

ram

int

ma

in ()

co

mp

ou

nd

-sta

tem

en

t

co

mp

ou

nd

-sta

tem

en

t

{s

tate

me

nt-

se

q}

sta

tem

en

t

de

cla

rati

on

-sta

tem

en

t

de

fin

itio

n-s

tate

me

nt

ex

pre

ss

ion

-sta

tem

en

t

str

uc

ture

d-s

tate

me

nt

jum

p-s

tate

me

nt

lab

ele

d-s

tate

me

nt

Istr

uzio

ni d

i d

ich

iara

zio

ne

/de

fin

izio

ne:

decla

rati

on

-sta

tem

en

t

defi

nit

ion

-sta

tem

en

t

ha

nn

o la

fo

rma

vis

ta in

pre

ce

de

nza

.

Sim

bo

li in

tro

do

tti d

al p

rog

ram

ma

tore

:

•d

evo

no

es

se

re d

ich

iara

ti/d

efi

nit

i p

rim

a d

i e

ss

ere

u

sa

ti;

•n

on

è n

ec

es

sa

rio

ch

e l

e d

ich

iara

zio

ni/

de

fin

izio

ni

pre

ce

da

no

le

alt

re i

str

uzio

ni.

143

Page 74: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

4.2

Esp

ressio

ni d

i 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,

iden

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é i

n c

ert

i casi

pu

ò e

ssere

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 i

l valo

re d

ell

’esp

ressio

ne a

destr

a

dell

’op

era

tore

di asseg

nam

en

to (

‘=

‘);

–so

sti

tuir

lo a

l valo

re d

ell

a v

ari

ab

ile.

No

me a

sin

istr

a d

ell

’op

era

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

’op

era

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 d

i 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

= 1

00);

// 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")

;re

turn

0;

} 3 3 5

5

5

3

6

6

10

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

145

Page 75: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

4.2

.1 A

ltri

op

era

tori

di

asseg

nam

en

to

ba

sic

-re

cu

rre

nc

e-a

ss

ign

me

nt

va

ria

ble

-na

me

= v

ari

ab

le-n

am

e ⊕

ex

pre

ss

ion

ba

sic

-co

mp

ou

nd

-as

sig

nm

en

tv

ari

ab

le-n

am

e ⊕

= e

xp

res

sio

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;//

30

i -

= j -

= 1

;//

associa

tivo a

destr

a;

co

ut

<<

i <

< e

nd

l;//

26

(i +

= 1

2)

= 2

;co

ut

<<

i <

< e

nd

l; /

/ re

stitu

isce u

n l-v

alu

e

syste

m("

PA

US

E")

;re

turn

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++

;//

ER

RO

RE

!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")

;re

turn

0;

}

147

Page 76: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

4.3

Esp

ressio

ni ari

tmeti

ch

e e

lo

gic

he (

I)

Calc

olo

dell

e 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

ell

e f

un

zio

ni e a

pp

lican

do

gli

op

era

tori

u

nari

(p

rim

a i

ncre

men

to e

decre

men

to

po

stf

issi,

po

i in

cre

men

to e

decre

men

to

pre

fissi,

NO

T 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,

ap

pli

can

do

gli

o

pera

tori

bin

ari

nel seg

uen

te o

rdin

e:

•q

uell

i m

olt

ipli

cati

vi

( *,

/ , %

);

•q

uell

i ad

dit

ivi

( +

, -

);

•q

uell

i d

i re

lazio

ne (

<, …

);

•q

uell

i d

i u

gu

ag

lian

za (

==

, !=

)

•q

uell

i lo

gic

i (n

ell

’ord

ine, &

&,

|| )

;

•q

uell

i d

i asseg

nam

en

to (

= , …

);

Pare

nte

si

ton

de (

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")

;re

turn

0;

} 7 9 Pre

mere

un

tasto

per

co

nti

nu

are

. . .

149

Page 77: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

bin

ari

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")

;re

turn

0;

} 1 4 1 1 Pre

mere

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")

;re

turn

0;

} 0 1 1 0 Pre

mere

un

tasto

per

co

nti

nu

are

. . .

151

Page 78: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

calc

olo

di u

n'e

sp

ressio

ne l

og

ica 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

oc

irc

uit

o

#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

);//

NO

!co

ut

<<

k <

< e

nd

l;

syste

m("

PA

US

E")

;re

turn

0;

}

152

4.4

Op

era

tore

co

nd

izio

nale

(I)

e1 ?

e2

: e3

e1

esp

ressio

ne l

og

ica

Se e

1 è

vera

, il

valo

re r

esti

tuit

o d

all

’op

era

tore

co

nd

izio

nale

è i

l valo

re d

i e2,

alt

rim

en

ti d

ie3.

// L

eg

ge d

ue i

nte

ri e

sta

mp

a 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

du

e n

um

eri

in

teri

" <

< e

nd

l;

cin

>>

i >

> j;

// 2

4

min

= (

i <

j ?

i :

j);

co

ut

<<

"Il

nu

mero

min

ore

e':

" <

< m

in <

< e

nd

l;

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

du

e 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

Page 79: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

4.4

Op

era

tore

co

nd

izio

nale

(II

)

// L

eg

ge t

re i

nte

ri e

d i

ncre

men

ta i

l 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

tre 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

nu

mero

min

ore

e':

" <

< m

in <

< e

nd

l;co

ut

<<

i <

< '\t

' <

< j <

< '\t

' <

< z

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

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

Istr

uzio

ni

str

utt

ura

te

Istr

uzio

ni s

tru

ttu

rate

:–

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

co

mp

os

ta:

–g

ià e

sam

inata

nell

a s

inta

ssi

di p

rog

ram

ma;

–co

nsen

te,

per

mezzo

dell

a c

op

pia

di

deli

mit

ato

ri {

e

} ,

di 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

pre

ved

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

du

e

deli

mit

ato

ri.

Istr

uzio

ni c

on

diz

ion

ali:

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

Page 80: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;//

46

if (

a >

b)

max =

a;

els

e max =

b;

co

ut

<<

max <

< e

nd

l;

syste

m("

PA

US

E")

;re

turn

0;

} 4 6 6 Pre

mere

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")

;re

turn

0;

} 4 6 3

5

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

157

Page 81: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

un

nu

mero

in

tero

" <

< e

nd

l;cin

>>

a;

if (

a <

0)

a =

-a;

co

ut

<<

"Il

valo

re a

sso

luto

e' ";

co

ut

<<

a <

< e

nd

l;

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

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 i

l 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

un

nu

mero

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")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

2 Nu

mero

in

cre

men

tato

3P

rem

ere

un

tasto

per

co

nti

nu

are

. . .

Inseri

sci

un

nu

mero

in

tero

0 Pre

mere

un

tasto

per

co

nti

nu

are

. . .

N.B

.: L

’esp

ressio

ne n

ell

a c

on

diz

ion

e p

resti

tuir

e u

n

valo

re a

ritm

eti

co

: se i

l valo

re è

0,

la c

on

diz

ion

e è

fa

lsa;

alt

rim

en

ti è

vera

.

159

Page 82: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

du

e 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")

;re

turn

0;

} Inseri

sci

du

e 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

sc

e a

lla

co

nd

izio

ne

più

vic

ina

(n

ell’e

se

mp

io, a

lla

co

nd

izio

ne

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

du

e 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")

;re

turn

0;

} Inseri

sci

du

e n

um

eri

in

teri

5 7 6

7

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

161

Page 83: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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")

;re

turn

0;

} Qu

an

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"

<<

en

dl;

co

ut

<<

"x:

" <

< -

c /

b <

< e

nd

l;} 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"

<<

en

dl;

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")

;re

turn

0;

}

163

Page 84: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

d

el ti

po

del ri

su

ltato

dell

’esp

ressio

ne;

–in

div

idu

an

o l

e v

ari

e a

ltern

ati

ve n

el

co

rpo

d

ell

’istr

uzio

ne s

wit

ch

;

–i valo

ri d

ell

e 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,

deve e

ssere

un

ica.

165

Page 85: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

'alt

ern

ati

va c

on

l’e

tich

ett

a i

n c

ui

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, all

ora

vie

ne

eseg

uit

a,

se e

sis

te,

l’alt

ern

ati

va c

on

eti

ch

ett

a

defa

ult

;

•in

mancan

za d

i etichett

a d

efa

ult

l'esecuzi

on

e

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’i

str

uzio

ne b

reak

(rie

ntr

a n

ell

a c

ate

go

ria d

ell

e istr

uzio

ni d

i salt

o):

bre

ak-s

tate

men

t

bre

ak

;

Att

en

zio

ne:

•S

e l

’ult

ima

is

tru

zio

ne

di

un

’alt

ern

ati

va

no

n f

a

term

ina

re l

’is

tru

zio

ne

sw

itc

h,

e s

e l

’alt

ern

ati

va

n

on

e’

l’u

ltim

a,

vie

ne

es

eg

uit

a l

’alt

ern

ati

va

s

uc

ce

ss

iva

.

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

<<

"**

";b

reak;

case 3

:co

ut

<<

"**

*";

bre

ak;

defa

ult

:co

ut

<<

'!'

;} co

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Qu

an

ti a

ste

risch

i?2 ** P

rem

ere

un

tasto

per

co

nti

nu

are

. . .

167

Page 86: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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")

;re

turn

0;

} Qu

an

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"

<<

en

dl;

co

ut

<<

"A

-P

rim

a A

ltern

ati

va"

<<

en

dl;

co

ut

<<

"B

-S

eco

nd

a A

ltern

ati

va"

<<

en

dl;

co

ut

<<

"C

-T

erz

a A

ltern

ati

va"

<<

en

dl;

co

ut

<<

"Q

uals

iasi alt

ro t

asto

per

uscir

e"

<<

en

dl;

ch

ar

c;

cin

>>

c;

sw

itch

(c)

{case 'a':

case 'A

':

co

ut

<<

"P

rim

a a

ltern

ati

va"

<<

en

dl;

b

reak;

case 'b

': c

ase 'B

':

co

ut

<<

"S

eco

nd

a a

ltern

ati

va"

<<

en

dl;

bre

ak;

case 'c':

case 'C

':

co

ut

<<

"T

erz

a a

ltern

ati

va"

<<

en

dl;

//

Manca 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")

;re

turn

0;

}

169

Page 87: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

iall

o "

<<

en

dl;

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

Page 88: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

6.3

.2 Istr

uzio

ni

sw

itch

e b

reak (

VII

I)

// S

cri

ttu

ra d

i en

um

era

zio

ni

(co

nti

nu

a)

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")

;re

turn

0;

} Sele

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:

ite

rati

on

-sta

tem

en

t

wh

ile

-sta

tem

en

t

do

-sta

tem

en

t

for-

sta

tem

en

t

wh

ile

-sta

tem

en

t

wh

ile

(

co

nd

itio

n)

s

tate

me

nt

// 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 c

onserv

a il valo

re iniz

iale

co

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Qu

an

ti a

ste

risch

i?6 **

****

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

173

Page 89: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

--;

}//

al te

rmin

e,

n v

ale

0co

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Qu

an

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

(ii

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;

wh

ile (

n--

> 0

) co

ut

<<

'*'

;//

al te

rmin

e,

n v

ale

-1

co

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

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

) //

non t

erm

ina s

e n

< 0

co

ut

<<

'*';

co

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

}

175

Page 90: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

un

nu

mero

in

tero

" <

< e

nd

l;cin

>>

i;

wh

ile (

i >

= 0

) {

co

ut

<<

2 *

i <

< e

nd

l;co

ut

<<

"In

seri

sci

un

nu

mero

in

tero

" <

< e

nd

l;cin

>>

i;

} syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

1 2 Inseri

sci

un

nu

mero

in

tero

3 6 Inseri

sci

un

nu

mero

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 l

a s

om

ma d

ei p

rim

i//

m i

nte

ri p

osit

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 "

<<

en

dl;

cin

>>

n;

wh

ile (

so

mm

a <

= n

)so

mm

a +

= +

+m

;m

--;

co

ut

<<

m <

< e

nd

l;syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

n8 3 P

rem

ere

un

tasto

per

co

nti

nu

are

. . .

177

Page 91: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

6.4

.1 Istr

uzio

ne w

hil

e (

V)

// C

alc

ola

il m

assim

o t

erm

ine d

ell

a 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 l

a 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

so

no

in

gra

do

di ri

pro

du

rsiall

'età

di

un

mese.

Su

pp

on

iam

o c

he i

no

str

i co

nig

lin

on

mu

oia

no

mai

e c

he l

a 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 i

n p

oi.

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

dell

e 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

ell

a 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 "

<<

en

dl;

cin

>>

n;

if (

n<

=0)

co

ut

<<

"V

alo

re n

on

co

nsis

ten

te"

<<

en

dl;

els

e{

wh

ile (

(s =

j +

i)

<=

n)

{i =

j;

j =

s;

} co

ut

<<

j <

< e

nd

l;} s

yste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

n7 5 P

rem

ere

un

tasto

per

co

nti

nu

are

. . .

179

Page 92: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

6.4

.1 Istr

uzio

ne w

hil

e (

V)

// C

alc

ola

il m

assim

o t

erm

ine d

ell

a 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 "

<<

en

dl;

cin

>>

n;

if (

n<

=0)

co

ut

<<

"V

alo

re n

on

co

nsis

ten

te"

<<

en

dl;

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")

;re

turn

0;

} Inseri

sci

n7 5 P

rem

ere

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

( e

xp

res

sio

n)

;

Es

ec

uzio

ne

de

ll’is

tru

zio

ne

do

:

–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

ell

a v

alu

tazio

ne d

ell

a

co

nd

izio

ne d

i te

rmin

azio

ne.

181

Page 93: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

6.4

.2 Istr

uzio

ne d

o (

II)

// C

alc

ola

il m

assim

o t

erm

ine d

ell

a 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 "

<<

en

dl;

cin

>>

n;

if (

n<

=0)

co

ut

<<

"V

alo

re n

on

co

nsis

ten

te"

<<

en

dl;

els

e{

do

{

i =

j;

j =

s;

} w

hil

e (

(s =

j +

i)

<=

n);

co

ut

<<

j <

< e

nd

l;} syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

n7 5 P

rem

ere

un

tasto

per

co

nti

nu

are

. . .

182

6.4

.3 Istr

uzio

ne f

or

(I)

for-

sta

tem

en

tfo

r (

init

iali

zati

on

co

nd

itio

n-s

pecif

icati

on

ste

p)

sta

tem

en

t

init

iali

zati

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

)

{//

corp

o d

el fo

r

istr

uzio

ne

passo

;

}

}

183

Page 94: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

<<

'*'

;//

al te

rmin

e,

i vale

nco

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Qu

an

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

<<

'*'

;//

al te

rmin

e,

n v

ale

0co

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Qu

an

ti a

ste

risch

i?6 **

****

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

185

Page 95: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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++

) //

vis

ibili

ta’ i lim

itata

co

ut

<<

'!'

; //

blo

cco f

or

co

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Qu

an

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")

;re

turn

0;

} Qu

an

ti?

6 ****

**!!

!!!!

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

187

Page 96: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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")

;re

turn

0;

} Nu

mero

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

cc

essiv

aal

co

rpo

del

cic

loo

dell’i

str

uzio

ne

sw

itch

ch

eco

nte

ng

on

ol’

istr

uzio

ne

bre

ak:

wh

ile

(..

.)

{..

.

bre

ak;

...

} sw

itch

(..

..)

{..

.. bre

ak;

...

}

189

Page 97: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

un

nu

mero

in

tero

" <

< e

nd

l;cin

>>

j;

if (

j <

0)

bre

ak;

co

ut

<<

j <

< e

nd

l;} syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

3 3 Inseri

sci

un

nu

mero

in

tero

5 5 Inseri

sci

un

nu

mero

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

un

nu

mero

in

tero

" <

< e

nd

l;cin

>>

j;

if (

j <

0)

bre

ak;

co

ut

<<

j <

< e

nd

l;} syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

3 3 Inseri

sci

un

nu

mero

in

tero

5 5 Inseri

sci

un

nu

mero

in

tero

-1 Pre

mere

un

tasto

per

co

nti

nu

are

. . .

191

Page 98: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 l

a 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

oll

o:

wh

ile (

...

)

wh

ile (

….)

{

...

{ …

co

nti

nu

e;

sw

itch

(…)

...

{ …

}co

nti

nu

e;

} ….

}

No

ta: –

le i

str

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 i

n c

ui 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

'ult

ima d

i u

n c

iclo

, n

ell

e 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

un

nu

mero

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")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

1 1 Inseri

sci

un

nu

mero

in

tero

2 2 Inseri

sci

un

nu

mero

in

tero

-2 Inseri

sci

un

nu

mero

in

tero

-3 Inseri

sci

un

nu

mero

in

tero

4 4 Pre

mere

un

tasto

per

co

nti

nu

are

. . .

193

Page 99: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

casell

e(o

cell

e),

cia

scu

na

di

un

byte

,ch

ete

rmin

aco

nu

na

marc

ad

ifi

ne

str

eam

(il

nu

mero

dell

ecasell

illi

mit

ato

);

≅c

ba

int m

ain

(){

ch

ar

c;

cin

>>

c;

….

}

po

siz

ion

e c

asell

aco

invo

lta

nell

a lett

ura

accesso

seq

uen

zia

le 194

5.2

Co

ncett

o d

i str

eam

(II

)

Gli s

tre

am

pre

de

fin

iti s

on

o t

re:

–cin

, co

ut

e c

err

;

Fu

nzio

ni c

he

op

era

no

su

qu

es

ti s

tre

am

:–

si

tro

van

o i

n u

na l

ibre

ria d

i in

gre

sso

/uscit

a,

e

per

il lo

ro u

so

occo

rre i

nclu

dere

il fi

le d

i in

testa

zio

ne <

iostr

eam

>.

Os

se

rva

zio

ne

:–

qu

an

to v

err

à d

ett

o p

er

lo s

tream

co

ut

vale

an

ch

e p

er

lo s

tream

cerr

.

Str

ea

m d

i in

gre

ss

o s

tan

da

rd (

cin

):–

per

pre

levarv

i d

ati

, si

usa 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

reli

evo

dall

o s

tream

di u

na s

eq

uen

za d

i cara

tteri

, co

nsis

ten

te c

on

la s

inta

ssi

dell

e c

osta

nti

asso

cia

te

al

tip

o d

ell

a 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 i

n u

n v

alo

re c

he

vie

ne a

sseg

nato

all

a v

ari

ab

ile.

195

Page 100: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

p

rog

ram

ma 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 l

o s

tream

cin

;

•p

er

co

nsen

tire

even

tuali

co

rrezio

ni,

i c

ara

tteri

batt

uti

co

mp

aio

no

an

ch

e i

n e

co

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

ell

o.

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

nre

sid

en

te s

u m

em

ori

a d

i m

assa;

•co

man

do

DO

S/W

ind

ow

s (l

eg

gi.

exe

è u

n f

ile

eseg

uib

ile):

leg

gi.

exe <

fil

e.i

n

196

5.2

Lett

ura

di

Cara

tteri

(I)

ch

ar

c;

cin

>>

c;

Azio

ne:

•se i

l cara

ttere

co

nte

nu

to n

ell

a c

asell

a 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

all

a v

ari

ab

ile c

;

–il

pu

nta

tore

si

sp

osta

su

lla c

asell

a s

uccessiv

a;

•se i

l cara

ttere

co

nte

nu

to n

ell

a c

asell

a s

ele

zio

nata

dal

pu

nta

tore

è u

no

sp

azio

bia

nco

:

–vie

ne i

gn

ora

to;

–il

pu

nta

tore

si

sp

osta

su

lla c

asell

a 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

.

Le

ttu

ra d

i u

n c

ara

tte

re q

ua

lsiv

og

lia

(a

nc

he

di u

no

s

pa

zio

bia

nc

o):

c

ha

r c

;cin

.get(

c);

No

ta: –

un

a f

un

zio

ne (

co

me g

et(

)), ap

pli

cata

ad

un

o

sp

ecif

ico

str

eam

(co

me c

in),

si

dic

e f

un

zio

ne

mem

bro

.

197

Page 101: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

5.2

Lett

ura

di

Cara

tteri

(II

)

// L

eg

ge c

ara

tteri

e l

i 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

un

cara

ttere

" <

< e

nd

l;cin

>>

c;

if (

c !

= 'q

')co

ut

<<

c <

< e

nd

l;els

eb

reak;

} syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

cara

ttere

a w

qa In

seri

sci

un

cara

ttere

w Inseri

sci

un

cara

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 l

i 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

un

cara

ttere

" <

< e

nd

l;cin

.get(

c);

if (

c !

= 'q

')co

ut

<<

c <

< e

nd

l;els

eb

reak;

} syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

cara

ttere

a w

qa In

seri

sci

un

cara

ttere

Inseri

sci

un

cara

ttere

Inseri

sci

un

cara

ttere

w Inseri

sci

un

cara

ttere

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

199

Page 102: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

5.2

Lett

ura

di

Inte

ri

int

i;cin

>>

i;

Azio

ne:

•il

pu

nta

tore

si

sp

osta

da u

na c

asell

a a

lla s

uccessiv

a

fin

tan

to c

he t

rova c

ara

tteri

co

nsis

ten

ti c

on

la

sin

tassi

dell

e c

osta

nti

in

tere

, salt

an

do

even

tuali

sp

azi

bia

nch

i in

testa

, e s

i fe

rma s

ul

pri

mo

cara

ttere

n

on

pre

vis

to d

all

a s

inta

ssi

ste

ssa;

•il

nu

mero

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

all

a 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

du

e 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")

;re

turn

0;

} Inseri

sci

du

e 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

pu

nta

tore

si

sp

osta

da u

na c

asell

a a

lla s

uccessiv

a

fin

tan

to c

he t

rova c

ara

tteri

co

nsis

ten

ti c

on

la

sin

tassi

dell

e c

osta

nti

reali

, salt

an

do

even

tuali

sp

azi

bia

nch

i in

testa

, e s

i fe

rma s

ul p

rim

o c

ara

ttere

no

n

pre

vis

to d

all

a s

inta

ssi

ste

ssa;

•il

nu

mero

reale

co

rris

po

nd

en

te a

lla s

eq

uen

za d

i cara

tteri

lett

i vie

ne a

sseg

nato

all

a 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

du

e n

um

eri

reali

" <

< e

nd

l;cin

>>

f;

cin

>>

g;

co

ut

<<

f <

< e

nd

l <

< g

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

du

e n

um

eri

reali

-1.2

5e-3

.1e4

-0.0

0125

1000

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

201

Page 103: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

5.2

Lett

ure

Mu

ltip

le

Istr

uzio

ne

di in

gre

ss

o:

–ri

en

tra

ne

lla

ca

teg

ori

a d

ell

e i

str

uzio

ne

es

pre

ss

ion

e;

–l’

es

pre

ss

ion

e p

rod

uc

e c

om

e r

isu

lta

to l

o s

tre

am

co

invo

lto

;

–c

on

se

nte

di

eff

ett

ua

re p

iù l

ett

ure

in

se

qu

en

za

.

cin

>>

x >

> y

;

eq

uiv

ale

nte

a:

cin

>>

x;

c

in >

> y

;

Infa

tti,

essen

do

l’o

pera

tore

>>

asso

cia

tivo

a s

inis

tra,

pri

ma v

ien

e c

alc

ola

ta l

a 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

du

e n

um

eri

reali

" <

< e

nd

l;cin

>>

f>

>g

;co

ut

<<

f <

< e

nd

l <

< g

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

du

e n

um

eri

reali

-1.2

5e-3

.1e4

-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

di le

ttu

ra:

•il

pu

nta

tore

no

n in

div

idu

a u

na s

eq

uen

za d

i cara

tteri

co

nsis

ten

te c

on

la s

inta

ssi

dell

e c

osta

nti

asso

cia

te

al

tip

o d

ell

a v

ari

ab

ile:

–l'o

pera

zio

ne d

i p

reli

evo

no

n h

a lu

og

o e

lo

str

eam

si

po

rta i

n u

no

sta

to d

i err

ore

;

Ca

so

tip

ico

:•

si

vu

ole

leg

gere

un

nu

mero

in

tero

, e i

l 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

ten

ta d

i le

gg

ere

la m

arc

a d

i fi

ne s

tream

.

Str

ea

m d

i in

gre

ss

o in

sta

to d

i e

rro

re:

•o

cco

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

ea

m d

i in

gre

ss

o:

•p

co

sti

tuir

e u

na

co

nd

izio

ne

(nell

e istr

uzio

ni

co

nd

izio

nali

o r

ipeti

tive);

•la

co

nd

izio

ne è

vera

se l

o s

tream

no

n è

in

un

o s

tato

d

i err

ore

, fa

lsa a

ltri

men

ti.

Ta

sti

era

de

l te

rmin

ale

:•

se u

n p

rog

ram

ma l

eg

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

ott

ien

e p

rem

en

do

Co

ntr

ol e Z

n

ei sis

tem

i D

OS

/Win

do

ws (

Ctr

l-Z

).

203

Page 104: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

dell

e 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

hil

e (

tru

e)

{co

ut

<<

"In

seri

sci

un

nu

mero

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")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

3 Nu

mero

in

tero

: 3

Inseri

sci

un

nu

mero

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

dell

e 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

hil

e (

cin

){

co

ut

<<

"In

seri

sci

un

nu

mero

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")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

3 Nu

mero

in

tero

: 3

Inseri

sci

un

nu

mero

in

tero

x Pre

mere

un

tasto

per

co

nti

nu

are

. . .

205

Page 105: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

dell

e 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

un

nu

mero

in

tero

" <

< e

nd

l;w

hil

e (

cin

>>

i)

{co

ut

<<

"N

um

ero

in

tero

: "

<<

i <

< e

nd

l;co

ut

<<

"In

seri

sci

un

nu

mero

in

tero

" <

< e

nd

l;}

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

3 Nu

mero

in

tero

: 3

Inseri

sci

un

nu

mero

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

dell

e 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

hil

e (

co

ut

<<

"In

seri

sci

un

nu

mero

in

tero

" <

< e

nd

l&

& c

in >

> i)

co

ut

<<

"N

um

ero

in

tero

: "

<<

i <

< e

nd

l;syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

3 Nu

mero

in

tero

: 3

Inseri

sci

un

nu

mero

in

tero

x Pre

mere

un

tasto

per

co

nti

nu

are

. . .

207

Page 106: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 i

l 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

un

cara

ttere

" <

< e

nd

l &

&cin

>>

c)

co

ut

<<

"C

ara

ttere

: "

<<

c <

< e

nd

l;syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

cara

ttere

s

eC

ara

ttere

: s

Inseri

sci

un

cara

ttere

Cara

ttere

: e

Inseri

sci

un

cara

ttere

a Cara

ttere

: a

Inseri

sci

un

cara

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 i

l 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

un

cara

ttere

" <

< e

nd

l &

&

cin

.get(

c))

co

ut

<<

"C

ara

ttere

: "

<<

c <

< e

nd

l;syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

cara

ttere

s

eC

ara

ttere

: s

Inseri

sci

un

cara

ttere

Cara

ttere

:In

seri

sci

un

cara

ttere

Cara

ttere

:In

seri

sci

un

cara

ttere

Cara

ttere

: e

Inseri

sci

un

cara

ttere

Cara

ttere

:

Inseri

sci

un

cara

ttere

^Z

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

209

Page 107: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

5.3

Err

ori

su

llo

str

eam

di

ing

resso

(V

III)

// U

so

dell

a 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

";w

hil

e (

cin

>>

c)

co

ut

<<

c <

< e

nd

l;co

ut

<<

"In

seri

sci

i cara

tteri

(te

rmin

a c

on

^Z

)\n

";w

hil

e (

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

";w

hil

e (

cin

>>

c)

co

ut

<<

c <

< e

nd

l;syste

m("

PA

US

E")

;re

turn

0;

} Inseri

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

(){

i

nt

i;ch

ar

c;

co

ut

<<

"In

seri

sci

nu

meri

in

teri

" <

< e

nd

l;w

hil

e (

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

nu

meri

in

teri

" <

< e

nd

l;w

hil

e (

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

hil

e (

cin

.get(

c)

&&

c!=

'\n

');

co

ut

<<

"In

seri

sci

nu

meri

in

teri

" <

< e

nd

l;w

hil

e (

cin

>>

i)co

ut

<<

i <

< e

nd

l;syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

nu

meri

in

teri

p Str

eam

in

sta

to d

i err

ore

Inseri

sci

nu

meri

in

teri

Str

eam

in

sta

to d

i err

ore

Inseri

sci

nu

meri

in

teri

1 1 …211

Page 108: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

5.4

Str

eam

di

uscit

a

Str

ea

m d

i u

sc

ita

sta

nd

ard

(c

ou

t):

•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

’esp

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

nell

e v

ari

e c

asell

e d

ell

o

str

eam

, a p

art

ire d

all

a p

rim

a;

•il

pu

nta

tore

e l

a m

arc

a d

i fi

ne s

tream

si

sp

osta

no

in

avan

ti,

e i

n o

gn

i m

om

en

to i

l p

un

tato

re in

div

idu

a l

a

marc

a d

i fi

ne s

tream

.

Po

ss

on

o e

ss

ere

sc

ritt

i:

–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

di u

sc

ita

:•

è u

n’i

str

uzio

ne e

sp

ressio

ne;

•il

ris

ult

ato

è l

o s

tream

;

•an

alo

gam

en

te a

ll’i

str

uzio

ne d

i in

gre

sso

, co

nsen

te d

i eff

ett

uare

più

scri

ttu

re i

n s

eq

uen

za.

Fo

rma

to d

i s

cri

ttu

ra (

pa

ram

etr

i):

•am

pie

zza d

el

cam

po

(nu

mero

to

tale

di cara

tteri

im

pie

gati

, co

mp

resi

even

tuali

sp

azi p

er

l'all

ineam

en

to);

•lu

ng

hezza d

ell

a p

art

e f

razio

nari

a(s

olo

per

i n

um

eri

re

ali

);

Pa

ram

etr

i:•

valo

ri d

efa

ult

fis

sati

dall

’im

ple

men

tazio

ne;

•p

osso

no

essere

cam

bia

ti d

al

pro

gra

mm

ato

re.

Rid

ire

zio

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.

exe

è u

n f

ile

eseg

uib

ile):

scri

vi.

exe >

fil

e.o

ut

213

Page 109: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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")

;re

turn

0;

} 0.0

1564

0.0

16

1.2

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

ea

m a

ss

oc

iati

ai fi

le v

isti

da

l s

iste

ma

op

era

tivo

:

•g

esti

ti d

a u

na a

pp

osit

a l

ibre

ria;

•o

cco

rre i

nclu

dere

il fi

le d

i in

testa

zio

ne <

fstr

eam

>.

Dic

hia

razio

ne

:

ba

sic

-file

-str

ea

m-d

efi

nit

ion

fstr

ea

mid

en

tifi

er-

lis

t ;

Es

em

pio

:

fstr

eam

in

gr,

usc;

Fu

nzio

ne

op

en

():

•asso

cia

un

o s

tream

ad

un

fil

e;

•ap

re l

o s

tream

seco

nd

o o

pp

ort

un

e m

od

ali

tà;

•le

mo

dali

tà d

i 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 |

ios::

ap

p;

•il

no

me 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

Page 110: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

5.5

Man

ipo

lazio

ne d

ei

file

(II

)

Es

em

pio

:

ing

r.o

pen

("fi

le1.i

n",

io

s::

in);

usc.o

pen

("fi

le2.o

ut"

, io

s::

ou

t);

Str

ea

m a

pe

rto

in

le

ttu

ra:

–il

fil

e a

sso

cia

to d

eve e

ssere

già

pre

sen

te;

–il

pu

nta

tore

si

sp

osta

su

lla p

rim

a c

asell

a.

Str

ea

m a

pe

rto

in

sc

ritt

ura

:

–il

fil

e a

sso

cia

to,

se n

on

pre

sen

te,

vie

ne c

reato

;

–il

pu

nta

tore

si

po

siz

ion

a a

ll'in

izio

dell

o s

tream

,

su

l q

uale

co

mp

are

so

lo la m

arc

a d

i fi

ne s

tream

(e

ven

tuali

dati

pre

sen

ti n

el fi

le v

en

go

no

p

erd

uti

).

Str

ea

m a

pe

rto

in

ap

pe

nd

:

–il

fil

e a

sso

cia

to,

se n

on

pre

sen

te,

vie

ne c

reato

;

–il

pu

nta

tore

si

sp

osta

all

a f

ine d

ell

o s

tream

, in

co

rris

po

nd

en

za d

ell

a m

arc

a d

i fi

ne s

tream

(e

ven

tuali

dati

pre

sen

ti n

el fi

le n

on

ven

go

no

p

erd

uti

).

216

5.5

Man

ipo

lazio

ne d

ei

file

(II

I)

Str

ea

m a

pe

rto

:

–u

tili

zzato

co

n l

e s

tesse m

od

ali

tà e

gli

ste

ssi

op

era

tori

vis

ti p

er

gli

str

eam

sta

nd

ard

;

–le

op

era

zio

ni eff

ett

uate

su

gli

str

eam

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

clo

se

():

–ch

iud

e u

no

str

eam

ap

ert

o,

un

a v

olt

a c

he è

sta

to

uti

lizzato

.

ing

r.clo

se()

;

usc.c

lose()

;

Str

ea

m c

hiu

so

:–

pu

ò e

ssere

ria

pert

o,

asso

cia

nd

olo

ad

un

q

ualu

nq

ue f

ile e

co

n u

na m

od

ali

tà a

rbit

rari

a.

Fin

e d

el p

rog

ram

ma

:–

tutt

i g

li s

tream

ap

ert

i ven

go

no

au

tom

ati

cam

en

te

ch

iusi.

Err

ori

:–

qu

an

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 i

n lett

ura

.

217

Page 111: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 i

n 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

fil

e n

on

pu

o' essere

ap

ert

o"

<<

en

dl;

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

fil

e n

on

pu

o' essere

ap

ert

o"

<<

en

dl;

exit

(1);

}

wh

ile (

ff >

> n

um

)

//

fin

o a

lla f

ine d

el file

co

ut

<<

nu

m <

< '\t

';co

ut

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

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

oll

a c

he l

e i

str

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,

nu

m;

co

nst

int

N =

6;

ff.o

pen

("esem

pio

", io

s::

in);

if (

!ff)

{cerr

<<

"Il

fil

e n

on

pu

o' essere

ap

ert

o"

<<

en

dl;

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

ell

a l

ett

ura

del fi

le "

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} 0

1

2

3

E

rro

re n

ell

a l

ett

ura

del fi

leP

rem

ere

un

tasto

per

co

nti

nu

are

. . .

219

Page 112: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

fil

e n

on

pu

o' essere

ap

ert

o"

<<

en

dl;

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

fil

e n

on

pu

o' essere

ap

ert

o"

<<

en

dl;

exit

(1);

}

wh

ile (

ff.g

et(

c))

co

ut

<<

c;

syste

m("

PA

US

E")

;re

turn

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(

"fil

e")

;

fstr

eam

ff;

ff

.op

en

("fi

le",

io

s::

ou

t);

ofs

tream

ff(

"fil

e")

;

fstr

eam

ff;

ff

.op

en

("fi

le",

io

s::

ou

t|io

s::

ap

p);

ofs

tream

ff(

"fil

e",

ios::

ap

p);

221

Page 113: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

un

nu

mero

in

tero

:";

cin

>>

n;

f =

1;

for

(in

t i =

2;

i <

= n

; i+

+)

f *

= i

;co

ut

<<

"Il

fatt

ori

ale

e':

" <

< f

<<

en

dl;

/* A

ltre

ela

bora

zio

ni */

co

ut

<<

"In

seri

sci

un

nu

mero

in

tero

";

cin

>>

n;

f =

1;

for

(in

t i =

2;

i <

= n

; i+

+)

f *=

i;

co

ut

<<

"Il

fatt

ori

ale

e':

" <

< f

<<

en

dl;

/* A

ltre

ela

bora

zio

ni */

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

: 4

Il f

att

ori

ale

e':

24

Inseri

sci

un

nu

mero

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

un

nu

mero

in

tero

:";

cin

>>

n;

f =

fatt

();

co

ut

<<

"Il

fatt

ori

ale

e':

" <

< f

<<

en

dl;

/* A

ltre

ela

bora

zio

ni */

co

ut

<<

"In

seri

sci

un

nu

mero

in

tero

:";

cin

>>

n;

f =

fatt

();

co

ut

<<

"Il

fatt

ori

ale

e':

" <

< f

<<

en

dl;

/* A

ltre

ela

bora

zio

ni */

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

: 4

Il f

att

ori

ale

e':

24

Inseri

sci

un

nu

mero

in

tero

: 5

Il f

att

ori

ale

e':

120

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

223

Page 114: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

un

nu

mero

in

tero

:";

cin

>>

i;

f =

fatt

(i);

co

ut

<<

"Il

fatt

ori

ale

e':

" <

< f

<<

en

dl;

/* A

ltre

ela

bora

zio

ni */

co

ut

<<

"In

seri

sci

un

nu

mero

in

tero

:";

cin

>>

i;

f =

fatt

(i);

co

ut

<<

"Il

fatt

ori

ale

e':

" <

< f

<<

en

dl;

/* A

ltre

ela

bora

zio

ni */

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

un

nu

mero

in

tero

: 4

Il f

att

ori

ale

e':

24

Inseri

sci

un

nu

mero

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

all

a f

un

zio

ne;

No

mi

di vari

ab

ili

locali

e d

i arg

om

en

ti f

orm

ali

:

•asso

cia

ti a

d o

gg

ett

i ch

e a

pp

art

en

go

no

all

a f

un

zio

ne

in c

ui so

no

defi

nit

i;

•se u

no

ste

sso

no

me v

ien

e u

tili

zzato

in

fu

nzio

ni

div

ers

e,

si

rife

risce i

n c

iascu

na f

un

zio

ne a

d u

n

og

gett

o d

ivers

o;

•in

qu

esto

caso

si d

ice c

he i

l n

om

e è

vis

ibil

eso

lo

nell

a r

isp

ett

iva f

un

zio

ne.

Ch

iam

ata

:

•g

li a

rgo

men

ti f

orm

ali

e l

e v

ari

ab

ili

locali

ven

go

no

all

ocati

in

mem

ori

a;

•g

li a

rgo

men

ti f

orm

ali

ven

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 l

e v

ari

ab

ili

locali

ven

go

no

u

tili

zzati

per

le d

ovu

te e

lab

ora

zio

ni;

•al

term

ine d

ell

a f

un

zio

ne, essi

ven

go

no

deall

ocati

, e

la m

em

ori

a d

a e

ssi

occu

pata

vie

ne r

esa d

isp

on

ibil

e

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 d

ell

e v

ari

ab

ili

locali

(n

asco

no

e m

uo

ion

o c

on

l'in

izio

e l

a f

ine d

ell

a

esecu

zio

ne d

ell

a f

un

zio

ne);

•il

valo

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

ell

a f

un

zio

ne n

on

vie

ne

co

nserv

ato

per

le s

uccessiv

e i

sta

nze.

225

Page 115: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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’i

sta

nza d

ell

a f

un

zio

ne;

•L

’ista

nza h

a u

n t

em

po

di vit

a p

ari

al

tem

po

di

esecu

zio

ne d

ell

a f

un

zio

ne

// Ista

nza d

i fu

nzio

ne

Valo

re d

i i

1in

t ri

s

int n

Arg

om

enti f

orm

ali

Variabili

locali

Ese

mp

io: fu

nzio

ne

in

t fa

tt(i

nt n

)p

rece

de

nte

……in

t f

int i

Ese

mp

io: fu

nzio

ne

ma

in()

pre

ce

de

nte

226

7.3

.1 Istr

uzio

ne r

etu

rn (

I)

// R

esti

tuis

ce i

l m

assim

o t

erm

ine d

ell

a 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

un

nu

mero

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")

;re

turn

0;

} Inseri

sci

un

nu

mero

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

1…

int

j

int

s

Ista

nza d

ella

funzio

ne f

ibo()

…in

t n

Ista

nza d

ella

funzio

ne m

ain

()

227

Page 116: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

ull

o

#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

hil

e (

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

ull

o"

<<

en

dl;

co

nti

nu

e;

case P

:co

ut

<<

"V

alo

re p

osit

ivo

" <

< e

nd

l;} syste

m("

PA

US

E")

;re

turn

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

ull

o

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

ull

oN

um

ero

in

tero

? ^

ZP

rem

ere

un

tasto

per

co

nti

nu

are

. . .

-10

int

n

Prim

a ista

nza f

unzio

ne s

egno()

3in

t n

Seconda ista

nza f

unzio

ne s

egno()

0in

t n

Terz

a ista

nza f

unzio

ne s

egno()

229

Page 117: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

7.4

Dic

hia

razio

ni d

i fu

nzio

ni

(I)

// C

on

tro

lla s

e i

cara

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_lo

w_d

ig(c

))//

ER

RO

RE

!{

syste

m("

PA

US

E")

;re

turn

0;

}

} bo

ol is

_lo

w_d

ig(c

har

c)

{re

turn

(c >

= '0' &

& c

<=

'9' ||

c >

= 'a' &

& c

<=

'z')

? t

rue :

fals

e;

} ER

RO

RE

SE

GN

AL

AT

O I

N F

AS

E D

I C

OM

PIL

AZ

ION

E

9:

`is_lo

w_d

ig' u

nd

ecla

red

(fi

rst

use t

his

fu

ncti

on

)

230

7.4

Dic

hia

razio

ni d

i fu

nzio

ni

(II)

// C

on

tro

lla s

e i

cara

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_d

ig(c

har

c);

//

oppure

bo

ol is

_lo

w_d

ig(c

har)

;in

t m

ain

()

{ch

ar

c;

wh

ile (

co

ut

<<

"C

ara

ttere

:? "

<<

en

dl &

& c

in >

> c

)if

(!i

s_lo

w_d

ig(c

)){

syste

m("

PA

US

E")

;re

turn

0;

}

} bo

ol is

_lo

w_d

ig(c

har

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

Page 118: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

7.6

Arg

om

en

ti e

vari

ab

ili

locali

(I)

// S

om

ma g

li in

teri

co

mp

resi

tra i

dati

in

teri

n e

d m

,//

estr

em

i in

clu

si,

co

n 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;

wh

ile (

co

ut

<<

"D

ue i

nte

ri?

" &

& c

in >

> a

>>

b)

// term

ina s

e legge u

n v

alo

re ille

gale

per

a,

bco

ut

<<

so

mm

aIn

teri

(a,

b)

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

} Du

e i

nte

ri?

1 2

3 Du

e i

nte

ri?

4 5

9 Du

e i

nte

ri?

sP

rem

ere

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

locali

(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,

int

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

tre 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

tre n

um

eri

: ";

cin

>>

x >

> y

>>

z;

do

ub

le w

= m

assim

o (

x, y,

z);

//

Si 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")

;re

turn

0;

} Inseri

sci

tre n

um

eri

: 3 4

55 In

seri

sci

tre n

um

eri

: 3.3

4.4

5.5

5 Pre

mere

un

tasto

per

co

nti

nu

are

. . .

233

Page 119: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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")

;re

turn

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")

;re

turn

0;

} ****

****

****

****

****

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

235

Page 120: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

7.9

Fu

nzio

ni

rico

rsiv

e (

I)

Fu

nzio

ne:

–p

in

vo

ca

re,

olt

re c

he

un

'alt

ra f

un

zio

ne

, a

nc

he

se

s

tes

sa

;

–in

qu

es

to c

as

o s

i h

a u

na

un

a f

un

zio

ne

ric

ors

iva

.

Fu

nzio

ne r

ico

rsiv

a:

–n

atu

rale

qu

an

do

il

pro

ble

ma

ris

ult

a f

orm

ula

to in

m

an

iera

ric

ors

iva

;

–e

se

mp

io (

fatt

ori

ale

di

un

nu

me

ro n

atu

rale

n):

fatt

ori

ale

(n)

= 1

s

e 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

fatt

ori

ale

di 3 e

': "

<<

fatt

(3)

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

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

Page 121: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

7.9

Fu

nzio

ni

rico

rsiv

e (

III)

Massim

o c

om

un

div

iso

re:

int

mcd

(in

t alf

a,

int

beta

)

{ if

(b

eta

==

0)

retu

rn a

lfa;

retu

rn m

cd

(beta

, alf

a %

beta

);

}

So

mm

a d

ei

pri

mi 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

ell

a 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 l

a 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

giI

nvert

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")

;re

turn

0;

} pip

po

.o

pp

ipP

rem

ere

un

tasto

per

co

nti

nu

are

. . .

239

Page 122: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

ric

ors

iva

di u

na

fu

nzio

ne

:

–in

div

idu

azio

ne d

i u

no

o p

iù c

asi

base,

nei q

uali

te

rmin

a l

a s

uccessio

ne d

ell

e 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

rico

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

oll

o, in

base a

l q

uale

si

sceg

lie s

e s

i tr

att

a d

i u

n c

aso

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

n

uo

vam

en

te p

assan

do

le u

n n

uo

vo

valo

re

dell

’arg

om

en

to d

i co

ntr

oll

o;

–il

ris

ult

ato

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

base,

il r

isu

ltato

vie

ne c

alc

ola

to s

en

za a

ltre

ch

iam

ate

ric

ors

ive.

Sc

he

ma

di c

alc

olo

:

–p

ara

llelo

a q

uell

o u

sato

nell

e c

om

pu

tazio

ni

itera

tive.

241

Page 123: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

7.9

Fu

nzio

ni

rico

rsiv

e (

VII

)

NO

TA

BE

NE

:

–o

gn

i fu

nzio

ne

pu

ò e

ss

ere

fo

rmu

lata

sia

in

ma

nie

ra

ric

ors

iva

ch

e i

n m

an

iera

ite

rati

va

;

–s

pe

ss

o,

la f

orm

ula

zio

ne

ite

rati

va

è p

iù c

on

ve

nie

nte

, in

te

rmin

i d

i te

mp

o d

i e

se

cu

zio

ne

e d

i o

cc

up

azio

ne

di

me

mo

ria

.

–in

div

ers

i c

as

i è

più

ag

evo

le (

pe

r il p

rog

ram

ma

tore

) e

sp

rim

ere

un

pro

ce

dim

en

to d

i c

alc

olo

in

ma

nie

ra

ric

ors

iva

;

–q

ue

sto

pu

ò r

ifle

tte

rsi

in u

na

ma

gg

iore

co

nc

isio

ne

e

ch

iare

zza

de

l p

rog

ram

ma

, e

qu

ind

i u

na

min

ore

p

rob

ab

ilit

à d

i c

om

me

tte

re e

rro

ri.

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

ves

cia

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

ris

ch

i.N

ell

’esem

pio

seg

uen

teN

=3.

* *

*

* *

*

243

Page 124: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 li

bre

ria:

•n

ell

a f

ase d

i scri

ttu

ra d

el p

rog

ram

ma,

inclu

dere

il

fi

le d

i in

testa

zio

ne d

ell

a lib

reri

a u

san

do

la d

irett

iva

#in

clu

de;

•n

ell

a f

ase d

i co

lleg

am

en

to, sp

ecif

icare

la l

ibre

ria d

a

usare

, seco

nd

o l

e c

on

ven

zio

ni

dell

’am

bie

nte

di

svil

up

po

uti

lizzato

.

Esem

pio

:

•p

rog

ram

ma c

on

ten

uto

nel

file

mio

pro

g.c

pp

, ch

e u

sa

dell

e f

un

zio

ni d

ell

a 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 l

ibre

rie C

++

so

no

dis

po

nib

ili in

tu

tte l

e

imp

lem

en

tazio

ni e c

on

ten

go

no

gli

ste

ssi

so

tto

pro

gra

mm

i.

245

Page 125: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

3.1

1 L

ibre

ria s

tan

dard

cs

tdlib

•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_M

AX

;

•sra

nd

(n)

iniz

iali

zza la f

un

zio

ne

ran

d()

.

cc

typ

e

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

ell

o,

tab

ula

zio

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

all

a 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)

min

imo

in

tero

mag

gio

re o

u

gu

ale

a x

;

–fl

oo

r(x)

massim

o i

nte

ro m

ino

re o

u

gu

ale

a x

;

–p

ow

(x, y)

x e

levato

all

a y

;

–sq

rt(x

)ra

dic

e q

uad

rata

di x;

247

Page 126: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

8.1

Tip

i d

eri

vati

Tip

i fo

nd

am

en

tali

:

•d

a q

uesti

si

po

sso

no

deri

vare

alt

ri t

ipi;

•d

al t

ipo

in

tsi d

eri

va i

l ti

po

pu

nta

tore

a i

nt.

–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

deri

va i

l ti

po

arr

ay d

i 4 i

nt:

–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

po

sso

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

me

nto

:

–id

en

tifi

ca

tore

ch

e in

div

idu

a u

n o

gg

ett

o;

–ri

feri

me

nto

de

fau

lt:

il n

om

e d

i u

n o

gg

ett

o,

qu

an

do

qu

es

to è

un

id

en

tifi

ca

tore

.

–o

ltre

a q

ue

llo

de

fau

lt, s

i p

os

so

no

de

fin

ire

alt

ri

rife

rim

en

ti d

i u

n o

gg

ett

o (

sin

on

imi o

alia

s).

Tip

o r

ife

rim

en

to:

–p

os

sib

ili id

en

tifi

ca

tori

di o

gg

ett

i d

i u

n d

ato

tip

o

(il ti

po

de

ll’o

gg

ett

o d

ete

rmin

a il ti

po

de

l ri

feri

me

nto

).

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:

ba

sic

-re

fere

nc

e-d

efi

nit

ion

refe

ren

ce

-ty

pe

-in

dic

ato

r i

de

nti

fie

r

refe

ren

ce

-in

itia

lize

r|o

pt

refe

ren

ce

-ty

pe

-in

dic

ato

r

typ

e-i

nd

ica

tor

&

refe

ren

ce

-in

itia

lize

r

=o

bje

ct-

na

me

–in

dic

ato

re d

i ti

po

:

•sp

ecific

a tip

o d

ell’

og

ge

tto

rife

rito

;N

on

si

po

sso

no

defi

nir

eri

feri

men

ti d

iri

feri

men

ti.

249

Page 127: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;//

un r

iferim

ento

ed u

n inte

ro

syste

m("

PA

US

E")

;re

turn

0;

} 10

10

10

11

11

11

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

1 0 10

11

2

11

6

12

0i, 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

;//

OK

co

ut

<<

t <

< e

nd

l;//

10

//in

t &

tt =

k;

ER

RO

RE

!syste

m("

PA

US

E")

;re

turn

0;

} 1 10

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

10

10 1

11

2

11

6

12

0i, r

jk, t

251

Page 128: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

du

e in

teri

: "

<<

en

dl;

cin

>>

i >

> j;

// E

sem

pio

: 2

3scam

bia

(i,

j);

co

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;//

Esem

pio

: 2

3syste

m("

PA

US

E")

;re

turn

0;

}

3 2 3 2

96

10

0

11

6

12

0ijab

2 3 3 2

96

10

0

11

6

12

0ijab

Ista

nza

(sca

mb

ia)

Ista

nza

(sca

mb

ia)

Ista

nza

(m

ain

)Is

tan

za

(m

ain

) 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

isponde a

un

conte

nitore

senza

nom

e,

che h

a p

er

valo

re il

rife

rim

ento

;

•nel corp

o d

ella

funzi

one,

ogni opera

zione c

he

coin

volg

e l’a

rgom

ento

form

ale

agis

ce

sull’

entità

riferita

.

Ch

iam

ata

dell

a f

un

zio

ne:

–il

rif

eri

men

to a

rgo

men

to f

orm

ale

vie

ne

iniz

iali

zzato

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

p

essere

mo

dif

icata

.

In s

inte

si:

–la

fu

nzio

ne a

gis

ce s

ull

e e

nti

tà r

iferi

te d

ag

li

arg

om

en

ti a

ttu

ali

.

253

Page 129: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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,

int

&b

) {

// s

cam

bia

i v

alo

ri d

egli

oggett

i rife

riti

int

c =

a;

a =

b;

b =

c;

} int

main

()

{in

t i,

j;

co

ut

<<

"In

seri

sci

du

e in

teri

: "

<<

en

dl;

cin

>>

i >

> j;

// E

sem

pio

: 2

3scam

bia

(i,

j);

co

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;//

Esem

pio

: 3

2syste

m("

PA

US

E")

;re

turn

0;

}

rife

r j

rife

r i

3 2

96

10

0

11

6

12

0ijab

rife

r j

rife

r i

2 3

96

10

0

11

6

12

0ijab

Ista

nza

(sca

mb

ia)

Ista

nza

(sca

mb

ia)

Ista

nza

(m

ain

)Is

tan

za

(m

ain

) 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")

;re

turn

0;

} Inte

resse :

1200

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

255

Page 130: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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,

int

&b

) {

retu

rn a

> b

? a

: b

;} in

t m

ain

()

{in

t i,

j;

co

ut

<<

"In

seri

sci

du

e in

teri

: "

<<

en

dl;

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

massim

o(i

, j)

++

;

//

l-v

alu

eco

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;//

Esem

pio

: 1 6

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

du

e 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,

int

&b

) {

int

&p

= a

> b

? a

: b

;re

turn

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,

int

b)

{re

turn

a >

b ?

a :

b;

// E

RR

OR

E.

Riferim

ento

ad u

n a

rgom

ento

att

uale

che

// v

iene d

istr

utt

o} N

OT

A B

EN

E:

l’err

ore

no

n è

seg

nala

to d

al co

mp

ilato

re.

257

Page 131: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

du

e in

teri

: "

<<

en

dl;

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")

;re

turn

0;

} Inseri

sci

du

e 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

(IV

)

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

os

so

no

es

se

re r

ife

rim

en

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

ave

re c

om

e c

orr

isp

on

de

nte

un

arg

om

en

to

att

ua

le s

en

za

ta

le a

ttri

bu

to, m

a n

on

è le

cit

o i

l c

on

tra

rio

.

Ris

ult

ato

co

n l

'att

rib

uto

co

nst:

–u

na

is

tru

zio

ne

re

turn

pu

ò c

on

ten

ere

u

n'e

sp

res

sio

ne

se

nza

ta

le a

ttri

bu

to, m

a n

on

è

lec

ito

il

co

ntr

ari

o.

Op

era

tore

co

nst_

cast:

–c

on

ve

rte

un

rif

eri

me

nto

co

ns

tin

un

rif

eri

me

nto

n

on

co

ns

t.

259

Page 132: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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//

int&

massim

oE

rrato

(const

int&

a, const

int&

b)

//{

// re

turn

a >

b ?

a :

b;

//}

int

main

()

{in

t i,

j;

co

ut

<<

"In

seri

sci

du

e in

teri

: "

<<

en

dl;

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")

;re

turn

0;

} Inseri

sci

du

e 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

(VI)

Esem

pio

:

–il r

isu

lta

to d

ella

fu

nzio

ne

è d

i ti

po

in

t&;

–n

ella

is

tru

zio

ne

re

turn

co

mp

are

un

rif

eri

me

nto

c

on

st;

–s

i re

nd

e o

pp

ort

un

a u

na

co

nve

rsio

ne

es

plic

ita

di

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

Page 133: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

’og

gett

o o

dell

a f

un

zio

ne

dete

rmin

a i

l 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,

*p5;

// 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")

;re

turn

0;

}

262

8.3

Pu

nta

tori

(II

)

12

89

03

78

9

12

0

1

10

0

10

4

10

8

11

2

11

6

12

0

#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;

…}

ip1

p2

Ind

iriz

zo

ca

su

ale 263

Page 134: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

ggett

o

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.

ad u

n int.

int

*p3;

*p3 =

2;

// A

TT

EN

ZIO

NE

: punta

tore

non iniz

.

syste

m("

PA

US

E")

;re

turn

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

du

e c

ara

tteri

" <

< e

nd

l;cin

>>

a >

> b

;//

Esem

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;//

Esem

pio

: 'b

''b

'

co

ut

<<

"In

seri

sci

du

e c

ara

tteri

" <

< e

nd

l;cin

>>

a >

> b

;//

Esem

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;//

Esem

pio

: 'f'

'f'

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

du

e c

ara

tteri

ab

b

bb

bIn

seri

sci

du

e c

ara

tteri

cf

c

f

f

fP

rem

ere

un

tasto

per

co

nti

nu

are

. . .

265

Page 135: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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;

//

OK

// N

.B.:

i n

on e

` costa

nte

int

j;j =

*p

;//

OK

//*p

= 1

;//

ER

RO

RE

! Il v

alo

re d

i inon p

uo’

// e

ssere

modific

ato

att

ravers

o p

co

nst

int

k =

10;

co

nst

int

*q =

&k;

// O

K

int

*qq

;//

qq

= &

k;

// E

RR

OR

E!

int*

= c

onst

int*

//q

q =

q;

// E

RR

OR

E!

int*

= c

onst

int*

syste

m("

PA

US

E")

;re

turn

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,

*co

nst

p2 =

&d

;p

1 =

p;

co

ut

<<

*p

1 <

< e

nd

l;//

'b'

//

p =

p1;

// E

RR

OR

E//

p =

p2;

//

ER

RO

RE

!

syste

m("

PA

US

E")

;re

turn

0;

} a b b Pre

mere

un

tasto

per

co

nti

nu

are

. . .

267

Page 136: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 =

10;

int

*pi =

&i,

*p

j =

&j;

int

**q

1 =

&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

ggett

o p

unta

to

syste

m("

PA

US

E")

;re

turn

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

ull

i

#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 I

N E

SE

CU

ZIO

NE

!

if (

p =

= N

UL

L)

co

ut

<<

"P

un

tato

re n

ull

o "

<<

en

dl;

if (

p =

= 0

)co

ut

<<

"P

un

tato

re n

ull

o "

<<

en

dl;

if (

!p) co

ut

<<

"P

un

tato

re n

ull

o "

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

}

269

Page 137: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

8.3

Op

era

zio

ni

su

i p

un

tato

ri (

I)

Op

era

zio

ni p

os

sib

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

'og

gett

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

pu

nta

tore

ossia

l’i

nd

iriz

zo

d

ell

’og

gett

o p

un

tato

.

Un

pu

nta

tore

pu

ò c

os

titu

ire

un

arg

om

en

to d

i u

na

fu

nzio

ne

:

•n

el co

rpo

dell

a f

un

zio

ne, p

er

mezzo

di in

dir

ezio

ni,

si

po

sso

no

mo

dif

icare

gli

og

gett

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

du

e in

teri

: "

<<

en

dl;

cin

>>

i >

> j;

// E

sem

pio

: 2

3scam

bia

(i,

j);

co

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;//

Esem

pio

: 2

3syste

m("

PA

US

E")

;re

turn

0;

}

3 2 3 2

96

10

0

11

6

12

0ijab

2 3 3 2

96

10

0

11

6

12

0ijab

Ista

nza

(sca

mb

ia)

Ista

nza

(sca

mb

ia)

Ista

nza

(m

ain

)Is

tan

za

(m

ain

) 271

Page 138: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

oggett

i punta

tiin

t c =

*a;

*a =

*b

;*b

= c

;} in

t m

ain

()

{in

t i,

j;

co

ut

<<

"In

seri

sci

du

e in

teri

: "

<<

en

dl;

cin

>>

i >

> j;

// E

sem

pio

: 2

3scam

bia

(&

i, &

j);

co

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;//

Esem

pio

: 3

2syste

m("

PA

US

E")

;re

turn

0;

}

11

6

12

0

3 2

96

10

0

11

6

12

0ijab

11

6

12

0

2 3

96

10

0

11

6

12

0ijab

Ista

nza

(sca

mb

ia)

Ista

nza

(sca

mb

ia)

Ista

nza

(m

ain

)Is

tan

za

(m

ain

) 272

8.3

.4P

un

tato

ri c

om

e a

rgo

men

ti (

III)

// In

cre

men

ta 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;

vo

id i

ncre

men

ta(i

nt

*a,

int

*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

du

e in

teri

: "

<<

en

dl;

cin

>>

i >

> j;

// E

sem

pio

: 2 3

incre

men

ta(&

i, &

j);

co

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;//

Esem

pio

: 2 4

syste

m("

PA

US

E")

;re

turn

0;

}

11

6

12

0

3 2

96

10

0

11

6

12

0ijab

11

6

12

0

4 2

96

10

0

11

6

12

0ijab

Ista

nza

(in

cre

me

nta

)Is

tan

za

(in

cre

me

nta

)

Ista

nza

(m

ain

)Is

tan

za

(m

ain

)

273

Page 139: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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,

int

*b)

{re

turn

*a >

*b

? a

: b

;} in

t m

ain

()

{in

t i,

j;

co

ut

<<

"In

seri

sci

du

e in

teri

: "

<<

en

dl;

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;//

Esem

pio

: 2 5

//m

assim

o(&

i, &

j)+

+;

//

ER

RO

RE

: 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;//

Esem

pio

: 2 6

syste

m("

PA

US

E")

;re

turn

0;

} Inseri

sci

du

e 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,

int

*b)

{in

t *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,

int

*b)

{in

t 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

Page 140: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

8.3

.4P

un

tato

ri c

om

e a

rgo

men

ti c

osta

nti

(I)

// T

rasm

issio

ne d

ei

para

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,

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;

// E

RR

OR

E:

invalid

convers

ion f

rom

'const in

t*' t

o 'i

nt*

'

syste

m("

PA

US

E")

;re

turn

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

int

*a,

const

int

*b)

{re

turn

*a >

*b ?

a :

b;

// E

RR

OR

E:

invalid

convers

ion f

rom

'const in

t*' t

o 'i

nt*

'} */ 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;

syste

m("

PA

US

E")

;re

turn

0;

}

277

Page 141: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;

E

RR

OR

E

syste

m("

PA

US

E")

;re

turn

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

ime

ns

ion

e n

:•

n-u

pla

ord

inata

di ele

men

ti d

ell

o s

tesso

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 l

a

loro

po

siz

ion

e a

ll'in

tern

o d

ell

’arr

ay.

Tip

o d

ell

’arr

ay:

•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 vett

ore

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

];

//

opera

tore

di sele

zio

ne c

on indic

ein

t s =

v[0

];//

restitu

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")

;re

turn

0;

} Inseri

sci

5 n

um

eri

in

teri

1 2

3 4

515

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

279

Page 142: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.1

Tip

i e o

gg

ett

i arr

ay (

II)

0 1 2 3 4

10

4

10

8

11

2

11

6

12

0v[4

]

v[3

]

v[1

]

v[0

]

v[2

]

AT

TE

NZ

ION

E: l’i

de

ntifica

tore

de

ll’a

rra

y id

en

tifica

l’i

nd

iriz

zo

de

l p

rim

o e

lem

en

to d

ell’

arr

ay

v =

&v[0

]

Ne

ll’e

se

mp

io, v =

10

4;

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 /

siz

eo

f(in

t) <

< '\t

';//

4co

ut

<<

siz

eo

f b

/ s

izeo

f(in

t) <

< e

nd

l;//

6

// E

RR

OR

E!

NO

N S

EG

NA

LA

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")

;re

turn

0;

} Dim

en

sio

ni arr

ay:

16

24

Nu

mero

di ele

men

ti:

4

60

1

2

3

3

7879712

2009179755

0

1

2

3

0

0

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

281

Page 143: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.1

Tip

i e o

gg

ett

i arr

ay (

IV)

// A

TT

EN

ZIO

NE

: il

DE

V-C

++

NO

N S

EG

UE

LO

ST

AN

DA

RD

// P

er

imp

orr

e i

l ri

sp

ett

o d

ell

o s

tan

dard

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

men

u’

// S

tru

men

ti, la

vo

ce "

Op

zio

ni d

i C

om

pil

azio

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")

;re

turn

0;

} Il c

om

pil

ato

re u

sato

sen

za l

’op

zio

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

arr

ay.

NO

N S

ON

O P

ER

ME

SS

E

// O

PE

RA

ZIO

NI

AR

ITM

ET

ICH

E,

DI

CO

NF

RO

NT

O, 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 I

nd

. u

: "

<<

u <

< e

nd

l;

if (

v =

= u

) //

Att

enzio

ne c

onfr

onta

gli

indiriz

zi

co

ut

<<

"A

rra

y u

gu

ali

" <

< e

nd

l;els

e co

ut

<<

"A

rra

y d

ivers

i "

<<

en

dl;

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")

;re

turn

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

Page 144: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

// A

ritm

eti

ca d

ei p

un

tato

ri

Perm

ett

e d

i calc

ola

re i

nd

iriz

zi co

n la r

eg

ola

seg

uen

te:

•se

l'esp

ressio

ne

pra

pp

rese

nta

un

valo

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

esi

tro

va

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

esi

tro

va

inm

em

ori

a,

do

po

ip

osiz

ion

i.

No

ta:

•S

el'esp

ressio

ne

ph

aco

me

valo

rea

dd

re

se

To

ccu

pa

nlo

cazio

ni

di

mem

ori

a,

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

ell

oste

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

;fo

r (i

nt

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 a

ritm

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(e

lem

enti)

co

ut

<<

in

t(p

2)

-in

t(p

1)

<<

en

dl;

// 4

(byte

)syste

m("

PA

US

E")

;re

turn

0;

}

285

Page 145: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;fo

r (i

nt

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")

;re

turn

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

gli

ele

men

ti d

ell

a m

atr

ice"

<<

en

dl;

for

(in

t 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")

;re

turn

0;

} Inseri

sci

gli

ele

men

ti d

ell

a 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

10

4

10

8

11

2

11

6

12

0

m[0

][0

]

m[0

][1

]

m[0

][2

]

m[1

][0

]

m[1

][1

]

m[1

][2

]6

12

4

287

Page 146: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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};

//

anche:

int

m1[]

[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}}

;//

anche:

int

m2[]

[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")

;re

turn

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

])//

La d

imensio

ne n

on h

a s

ignific

ato

{//

anche:

(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;//

46

syste

m("

PA

US

E")

;re

turn

0;

}11

2

… 10

11

12

10

4

10

8

11

2

11

6

12

0

v =

&ve

tt[0

]

ve

tt[0

]

ve

tt[1

]

ve

tt[2

]

ve

tt[3

]1

31

24

289

Page 147: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

)//

(E

RR

AT

O)

#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);

//

1fo

r (i

nt

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")

;re

turn

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

(ii

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[]

, in

t n

)//

Dim

ensio

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")

;re

turn

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

Page 148: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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")

;re

turn

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

)//

gli

ele

menti d

ell’

arr

ay

{//

non 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")

;re

turn

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

Page 149: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

)//

OK

!!!

{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

)//

ER

RO

RE

{fo

r (i

nt

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")

;re

turn

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")

;re

turn

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

Page 150: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 l

e d

imen

sio

ni tr

an

ne l

a p

rim

a.

// S

e M

e’ il

nu

mero

dell

e d

imen

sio

ni,

l’a

rgo

men

to

// f

orm

ale

e’

un

pu

nta

tore

ad

arr

ay 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

iali

zza(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;} //

vo

id r

iem

piE

rrata

(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

iali

zza(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")

;re

turn

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

Page 151: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

iali

zza(i

nt*

m,

int

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,

int

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);

ER

RO

RE

passin

g 'in

t (*

)[3]'

as

//

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

iali

zza((

int*

) m

at2

, 2,

6);

sta

mp

a(&

mat2

[0][

0],

2,

6);

syste

m("

PA

US

E")

;re

turn

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 i

l 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 i

l 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;//

4co

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

++

";E

RR

OR

E!

Assegnam

ento

tra

arr

ay

syste

m("

PA

US

E")

;re

turn

0;

} 4

3

3

4

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

299

Page 152: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

dall

o s

tream

di in

gre

sso

(salt

an

do

even

tuali

cara

tteri

bia

nch

i d

i te

sta

) e l

i m

em

ori

zza i

n

seq

uen

za,

fin

o a

ch

e i

nco

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 i

l te

rmin

e d

ell

’op

era

zio

ne e

la m

em

ori

zzazio

ne n

ell

a

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

dell

a s

trin

ga (

esclu

so

il cara

ttere

n

ull

o f

inale

) 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];

//

al 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;//

Esem

pio

: In

form

atica

syste

m("

PA

US

E")

;re

turn

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;//

punta

tori a

cara

tteri inte

rpre

tati c

om

e s

trin

ghe

s4 =

s3;

co

ut

<<

s3 <

< e

nd

l;//

Pis

aco

ut

<<

s4 <

< e

nd

l;//

Pis

a

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;//

Per

sta

mpare

il punta

tore

syste

m("

PA

US

E")

;re

turn

0;

} Un

ivers

ita' d

i P

isa T

oscan

aP

isa

Pis

a0x40121d

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

301

Page 153: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.3

Str

ing

he (

IV)

// C

on

ta l

e o

cco

rren

ze d

i cia

scu

na l

ett

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

un

a 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 i

f (s

tr[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")

;re

turn

0;

} Inseri

sci

un

a 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: 0

u:

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

nic

on

ten

ute

ne

lfi

le<

cs

trin

g>

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

nu

llocom

pare

solo

alla

fin

ed

ella

str

ing

a

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

de

vo

no

essere

dell

e

str

ing

he.

303

Page 154: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

ng

hezza

di

str

ing;

ilvalo

rere

stitu

ito

è

infe

riore

di

1al

num

ero

di

cara

tteri

eff

ett

ivi,

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

ren

egativo

se

s1

è

alfabeticam

ente

min

ore

dis2;

–un

valo

renullo

se

ledue

str

inghe

sono

uguali,

–un

valo

rep

ositiv

ose

s1

èalfab

eticam

ente

maggio

red

is2;

(la

fun

zio

ne

dis

tin

gue

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[]

="I

nfo

rmati

ca\n

";

ch

ar

s4[N

]=

"Co

rso

";

co

ut

<<

"Dim

en

sio

ne

deg

liarr

ay

s1

es4

"<

<en

dl;

co

ut

<<

siz

eo

fs1

<<

""

<<

siz

eo

fs4

<<

en

dl;

co

ut

<<

"Dim

en

sio

ne

dell

estr

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

<<

"Str

ing

he

ug

uali

"<

<en

dl;

els

eco

ut

<<

"Str

ing

he

div

ers

e"

<<

en

dl;

if(!

str

cm

p(s

1,s

2))

co

ut

<<

"Str

ing

he

ug

uali

"<

<en

dl;

els

eco

ut

<<

"Str

ing

he

div

ers

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

Page 155: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.6

Fu

nzio

ni

di

lib

reri

a s

ull

e s

trin

gh

e (

IV)

co

ut

<<

"Co

ncate

nazio

ne

dis1,

s2

es3

"<

<en

dl;

co

ut

<<

s5

<<

en

dl;

ch

ar

*s=

str

ch

r(s5,'I');

co

ut

<<

"Str

ing

ad

all

ap

rim

ais

tan

za

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

dell

estr

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

all

ap

rim

ais

tan

za

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

ina

me

nto

pe

r s

ele

zio

ne

(s

ele

cti

on

-so

rt)

•S

i cerc

a l

’ele

men

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

Page 156: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.7

Ord

inam

en

to d

ei

vett

ori

(sele

cti

on

-so

rt)

Ord

ina

me

nto

pe

r s

ele

zio

ne

(s

ele

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

ina

me

nto

pe

r s

ele

zio

ne

(s

ele

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")

;re

turn

0;

} [2 2

8 2

3 2

6]

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

•C

om

ple

ssit

à d

ell

’alg

ori

tmo

dell

’ord

ine d

i n

2, d

ove n

è

il n

um

ero

di ele

men

ti n

el vett

ore

.

309

Page 157: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.7

Ord

inam

en

to d

ei

vett

ori

(b

ub

ble

-so

rt)

Ord

ina

me

nto

bu

bb

le-s

ort

•S

i sco

rre l

’arr

ay n

-1 v

olt

e,

do

ve n

è i

l n

um

ero

di

ele

men

ti n

ell

’arr

ay,

da 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

’ord

ine

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

pri

mi 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

ina

me

nto

bu

bb

le-s

ort

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

’alg

ori

tmo

dell

’ord

ine 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

pri

mi tr

e e

lem

en

ti r

isu

ltan

o o

rdin

ati

N.B

.: i

pri

mi q

uatt

ro e

lem

en

ti r

isu

ltan

o o

rdin

ati

311

Page 158: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.7

Ord

inam

en

to d

ei

vett

ori

(b

ub

ble

-so

rt)

Ord

ina

me

nto

bu

bb

le-s

ort

ott

imiz

za

to

Su

pp

on

iam

o c

he i

l vett

ore

sia

•Il

vett

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

ina

me

nto

bu

bb

le-s

ort

ott

imiz

za

to

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")

;re

turn

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

ell

e q

uatt

rod

ell

’alg

ori

tmo

no

n o

ttim

izzato 313

Page 159: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.7

Ric

erc

a lin

eare

(I)

Pro

ble

ma

•cerc

are

un

ele

men

to i

n u

n a

rray t

ra l

’ele

men

to in

p

osiz

ion

e in

fe e

qu

ell

o in

po

siz

ion

e s

up

e.

Po

ss

ibil

e s

olu

zio

ne

•S

co

rrere

il vett

ore

in

seq

uen

za a

part

ire d

all

’ele

men

to

in p

osiz

ion

e in

fe f

ino

all

’ele

men

to c

erc

ato

op

pu

re

all

’ele

men

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")

;re

turn

0;

} Po

siz

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

’ele

men

to 5

è n

ecessari

o e

sam

inare

5 e

lem

en

ti.

315

Page 160: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.7

Ric

erc

a b

inari

a(I

)

PR

ER

EQ

UIS

ITO

: V

ett

ori

ord

ina

ti!!

!!

Ric

erc

a b

inari

a (

vett

ori

ord

inati

in

ord

ine c

rescen

te)

Idea:

•S

i co

nfr

on

ta l

’ele

men

to c

erc

ato

co

n l’e

lem

en

to i

n

po

siz

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

’ele

men

to c

erc

ato

è m

ino

re d

ell

’ele

men

to in

p

osiz

ion

e c

en

trale

la r

icerc

a p

roseg

ue n

ell

a p

rim

a

metà

del vett

ore

; alt

rim

en

ti p

roseg

ue n

ell

a

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

hil

e (

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;

//

ric

erc

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

’ele

men

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 i

n u

n v

ett

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

hil

e (

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;

//

ric

erc

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")

;//

2re

turn

0;

}

317

Page 161: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

9.7

Esem

pio

(I)

Esem

pio

: o

rdin

am

en

to e

ric

erc

a i

n u

n v

ett

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

hil

e (

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

Page 162: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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")

;re

turn

0;

} ? mu

cca

? an

atr

a? zeb

ra? cavall

o[m

ucca a

natr

a z

eb

ra c

avall

o]

[an

atr

a c

avall

o m

ucca z

eb

ra]

Ric

erc

a ?

cavall

oT

rovato

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,

dett

i m

em

bri

(o

cam

pi)

, cia

scu

no

dei q

uali

ha 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

oll

ezio

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

dati

);

•fo

rma s

inta

ttic

am

en

te e

qu

ivale

nte

all

a d

efi

niz

ion

e d

i o

gg

ett

i n

on

co

sta

nti

e n

on

in

izia

lizzati

.

Es

em

pio

:

str

uct

pers

on

a{

ch

ar

no

me[2

0];

ch

ar

co

gn

om

e[2

0];

int

g_n

ascit

a,

m_n

ascit

a,

a_n

ascit

a;

};

321

Page 163: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

).x

co

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")

;re

turn

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

;//

ER

RO

RE

!}; //

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

////

Str

utt

ura

co

nte

nen

te u

n r

iferi

men

to a

se s

tessa

str

uct

pu

nto

{/*

...

*/

pu

nto

* p

;//

OK

}; //~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~~

~//

// S

tru

ttu

re c

on

rif

eri

men

ti i

ntr

eccia

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

Page 164: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

10.1

Str

utt

ure

(IV

)

// A

rra

y 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

eff

ett

ivo 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

po

lig

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")

;re

turn

0;

} Sta

mp

a d

el

po

lig

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

<<

", "

<<

r1.y

<<

">

\n";

// <

3, 10>

co

ut

<<

"r2

= <

" <

< r

2.x

<<

", "

<<

r2.y

<<

">

\n";

// <

3, 10>

//if

(r2

!=

r1)

ER

RO

RE

syste

m("

PA

US

E")

;re

turn

0;

} r1 =

<3,

10>

r2 =

<3,

10>

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

N.B

.: N

on

so

no

de

fin

ite

op

era

zio

ni d

i c

on

fro

nto

s

ulle

str

utt

ure

.

325

Page 165: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 i

ns[i

nd

ex];

}

12

4

p.y

10

.01

28

p.x

3.5

12

0

13

2

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)

;//

4co

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")

;re

turn

0;

} Dim

en

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

Page 166: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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")

;re

turn

0;

} Sta

mp

a 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

>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;

} 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")

;re

turn

0;

} Sta

mp

a 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

Page 167: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

10.2

Un

ion

i (I

)

So

no

dic

hia

rate

e u

sate

co

n la s

tessa s

inta

ssi

dell

e

str

utt

ure

:•

si

uti

lizza 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 i

n t

em

pi

div

ers

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

dell

a 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

{ i

nt

i; d

ou

ble

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 i

nu

tili

zzati

) o

ad

un

valo

re

reale

.

Op

era

zio

ni:

–q

uell

e v

iste

per

le s

tru

ttu

re.

Valo

ri in

izia

li d

ell

e 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 4

co

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};

E

RR

AT

O

u.i

= 0

xF

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 6

5402

Str

s =

{'a

', 0

xF

F7A

};

co

ut

<<

s.c

<<

'\t

' <

< s

.i <

< e

nd

l;//

a 6

5402

syste

m("

PA

US

E")

;re

turn

0;

} 1

4

4

8

z

6

5402

a

6

5402

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

331

Page 168: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 l

a s

eg

uen

te r

eg

ola

di accesso

: l’

ult

imo

dato

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

pil

a è

vu

ota

. S

e t

op

==

DIM

-1,

do

ve

DIM

è i

l n

um

ero

massim

o d

i ele

men

ti n

ell

a 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

pil

a

{in

t to

p;

T s

tack[D

IM];

}; //in

izia

lizzazio

ne d

ella

pila

vo

id i

nip

(pil

a&

pp

){

pp

.to

p=

-1;

}

top

0D

IM-

1

332

10.3

.1 P

ila (

II)

bo

ol em

pty

(co

nst

pil

a&

pp

)//

pila

vuota

?{

if (

pp

.to

p=

=-1

) re

turn

tru

e;

retu

rn f

als

e;

} bo

ol fu

ll(c

on

st

pil

a&

pp

)//

pila

pie

na?

{ if

(p

p.t

op

==

DIM

-1)

retu

rn t

rue;

retu

rn f

als

e;

} bo

ol p

ush

(pil

a&

pp

, T

s)

// inserisce u

n e

lem

ento

in p

ila{

if (

full

(pp

)) r

etu

rn f

als

e;

pp

.sta

ck[+

+(p

p.t

op

)] =

s;

retu

rn t

rue;

} bo

ol p

op

(pil

a&

pp

, T

& s

)//

estr

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

pil

a&

pp

) //

sta

mpa g

li ele

menti

{co

ut

<<

"E

lem

en

ti c

on

ten

uti

nell

a p

ila:

" <

< e

nd

l;fo

r (i

nt

i =

pp

.to

p;

i >

= 0

; i-

-)co

ut

<<

'['

<<

i <

< "

] "

<<

pp

.sta

ck[i

] <

< e

nd

l;}

333

Page 169: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

10.3

.1 P

ila (

III)

int

main

(){

pil

a s

t;in

ip(s

t);

T n

um

;if

(em

pty

(st)

) co

ut

<<

"P

ila v

uo

ta"

<<

en

dl;

for

(in

t 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 <

< "

fall

ito

" <

< e

nd

l;if

(fu

ll(s

t))

co

ut

<<

"P

ila p

ien

a"

<<

en

dl;

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 <

<".

Valo

re d

i to

p:

" <

< s

t.to

p <

< e

nd

l;els

e c

err

<<

"E

str

azio

ne f

all

ita"

<<

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 <

< "

fall

ito

" <

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

<".

Valo

re d

i to

p:

" <

< s

t.to

p <

< e

nd

l;els

e c

err

<<

"E

str

azio

ne f

all

ita"

<<

en

dl;

sta

mp

a(s

t);

syste

m("

PA

US

E")

;re

turn

0;

}

334

10.3

.1 P

ila (

IV)

Pil

a 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

nell

a 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

all

ito

Inseri

men

to d

i 4 f

all

ito

Ele

men

ti c

on

ten

uti

nell

a 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

nell

a p

ila:

[2]

0[1

] 4

[0]

5P

rem

ere

un

tasto

per

co

nti

nu

are

. . .

335

Page 170: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 l

a s

eg

uen

te r

eg

ola

di accesso

: il

p

rim

o d

ato

in

seri

to è

il p

rim

o a

d e

ssere

estr

att

o

(FIF

O:

Fir

st

In F

irst

Ou

t).

•R

eali

zzata

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’e

str

azio

ne

;

–b

ac

k –

po

siz

ion

e i

n c

ui

avvie

ne

l’i

ns

eri

me

nto

.

•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

ma

ss

imo

DIM

-1

ele

me

nti

ba

ck

fro

nt

fro

nt

ba

ck

fro

nt

ba

ck

fro

nt

Ins

eri

me

nto

di

un

ele

me

nto

Ins

eri

me

nto

di

un

ele

me

nto

Ins

eri

me

nto

di

un

ele

me

nto

No

ns

are

bb

ep

os

sib

ile

dis

cri

min

are

tra

co

da

vu

ota

ec

od

ap

ien

a

ba

ck

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

Page 171: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

%D

IM !

= c

c.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"

<<

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 "

<<

(q

u.b

ack +

DIM

-1)%

DIM

<<

en

dl;

els

e c

err

<<

"C

od

a p

ien

a"

<<

en

dl;

if (

full

(qu

)) c

ou

t <

< "

Co

da p

ien

a"

<<

en

dl;

sta

mp

a(q

u);

for

(in

t i

= 0

; i <

DIM

-2;

i++

)if

(esq

ueu

e(q

u,n

um

))co

ut

<<

"Estr

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

'ele

men

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

<<

"Estr

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")

;re

turn

0;

}

339

Page 172: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

'ele

men

to 0

in

po

siz

ion

e 0

Estr

att

o l

'ele

men

to 1

in

po

siz

ion

e 1

Estr

att

o l

'ele

men

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

'ele

men

to 3

in

po

siz

ion

e 3

Estr

att

o l

'ele

men

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

all

a n

-up

la o

rdin

ata

dei

tip

i 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 l

e f

un

zio

ni co

rris

po

nd

en

ti (

no

n v

alg

on

o l

e

co

nvers

ion

i im

pli

cit

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 f

unzio

ne int(

int)

{ r

etu

rn n

*n;

}

int

cu

bo

(in

t n

)//

Ista

nza d

i tipo f

unzio

ne int(

int)

{ r

etu

rn n

*n*n

; }

do

ub

le m

ed

ia(i

nt

fp(i

nt)

, in

t a,

int

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")

;re

turn

0;

} 2.5

4.5

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

341

Page 173: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 i

nd

iriz

zi d

i fu

nzio

ne.

Defi

niz

ion

e d

i u

n p

un

tato

re a

fu

nzio

ne:

result-t

ype

( *

identifier

)(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,

int

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"

<<

en

dl;

}

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

Page 174: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

11.3

Arg

om

en

ti d

efa

ult

(I)

Arg

om

en

ti f

orm

ali

di 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

ell

e

ch

iam

ate

dell

a f

un

zio

ne in

cu

i g

li a

rgo

men

ti a

ttu

ali

so

no

om

essi)

;

–se i

l 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

ult

imi;

–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

dell

a f

un

zio

ne.

Ch

iam

ata

di fu

nzio

ne:

–p

osso

no

essere

om

essi

tutt

i o

so

lo a

lcu

ni

arg

om

en

ti d

efa

ult

: in

og

ni caso

gli

arg

om

en

ti

om

essi

devo

no

essere

gli

ult

imi.

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,

do

ub

le

den

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);

//

equiv

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

* l

un

gh

Lato

;} 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()

;//

OK

co

ut

<<

p <

< e

nd

l;} in

t m

ain

()

{f(

);g

();

syste

m("

PA

US

E")

;re

turn

0;

} 3 Pre

mere

un

tasto

per

co

nti

nu

are

. . .

345

Page 175: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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,

int

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"

<<

en

dl;

retu

rn a

> b

? a

: b

;} /*

in

t m

assim

o(d

ou

ble

a,

do

ub

le b

)

ER

RO

RE

!{

retu

rn i

nt(

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")

;re

turn

0;

} Massim

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

rra

y c

on

st

";in

t m

= v

[0];

for

(in

t 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

rra

y n

on

co

nst

";in

t m

= v

[0];

for

(in

t 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")

;re

turn

0;

} Arr

ay c

on

st

100

Arr

ay n

on

co

nst

100

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

347

Page 176: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

12.4

Dic

hia

razio

ni ty

ped

ef

(I)

Pa

rola

ch

iave

ty

pe

de

f:•

defi

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

ell

e d

ich

iara

zio

ni.

Le

dic

hia

razio

ni ty

pe

de

f n

on

cre

an

o n

uo

vi

tip

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;

typ

ed

ef

int*

in

tP;

intP

p =

&i;

co

ut

<<

*p

<<

en

dl;

// 1

typ

ed

ef

int

vett

[5];

//

vett

ore

di 5 inte

rivett

v =

{1,

10,

100,

10,

1};

co

ut

<<

"v =

["

<<

v[0

];fo

r (i

nt

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

; //

OK

, ty

pedef

non intr

oduce u

n n

uovo t

ipo

co

ut

<<

a <

< '\t

' <

< b

<<

en

dl;

// 4

4

syste

m("

PA

US

E")

;re

turn

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

rec

ed

en

ti:

–il

pro

gra

mm

ato

resp

ecif

ica

,u

tilizzan

do

defi

niz

ion

i,n

um

ero

eti

po

dell

evari

ab

ili

uti

lizzate

.

•Sit

ua

zio

nic

om

un

i:–

ilp

rog

ram

mato

ren

on

èin

gra

do

di

sta

bilir

ea

pri

ori

iln

um

ero

di

vari

ab

ili

di

un

cert

oti

po

ch

eserv

iran

no

du

ran

tel'esecu

zio

ne

delp

rog

ram

ma.

–P

er

va

riab

ili

di

tip

oarr

ay,

per

es

em

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

aver

sco

pert

od

ura

nte

l’esecu

zio

ne

del

pro

gra

mm

a,

qu

an

tod

eve

essere

gra

nd

e.

–P

er

ese

mp

io,

so

mm

ad

iN

nu

meri

inseri

tid

ata

sti

era

,co

nN

lett

od

ata

sti

era

.

•Me

cca

nis

mo

de

lla

me

mo

ria

lib

era

(om

em

ori

ad

ina

mic

a):

–ri

su

lta

po

ssib

ile

allo

care

dell

eare

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

all

ocati

nell

am

em

ori

ali

bera

.

349

Page 177: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

•A

llo

ca

zio

ne

dio

gg

ett

id

ina

mic

i:–

op

era

tore

pre

fisso

new

:

»h

aco

me

arg

om

en

toil

tip

od

ell’o

gg

ett

od

aall

ocare

;

»re

sti

tuis

ce

l’in

dir

izzo

dell

am

em

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

>u

sin

gn

am

esp

ace

std

;

int

main

(){

int*

q;

q=

new

int;

*q=

10;

co

ut

<<

*q<

<en

dl;

//10

int

*p

;in

tn

;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")

;re

turn

0;

}

13.1

Mem

ori

a d

inam

ica (

II)

350

•B

uo

ne

sit

od

ell’o

pe

rato

ren

ew

:–

pu

òessere

co

ntr

oll

ato

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'all

ocazio

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

<<

"Mem

ori

ali

bera

no

nd

isp

on

ibil

e"

<<

en

dl;

exit

(1);

} int

main

()

{

int

n;

set_

new

_h

an

dle

r(m

yh

an

dle

r);

co

ut

<<

"In

seri

sci

lad

imen

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

Page 178: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

•O

gg

ett

ia

llo

ca

tin

ella

me

mo

ria

lib

era

:–

esis

ton

ofi

nch

én

on

ven

go

no

dis

tru

tti

dall

’op

era

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

pli

cato

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

osi

co

mm

ett

eu

nerr

ore

).

•S

el’o

pe

rato

red

ele

ten

on

vie

ne

uti

lizza

to:

–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

DI

ES

EC

UZ

ION

E

int*

m=

new

int

[n];

dele

te[]

m;

//dele

ten;

//E

RR

OR

E-

oggett

onon

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

: m

em

ori

zza

re n

um

eri

in

se

riti

da

ta

sti

era

fi

nc

no

n v

ien

e in

se

rito

il c

ara

tte

re ‘.’.

Str

utt

ura

dati

,fo

rmata

da

ele

me

nti

de

llo

ste

sso

tip

oc

olle

gati

inc

ate

na

,la

cu

ilu

ng

he

zza

va

ria

din

am

ica

me

nte

.

•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

dell

ali

sta

);

–il

cam

po

pu

nta

tore

dell

’ult

imo

ele

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

hea

p

353

Page 179: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

13.2

Lis

te (

II)

Cre

azio

ne

di u

na

lis

ta1

. L

eg

ge

re l’in

form

azio

ne

2. A

lloca

re u

n n

uo

vo

ele

me

nto

co

n l’in

form

azio

ne

da

in

se

rire

3. C

olle

ga

re il n

uo

vo

ele

me

nto

al p

rim

o e

lem

en

to

de

lla lis

ta4

. A

gg

iorn

are

il p

un

tato

re d

i te

sta

de

lla lis

ta a

pu

nta

re

al n

uo

vo

ele

me

nto

typ

ed

ef

ele

m*

lista

;//

tip

o lis

ta

lista

cre

ali

sta

(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

->p

un

= p

0;

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

ta1

. S

ca

nd

ire

la

lis

ta d

all’

iniz

io a

lla f

ine

e p

er

og

ni

ele

me

nto

sta

mp

are

su

vid

eo

il ca

mp

o in

form

azio

ne

vo

id s

tam

pali

sta

(lis

ta p

0)

{ele

m*

p =

p0;

wh

ile (

p !

= 0

){

co

ut

<<

p->

inf

<<

' ';

p =

p->

pu

n;

}}

p0p

355

Page 180: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

13.2

Lis

te(I

V)

Ins

eri

me

nto

in

te

sta

1.

Allo

ca

re u

n n

uo

vo

ele

me

nto

co

n l’in

form

azio

ne

da

in

se

rire

2.

Co

lleg

are

il n

uo

vo

ele

men

to a

l p

rim

o e

lem

en

to d

ell

a

lista

3.

Ag

gio

rnare

il p

un

tato

re d

i te

sta

dell

a lis

ta

vo

id i

nste

sta

(lis

ta&

p0, T

a)

{ele

m*

p =

new

ele

m;

p->

inf

= a

; p

->p

un

= p

0;

p0 =

p;

}

p0

0

a

p

356

13.2

Lis

te(V

)

Es

tra

zio

ne

da

lla

te

sta

Se

la

lis

ta n

on

è v

uo

ta1

.A

gg

iorn

are

il p

un

tato

re d

i te

sta

de

lla lis

ta2

.D

ea

lloca

re l’e

lem

en

to

bo

ol estt

esta

(lis

ta&

p0, T

& a

){

ele

m*

p =

p0;

if (

p0 =

= 0

) re

turn

fals

e;

a =

p0->

inf;

p

0 =

p0->

pu

n;

dele

te p

;re

turn

tru

e;

}

p0

0

p

357

Page 181: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

13.2

Lis

te(V

I)

Ins

eri

me

nto

in

fo

nd

o1

.S

ca

nd

ire

la

lis

ta fin

o a

ll’u

ltim

o e

lem

en

to (

me

mb

ro

pu

n =

0)

2.

Allo

ca

re u

n n

uo

vo

ele

me

nto

co

n l’in

form

azio

ne

da

in

se

rire

3.

Co

lleg

are

l’u

ltim

o e

lem

en

to a

l n

uo

vo

ele

me

nto

vo

id i

nsfo

nd

o(l

ista

& p

0,

Ta)

{ele

m*

p;

ele

m*

q;

for

(q =

p0;

q !

= 0

; q

= q

->p

un

) p

= q

;q

= n

ew

ele

m;

q->

inf

= a

; q

->p

un

= 0

;if

(p

0 =

= 0

) p

0 =

q;

els

e p

->p

un

= q

;}

p0

0

pq00

a

358

13.2

Lis

te(V

II)

Es

tra

zio

ne

da

l fo

nd

oA

TT

EN

ZIO

NE

: n

ece

ssita

di d

ue

pu

nta

tori

pe

r sca

nd

ire

la lis

ta

bo

ol estf

on

do

(lis

ta&

p0, T

& a

){

ele

m*

p =

0;

ele

m*

q;

if (

p0 =

= 0

) re

turn

fals

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

;re

turn

tru

e;

}

p0

0

pq

0

359

Page 182: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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;fo

r (q

= p

0;

q !

= 0

&&

q->

inf

< a

; q

= q

->p

un

)p

= q

;r

= n

ew

ele

m;

r->

inf

= a

; r-

>p

un

= q

;//

contr

olla

se s

i deve inserire

in t

esta

if (

q =

= p

0)

p0 =

r;

els

e p

->p

un

= r

;}In

se

rim

en

to in

un

a lis

ta o

rdin

ata

1.

Sca

nd

ire

la

lis

ta fin

ch

è s

i in

co

ntr

a u

n e

lem

en

to

co

nte

ne

nte

ne

l ca

mp

o in

f u

n v

alo

re m

ag

gio

re d

i q

ue

llo d

a in

se

rire

op

pu

re fin

e lis

ta2

. A

lloca

re u

n n

uo

vo

ele

me

nto

co

n l’in

form

azio

ne

da

in

se

rire

3. In

se

rire

il n

uo

vo

ele

me

nto

….

3

p0

p0

->in

fp

0->

pu

n

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)

retu

rn f

als

e;

if (

q =

= p

0)

p0 =

q->

pu

n;

els

e p

->p

un

= q

->p

un

;d

ele

te q

;re

turn

tru

e;

}Es

tra

zio

ne

di u

n e

lem

en

to d

a u

na

lis

ta

1. S

ca

nd

ire

la

lis

ta fin

ch

è s

i in

co

ntr

a u

n e

lem

en

to

co

nte

ne

nte

l’in

form

azio

ne

ce

rca

ta2

. S

e tro

va

to, co

lleg

are

i d

ue

no

di a

dia

ce

nti

3. D

ea

lloca

re l’e

lem

en

to

23

91

20

361

Page 183: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

13.2

Lis

te(X

)

bo

ol estr

azio

ne_o

rdin

ata

(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

->in

fo>

a))

retu

rn f

als

e;

if (

q =

= p

0)

p0 =

q->

pu

n;

els

e p

->p

un

= q

->p

un

;d

ele

te q

;re

turn

tru

e;

}Es

tra

zio

ne

di u

n e

lem

en

to d

a u

na

lis

ta o

rdin

ata

1

. S

ca

nd

ire

la

lis

ta fin

ch

è s

i in

co

ntr

a u

n e

lem

en

to

co

nte

ne

nte

l’in

form

azio

ne

ce

rca

ta o

m

ag

gio

re2

. S

e tro

va

to, co

lleg

are

i d

ue

no

di a

dia

ce

nti

3. D

ea

lloca

re l’e

lem

en

to

39

12

0

362

13.2

Lis

te c

on

pu

nta

tore

au

sil

iari

o (

I)

lista

_n

cre

ali

sta

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

= n

ew

ele

m;

cin

>>

p->

inf;

p->

pu

n =

li.

p0;

li.p

0 =

p;

}} re

turn

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

Page 184: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

13.2

Lis

te c

on

pu

nta

tore

au

sil

iari

o (

II)

bo

ol estt

esta

1(l

ista

_n

& l

i, T

& a

){

ele

m*

p =

li.

p0;

if (

li.p

0 =

= 0

) re

turn

fals

e;

a =

li.

p0->

inf;

li.

p0 =

li.

p0->

pu

n;

dele

te p

;if

(li

.p0 =

= 0

) li

.p1 =

0;

retu

rn t

rue;

} vo

id i

nsfo

nd

o1(l

ista

_n

& li,

Ta)

{ele

m*

p =

new

ele

m;

p->

inf

= a

; p

->p

un

= 0

;if

(li

.p0 =

= 0

) {

li

.p0 =

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

{n

u_ele

m*

p0;

nu

_ele

m*

p1;

};

p0

p1

0

0

365

Page 185: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

14.2

.1 V

isib

ilit

à

Pro

gra

mm

i sem

pli

ci:

•fo

rmati

da p

och

e f

un

zio

ni,

tu

tte 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

uti

lizzan

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 i

n d

ivers

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

tili

zzan

do

o

gg

ett

i co

mu

ni.

Vis

ibil

ità (

sco

pe):

•c

am

po

di

vis

ibil

ità

di u

n i

de

nti

fic

ato

re (

pa

rte

di

pro

gra

mm

a i

n c

ui

l'id

en

tifi

ca

tore

pu

ò e

ss

ere

u

sa

to);

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

ibil

ità):

•serv

on

o a

co

ntr

oll

are

la c

on

div

isio

ne d

ell

e

info

rmazio

ni fr

a i

vari

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

’en

tità

d

eve e

ssere

vis

ibil

e a

lle p

art

i d

el

pro

gra

mm

a

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

’en

tità

no

n

deve e

ssere

vis

ibil

e a

tali

part

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

gra

ffe

#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} in

t m

ain

()

{ //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

{

//

blo

cco

co

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;//

1 5

int

i =

10;

// n

asconde l’o

ggett

o i d

el blo

cco s

uper.

co

ut

<<

i <

< e

nd

l;//

10

} 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")

;re

turn

0;

}

367

Page 186: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

file

in

clu

si

med

ian

te d

irett

ive #

inclu

de;

•se i

l fi

le d

a in

clu

dere

no

n è

di li

bre

ria,

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

;} //

Unità d

i com

pila

zio

ne r

isultante

int

f1(i

nt)

; i

nt

f2(i

nt)

;in

t m

ain

(){

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(

) //

vis

ibili

ta’ a liv

ello

di file

{co

ut

<<

"In

seri

sci

un

nu

mero

in

tero

" <

< e

nd

l;cin

>>

i;

} vo

id s

cri

vi(

) //

vis

ibili

ta’ 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")

;re

turn

0;

} Inseri

sci

un

nu

mero

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

ell

o d

i f

ile

ind

ivid

uan

o o

gg

ett

i co

nd

ivis

i d

a t

utt

e l

e f

un

zio

ni

defi

nit

e n

el fi

le.

369

Page 187: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

14.4

Un

ità d

i co

mp

ilazio

ne (

III)

// O

pera

tore

::

un

ari

o (

riso

luzio

ne d

i vis

ibil

ita')

#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{

int

i =

5;

// v

isib

ilita

' lo

cale

co

ut

<<

::i

<<

'\t

' <

< i <

< e

nd

l;//

1 5

{in

t i =

10;

// v

isib

ilita

' lo

cale

co

ut

<<

::i

<<

'\t

' <

< i <

< e

nd

l; // 1 1

0}

} co

ut

<<

::i

<<

en

dl;

// 1

syste

m("

PA

US

E")

;re

turn

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

gra

ffe,

og

nu

na d

ell

e 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

ell

o d

i fi

le o

all

’in

tern

o d

i u

n a

ltro

sp

azio

dei

no

mi.

•G

li id

en

tifi

cato

ri r

ela

tivi

ad

un

o s

pazio

dei n

om

i so

no

vis

ibil

i d

al

pu

nto

in

cu

i so

no

dic

hia

rati

fin

o a

lla f

ine

dell

o s

pazio

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)

{/*…

*/}

//…

} 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;

//dirett

iva

st

ss2;

}

371

Page 188: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

{/*…

*/}

//…

} 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

dell

a d

irett

iva u

sin

g n

am

esp

ace p

gen

era

re

dell

e a

mb

igu

ità.

372

14.5

Sp

azio

di

no

mi

(III

)

Lo

sp

azio

dei

no

mi è 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,

per

inclu

derv

i n

uo

vi

mem

bri

.

Sp

azio

dei n

om

i g

lob

ali

:co

sti

tuit

o d

all

e d

efi

niz

ion

i e

dic

hia

razio

ni a l

ivell

o d

i 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;

} int

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")

;re

turn

0;

} 4

3

2

5

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

373

Page 189: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

svil

up

pate

sep

ara

tam

en

te e

su

ccessiv

am

en

te c

oll

eg

ate

per

form

are

un

fil

e

eseg

uib

ile.

Co

lleg

am

en

to:

•u

n id

en

tifi

cato

re h

a c

oll

eg

am

en

to in

tern

ose s

i ri

feri

sce a

un

a e

nti

tà a

ccessib

ile s

olo

da q

uell

a u

nit

à

di co

mp

ilazio

ne;

–u

no

ste

sso

id

en

tifi

cato

re c

he h

a c

oll

eg

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

ibil

ità l

ocale

han

no

co

lleg

am

en

to in

tern

o;

•g

li id

en

tifi

cato

ri c

on

vis

ibil

ità a

liv

ell

o d

i 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 l

a p

aro

la c

hia

ve

exte

rn(e

se 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

pu

ò a

nch

e u

tili

zzare

la p

aro

la

ch

iave e

xte

rn,

nel 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 i

l co

rpo

.

Osserv

azio

ne:

•an

alo

gam

en

te a

gli

og

gett

i co

n v

isib

ilit

à a

liv

ell

o d

i fi

le (

og

gett

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

) p

erm

ett

on

o l

a

co

nd

ivis

ion

e d

i in

form

azio

ni fr

a f

un

zio

ni.

375

Page 190: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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,

colle

gam

ento

inte

rno

sta

tic i

nt

b =

10;

// 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

/* .

.. *

/} //

sta

tic, 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 ...

) 376

14.6

Co

lleg

am

en

to (

IV)

// -

----

----

----

----

----

----

---

file

fil

e2.c

pp

----

----

----

----

----

----

----

//#in

clu

de <

cstd

lib

>#in

clu

de <

iostr

eam

>u

sin

g n

am

esp

ace s

td;

exte

rn i

nt

a;

// s

olo

dic

hia

razio

ne

vo

id f

1(i

nt)

;//

solo

dic

hia

razio

ne

vo

id f

2()

; //

solo

dic

hia

razio

ne

vo

id f

3()

; //

solo

dic

hia

razio

ne

do

ub

le f

4(d

ou

ble

, d

ou

ble

);//

definiz

ione m

ancante

// O

K, non u

tiliz

zata

int

main

(){

co

ut

<<

a <

< e

nd

l;//

OK

, 1

exte

rn i

nt

b;

// d

ichia

razio

ne

//co

ut

<<

b <

< e

nd

l;E

RR

OR

E!

f1(a

);//

OK

//f2

();

ER

RO

RE

!//

f3()

;E

RR

OR

E!

//p

un

to p

2;

ER

RO

RE

! punto

non d

ichia

rato

//

p1.x

= 1

0;

ER

RO

RE

! P

1 n

on d

ichia

rato

syste

m("

PA

US

E")

;re

turn

0;

} Ste

sso

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

’org

an

izzazio

ne in

tern

a n

on

èla

ste

ssa,

si

han

no

err

ori

lo

gic

i a t

em

po

di esecu

zio

ne.

377

Page 191: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 i

nt

m;

//

iniz

ializ

zato

a z

ero

int

co

nta

Ch

iam

ate

Err

ata

()

{//

ER

RA

TA

!in

t n

= 0

;//

di cla

sse a

uto

matica

retu

rn +

+n

;} in

t co

nta

Ch

iam

ate

()

{sta

tic i

nt

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")

;re

turn

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 i

nt

m;

//

iniz

ializ

zato

a z

ero

int

co

nta

Ch

iam

ate

Err

ata

()

{//

ER

RA

TA

!in

t n

= 0

;//

di cla

sse a

uto

matica

retu

rn +

+n

;} in

t co

nta

Ch

iam

ate

()

{sta

tic i

nt

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")

;re

turn

0;

} 1 1 1 1

1

2

2

3

3

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

379

Page 192: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 =

100;

// Incre

menta

il m

aggio

re.

Restitu

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")

;re

turn

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.

Restitu

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 =

100;

co

ut

<<

in

cre

mM

ag

(&i,

&j)

<<

en

dl;

co

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;syste

m("

PA

US

E")

;re

turn

0;

} 100

10

101

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

381

Page 193: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.

Restitu

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 =

100;

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 =

100;

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;syste

m("

PA

US

E")

;re

turn

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.

Restitu

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 =

100;

co

ut

<<

i +

j +

in

cre

mM

ag

(&i,

&j)

<<

en

dl;

co

ut

<<

i <

< '\t

' <

< j <

< e

nd

l;i =

10,

j =

100;

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")

;re

turn

0;

} 210

10

101

211

10

101

Pre

mere

un

tasto

per

co

nti

nu

are

. . .

383

Page 194: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.

Restitu

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 =

100,

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 =

100;

r1 =

i +

j +

in

cre

mM

ag

(&i,

&j)

;r2

= r

1;

//

210 2

10

co

ut

<<

r1 <

< '\t

' <

< r

2 <

< e

nd

l;syste

m("

PA

US

E")

;re

turn

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

nali

tà e

ch

e r

isie

de s

u u

no

o p

iùfi

le;

•m

od

uli

serv

ito

rie m

od

uli

cli

en

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

tes

tazio

ne

o in

terf

ac

cia

(d

ich

iara

zio

ne

de

i s

erv

izi

off

ert

i);

–re

alizza

zio

ne

.

Sep

ara

zio

ne f

ra i

nte

rfaccia

e r

eali

zzazio

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

);

–s

em

plifi

ca

le

dip

en

de

nze

fra

i m

od

uli;

–p

erm

ett

e d

i m

od

ific

are

la

re

alizza

zio

ne

di

un

m

od

ulo

s

en

za

in

flu

en

za

re i

l fu

nzio

na

me

nto

de

i s

uo

i c

lie

nti

.

Mo

du

lo c

lien

te:

•u

tili

zza (

imp

ort

a)

riso

rse o

ffert

e d

ai

mo

du

liserv

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

all

a

reali

zzazio

ne d

ei m

od

uli

serv

ito

ri.

385

Page 195: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

14.1

1 M

od

uli

(II)

// E

SE

MP

IO P

ILA

// M

OD

ULO

SE

RV

ER

// file

pila

.hty

ped

ef

in

t T

;co

nst

int

DIM

= 5

;str

uct

pil

a

{in

t to

p;

T s

tack[D

IM];

}; vo

id i

nip

(pil

a&

pp

);b

oo

l em

pty

(co

nst

pil

a&

pp

);b

oo

l fu

ll(c

on

st

pil

a&

pp

);b

oo

l p

ush

(pil

a&

pp

, T

s);

bo

ol p

op

(pil

a&

pp

, T

& s

);vo

id s

tam

pa(c

on

st

pil

a&

pp

);

// file

pila

.cpp

#in

clu

de <

cstd

lib

>#in

clu

de <

iostr

eam

>#in

clu

de "

pil

a.h

"u

sin

g n

am

esp

ace s

td;

//in

izia

lizzazio

ne d

ella

pila

vo

id i

nip

(pil

a&

pp

){

pp

.to

p =

-1;

} ….

386

14.1

1 M

od

uli

(III

)

// E

SE

MP

IO P

ILA

// M

OD

ULO

CLIE

NT

// file

pila

Main

.cpp

#in

clu

de <

cstd

lib

>#in

clu

de <

iostr

eam

>#in

clu

de "

pil

a.h

"u

sin

g n

am

esp

ace s

td;

int

main

(){

pil

a s

t;in

ip(s

t);

T n

um

;if

(em

pty

(st)

) co

ut

<<

"P

ila v

uo

ta"

<<

en

dl;

for

(in

t 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 <

< "

fall

ito

" <

<

en

dl;

if (

full

(st)

) co

ut

<<

"P

ila p

ien

a"

<<

en

dl;

syste

m("

PA

US

E")

;re

turn

0;

}

387

Page 196: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

14.1

1.1

Astr

azio

ni

pro

ced

ura

li

Astr

azio

ni

pro

ced

ura

li.

–i m

od

uli

serv

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

tro

van

o i

n u

n

file

di in

testa

zio

ne c

he v

ien

e i

nclu

so

dai

mo

du

li

cli

en

ti;

–la

reali

zzazio

ne d

i ta

li f

un

zio

ni si

tro

va 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

ell

a l

oro

str

utt

ura

in

tern

a.

Esem

pio

:

–le

fu

nzio

ni d

i li

bre

ria p

er

l’ela

bo

razio

ne d

ell

e

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 i

l lo

ro u

tili

zzo

no

n

rich

ied

e a

lcu

na c

on

oscen

za s

ull

a l

oro

re

ali

zzazio

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

’occu

ltam

en

to d

ell

’in

form

azio

ne:

–l’

org

an

izzazio

ine in

tern

a d

el

tip

o n

on

deve e

ssere

accessib

ile a

i m

od

uli

cli

en

ti;

–i m

od

uli

cli

en

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,

se

nza

po

ss

ibilit

à d

i a

cc

ed

ere

alla

lo

ro

org

an

izza

zio

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

att

i.

#in

clu

de "

pil

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

!//

…} #in

clu

de "

pil

a.h

"in

t f(

pil

a&

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

Page 197: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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' i

sprivate

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

dp

ub

lic

In g

en

ere

uti

lizzere

mo

la f

orm

a s

em

pli

ficata

seg

uen

te:

cla

ss n

om

e{

part

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

:-

un

tip

o (

en

um

era

zio

ne o

str

utt

ura

);-

un

cam

po

dati

(o

gg

ett

o n

on

in

izia

lizzato

);-

un

a 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).

Page 198: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

Page 199: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

<<

')'

;}

Page 200: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 201: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

)

Page 202: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 n

on

an

co

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 m

ed

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

;//

…}

Page 203: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

.

Page 204: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;}

Page 205: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

}

Page 206: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.

Page 207: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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(

"Fo

nd

am

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

;/*

…*/

}

Page 208: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.")

;/*

...*

/d

ele

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

d

efi

niz

ion

e;

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

u

ltim

i 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 s

on

o d

efi

nit

i;

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

u

ltim

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

Page 209: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

a

ltro

og

ge

tto

de

lla

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

fu

nzio

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

o

gg

ett

o c

las

se

(m

ed

ian

te 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;}

;

Page 210: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;} in

tm

ain

(){

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)

Page 211: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

trs2

.str

og

gi

\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

){

// …

} int

main

(){

str

ing

as1("

og

gi"

);ff

(s1);

retu

rn 0

;}

s1.s

trsg

.str

og

gi

\0

Ter

min

e

esec

uzi

on

e

fun

zio

ne

Page 212: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

trsg

.str

og

gi

\0

Ter

min

e

esec

uzi

on

e

fun

zio

ne

og

gi

\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

{//

…}

Page 213: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;}

Page 214: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

>u

sin

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

;p

ub

lic:

co

mp

lesso

(do

ub

le r

= 0

, d

ou

ble

i =

0){

re=

r; im

=i;

}/*

seg

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

//

su

og

ni co

mp

lesso

del vett

ore

} do

ub

le m

od

ulo

Qu

ad

ro()

{d

ou

ble

mQ

= 0

;fo

r (i

nt

i=0;

i<siz

e;

i++

){//

essen

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

()m

Q+

= v

ett

[i].

re*v

ett

[i].

re +

vett

[i].

im*v

ett

[i].

im;

} retu

rnm

Q;

}}; in

tm

ain

(){

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

>u

sin

g n

am

esp

ace s

td;

cla

ss c

om

ple

sso

;

//p

re-d

ich

iara

zio

ne d

ella c

lasse u

tilizzata

cla

ss v

ett

ore

Co

mp

less

o /

/ d

ich

iara

zio

ne d

ella c

lasse u

tilizzatr

ice

{co

mp

lesso

*vett

;

in

t siz

e;

pu

blic:

vett

ore

Co

mp

less

o(i

nt)

;d

ou

ble

mo

du

loQ

uad

ro()

;

}; cla

ss c

om

ple

sso

{ // d

ich

iara

zio

ne d

ella c

lasse u

tilizzata

do

ub

le r

e, im

;p

ub

lic:

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()

{d

ou

ble

mQ

= 0

;fo

r (i

nt

i=0;

i<siz

e;

i++

){m

Q +

= v

ett

[i].

re*v

ett

[i].

re +

vett

[i].

im*v

ett

[i].

im;

} retu

rn m

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

rn 0

; }

Page 215: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

s

i 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

u

na

fu

nzio

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

& )

;/*

…*/

}; // 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

;}

Page 216: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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;

}

Page 217: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

.

Page 218: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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 'c

1 +

//

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

& )

;/*

…*/

}; // 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

;}

Page 219: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;}

Page 220: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

trs2

.str

og

gi

\0i

er

i\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

;}

Page 221: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

trs2

.str

ie

ri

\0i

er

i\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

p

un

tato

re a

me

mb

ro (

.*)

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

(‘,’

).

Page 222: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;p

ub

lic:

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 s

ec

on

da

rie

, s

e d

efi

nit

i, 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

c

las

se

pri

nc

ipa

le,

se

de

fin

ito

.

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 s

ec

on

da

rie

, s

e d

efi

nit

i, n

ell’o

rdin

e i

nve

rso

in

cu

i q

ue

ste

c

om

pa

ion

o n

ella

dic

hia

razio

ne

de

i m

em

bri

de

lla

cla

ss

e

pri

nc

ipa

le.

Page 223: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

){/

*….*

/}//

// 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

;//

…}

Page 224: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.

Page 225: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 226: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

;}

Page 227: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

// 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 r

eale

();

//…

}; // file

com

ple

sso.c

pp

do

ub

le c

om

ple

sso

:: r

eale

() c

on

st

{co

ut

<<

"C

OS

TA

NT

E"

<<

en

dl;

retu

rn r

e;}

do

ub

le c

om

ple

sso

:: r

eale

()

{retu

rn r

e;}

//…

.

// file

main

.cpp

//…

int

main

()

{co

nst

co

mp

lesso

c1 (

3.2

, 4);

co

mp

lesso

c2(3

.2,4

);co

ut

<<

"P

art

e R

eale

" <

< c

1.r

eale

() <

< e

nd

l;co

ut

<<

"P

art

e R

eale

" <

< c

2.r

eale

() <

< e

nd

l;//

…N

OT

AR

E L

’US

CIT

A} C

OS

TA

NT

EP

art

e R

eale

3.2

Part

e R

eale

3.2

Page 228: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

Page 229: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

(){…

};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.

Page 230: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

(){…

};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

Page 231: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

().

Page 232: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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(

"no

nE

sis

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;}

//…

}; 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

);

Page 233: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

Page 234: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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.

>

}

Page 235: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

/

/ e

qu

iva

le a

‘#

if d

efi

ne

d L

INU

X’

sys

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

Page 236: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

u

nit

à d

i c

om

pila

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’ag

giu

nta

erro

nea

di

qu

esto

seco

nd

oin

clu

de

ora

no

nca

usa

più

il

pro

ble

ma

di

rid

efin

izio

ne

del

lacl

asse

com

ple

sso,

per

ché

ladef

iniz

ion

ed

ella

clas

seco

mple

sso

vie

ne

incl

usa

solo

lap

rim

av

olt

a

Page 237: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 238: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 239: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 240: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 241: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 242: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

La console (finestra terminale)

Comando da eseguire (in

questo caso g++ -c es1.cpp)

Prompt dei

comandi

11 /16

Comandi base per la consoleComandi 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

Page 243: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 244: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 245: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

Università di Pisa

Corso di Laurea in Ingegneria Informatica

Guida al Debuggingdi 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 &

Page 246: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

Come appare DDD

Customizzazione di DDD

• Numero di riga: Source � Display Line Numbers

• Ancoraggio della barra degli strumenti: Edit � Preferences

Page 247: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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)

Page 248: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

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

Page 249: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

Inspezione delle variabili (1/2)

• Fare click sul pulsantedestro sopra una variabilee poi scegliere Display nomeVariabile

– questo provoca l’apertura del display editor

• Fare ancora click sulpulsante 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

Page 250: Fondamenti di Informatica I - iet.unipi.it · Fondamenti di Informatica I ... Elementi di Strutture Dati con il Linguaggio C++ ... Visibilità e collegamento. Algoritmi di ricerca

Per tornare indietro nell’esecuzione

• Per andare indietro rispetto alla linea di interruzione

– clickare e trascinare la freccia in alto, alla linea desiderata