Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Cesare Rota
www.hoepli.it
ISBN 978-88-203-4248-7
Ristampa:
Realizzazione editoriale
ART Servizi Editoriali S.p.A. - Bologna
www.art.bo.it
Coordinamento editoriale: Monica Monari
Redazione: Barbara Megali
Progetto grafico: Marina Baldisserri
Impaginazione: Sonia Bertusi
Stampa: Art Grafiche Franco Battaia S.r.l. - Zibido San Giacomo (MI)
Printed in Italy
Preliminari.qxd 15-01-2009 12:19 Pagina 3
Indice
3
Preliminari.qxd 15-01-2009 12:19 Pagina 4
Indice
4
Preliminari.qxd 23-01-2009 12:34 Pagina 5
Presentazione
Il presente volume espone, in modo chiaro ed efficace, le caratteristiche del linguaggio C++
e ha il duplice scopo di descriverne la sintassi e di evidenziarne le potenzialit.
In particolare il libro:
Il primo obiettivo si realizza tramite numerosi esempi presenti nel testo, che forniscono
chiare indicazioni sulle caratteristiche sintattiche del linguaggio. Per quanto riguarda le
basi teoriche sono stati messi in rilievo i fondamenti dei cinque argomenti di base per la
programmazione: la rappresentazione dei dati, le strutture di controllo utilizzabili nella
costruzione di un algoritmo, le strutture dei dati, la programmazione orientata agli og-
getti e la gestione dei file.
1 La sezione Premesse sviluppa gli argomenti della codifica binaria delle informazioni.
2 In Primi elementi di programmazione vengono descritti i concetti di variabile,
costante e tipi di dato, le operazioni di input/output da console e gli operatori arit-
metici.
3 Nella sezione Organizzazione degli algoritmi viene introdotta la nozione di algorit-
mo e sono descritte le principali strutture di controllo sia in pseudocodifica sia in C++.
4 Nella sezione Strutture dei dati vengono definite le principali strutture statiche dei
dati.
5 Lintera sezione Classi e oggetti dedicata alle nozioni fondamentali della OOP e
vengono presentati i concetti principali della programmazione orientata agli ogget-
ti quali lincapsulamento, il polimorfismo e lereditariet.
6 La sezione Operare con gli archivi spiega le nozioni di base per la definizione de-
gli archivi di dati.
7 La sezione Le eccezioni descrive gli accorgimenti essenziali per la realizzazione di
applicazioni robuste.
5
Preliminari.qxd 15-01-2009 12:19 Pagina 6
Presentazione
di facile lettura, che aiuta lo studente a concentrarsi, di volta in volta, su un singolo ele-
mento del discorso. Tutti i concetti presentati sono accompagnati da un esempio, che
mette in pratica quanto esposto. Ogni esempio contiene un listato di codice, una figura
che illustra una prova di esecuzione del codice proposto e lanalisi dettagliata del codice
stesso; questultima parte dellesempio presenta una descrizione dettagliata degli aspetti
pi significativi del linguaggio C++ presenti nellesempio.
Per ogni sezione sono indicati gli obiettivi generali che si vogliono raggiungere, mentre
nella prima pagina di ogni Unit didattica specificato per lo studente Che cosa impare-
rai a fare e Che cosa dovrai studiare. In concreto, gli obiettivi generali presentati alli-
nizio di ogni modulo descrivono le capacit che lo studente deve acquisire. Le voci Che
cosa imparerai a fare e Che cosa dovrai studiare indicano rispettivamente le compe-
tenze e le conoscenze che devono essere apprese dallalunno.
Considerando lampiezza della trattazione, il libro include tutti i contenuti dei program-
mi didattici tradizionalmente affrontati nelle classi terze degli istituti tecnici.
In particolare pu essere adottato nella classe terza degli Istituti Tecnici Industriali con in-
dirizzo ABACUS o informatica industriale, in quella degli Istituti Tecnici Commerciali
con indirizzo MERCURIO o programmatori, nonch in quella dei Licei scientifici tec-
nologici.
LAutore
6
S04UD10.qxd 15-01-2009 9:21 Pagina 167
Sezione 4
Strutture dei dati
Obiettivi
generali Definire insiemi di dati numerabili
Saper utilizzare schemi logici per organizzare insiemi
complessi di dati
Costruire tabelle di dati omogenei
Manipolare stringhe di caratteri
Raggruppare dati di tipo diverso
10
Unit didattica
Enumerazioni e array
Unit didattica
Enumerazioni e array
10
10.1 Introduzione
Finora abbiamo visto i tipi di dato pi comuni e i pi facili da utilizzare in C++, cio i tipi predefini-
ti: int, double, bool ecc.
In C++, per, si possono anche utilizzare tipi definiti dal programmatore. Tali nuovi tipi, per poter
essere utilizzati, vanno inseriti nella dichiarazione delle variabili secondo la sintassi consueta:
tipo variabile;
Tutti i dati che compaiono in un programma possiedono uno e un solo tipo, e possono essere di ti-
po semplice oppure aggregati in modo complesso.
I tipi di dato semplici sono classificati secondo lo schema gerarchico riportato di seguito.
semplici
reali ordinali
I tipi semplici possono essere float o double, oppure di tipo ordinale; i tipi ordinali possono es-
sere definiti dal programmatore attraverso i tipi enumerativi, oppure possono appartenere ai tipi or-
dinali predefiniti int, bool, char.
Il tipo ordinale si chiama cos perch descrive un insieme finito e ordinato di valori,
che possono essere associati a numeri interi positivi.
I tipi ordinali predefiniti e i tipi float e double sono gi stati presentati e utilizzati in prece-
denza.
169
S04UD10.qxd 15-01-2009 9:21 Pagina 170
Il nome dellenumerazione pu essere utilizzato per dichiarare variabili di tale tipo, in maniera ana-
loga alle dichiarazioni di tipo viste in precedenza. Per esempio, potremo scrivere:
controlli check;
La variabile check pu assumere uno qualsiasi dei valori della lista dei controlli definita in prece-
denza. Per esempio, si pu scrivere:
check = gomme;
oppure
Si deve ricordare che a ognuno dei valori di una variabile enumerativa corrisponde il numero dordi-
ne che esso occupa allinterno della definizione dellenumerazione.
Esempio Enumera...............................................................................................................
Scrivere un programma che utilizza una variabile di tipo controlli.
Codice
Enumera.cpp
1 #include <iostream>
2 using namespace std;
3
4 //INIZIO
5 int main ()
6 {
7 //definisci l'enumerazione
8 enum controlli {freni, fari, gomme, olio, tergicristalli, carburante};
9
10 //definisci la variabile di tipo enumerativo
11 controlli check;
12
13 //assegna un valore alla variabile
14 check = gomme;
15
16 //esegui un confronto
17 if (check == gomme) cout << "controlla fari";
18
19 //scrivi il numero d'ordine del valore della variabile enumerativa
20 cout << "\nNumero d'ordine di gomme = " << check;
21
170
S04UD10.qxd 15-01-2009 9:21 Pagina 171
22 //fine programma
23 cout << "\n\nFine ";
24 system ("pause");
25 return 0;
26 }
Prova di esecuzione
Fino a questo momento abbiamo visto come sia possibile definire e utilizzare in C++ tipi di dati che
abbiamo definito semplici.
Se ci soffermiamo, per, a considerare qualche esempio un po pi complesso di quelli presentati fi-
no a ora ci rendiamo rapidamente conto che non affatto raro incontrare la necessit di gestire elen-
chi di dati.
Pensiamo per esempio a un elenco di invitati a una festa, alla lista degli studenti di una classe o agli
iscritti a una gara. In questi tre esempi siamo di fronte a un dato (cognome e nome) sempre dello stes-
so tipo che si ripete pi volte.
Nei prossimi paragrafi presenteremo le strutture messe a disposizione da C++ per gestire non pi da-
ti singoli, bens strutture di dati che raggruppano in ununica variabile dati diversi.
171
S04UD10.qxd 15-01-2009 9:21 Pagina 172
Prendiamo, per esempio, lelenco degli studenti di una classe, cos come appare sul registro.
1 Abbiati Mario
2 Bonaldi Piera
3 Casati Luigi
4 Esposito Salvatore
.. ...
.. ...
24 Vivaldi Giuseppe
A ogni studente associato un numero di posizione e ogni numero individua uno studente.
In questo esempio, ogni elemento del vettore di tipo stringa (per contenere il cognome e nome del-
lo studente) e ogni elemento individuato da un numero, detto indice. La dimensione del vettore 24.
Oppure consideriamo un quadrilatero irregolare in cui ogni lato ha una misura diversa.
4
3
1 2
Ogni elemento dellesempio precedente un dato di tipo numerico (la misura del lato) e per ogni
misura presente un indice che il numero del lato; la dimensione 4.
Riprendendo gli esempi del paragrafo precedente, per definire il vettore che contiene i nomi dei 24
studenti di una classe possiamo scrivere:
int dim = 24;
string Studenti [dim];
172
S04UD10.qxd 15-01-2009 9:21 Pagina 173
buona norma definire la dimensione del vettore come variabile (nel nostro caso: dim): in questo
modo eventuali variazioni della dimensione richiedono un solo intervento nel codice.
Si ricordi che lintervallo dei valori possibili per lindice di un vettore parte da 0 e arri-
va fino a dimensione 1.
In base a questa regola, nellesempio dellelenco degli studenti il primo studente (Abbiati Mario)
individuato dallindice 0 e lultimo (Vivaldi Giuseppe) dallindice 23.
Quando si lavora con una variabile di tipo vettore, occorre sempre, allinterno del programma, indi-
care sia il nome della variabile sia lindice che individua la componente del vettore che vogliamo trat-
tare; per esempio, per assegnare al primo elemento del vettore la misura del primo lato, si scrive:
misure[0] = 15
Si noti che lindice va indicato racchiuso tra parentesi quadre dopo il nome della variabile.
Per assegnare a ciascun lato la misura corrispondente, si scrive:
misure[1] = 8
misure[2] = 7
misure[3] = 16
Dal punto di vista concettuale, possiamo pensare che in memoria presente una struttura di questo
tipo:
VETTORE
misure 15 8 7 16
indice 0 1 2 3
Per sommare le misure del primo e del quarto lato, si utilizza la seguente istruzione:
Spesso nasce lesigenza di accedere a tutti gli elementi di un vettore o, come si usa dire, di visitare
tutti gli elementi del vettore per poter eseguire una elaborazione su ciascuno di essi. In questo caso,
torna molto utile ricorrere alla struttura della ripetizione con contatore: attraverso di essa si utilizza
un indice che assume tutti i valori che vanno da 0 a dimensione 1 del vettore e che serve per riferir-
si a ciascun elemento.
173
S04UD10.qxd 15-01-2009 9:21 Pagina 174
Pseudocodifica
//struttura dati
vettore delle misure dei lati
//input
//tutti i dati sono definiti allinterno del programma
//output
perimetro
//variabili di lavoro
i //indice per ciclo for
INIZIO
//inizializza il vettore delle misure
misure[0] 15
misure[1] 8
misure[2] 7
misure[3] 16
//inizializza perimetro
perimetro 0
//visita il vettore
PER i DA 0 A dim 1
perimetro = perimetro + misure[i] //somma le misure ad 1 ad 1
FINE PER
scrivi (Perimetro)
FINE
Codice
Perimetro.cpp
1 #include <iostream>
2 using namespace std;
3
4 //INIZIO
5 int main ()
6 {
7 //struttura del vettore
8 const int dim=4;
9 int misure[dim];
10
11 int i; //contatore per ciclo for
12 int perim; //dato di output
13
14 //inizializza il vettore misure
174
S04UD10.qxd 15-01-2009 9:21 Pagina 175
15 misure[0] = 15;
16 misure[1] = 8;
17 misure[2] = 7;
18 misure[3] = 16;
19
20 //inizializza perimetro
21 perim = 0;
22
23 //visita il vettore
24 for(i=0; i<dim; i++)
25 {
26 perim = perim + misure[i]; //somma le misure ad 1 ad 1
27 }
28
29 //scrivi perimetro
30 cout<<"Perimetro = "<<perim;
31
32 //fine programma
33 cout << "\n\nFine ";
34 system ("pause");
35 return 0;
36 }
Prova di esecuzione
Le istruzioni di inizializzazione usate nellesempio precedente possono essere sostituite da una scrittu-
ra pi compatta. Nel codice Perimetro.cpp le righe da 15 a 18 servono per assegnare i valori iniziali
alle componenti del vettore misure. Le riportiamo di seguito.
misure[0] = 15;
misure[1] = 8;
misure[2] = 7;
misure[3] = 16;
Loperazione precedente pu essere realizzata assegnando direttamente i valori delle componenti in fa-
se di definizione del vettore. Quindi le sette righe di codice
7 const int dim=4;
8 int misure[dim];
175
S04UD10.qxd 15-01-2009 9:21 Pagina 176
. . .
14 //inizializza il vettore misure
15 misure[0] = 15;
15 misure[1] = 8;
16 misure[2] = 7;
17 misure[3] = 16;
18 . . .
...........................................................................................................................................
Pseudocodifica
//costanti
dimensione = 5
//struttura dati
vettore di 5 interi
//input
serie di 5 numeri
//output
vettore di 5 interi
INIZIO
PER ogni elemento del vettore
richiedi dato
carica dato
FINE PER
PER ogni elemento del vettore
scrivi (elemento)
FINE PER
FINE
176
S04UD10.qxd 15-01-2009 9:21 Pagina 177
Codice
arrayCarica.cpp
1 #include <iostream>
2 using namespace std;
3
4 //INIZIO
5 int main ()
6 {
7 //definisci il vettore di 5 elementi
8 const int dim = 5;
9
10 //definisci la struttura dati
11 int vett [dim];
12
13 //ciclo for x caricare vettore
14 for (int i=0; i<dim; i++)
15 {
16 //richiedi un dato
17 cout<<"Inserisci un dato ";
18 cin>>vett[i];
19 }
20
21 cout<<"\nContenuto del vettore: ";
22
23 //visita il vettore
24 for (int i=0; i<dim; i++)
25 {
26 cout<<" "<<vett[i]; //scrivi elemento di posto i
27 }
28 cout<<"\nVettore visualizzato";
29
30 //fine programma
31 cout << "\n\nFine ";
32 system ("pause");
33 return 0;
34 }
Prova di esecuzione
177
S04UD10.qxd 15-01-2009 9:21 Pagina 178
Alla riga 18 il dato inserito da tastiera viene assegnato allelemento vett con indice i, dove i, gra-
zie al ciclo for, assume, di volta in volta, i valori che vanno da 0 a 4.
Alla riga 24 la scrittura degli elementi del vettore viene realizzata con un secondo ciclo for.
Alla riga 26 ogni elemento del vettore viene scritto sulla stessa riga dei precedenti. Solo alla fine del
ciclo for, alla riga 28, si va a capo per scrivere una nuova riga di messaggio.
...........................................................................................................................................
Esempio arrayVaria............................................................................................................
Permettere linserimento da tastiera dei valori di un vettore di interi. Anche la dimensione
del vettore acquisita da tastiera e deve essere inferiore a 20.
Pseudocodifica
//costanti
dimensione massima = 20
//struttura dati
vettore di interi
//input
dimensione
serie di n interi (n = dimensione)
//output
vettore di interi
INIZIO
leggi (dimensione)
PER ogni elemento del vettore
chiedi dato
carica dato
FINE PER
PER ogni elemento del vettore
scrivi (elemento)
FINE PER
FINE
Codice
arrayVaria.cpp
1 #include <iostream>
2 using namespace std;
178
S04UD10.qxd 15-01-2009 9:21 Pagina 179
3
4 //INIZIO
5 int main ()
6 {
7 const int MAX = 20; //dimensione massima per il vettore
8 int dim;
9 int i;
10
11 //definisci il vettore
12 int vett[MAX];
13
14 //acquisisci e controlla la dimensione
15 do
16 {
17 cout<<"\nInserisci la dimensione (max = 20) "
18 cin>>dim;
19 }
20 //controlla il rispetto dei limiti
21 while (dim < 1 | dim > MAX);
22
23 //salta una riga
24 cout<<"\n";
25
26 for (i=0; i<dim; i++)
27 {
28 //richiedi un dato e caricalo nel vettore
29 cout<<"Inserisci un dato ";
30 cin>>vett[i];
31 }
32
33 cout<<"\nContenuto del vettore: ";
34 //visita il vettore
35 for (i=0; i<dim; i++)
36 {
37 cout<<" "<<vett[i];
38 }
39 cout<<"\nVettore visualizzato";
40
41 //fine programma
42 cout << "\n\nFine ";
43 system ("pause");
44 return 0;
45 }
Prova di esecuzione
179
S04UD10.qxd 15-01-2009 9:21 Pagina 180
10.7 Matrici
Nei paragrafi precedenti abbiamo visto come lavorare con array a una dimensione, vale a dire con ar-
ray che hanno un unico indice di individuazione degli elementi che li compongono.
possibile, tuttavia, definire anche array a due o pi dimensioni.
Solitamente, gli array a una dimensione prendono il nome di vettori, mentre gli array
a due dimensioni sono detti matrici.
Come gi visto, un array a una dimensione definito da un nome e da una dimensione, con una sin-
tassi del tutto simile a quella riportata di seguito.
VETTORE
Dati 37 53 11 28
Indice 0 1 2 3
Una matrice un insieme di dati dello stesso tipo organizzati in una griglia: ogni ele-
mento che compone la matrice individuato dallindice di riga e dallindice di co-
lonna in cui lelemento posizionato.
In C++ la definizione della struttura di una matrice analoga alla definizione di un array a una di-
mensione. Per esempio, se si scrive:
int matrice[3][4]
180
S04UD10.qxd 15-01-2009 9:21 Pagina 181
sintende che la struttura di nome matrice composta da 3 righe e 4 colonne, come mostrato nel-
lesempio che segue.
MATRICE
0 7 37 24 3
Righe 1 45 12 18 81
2 11 53 37 28
0 1 2 3
Colonne
Per elaborare un singolo elemento della matrice occorre specificare il numero di riga e il numero di
colonna. Con riferimento alla matrice precedente, si pu dire che 18 contenuto nella cella indivi-
duata da matrice[1][2].
Pseudocodifica
Costante MAX = 20 //limite massimo per le dimensioni della matrice
//struttura dati
Matrice di interi
//input
Righe
Colonne
181
S04UD10.qxd 15-01-2009 9:21 Pagina 182
INIZIO
//acquisisci numero delle righe
RIPETI
leggi (righe)
//controlla rispetto dei limiti
MENTRE righe < 1 OR righe > 20
//visita la matrice
PER i DA 0 A righe 1
PER j DA 0 A colonne 1
scrivi (matrice [i, j])
FINE PER
vai a capo
FINE PER
FINE
Codice
MatriceCarica.cpp
1 #include <iostream>
2 #include <iomanip>
3 using namespace std;
4
5 //INIZIO
6 int main ()
7 {
8 const int MAX = 20; //dimensione massima per la matrice
9
10 //definisci la matrice
11 int mat[MAX][MAX];
12 int righe;
13 int colonne;
182
S04UD10.qxd 15-01-2009 9:21 Pagina 183
14 int i;
15 int j;
16
17 //acquisisci numero delle righe
18 do
19 {
20 cout<<"\nInserisci il numero righe (max="<<MAX<<") ";
21 cin>>righe;
22 }
23 //controlla il rispetto dei limiti
24 while (righe < 1 | righe > MAX);
25
26 //acquisisci numero delle colonne
27 do
28 {
29 cout<<"\nInserisci il numero colonne (max="<<MAX<<") ";
30 cin>>colonne;
31 }
32 //controlla il rispetto dei limiti
33 while (colonne < 1 | colonne > 20);
34
35 cout<<"\n";
36
37 //carica dati nella matrice
38 for (i=0; i<righe; i++) //per ogni riga della matrice
39 {
40 for (j=0; j<colonne; j++) //per ogni elemento della riga
41 {
42 //richiedi un dato e caricalo nella matrice
43 cout<<"Inserisci un dato ";
44 cin>>mat [i][j];
45 }
46 }
47
48 cout<<"\nContenuto della matrice: \n";
49 //visita la matrice
50 for (i=0; i<righe; i++) //per ogni riga della matrice
51 {
52 for (j=0; j<colonne; j++) //per ogni elemento della riga
53 {
54 //scrivi gli elementi di una riga
55 //uno di seguito all'altro, con ingombro pari a 6 caratteri
56 cout<<setw(6)<<mat[i][j];
57 }
58 //alla fine della riga va a capo
59 cout<<"\n";
60 }
61
62 cout<<"\nmatrice visualizzata";
63
64 //fine programma
65 cout << "\n\nFine ";
66 system ("pause");
67 return 0;
68 }
183
S04UD10.qxd 15-01-2009 9:21 Pagina 184
Prova di esecuzione
Allo scopo di acquisire dimestichezza con i problemi relativi al trattamento delle matrici, viene pre-
sentato un secondo esempio.
Esempio TotaleRighe..........................................................................................................
Caricare i dati di una matrice di interi con numero di righe e numero di colonne non supe-
riore a 20. Scrivere il contenuto della matrice e indicare per ogni riga il totale dei valori in
essa contenuti.
184
S04UD10.qxd 15-01-2009 9:21 Pagina 185
Si definisca una variabile totRiga in cui accumulare i valori di ciascuna riga e, con riferimento al
segmento di codice relativo alla scrittura della matrice, si inseriscano le istruzioni che servono per:
1. inizializzare totRiga;
2. sommare in totRiga i valori di una riga della matrice;
3. scrivere totRiga.
Pseudocodifica
Costante Max = 20 //limite massimo per le dimensioni della matrice
//struttura dati
matrice di interi
//input
Righe
Colonne
Serie di numeri per caricare la matrice
//output
matrice
totaleRiga
//variabili di lavoro
i indice di riga
j indice di colonna
INIZIO
....
//parte uguale allesempio precedente
....
//visita la matrice
PER i DA 0 A righe 1
totRiga 0
PER j DA 0 A colonne 1
scrivi (matrice [i, j])
totRiga totRiga + mat [i, j]
FINE PER
scrivi (totRiga) e vai a capo
FINE PER
FINE
Codice
TotaleRighe.cpp
1 #include <iostream>
2 #include <iomanip>
3 using namespace std;
4
5 //INIZIO
6 int main ()
7 {
8 const int MAX = 20; //dimensione massima per la matrice
9
10 //definisci la matrice
11 int mat[MAX][MAX];
12 int righe;
185
S04UD10.qxd 15-01-2009 9:21 Pagina 186
13 int colonne;
14 int i;
15 int j;
16 int totRiga;
17
18 //acquisisci numero delle righe
19 do
20 {
21 cout<<"\nInserisci il numero righe (max="<<MAX<<") ";
22 cin>>righe;
23 }
24 //controlla il rispetto dei limiti
25 while (righe < 1 | righe > MAX);
26
27 //acquisisci il numero delle colonne
28 do
29 {
30 cout<<"\nInserisci il numero colonne (max="<<MAX<<") ";
31 cin>>colonne;
32 }
33 //controlla il rispetto dei limiti
34 while (colonne < 1 | colonne > MAX);
35
36 //salta una riga
37 cout<<"\n";
38
39 //carica la matrice
40 for (i=0; i<righe; i++) //per ogni riga della matrice
41 {
42 for (j=0; j<colonne; j++) //per ogni elemento della riga
43 {
44 //richiedi un dato e caricalo nella matrice
45 cout<<"Inserisci un dato ";
46 cin>>mat [i][j];
47 }
48 }
49
50 cout<<"\nContenuto della matrice: \n";
51 cout<<setw(14)<<"Totale"<<endl;
52
53 //visita la matrice
54 for (i=0; i<righe; i++) //per ogni riga della matrice
55 {
56 totRiga = 0;
57 for (j=0; j<colonne; j++) //per ogni elemento della riga
58 {
59 //scrivi gli elementi di una riga
60 //uno di seguito all'altro, con ingombro pari a 4 caratteri
61 cout<<setw(4)<<mat[i][j];
62
63 //accumula i valori in totRiga
64 totRiga = totRiga + mat[i][j];
65 }
66 //alla fine della riga scrivi il totale
67 //e vai a capo
186
S04UD10.qxd 15-01-2009 9:21 Pagina 187
68 cout<<setw(6)<<totRiga<<endl;
69 }
70
71 cout<<"\nMatrice visualizzata";
72
73 //fine programma
74 cout << "\n\nFine ";
75 system ("pause");
76 return 0;
77 }
Prova di esecuzione
Esempio funzioniArray........................................................................................................
Acquisire da tastiera un vettore di dimensione non superiore a 20 righe e stamparlo. Per la
realizzazione del programma utilizzare tre funzioni, i cui nomi sono chiediDim, leggi-
Vettore, scriviVettore.
187
S04UD10.qxd 15-01-2009 9:21 Pagina 188
Codice
funzioniArray.cpp
1 #include <iostream>
2 using namespace std;
3
4 const int MAX = 20; //dimensione massima per il vettore
5 int dim; //dimensione acquisita da tastiera
6 int i;
7
8 //funzione per leggere la dimensione
9 int chiediDim (int &d)
10 {
11 //acquisisci e controlla la dimensione
12 do
13 {
14 //chiedi e leggi la dimensione
15 cout<<"\nInserisci la dimensione ";
16 cin>>d;
17 }
18 //controlla il rispetto dei limiti
19 while (d < 1 | d > MAX);
20 return d;
21 }
22
23 //funzione per leggere il vettore
24 void leggiVettore (int v[], int d)
25 {
26 for (i=0; i<d; i++)
27 {
28 //richiedi un dato e caricalo nel vettore
29 cout<<"Inserisci un dato ";
30 cin>>v[i];
31 }
32 }
33
34 //funzione per scrivere il vettore
35 void scriviVettore (int v[], int d)
36 {
37 cout<<"\nContenuto del vettore: ";
38 //visita il vettore
39 for (i=0; i<d; i++)
40 {
41 cout<<" "<<v[i];
42 }
43 cout<<"\nVettore visualizzato";
44 }
45
188
S04UD10.qxd 15-01-2009 9:21 Pagina 189
46 //INIZIO
47 int main ()
48 {
49 //definisci il vettore con dimensione MAX
50 int vett[MAX];
51
52 //richiama la funzione per acquisire la dimensione del vettore
53 dim = chiediDim (dim);
54
55 //salta una riga
56 cout<<"\n";
57
58 //richiama la funzione leggiVettore
59 leggiVettore(vett,dim);
60
61 //richiama la funzione scriviVettore
62 scriviVettore(vett,dim);
63
64 //fine programma
65 cout << "\n\nFine ";
66 system ("pause");
67 return 0;
68 }
Prova di esecuzione
Risulta del tutto uguale a quella dellesempio ArrayVaria.
Nel caso in cui si voglia lavorare con array a pi di una dimensione i richiami alla funzione leggiVetto-
re (che in questo caso si pu chiamare leggiMatrice) mantengono la stessa sintassi indicata nelle-
sempio, con largomento privo di dimensioni, mentre nellintestazione della funzione il parametro che si ri-
ferisce alla struttura multidimensionale DEVE contenere la specifica di tutte le dimensioni tranne la prima.
Per esempio, se si vuole lavorare sulla matrice quadrata matr di ordine MAX, per richiamare la funzione
leggiMatrice si deve scrivere listruzione che segue.
leggiMatrice(matr, . . . );
mentre lintestazione della funzione assume la forma indicata di seguito.
void scriviMatrice (int m[][MAX], . . . )
...........................................................................................................................................
189
S04UD10.qxd 15-01-2009 9:21 Pagina 190
Esercizi
Unit didattica 10
1 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), calco-
lare la somma dei valori contenuti nel vettore.
2 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), azzera-
re il primo elemento del vettore.
3 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), azzera-
re lultimo elemento del vettore.
4 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), azzera-
re lelemento di posto n, con n dato in input.
5 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), calco-
lare la media dei valori contenuti nel vettore.
6 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), calco-
lare la media dei valori contenuti nel vettore. Successivamente scrivere gli elementi del vettore che han-
no valore superiore alla media.
7 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), calco-
lare la media dei valori contenuti nel vettore. Successivamente contare gli elementi del vettore che han-
no valore superiore alla media.
8 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), calco-
lare la media dei valori contenuti nel vettore. Successivamente creare un nuovo vettore che contenga gli
elementi del vettore iniziale che hanno valore superiore alla media.
9 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), scrive-
re gli elementi pari contenuti nel vettore.
q0 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), scrive-
re gli elementi di posto pari contenuti nel vettore.
qa Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), creare
un nuovo vettore che contenga gli elementi pari del vettore iniziale.
qs Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), inserire
in testa al vettore un nuovo elemento. Scrivere il vettore iniziale e il vettore modificato. (Suggerimen-
ti: poich deve essere inserito un nuovo elemento il vettore deve essere definito con dimensione pari a
d + 1; in testa al vettore vuol dire al posto 0 del vettore; per fare spazio al nuovo elemento, i dati pree-
sistenti devono essere spostati di un posto a destra).
qd Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), inserire
in coda al vettore un nuovo elemento. Scrivere il vettore iniziale e il vettore modificato. (Suggerimenti:
poich deve essere inserito un nuovo elemento il vettore deve essere definito con dimensione pari a d
+ 1; In coda al vettore vuol dire dopo lultimo elemento del vettore; per fare spazio al nuovo elemen-
to, basta aumentare la dimensione iniziale).
190