Programmare con C++ - HOEPLI.it
Programmare con C++ - HOEPLI.it
Programmare con C++ - HOEPLI.it
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).