01.06.2013 Views

Programmare con C++ - HOEPLI.it

Programmare con C++ - HOEPLI.it

Programmare con C++ - HOEPLI.it

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Cesare Rota<br />

<strong>Programmare</strong> <strong>con</strong> <strong>C++</strong><br />

EDITORE ULRICO <strong>HOEPLI</strong> MILANO


Copyright © Ulrico Hoepli Ed<strong>it</strong>ore S.p.A. 2009<br />

via Hoepli 5, 20121 Milano (Italy)<br />

tel. +39 02 864871 – fax +39 02 8052886<br />

e-mail hoepli@hoepli.<strong>it</strong><br />

www.hoepli.<strong>it</strong><br />

Tutti i dir<strong>it</strong>ti sono riservati a norma di legge<br />

e a norma delle <strong>con</strong>venzioni internazionali<br />

ISBN 978-88-203-4248-7<br />

Ristampa:<br />

4 3 2 1 0 2009 2010 2011 2012 2013<br />

Realizzazione ed<strong>it</strong>oriale<br />

ART Servizi Ed<strong>it</strong>oriali S.p.A. - Bologna<br />

www.art.bo.<strong>it</strong><br />

Coordinamento ed<strong>it</strong>oriale: Monica Monari<br />

Redazione: Barbara Megali<br />

Progetto grafico: Marina Baldisserri<br />

Impaginazione: Sonia Bertusi<br />

Copertina: MN&CG S.r.l., Milano<br />

Stampa: Art Grafiche Franco Battaia S.r.l. - Zibido San Giacomo (MI)<br />

Printed in Italy


Presentazione 5<br />

Sezione 1 - Premesse 7<br />

U.D. 1 - Sistemi di numerazione 8<br />

1.1 Sistema di numerazione decimale 9<br />

1.2 Notazione polinomiale 9<br />

1.3 Numeri decimali 10<br />

1.4 Sistema di numerazione binario 11<br />

1.5 Conversione da base 2 a base 10 12<br />

1.6 Somma e sottrazione nel sistema<br />

binario 13<br />

1.7 Sistema di numerazione esadecimale 14<br />

1.8 Conversione da binario a esadecimale<br />

e viceversa 16<br />

Esercizi 18<br />

U.D. 2 - Codifica delle informazioni 20<br />

2.1 Introduzione 21<br />

2.2 Rappresentazione dei caratteri 22<br />

2.3 Rappresentazione interna<br />

dei numeri interi 24<br />

2.4 Rappresentazione dei numeri reali 28<br />

Esercizi 31<br />

Sezione 2 - Primi elementi<br />

di programmazione 33<br />

U.D. 3 - Introduzione a <strong>C++</strong> 34<br />

3.1 Primo programma 35<br />

3.2 Analisi del codice 38<br />

3.3 Definizione e assegnazione 40<br />

3.4 Tipi di dato 42<br />

3.5 Tipo di dato intero 43<br />

3.6 Tipo char 44<br />

3.7 Numeri in virgola mobile 46<br />

3.8 Casting 48<br />

3.9 Tipo booleano 48<br />

3.10 Costanti 49<br />

Esercizi 51<br />

U.D. 4 - Visualizzazione e acquisizione 54<br />

4.1 Acquisizione delle informazioni:<br />

il metodo cin 55<br />

Indice<br />

4.2 Output formattato 58<br />

4.3 Caratteri di escape 62<br />

4.4 Uso di “\\” e del carattere “@” 63<br />

Esercizi 64<br />

U.D. 5 - Operatori 66<br />

5.1 Operatori ar<strong>it</strong>metici 67<br />

5.2 Operatori ar<strong>it</strong>metici composti 73<br />

5.3 Operatori relazionali 78<br />

5.4 Operatori logici 80<br />

Esercizi 86<br />

Sezione 3 - Organizzazione degli algor<strong>it</strong>mi 89<br />

U.D. 6 - Algor<strong>it</strong>mi e pseudocodifica 90<br />

6.1 Analisi del problema 91<br />

6.2 Primo esempio 92<br />

6.3 Algor<strong>it</strong>mi 94<br />

6.4 Dati e istruzioni 96<br />

6.5 Istruzioni di assegnamento 97<br />

6.6 Istruzioni di ingresso e di usc<strong>it</strong>a<br />

dei dati 99<br />

6.7 Teorema di Jacopini-Böhm 100<br />

6.8 Struttura di alternativa 102<br />

6.9 Struttura di ripetizione 104<br />

6.10 Considerazioni sulla pseudocodifica 107<br />

Esercizi 109<br />

U.D. 7 - Istruzioni di selezione 112<br />

7.1 Istruzione if 113<br />

7.2 Istruzione if..else 115<br />

7.3 If nidificati 118<br />

7.4 Istruzione sw<strong>it</strong>ch<br />

(selezione multipla) 120<br />

7.5 Raggruppamento dei case 122<br />

Esercizi 125<br />

U.D. 8 - Istruzioni di ripetizione 127<br />

8.1 Istruzione while 128<br />

8.2 Tabulazione 130<br />

8.3 Istruzione do.. while 132<br />

8.4 Istruzione for 134<br />

Esercizi 139<br />

3


4<br />

Indice<br />

U.D. 9 - Le funzioni 142<br />

9.1 Le funzioni 143<br />

9.2 La funzione più importante 144<br />

9.3 Definizione delle funzioni 147<br />

9.4 Amb<strong>it</strong>o delle variabili 148<br />

9.5 Variabili locali e globali 151<br />

9.6 Valori di r<strong>it</strong>orno 152<br />

9.7 Passaggio dei parametri<br />

per valore 153<br />

9.8 Passaggio dei parametri<br />

per riferimento 157<br />

9.9 Ricorsione 161<br />

9.10 Funzioni matematiche 163<br />

Esercizi 165<br />

Sezione 4 - Strutture dei dati 167<br />

U.D. 10 - Enumerazioni e array 168<br />

10.1 Introduzione 169<br />

10.2 Tipi enumerativi (enumerazioni) 169<br />

10.3 Tipo vettore 171<br />

10.4 Vettori in <strong>C++</strong> 172<br />

10.5 Caricamento di un vettore<br />

in memoria 176<br />

10.6 Array di dimensione variabile 178<br />

10.7 Matrici 180<br />

10.8 Passaggio di un vettore come<br />

parametro a una funzione 187<br />

Esercizi 190<br />

U.D. 11 - Stringhe e strutture 192<br />

11.1 Definizione di stringa 193<br />

11.2 Lunghezza di una stringa 195<br />

11.3 Concatenazione ed estrazione 197<br />

11.4 Confronti tra stringhe 200<br />

11.5 Caratteri e stringhe C 201<br />

11.6 Dichiarazione di una struttura 202<br />

11.7 Metodi costruttori 204<br />

Esercizi 207<br />

Sezione 5 - Classi e oggetti 209<br />

U.D. 12 - Concetti generali 210<br />

12.1 Introduzione alla OOP 211<br />

12.2 Incapsulazione 211<br />

12.3 Polimorfismo 212<br />

12.4 Ered<strong>it</strong>arietà 213<br />

12.5 Introduzione alle classi 215<br />

12.6 Terminologia e rappresentazione<br />

grafica 216<br />

12.7 Dichiarazione degli oggetti 218<br />

Esercizi 222<br />

U.D. 13 - Polimorfismo ed ered<strong>it</strong>arietà 223<br />

13.1 Costruttori 224<br />

13.2 Costruttori parametrizzati 227<br />

13.3 Membri static di una classe 230<br />

13.4 Overloading 234<br />

13.5 Polimorfismo 236<br />

13.6 Ered<strong>it</strong>arietà 240<br />

Esercizi 249<br />

Sezione 6 - Operare <strong>con</strong> gli archivi 251<br />

U.D. 14 - Archivi 252<br />

14.1 Definizione di archivio 253<br />

14.2 Dati 254<br />

14.3 Definizione di record 255<br />

14.4 Operazioni fondamentali<br />

sugli archivi 256<br />

14.5 I/O standard e su memoria<br />

di massa 257<br />

14.6 Tipi di archivio 259<br />

14.7 Tipi di accesso 260<br />

Esercizi 261<br />

U.D. 15 - File di testo 262<br />

15.1 Creazione di un file di testo 263<br />

15.2 Lettura di un file di testo 266<br />

15.3 Accodamento 268<br />

Esercizi 271<br />

Sezione 7 - Le eccezioni 273<br />

U.D. 16 - Gestione delle eccezioni 274<br />

16.1 Concetto di anomalia 275<br />

16.2 Eccezioni 277<br />

Esercizi 283<br />

Appendice A - Riepilogo degli operatori 285<br />

Appendice B - Sequenze di caratteri<br />

escape 286<br />

Indice anal<strong>it</strong>ico 287


Il presente volume espone, in modo chiaro ed efficace, le caratteristiche del linguaggio <strong>C++</strong><br />

e ha il duplice scopo di descriverne la sintassi e di evidenziarne le potenzial<strong>it</strong>à.<br />

In particolare il libro:<br />

si rivolge allo studente come un manuale di facile <strong>con</strong>sultazione per la programmazione;<br />

presenta le basi teoriche per lo sviluppo delle applicazioni informatiche.<br />

Il primo obiettivo si realizza tram<strong>it</strong>e numerosi esempi presenti nel testo, che fornis<strong>con</strong>o<br />

chiare indicazioni sulle caratteristiche sintattiche del linguaggio. Per quanto riguarda le<br />

basi teoriche sono stati messi in rilievo i fondamenti dei cinque argomenti di base per la<br />

programmazione: la rappresentazione dei dati, le strutture di <strong>con</strong>trollo utilizzabili nella<br />

costruzione di un algor<strong>it</strong>mo, le strutture dei dati, la programmazione orientata agli oggetti<br />

e la gestione dei file.<br />

Il libro è suddiviso in sette sezioni.<br />

Presentazione<br />

1 La sezione Premesse sviluppa gli argomenti della codifica binaria delle informazioni.<br />

2 In Primi elementi di programmazione vengono descr<strong>it</strong>ti i <strong>con</strong>cetti di variabile,<br />

costante e tipi di dato, le operazioni di input/output da <strong>con</strong>sole e gli operatori ar<strong>it</strong>metici.<br />

3 Nella sezione Organizzazione degli algor<strong>it</strong>mi viene introdotta la nozione di algor<strong>it</strong>mo<br />

e sono descr<strong>it</strong>te le principali strutture di <strong>con</strong>trollo sia in pseudocodifica sia in <strong>C++</strong>.<br />

4 Nella sezione Strutture dei dati vengono defin<strong>it</strong>e le principali strutture statiche dei<br />

dati.<br />

5 L’intera sezione Classi e oggetti è dedicata alle nozioni fondamentali della OOP e<br />

vengono presentati i <strong>con</strong>cetti principali della programmazione orientata agli oggetti<br />

quali l’incapsulamento, il polimorfismo e l’ered<strong>it</strong>arietà.<br />

6 La sezione Operare <strong>con</strong> gli archivi spiega le nozioni di base per la definizione degli<br />

archivi di dati.<br />

7 La sezione Le eccezioni descrive gli accorgimenti essenziali per la realizzazione di<br />

applicazioni “robuste”.<br />

Ogni sezione è suddivisa in Un<strong>it</strong>à didattiche le quali <strong>con</strong>tengono un numero lim<strong>it</strong>ato di<br />

paragrafi, la cui trattazione è, di norma, <strong>con</strong>tenuta in circa due pagine. Ne risulta un testo<br />

5


6<br />

Presentazione<br />

di facile lettura, che aiuta lo studente a <strong>con</strong>centrarsi, di volta in volta, su un singolo elemento<br />

del discorso. Tutti i <strong>con</strong>cetti presentati sono accompagnati da un esempio, che<br />

mette in pratica quanto esposto. Ogni esempio <strong>con</strong>tiene un listato di codice, una figura<br />

che illustra una prova di esecuzione del codice proposto e l’analisi dettagliata del codice<br />

stesso; quest’ultima parte dell’esempio presenta una descrizione dettagliata degli aspetti<br />

più significativi del linguaggio <strong>C++</strong> presenti nell’esempio.<br />

Per ogni sezione sono indicati gli obiettivi generali che si vogliono raggiungere, mentre<br />

nella prima pagina di ogni Un<strong>it</strong>à didattica è specificato per lo studente “Che cosa imparerai<br />

a fare” e “Che cosa dovrai studiare”. In <strong>con</strong>creto, gli obiettivi generali presentati all’inizio<br />

di ogni modulo descrivono le capac<strong>it</strong>à che lo studente deve acquisire. Le voci “Che<br />

cosa imparerai a fare” e “Che cosa dovrai studiare” indicano rispettivamente le competenze<br />

e le <strong>con</strong>oscenze che devono essere apprese dall’alunno.<br />

Considerando l’ampiezza della trattazione, il libro include tutti i <strong>con</strong>tenuti dei programmi<br />

didattici tradizionalmente affrontati nelle classi terze degli ist<strong>it</strong>uti tecnici.<br />

In particolare può essere adottato nella classe terza degli Ist<strong>it</strong>uti Tecnici Industriali <strong>con</strong> indirizzo<br />

ABACUS o informatica industriale, in quella degli Ist<strong>it</strong>uti Tecnici Commerciali<br />

<strong>con</strong> indirizzo MERCURIO o programmatori, nonché in quella dei Licei scientifici tecnologici.<br />

L’Autore


†<br />

Obiettivi<br />

generali<br />

Sezione 4<br />

Strutture dei dati<br />

◊ Definire insiemi di dati numerabili<br />

◊ Saper utilizzare schemi logici per organizzare insiemi<br />

complessi di dati<br />

◊ Costruire tabelle di dati omogenei<br />

◊ Manipolare stringhe di caratteri<br />

&U.D.10<br />

Enumerazioni e array<br />

U.D.11 Stringhe e strutture<br />

◊ Raggruppare dati di tipo diverso<br />

Questa sezione <strong>con</strong>tiene


Un<strong>it</strong>à didattica 10<br />

Enumerazioni e array<br />

CHE COSA IMPARERAI A FARE<br />

$ Definire dati di tipo enumerativo<br />

$ Definire un array a una dimensione in <strong>C++</strong><br />

$ Caricare un vettore in memoria<br />

$ Definire un vettore a dimensione variabile<br />

$ Definire una matrice<br />

$ Popolare una matrice<br />

$ Visualizzare gli elementi di una matrice<br />

CHE COSA DOVRAI STUDIARE<br />

$ Definizione di tipo enumerativo<br />

$ Concetto di vettore<br />

$ Definizione di vettore<br />

$ Sintassi per la gestione di un vettore<br />

$ Sintassi per la gestione delle matrici


10<br />

Un<strong>it</strong>à didattica<br />

Enumerazioni e array<br />

10.1 Introduzione<br />

Finora abbiamo visto i tipi di dato più comuni e i più facili da utilizzare in <strong>C++</strong>, cioè i tipi predefin<strong>it</strong>i:<br />

int, double, bool ecc.<br />

In <strong>C++</strong>, però, si possono anche utilizzare tipi defin<strong>it</strong>i dal programmatore. Tali nuovi tipi, per poter<br />

essere utilizzati, vanno inser<strong>it</strong>i nella dichiarazione delle variabili se<strong>con</strong>do la sintassi <strong>con</strong>sueta:<br />

tipo variabile;<br />

Tutti i dati che compaiono in un programma possiedono uno e un solo tipo, e possono essere di tipo<br />

semplice oppure aggregati in modo complesso.<br />

I tipi di dato semplici sono classificati se<strong>con</strong>do lo schema gerarchico riportato di segu<strong>it</strong>o.<br />

reali<br />

float double<br />

semplici<br />

ordinali<br />

enumerativi predefin<strong>it</strong>i<br />

I tipi semplici possono essere float o double, oppure di tipo ordinale; i tipi ordinali possono essere<br />

defin<strong>it</strong>i dal programmatore attraverso i tipi enumerativi, oppure possono appartenere ai tipi ordinali<br />

predefin<strong>it</strong>i int, bool, char.<br />

Il tipo ordinale si chiama così perché descrive un insieme fin<strong>it</strong>o e ordinato di valori,<br />

che possono essere associati a numeri interi pos<strong>it</strong>ivi.<br />

I tipi ordinali predefin<strong>it</strong>i e i tipi float e double sono già stati presentati e utilizzati in precedenza.<br />

10.2 Tipi enumerativi (enumerazioni)<br />

int char bool<br />

A volte una variabile può assumere solo una serie di valori defin<strong>it</strong>i all’interno di un insieme discreto<br />

di possibil<strong>it</strong>à. Le enumerazioni sono molto comuni nella v<strong>it</strong>a di tutti i giorni: per esempio, può essere<br />

un’enumerazione la lista dei <strong>con</strong>trolli da eseguire sull’auto prima di affrontare un viaggio: freni,<br />

fari, gomme, olio, tergicristalli, carburante.<br />

169


170<br />

Sezione 4 - Strutture dei dati<br />

Per definire in <strong>C++</strong> un’enumerazione si usa la seguente sintassi:<br />

enum nome_enumerazione {elenco_enumerazioni};<br />

dove enum è la parola chiave che introduce l’enumerazione.<br />

Riprendendo la lista di esempio proposta in precedenza, si può scrivere:<br />

enum <strong>con</strong>trolli {freni, fari, gomme, olio, tergicristalli, carburante};<br />

Il nome dell’enumerazione può essere utilizzato per dichiarare variabili di tale tipo, in maniera analoga<br />

alle dichiarazioni di tipo viste in precedenza. Per esempio, potremo scrivere:<br />

<strong>con</strong>trolli check;<br />

La variabile check può assumere uno qualsiasi dei valori della lista dei <strong>con</strong>trolli defin<strong>it</strong>a in precedenza.<br />

Per esempio, si può scrivere:<br />

check = gomme;<br />

oppure<br />

if (check == fari) cout


22 //fine programma<br />

23 cout


172<br />

Sezione 4 - Strutture dei dati<br />

Prendiamo, per esempio, l’elenco degli studenti di una classe, così come appare sul registro.<br />

A ogni studente è associato un numero di posizione e ogni numero individua uno studente.<br />

In questo esempio, ogni elemento del vettore è di tipo stringa (per <strong>con</strong>tenere il cognome e nome dello<br />

studente) e ogni elemento è individuato da un numero, detto indice. La dimensione del vettore è 24.<br />

Oppure <strong>con</strong>sideriamo un quadrilatero irregolare in cui ogni lato ha una misura diversa.<br />

Possiamo scrivere: <br />

Ogni elemento dell’esempio precedente è un dato di tipo numerico (la misura del lato) e per ogni<br />

misura è presente un indice che è il numero del lato; la dimensione è 4.<br />

10.4 Vettori in <strong>C++</strong><br />

L’istruzione per definire un vettore ha il seguente formato:<br />

dove:<br />

Riprendendo gli esempi del paragrafo precedente, per definire il vettore che <strong>con</strong>tiene i nomi dei 24<br />

studenti di una classe possiamo scrivere:<br />

int dim = 24;<br />

string Studenti [dim];<br />

1 Abbiati Mario<br />

2 Bonaldi Piera<br />

3 Casati Luigi<br />

4 Espos<strong>it</strong>o Salvatore<br />

.. ...<br />

.. ...<br />

24 Vivaldi Giuseppe<br />

LATO MISURA<br />

1 15<br />

2 8<br />

3 7<br />

4 16<br />

tipo nomeVettore [dimensione];<br />

tipo specifica il tipo di dato comune a tutte le componenti;<br />

nomeVettore è il nome collettivo delle componenti del vettore;<br />

dimensione è il numero degli elementi <strong>con</strong>tenuti nel vettore.<br />

4<br />

1 2<br />

3


Per definire le misure dei lati di un quadrilatero:<br />

int dim=4;<br />

int misure [dim];<br />

È buona norma definire la dimensione del vettore come variabile (nel nostro caso: dim): in questo<br />

modo eventuali variazioni della dimensione richiedono un solo intervento nel codice.<br />

In base a questa regola, nell’esempio dell’elenco degli studenti il primo studente (Abbiati Mario) è<br />

individuato dall’indice 0 e l’ultimo (Vivaldi Giuseppe) dall’indice 23.<br />

Quando si lavora <strong>con</strong> una variabile di tipo vettore, occorre sempre, all’interno del programma, indicare<br />

sia il nome della variabile sia l’indice che individua la componente del vettore che vogliamo trattare;<br />

per esempio, per assegnare al primo elemento del vettore la misura del primo lato, si scrive:<br />

misure[0] = 15<br />

Si noti che l’indice va indicato racchiuso tra parentesi quadre dopo il nome della variabile.<br />

Per assegnare a ciascun lato la misura corrispondente, si scrive:<br />

misure[1] = 8<br />

misure[2] = 7<br />

misure[3] = 16<br />

Dal punto di vista <strong>con</strong>cettuale, possiamo pensare che in memoria è presente una struttura di questo<br />

tipo:<br />

Alcuni esempi di istruzioni sugli elementi di un vettore<br />

Sempre riferendosi alle misure dei lati di un quadrilatero, per scrivere la misura del terzo lato si utilizza<br />

la seguente istruzione:<br />

cout


174<br />

Sezione 4 - Strutture dei dati<br />

Descrizione della soluzione<br />

Le istruzioni per definire l’array e per assegnargli i valori iniziali sono già state viste in questo paragrafo.<br />

Per sommare tutti i lati del quadrato si definisca un ciclo for <strong>con</strong> l’indice che va da 0 a 3 e che<br />

permette di accedere a tutti e quattro i lati del quadrilatero, vale a dire a tutti e quattro gli elementi<br />

del vettore delle misure.<br />

Pseudocodifica<br />

//struttura dati<br />

vettore delle misure dei lati<br />

//input<br />

//tutti i dati sono defin<strong>it</strong>i all’interno del programma<br />

//output<br />

perimetro<br />

//variabili di lavoro<br />

i //indice per ciclo for<br />

INIZIO<br />

//inizializza il vettore delle misure<br />

misure[0] ← 15<br />

misure[1] ← 8<br />

misure[2] ← 7<br />

misure[3] ← 16<br />

//inizializza perimetro<br />

perimetro ← 0<br />

//vis<strong>it</strong>a il vettore<br />

PER i DA 0 A dim – 1<br />

perimetro = perimetro + misure[i] //somma le misure ad 1 ad 1<br />

FINE PER<br />

FINE<br />

scrivi (Perimetro)<br />

Codice<br />

Perimetro.cpp<br />

1 #include <br />

2 using namespace std;<br />

3<br />

4 //INIZIO<br />

5 int main ()<br />

6 {<br />

7 //struttura del vettore<br />

8 <strong>con</strong>st int dim=4;<br />

9 int misure[dim];<br />

10<br />

11 int i; //<strong>con</strong>tatore per ciclo for<br />

12 int perim; //dato di output<br />

13<br />

14 //inizializza il vettore misure


15 misure[0] = 15;<br />

16 misure[1] = 8;<br />

17 misure[2] = 7;<br />

18 misure[3] = 16;<br />

19<br />

20 //inizializza perimetro<br />

21 perim = 0;<br />

22<br />

23 //vis<strong>it</strong>a il vettore<br />

24 for(i=0; i


176<br />

Sezione 4 - Strutture dei dati<br />

. . .<br />

14 //inizializza il vettore misure<br />

15 misure[0] = 15;<br />

15 misure[1] = 8;<br />

16 misure[2] = 7;<br />

17 misure[3] = 16;<br />

18 . . .<br />

possono essere sost<strong>it</strong>u<strong>it</strong>e dalla seguente scr<strong>it</strong>tura più “veloce”:<br />

int [] misure = new int [] {15, 8, 7, 16};<br />

Si noti che non è neppure necessario specificare la dimensione del vettore.<br />

...........................................................................................................................................<br />

10.5 Caricamento di un vettore in memoria<br />

Nel paragrafo precedente è stato illustrato un esempio di trattamento di un vettore, ipotizzando che<br />

i suoi valori fossero caricati all’interno del codice del programma. Nell’esempio che segue, viene illustrato<br />

come si può fare in modo che sia l’utente a caricare direttamente in un vettore i valori che<br />

desidera. Inizialmente, <strong>con</strong>sideriamo il caso in cui la dimensione del vettore è nota a priori.<br />

Esempio arrayCarica.........................................................................................................<br />

Consentire l’inserimento da tastiera dei valori di un vettore di interi <strong>con</strong> dimensione fissa = 5.<br />

Descrizione della soluzione<br />

Dopo avere defin<strong>it</strong>o un vettore di 5 interi, si eseguono due “vis<strong>it</strong>e” sugli elementi del vettore: la prima<br />

<strong>con</strong>tiene il blocco di istruzioni che permette di caricare i dati inser<strong>it</strong>i da tastiera in ciascun elemento<br />

del vettore; la se<strong>con</strong>da viene utilizzata per visualizzare i dati caricati.<br />

Pseudocodifica<br />

//costanti<br />

dimensione = 5<br />

//struttura dati<br />

vettore di 5 interi<br />

//input<br />

serie di 5 numeri<br />

//output<br />

vettore di 5 interi<br />

INIZIO<br />

PER ogni elemento del vettore<br />

richiedi dato<br />

carica dato<br />

FINE PER<br />

PER ogni elemento del vettore<br />

scrivi (elemento)<br />

FINE PER<br />

FINE


Codice<br />

arrayCarica.cpp<br />

1 #include <br />

2 using namespace std;<br />

3<br />

4 //INIZIO<br />

5 int main ()<br />

6 {<br />

7 //definisci il vettore di 5 elementi<br />

8 <strong>con</strong>st int dim = 5;<br />

9<br />

10 //definisci la struttura dati<br />

11 int vett [dim];<br />

12<br />

13 //ciclo for x caricare vettore<br />

14 for (int i=0; i


178<br />

Sezione 4 - Strutture dei dati<br />

Alla riga 18 il dato inser<strong>it</strong>o da tastiera viene assegnato all’elemento vett <strong>con</strong> indice i, dove i, grazie<br />

al ciclo for, assume, di volta in volta, i valori che vanno da 0 a 4.<br />

Alla riga 24 la scr<strong>it</strong>tura degli elementi del vettore viene realizzata <strong>con</strong> un se<strong>con</strong>do ciclo for.<br />

Alla riga 26 ogni elemento del vettore viene scr<strong>it</strong>to sulla stessa riga dei precedenti. Solo alla fine del<br />

ciclo for, alla riga 28, si va a capo per scrivere una nuova riga di messaggio.<br />

...........................................................................................................................................<br />

10.6 Array di dimensione variabile<br />

Allo scopo di fornire all’utente strumenti flessibili, vediamo di perfezionare ulteriormente gli esempi<br />

fin qui visti, in modo da realizzare un programma che permetta all’utente di caricare un vettore la<br />

cui dimensione è defin<strong>it</strong>a dall’utente stesso. Nell’esempio del paragrafo precedente è stata data la<br />

possibil<strong>it</strong>à di caricare i dati di un array da tastiera, ma la dimensione del vettore era defin<strong>it</strong>a come costante<br />

uguale a 5. Nulla vieta, però, di acquisire da tastiera la dimensione del vettore e di definire il<br />

vettore stesso solo dopo avere avuto a disposizione la dimensione scelta dall’utente.<br />

Esempio arrayVaria............................................................................................................<br />

Permettere l’inserimento da tastiera dei valori di un vettore di interi. Anche la dimensione<br />

del vettore è acquis<strong>it</strong>a da tastiera e deve essere inferiore a 20.<br />

Descrizione della soluzione<br />

L’algor<strong>it</strong>mo e il programma che viene presentato si discostano dal precedente soltanto perché la dimensione<br />

non è defin<strong>it</strong>a come costante, ma è letta da tastiera.<br />

Pseudocodifica<br />

//costanti<br />

dimensione massima = 20<br />

//struttura dati<br />

vettore di interi<br />

//input<br />

dimensione<br />

serie di n interi (n = dimensione)<br />

//output<br />

vettore di interi<br />

INIZIO<br />

leggi (dimensione)<br />

PER ogni elemento del vettore<br />

chiedi dato<br />

carica dato<br />

FINE PER<br />

PER ogni elemento del vettore<br />

scrivi (elemento)<br />

FINE PER<br />

FINE<br />

Codice<br />

1 #include <br />

2 using namespace std;<br />

arrayVaria.cpp


3<br />

4 //INIZIO<br />

5 int main ()<br />

6 {<br />

7 <strong>con</strong>st int MAX = 20; //dimensione massima per il vettore<br />

8 int dim;<br />

9 int i;<br />

10<br />

11 //definisci il vettore<br />

12 int vett[MAX];<br />

13<br />

14 //acquisisci e <strong>con</strong>trolla la dimensione<br />

15 do<br />

16 {<br />

17 coutdim;<br />

19 }<br />

20 //<strong>con</strong>trolla il rispetto dei lim<strong>it</strong>i<br />

21 while (dim < 1 | dim > MAX);<br />

22<br />

23 //salta una riga<br />

24 cout


180<br />

Sezione 4 - Strutture dei dati<br />

Analisi del codice<br />

Alla riga 7 viene defin<strong>it</strong>a la costante intera MAX, che rappresenta la dimensione massima per il vettore.<br />

Tale dimensione è posta pari a 20, così come richiesto dal testo del problema. Alla riga 8 è<br />

defin<strong>it</strong>a la variabile dim, in cui viene memorizzata la dimensione effettiva del vettore inser<strong>it</strong>a da tastiera.<br />

Alla riga 12 viene defin<strong>it</strong>o il vettore di dimensione MAX, di cui verranno utilizzate soltanto le prime<br />

dim posizioni.<br />

Alle righe 17 e 18 viene rispettivamente richiesto e acquis<strong>it</strong>o il valore di dim; le elaborazioni successive<br />

del vettore fanno riferimento solo a questo valore, come si può vedere alle righe 26 e 35.<br />

Alla riga 21 viene esegu<strong>it</strong>o un <strong>con</strong>trollo sul valore dim inser<strong>it</strong>o da tastiera: soltanto se rientra tra i lim<strong>it</strong>i<br />

imposti dal problema (è cioè compreso tra 1 e MAX) l’elaborazione può procedere.<br />

Alla riga 24 viene immessa a video una riga vuota, per separare le istruzioni di acquisizione della dimensione<br />

dalla fase di caricamento e stampa dei dati del vettore. Tale fase è identica a quella già vista<br />

nell’esempio ArrayCarica.<br />

...........................................................................................................................................<br />

10.7 Matrici<br />

Nei paragrafi precedenti abbiamo visto come lavorare <strong>con</strong> array a una dimensione, vale a dire <strong>con</strong> array<br />

che hanno un unico indice di individuazione degli elementi che li compongono.<br />

È possibile, tuttavia, definire anche array a due o più dimensioni.<br />

Sol<strong>it</strong>amente, gli array a una dimensione prendono il nome di vettori, mentre gli array<br />

a due dimensioni sono detti matrici.<br />

Come già visto, un array a una dimensione è defin<strong>it</strong>o da un nome e da una dimensione, <strong>con</strong> una sintassi<br />

del tutto simile a quella riportata di segu<strong>it</strong>o.<br />

<strong>con</strong>st int dim = 4;<br />

int vettore[dim];<br />

Se, per esempio, è dato il vettore:<br />

avremo che l’elemento Vettore[2] <strong>con</strong>tiene il valore 11.<br />

Per definire una matrice, invece, occorre specificare due o più dimensioni.<br />

Una matrice è un insieme di dati dello stesso tipo organizzati in una griglia: ogni elemento<br />

che compone la matrice è individuato dall’indice di riga e dall’indice di colonna<br />

in cui l’elemento è posizionato.<br />

In <strong>C++</strong> la definizione della struttura di una matrice è analoga alla definizione di un array a una dimensione.<br />

Per esempio, se si scrive:<br />

int matrice[3][4]<br />

VETTORE<br />

Dati → 37 53 11 28<br />

Indice → 0 1 2 3


s’intende che la struttura di nome matrice è composta da 3 righe e 4 colonne, come mostrato nell’esempio<br />

che segue.<br />

Per elaborare un singolo elemento della matrice occorre specificare il numero di riga e il numero di<br />

colonna. Con riferimento alla matrice precedente, si può dire che 18 è <strong>con</strong>tenuto nella cella individuata<br />

da matrice[1][2].<br />

Esempio MatriceCarica .....................................................................................................<br />

Caricare i dati di una matrice di interi <strong>con</strong> numero di righe e numero di colonne non superiore<br />

a 20. Scrivere il <strong>con</strong>tenuto della matrice.<br />

Descrizione della soluzione<br />

Il lim<strong>it</strong>e di 20 è posto per non definire in memoria una struttura troppo ingombrante.<br />

Il programma è organizzato in tre parti. La prima parte serve per acquisire il numero di righe e il numero<br />

di colonne e per preparare la matrice.<br />

Quando viene acquis<strong>it</strong>o il numero di righe, viene <strong>con</strong>trollato che questo non ecceda il lim<strong>it</strong>e di 20:<br />

se ciò accade, il programma richiede di nuovo l’inserimento del dato e così succede per il numero delle<br />

colonne.<br />

La matrice è inizialmente defin<strong>it</strong>a come un array <strong>con</strong> dimensioni massime: solo dopo avere acquis<strong>it</strong>o<br />

il numero di righe e di colonne vengono defin<strong>it</strong>e le sue dimensioni effettive.<br />

La se<strong>con</strong>da parte <strong>con</strong>siste nel caricamento dei dati nella matrice. Vengono utilizzati due indici: i per<br />

le righe e j per le colonne. Per il caricamento si <strong>con</strong>sideri ogni riga della matrice come un vettore e<br />

si proceda come negli esempi del paragrafo precedente al caricamento del vettore attraverso una ripetizione<br />

enumerativa <strong>con</strong> l’indice j che va da 0 al numero di colonne – 1. Tale <strong>it</strong>erazione viene nidificata<br />

in una ripetizione più esterna che ripete l’operazione di acquisizione per tutte le righe della<br />

matrice, <strong>con</strong> l’indice i che varia da 0 al numero di righe – 1.<br />

Per la terza e ultima parte, la stampa della matrice, di nuovo si devono organizzare due cicli for uno<br />

interno all’altro: il più interno serve per “vis<strong>it</strong>are” gli elementi di una riga mentre l’esterno serve per<br />

ripetere tale operazione su tutte le righe. Occorre avere l’accortezza di scrivere gli elementi di una<br />

stessa riga senza andare a capo e di andare a capo solo alla fine della riga della matrice, cioè alla fine<br />

del ciclo for più interno.<br />

Pseudocodifica<br />

Righe<br />

Costante MAX = 20 //lim<strong>it</strong>e massimo per le dimensioni della matrice<br />

//struttura dati<br />

Matrice di interi<br />

//input<br />

Righe<br />

Colonne<br />

0<br />

1<br />

2<br />

7<br />

45<br />

11<br />

MATRICE<br />

37<br />

12<br />

53<br />

24<br />

18<br />

37<br />

0 1 2<br />

Colonne<br />

Un<strong>it</strong>à didattica 10 - Enumerazioni e array<br />

3<br />

81<br />

28<br />

3<br />

181


182<br />

Sezione 4 - Strutture dei dati<br />

Serie di numeri per caricare la matrice<br />

//output<br />

Matrice<br />

//variabili di lavoro<br />

i indice di riga<br />

j indice di colonna<br />

INIZIO<br />

//acquisisci numero delle righe<br />

RIPETI<br />

leggi (righe)<br />

//<strong>con</strong>trolla rispetto dei lim<strong>it</strong>i<br />

MENTRE righe < 1 OR righe > 20<br />

//acquisisci numero delle colonne<br />

RIPETI<br />

leggi (colonne)<br />

//<strong>con</strong>trolla rispetto dei lim<strong>it</strong>i<br />

MENTRE colonne < 1 OR colonne > 20<br />

//carica dati nella matrice<br />

PER i DA 0 A righe – 1<br />

PER j DA 0 A colonne – 1<br />

chiedi dato<br />

carica dato<br />

FINE PER<br />

FINE PER<br />

//vis<strong>it</strong>a la matrice<br />

PER i DA 0 A righe – 1<br />

PER j DA 0 A colonne – 1<br />

scrivi (matrice [i, j])<br />

FINE PER<br />

vai a capo<br />

FINE PER<br />

FINE<br />

Codice<br />

MatriceCarica.cpp<br />

1 #include <br />

2 #include <br />

3 using namespace std;<br />

4<br />

5 //INIZIO<br />

6 int main ()<br />

7 {<br />

8 <strong>con</strong>st int MAX = 20; //dimensione massima per la matrice<br />

9<br />

10 //definisci la matrice<br />

11 int mat[MAX][MAX];<br />

12 int righe;<br />

13 int colonne;


Un<strong>it</strong>à didattica 10 - Enumerazioni e array<br />

14 int i;<br />

15 int j;<br />

16<br />

17 //acquisisci numero delle righe<br />

18 do<br />

19 {<br />

20 cout


184<br />

Sezione 4 - Strutture dei dati<br />

Prova di esecuzione<br />

Analisi del codice<br />

Alla riga 11 viene defin<strong>it</strong>a la struttura della matrice, che viene identificata <strong>con</strong> il nome mat e per la<br />

quale è specificato il numero delle righe e delle colonne.<br />

Alle righe 20 e 21 viene acquis<strong>it</strong>o il numero di righe che compongono la matrice; le istruzioni di acquisizione<br />

sono inser<strong>it</strong>e all’interno di una ripetizione che serve per <strong>con</strong>trollare se il numero dig<strong>it</strong>ato<br />

rientra nei lim<strong>it</strong>i imposti (da 1 a 20).<br />

Alle righe 29 e 30 viene defin<strong>it</strong>o un processo analogo per l’acquisizione del numero di colonne.<br />

Alla riga 38 inizia il caricamento dei dati nella matrice: il primo ciclo for serve per ripetere le operazioni<br />

sottostanti per tutte le righe.<br />

Alla riga 40 viene defin<strong>it</strong>o il ciclo for più interno, che permette di “muoversi” all’interno di una riga,<br />

e per ogni elemento della riga viene acquis<strong>it</strong>o il dato da inserire come indicato alle righe 43 e 44.<br />

In particolare, alla riga 44, il dato letto da tastiera viene assegnato a una “casella” della matrice di nome<br />

mat individuata dai due indici i e j.<br />

Alla riga 50 inizia la scr<strong>it</strong>tura dei dati della matrice: l’impostazione generale del codice successivo è<br />

analoga a quella precedente relativa al caricamento dei dati: la differenza principale è che, nel ciclo<br />

for più interno, l’istruzione di scr<strong>it</strong>tura indicata alla riga 56 permette di scrivere i dati uno di segu<strong>it</strong>o<br />

all’altro, mentre alla riga 59 è indicata l’istruzione per andare a capo. Tale istruzione non rientra<br />

nel ciclo for interno, ma fa parte del ciclo for esterno, così che essa venga esegu<strong>it</strong>a solo alla fine di<br />

ogni riga e venga ripetuta per ogni riga.<br />

...........................................................................................................................................<br />

Allo scopo di acquisire dimestichezza <strong>con</strong> i problemi relativi al trattamento delle matrici, viene presentato<br />

un se<strong>con</strong>do esempio.<br />

Esempio TotaleRighe..........................................................................................................<br />

Caricare i dati di una matrice di interi <strong>con</strong> numero di righe e numero di colonne non superiore<br />

a 20. Scrivere il <strong>con</strong>tenuto della matrice e indicare per ogni riga il totale dei valori in<br />

essa <strong>con</strong>tenuti.<br />

Descrizione della soluzione<br />

La prima parte della richiesta del problema è identica a quella dell’esempio precedente; si tratta solo<br />

di intervenire nella parte relativa alla visualizzazione del <strong>con</strong>tenuto della matrice e inserire in questa<br />

parte le istruzioni per comunicare i totali di riga.


Si definisca una variabile totRiga in cui accumulare i valori di ciascuna riga e, <strong>con</strong> riferimento al<br />

segmento di codice relativo alla scr<strong>it</strong>tura della matrice, si inseriscano le istruzioni che servono per:<br />

1. inizializzare totRiga;<br />

2. sommare in totRiga i valori di una riga della matrice;<br />

3. scrivere totRiga.<br />

Pseudocodifica<br />

Costante Max = 20 //lim<strong>it</strong>e massimo per le dimensioni della matrice<br />

//struttura dati<br />

matrice di interi<br />

//input<br />

Righe<br />

Colonne<br />

Serie di numeri per caricare la matrice<br />

//output<br />

matrice<br />

totaleRiga<br />

//variabili di lavoro<br />

i indice di riga<br />

j indice di colonna<br />

INIZIO<br />

. . . .<br />

//parte uguale all’esempio precedente<br />

. . . .<br />

//vis<strong>it</strong>a la matrice<br />

PER i DA 0 A righe – 1<br />

totRiga ← 0<br />

PER j DA 0 A colonne – 1<br />

scrivi (matrice [i, j])<br />

totRiga ← totRiga + mat [i, j]<br />

FINE PER<br />

scrivi (totRiga) e vai a capo<br />

FINE PER<br />

FINE<br />

Codice<br />

TotaleRighe.cpp<br />

1 #include <br />

2 #include <br />

3 using namespace std;<br />

4<br />

5 //INIZIO<br />

6 int main ()<br />

7 {<br />

8 <strong>con</strong>st int MAX = 20; //dimensione massima per la matrice<br />

9<br />

10 //definisci la matrice<br />

11 int mat[MAX][MAX];<br />

12 int righe;<br />

Un<strong>it</strong>à didattica 10 - Enumerazioni e array<br />

185


186<br />

Sezione 4 - Strutture dei dati<br />

13 int colonne;<br />

14 int i;<br />

15 int j;<br />

16 int totRiga;<br />

17<br />

18 //acquisisci numero delle righe<br />

19 do<br />

20 {<br />

21 cout


68 cout


188<br />

Sezione 4 - Strutture dei dati<br />

Lo sviluppo top-down del programma<br />

è illustrato nella figura a destra. <br />

Codice<br />

Chiedi<br />

dimensione<br />

funzioniArray.cpp<br />

main<br />

Leggi<br />

vettore<br />

1 #include <br />

2 using namespace std;<br />

3<br />

4 <strong>con</strong>st int MAX = 20; //dimensione massima per il vettore<br />

5 int dim; //dimensione acquis<strong>it</strong>a da tastiera<br />

6 int i;<br />

7<br />

8 //funzione per leggere la dimensione<br />

9 int chiediDim (int &d)<br />

10 {<br />

11 //acquisisci e <strong>con</strong>trolla la dimensione<br />

12 do<br />

13 {<br />

14 //chiedi e leggi la dimensione<br />

15 coutd;<br />

17 }<br />

18 //<strong>con</strong>trolla il rispetto dei lim<strong>it</strong>i<br />

19 while (d < 1 | d > MAX);<br />

20 return d;<br />

21 }<br />

22<br />

23 //funzione per leggere il vettore<br />

24 void leggiVettore (int v[], int d)<br />

25 {<br />

26 for (i=0; i


46 //INIZIO<br />

47 int main ()<br />

48 {<br />

49 //definisci il vettore <strong>con</strong> dimensione MAX<br />

50 int vett[MAX];<br />

51<br />

52 //richiama la funzione per acquisire la dimensione del vettore<br />

53 dim = chiediDim (dim);<br />

54<br />

55 //salta una riga<br />

56 cout


190<br />

Sezione 4 - Strutture dei dati<br />

Esercizi<br />

Un<strong>it</strong>à didattica 10<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), calcolare<br />

la somma dei valori <strong>con</strong>tenuti nel vettore.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), azzerare<br />

il primo elemento del vettore.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), azzerare<br />

l’ultimo elemento del vettore.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), azzerare<br />

l’elemento di posto n, <strong>con</strong> n dato in input.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), calcolare<br />

la media dei valori <strong>con</strong>tenuti nel vettore.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), calcolare<br />

la media dei valori <strong>con</strong>tenuti nel vettore. Successivamente scrivere gli elementi del vettore che hanno<br />

valore superiore alla media.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), calcolare<br />

la media dei valori <strong>con</strong>tenuti nel vettore. Successivamente <strong>con</strong>tare gli elementi del vettore che hanno<br />

valore superiore alla media.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), calcolare<br />

la media dei valori <strong>con</strong>tenuti nel vettore. Successivamente creare un nuovo vettore che <strong>con</strong>tenga gli<br />

elementi del vettore iniziale che hanno valore superiore alla media.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), scrivere<br />

gli elementi pari <strong>con</strong>tenuti nel vettore.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), scrivere<br />

gli elementi di posto pari <strong>con</strong>tenuti nel vettore.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), creare<br />

un nuovo vettore che <strong>con</strong>tenga gli elementi pari del vettore iniziale.<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), inserire<br />

“in testa” al vettore un nuovo elemento. Scrivere il vettore iniziale e il vettore modificato. (Suggerimenti:<br />

poiché deve essere inser<strong>it</strong>o un nuovo elemento il vettore deve essere defin<strong>it</strong>o <strong>con</strong> dimensione pari a<br />

d + 1; “in testa” al vettore vuol dire al posto 0 del vettore; per fare spazio al nuovo elemento, i dati preesistenti<br />

devono essere spostati di un posto a destra).<br />

Dopo aver caricato in memoria un vettore di interi <strong>con</strong> dimensione d (<strong>con</strong> d inser<strong>it</strong>o da tastiera), inserire<br />

“in coda” al vettore un nuovo elemento. Scrivere il vettore iniziale e il vettore modificato. (Suggerimenti:<br />

poiché deve essere inser<strong>it</strong>o un nuovo elemento il vettore deve essere defin<strong>it</strong>o <strong>con</strong> dimensione pari a d<br />

+ 1; “In coda” al vettore vuol dire dopo l’ultimo elemento del vettore; per fare spazio al nuovo elemento,<br />

basta aumentare la dimensione iniziale).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!