Preliminari.qxd
23-01-2009
12:33
Pagina 1
Cesare Rota
Programmare con C++
EDITORE ULRICO HOEPLI MILANO
Preliminari.qxd
15-01-2009
12:19
Pagina 2
Copyright © Ulrico Hoepli Editore S.p.A. 2009
via Hoepli 5, 20121 Milano (Italy)
tel. +39 02 864871 – fax +39 02 8052886
e-mail [email protected]
www.hoepli.it
Tutti i diritti sono riservati a norma di legge
e a norma delle convenzioni internazionali
ISBN 978-88-203-4248-7
Ristampa:
4
3
2
1
0
2009
2010
2011
2012
2013
Realizzazione editoriale
ART Servizi Editoriali S.p.A. - Bologna
www.art.bo.it
Coordinamento editoriale:
Redazione:
Progetto grafico:
Impaginazione:
Monica Monari
Barbara Megali
Marina Baldisserri
Sonia Bertusi
Copertina: MN&CG S.r.l., Milano
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
Presentazione
5
Sezione 1 - Premesse
7
U.D. 1 - Sistemi di numerazione
1.1
1.2
1.3
1.4
1.5
1.6
Sistema di numerazione decimale
Notazione polinomiale
Numeri decimali
Sistema di numerazione binario
Conversione da base 2 a base 10
Somma e sottrazione nel sistema
binario
1.7 Sistema di numerazione esadecimale
1.8 Conversione da binario a esadecimale
e viceversa
Esercizi
U.D. 2 - Codifica delle informazioni
2.1
2.2
2.3
8
9
9
10
11
12
13
14
16
18
20
21
22
Introduzione
Rappresentazione dei caratteri
Rappresentazione interna
dei numeri interi
2.4 Rappresentazione dei numeri reali
Esercizi
24
28
31
Sezione 2 - Primi elementi
di programmazione
33
3.1 Primo programma
3.2 Analisi del codice
3.3 Definizione e assegnazione
3.4 Tipi di dato
3.5 Tipo di dato intero
3.6 Tipo char
3.7 Numeri in virgola mobile
3.8 Casting
3.9 Tipo booleano
3.10 Costanti
Esercizi
34
35
38
40
42
43
44
46
48
48
49
51
U.D. 4 - Visualizzazione e acquisizione
54
U.D. 3 - Introduzione a C++
4.1
Acquisizione delle informazioni:
il metodo cin
55
4.2 Output formattato
4.3 Caratteri di escape
4.4 Uso di “\\” e del carattere “@”
Esercizi
58
62
63
64
U.D. 5 - Operatori
66
67
73
78
80
86
5.1 Operatori aritmetici
5.2 Operatori aritmetici composti
5.3 Operatori relazionali
5.4 Operatori logici
Esercizi
Sezione 3 - Organizzazione degli algoritmi 89
U.D. 6 - Algoritmi e pseudocodifica
6.1
6.2
6.3
6.4
6.5
6.6
Analisi del problema
Primo esempio
Algoritmi
Dati e istruzioni
Istruzioni di assegnamento
Istruzioni di ingresso e di uscita
dei dati
6.7 Teorema di Jacopini-Bö hm
6.8 Struttura di alternativa
6.9 Struttura di ripetizione
6.10 Considerazioni sulla pseudocodifica
Esercizi
U.D. 7 - Istruzioni di selezione
7.1
7.2
7.3
7.4
Istruzione if
Istruzione if..else
If nidificati
Istruzione switch
(selezione multipla)
7.5 Raggruppamento dei case
Esercizi
U.D. 8 - Istruzioni di ripetizione
8.1 Istruzione while
8.2 Tabulazione
8.3 Istruzione do.. while
8.4 Istruzione for
Esercizi
90
91
92
94
96
97
99
100
102
104
107
109
112
113
115
118
120
122
125
127
128
130
132
134
139
3
Preliminari.qxd
15-01-2009
12:19
Pagina 4
Indice
U.D. 9 - Le funzioni
9.1
9.2
9.3
9.4
9.5
9.6
9.7
Le funzioni
La funzione più importante
Definizione delle funzioni
Ambito delle variabili
Variabili locali e globali
Valori di ritorno
Passaggio dei parametri
per valore
9.8 Passaggio dei parametri
per riferimento
9.9 Ricorsione
9.10 Funzioni matematiche
Esercizi
12.4 Ereditarietà
12.5 Introduzione alle classi
12.6 Terminologia e rappresentazione
grafica
12.7 Dichiarazione degli oggetti
Esercizi
213
215
216
218
222
157
161
163
165
13.1 Costruttori
13.2 Costruttori parametrizzati
13.3 Membri static di una classe
13.4 Overloading
13.5 Polimorfismo
13.6 Ereditarietà
Esercizi
223
224
227
230
234
236
240
249
Sezione 4 - Strutture dei dati
167
Sezione 6 - Operare con gli archivi
251
U.D. 10 - Enumerazioni e array
168
169
169
171
172
U.D. 14 - Archivi
14.1
14.2
14.3
14.4
252
253
254
255
10.1
10.2
10.3
10.4
10.5
Introduzione
Tipi enumerativi (enumerazioni)
Tipo vettore
Vettori in C++
Caricamento di un vettore
in memoria
10.6 Array di dimensione variabile
10.7 Matrici
10.8 Passaggio di un vettore come
parametro a una funzione
Esercizi
153
176
178
180
187
190
11.1 Definizione di stringa
11.2 Lunghezza di una stringa
11.3 Concatenazione ed estrazione
11.4 Confronti tra stringhe
11.5 Caratteri e stringhe C
11.6 Dichiarazione di una struttura
11.7 Metodi costruttori
Esercizi
192
193
195
197
200
201
202
204
207
Sezione 5 - Classi e oggetti
209
U.D. 12 - Concetti generali
210
211
211
212
U.D. 11 - Stringhe e strutture
12.1 Introduzione alla OOP
12.2 Incapsulazione
12.3 Polimorfismo
4
142
143
144
147
148
151
152
U.D. 13 - Polimorfismo ed ereditarietà
Definizione di archivio
Dati
Definizione di record
Operazioni fondamentali
sugli archivi
14.5 I/O standard e su memoria
di massa
14.6 Tipi di archivio
14.7 Tipi di accesso
Esercizi
256
257
259
260
261
15.1 Creazione di un file di testo
15.2 Lettura di un file di testo
15.3 Accodamento
Esercizi
262
263
266
268
271
Sezione 7 - Le eccezioni
273
U.D. 16 - Gestione delle eccezioni
16.1 Concetto di anomalia
16.2 Eccezioni
Esercizi
274
275
277
283
Appendice A - Riepilogo degli operatori
285
Appendice B - Sequenze di caratteri
escape
286
Indice analitico
287
U.D. 15 - File di testo
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:
: si rivolge allo studente come un manuale di facile consultazione per la programma-
zione;
: presenta le basi teoriche per lo sviluppo delle applicazioni informatiche.
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 oggetti e la gestione dei file.
Il libro è suddiviso in sette sezioni.
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 aritmetici.
3 Nella sezione Organizzazione degli algoritmi viene introdotta la nozione di algoritmo 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 L’intera sezione Classi e oggetti è dedicata alle nozioni fondamentali della OOP e
vengono presentati i concetti principali della programmazione orientata agli oggetti quali l’incapsulamento, il polimorfismo e l’ereditarietà.
6 La sezione Operare con gli archivi spiega le nozioni di base per la definizione degli archivi di dati.
7 La sezione Le eccezioni descrive gli accorgimenti essenziali per la realizzazione di
applicazioni “robuste”.
Ogni sezione è suddivisa in Unità didattiche le quali contengono un numero limitato di
paragrafi, la cui trattazione è, di norma, contenuta in circa due pagine. Ne risulta un testo
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 elemento 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 l’analisi dettagliata del codice
stesso; quest’ultima parte dell’esempio presenta una descrizione dettagliata degli aspetti
più significativi del linguaggio C++ presenti nell’esempio.
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 imparerai a fare” e “Che cosa dovrai studiare”. In concreto, gli obiettivi generali presentati all’inizio 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 competenze e le conoscenze che devono essere apprese dall’alunno.
Considerando l’ampiezza della trattazione, il libro include tutti i contenuti dei programmi didattici tradizionalmente affrontati nelle classi terze degli istituti tecnici.
In particolare può essere adottato nella classe terza degli Istituti Tecnici Industriali con indirizzo ABACUS o informatica industriale, in quella degli Istituti Tecnici Commerciali
con indirizzo MERCURIO o programmatori, nonché in quella dei Licei scientifici tecnologici.
L’Autore
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
&
Questa sezione contiene
U.D.10
U.D.11
Enumerazioni e array
Stringhe e strutture
S04UD10.qxd
15-01-2009
9:21
Pagina 168
10
Enumerazioni e array
Unità didattica
CHE COSA IMPARERAI A FARE
$ Definire dati di tipo enumerativo
$ Definire un array a una dimensione in C++
$ Caricare un vettore in memoria
$ Definire un vettore a dimensione variabile
$ Definire una matrice
$ Popolare una matrice
$ Visualizzare gli elementi di una matrice
CHE COSA DOVRAI STUDIARE
$ Definizione di tipo enumerativo
$ Concetto di vettore
$ Definizione di vettore
$ Sintassi per la gestione di un vettore
$ Sintassi per la gestione delle matrici
S04UD10.qxd
15-01-2009
9:21
Pagina 169
10
Unità didattica
Enumerazioni e array
10.1 Introduzione
Finora abbiamo visto i tipi di dato più comuni e i più facili da utilizzare in C++, cioè i tipi predefiniti: 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 tipo semplice oppure aggregati in modo complesso.
I tipi di dato semplici sono classificati secondo lo schema gerarchico riportato di seguito.
semplici
reali
float
ordinali
double
enumerativi
int
predefiniti
char
bool
I tipi semplici possono essere float o double, oppure di tipo ordinale; i tipi ordinali possono essere definiti dal programmatore attraverso i tipi enumerativi, oppure possono appartenere ai tipi ordinali 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 precedenza.
10.2 Tipi enumerativi (enumerazioni)
A volte una variabile può assumere solo una serie di valori definiti all’interno di un insieme discreto
di possibilità. Le enumerazioni sono molto comuni nella vita di tutti i giorni: per esempio, può essere un’enumerazione la lista dei controlli da eseguire sull’auto prima di affrontare un viaggio: freni,
fari, gomme, olio, tergicristalli, carburante.
169
S04UD10.qxd
15-01-2009
9:21
Pagina 170
Sezione 4 - Strutture dei dati
Per definire in C++ un’enumerazione si usa la seguente sintassi:
enum nome_enumerazione {elenco_enumerazioni};
dove enum è la parola chiave che introduce l’enumerazione.
Riprendendo la lista di esempio proposta in precedenza, si può scrivere:
enum controlli {freni, fari, gomme, olio, tergicristalli, carburante};
Il nome dell’enumerazione può essere utilizzato per dichiarare variabili di tale tipo, in maniera analoga 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 precedenza. Per esempio, si può scrivere:
check = gomme;
oppure
if (check == fari) cout << ”controlla fari”;
Si deve ricordare che a ognuno dei valori di una variabile enumerativa corrisponde il numero d’ordine che esso occupa all’interno della definizione dell’enumerazione.
Esempio Enumera...............................................................................................................
Scrivere un programma che utilizza una variabile di tipo controlli.
Codice
Enumera.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
170
#include <iostream>
using namespace std;
//INIZIO
int main ()
{
//definisci l'enumerazione
enum controlli {freni, fari, gomme, olio, tergicristalli, carburante};
//definisci la variabile di tipo enumerativo
controlli check;
//assegna un valore alla variabile
check = gomme;
//esegui un confronto
if (check == gomme) cout << "controlla fari";
//scrivi il numero d'ordine del valore della variabile enumerativa
cout << "\nNumero d'ordine di gomme = " << check;
S04UD10.qxd
15-01-2009
9:21
Pagina 171
Unità didattica 10 - Enumerazioni e array
22
23
24
25
26
//fine programma
cout << "\n\nFine
system ("pause");
return 0;
";
}
Prova di esecuzione
Analisi del codice
Alla riga 8 viene definito il tipo enumerativo controlli.
Alla riga 11 viene introdotta la variabile check di tipo controlli e alla riga 14 le viene assegnato
un valore (scelto tra quelli definiti nell’enumerazione controlli).
Alla riga 17 viene eseguito un confronto. Anche se la variabile check contiene “gomme”, l’istruzione alla riga 20 non fa comparire in output la parola “gomme”, ma il suo numero di posizione (partendo da zero) all’interno della definizione dell’enumerazione.
...........................................................................................................................................
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 fino a ora ci rendiamo rapidamente conto che non è affatto raro incontrare la necessità di gestire elenchi 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 stesso tipo che si ripete più volte.
Nei prossimi paragrafi presenteremo le strutture messe a disposizione da C++ per gestire non più dati singoli, bensì strutture di dati che raggruppano in un’unica variabile dati diversi.
10.3 Tipo vettore
Cominciamo a esaminare le strutture che contengono dati tutti dello stesso tipo: in generale, tali
strutture prendono il nome di array e si distinguono in vettori come array a una dimensione e matrici come array a due dimensioni.
La prima struttura che esaminiamo è la struttura di vettore che permette di raggruppare diversi dati
dello stesso tipo e di associare un indice a ogni dato.
Un vettore è un insieme ordinato di oggetti omogenei, ovvero appartenenti a un
unico tipo.
È possibile accedere ai vari oggetti del vettore utilizzando il loro indice numerico.
Il numero di elementi contenuto nel vettore è indicato come dimensione.
171
S04UD10.qxd
15-01-2009
9:21
Pagina 172
Sezione 4 - Strutture dei dati
Prendiamo, per esempio, l’elenco degli studenti di una classe, così come appare sul registro.
1
2
3
4
..
..
24
Abbiati Mario
Bonaldi Piera
Casati Luigi
Esposito Salvatore
...
...
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 dello 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
2
1
Possiamo scrivere: E
LATO
MISURA
1
2
3
4
15
8
7
16
Ogni elemento dell’esempio 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.
10.4 Vettori in C++
L’istruzione per definire un vettore ha il seguente formato:
tipo nomeVettore [dimensione];
dove:
: tipo specifica il tipo di dato comune a tutte le componenti;
: nomeVettore è il nome collettivo delle componenti del vettore;
: dimensione è il numero degli elementi contenuti nel vettore.
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
Unità didattica 10 - Enumerazioni e array
Per definire le misure dei lati di un quadrilatero:
int dim=4;
int misure [dim];
È 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 l’intervallo dei valori possibili per l’indice di un vettore parte da 0 e arriva fino a dimensione –1.
In base a questa regola, nell’esempio dell’elenco degli studenti il primo studente (Abbiati Mario) è
individuato dall’indice 0 e l’ultimo (Vivaldi Giuseppe) dall’indice 23.
Quando si lavora con una variabile di tipo vettore, occorre sempre, all’interno del programma, indicare sia il nome della variabile sia l’indice che individua la componente del vettore che vogliamo trattare; per esempio, per assegnare al primo elemento del vettore la misura del primo lato, si scrive:
misure[0] = 15
Si noti che l’indice 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:
misure →
indice →
15
0
VETTORE
8
7
1
2
16
3
Alcuni esempi di istruzioni sugli elementi di un vettore
Sempre riferendosi alle misure dei lati di un quadrilatero, per scrivere la misura del terzo lato si utilizza la seguente istruzione:
cout << “misura terzo lato = ” << misure[2];
Per sommare le misure del primo e del quarto lato, si utilizza la seguente istruzione:
somma = misure[0]+ misure[3]
Spesso nasce l’esigenza 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 riferirsi a ciascun elemento.
Esempio Perimetro .............................................................................................................
Dopo avere definito e inizializzato un vettore che contenga le misure dei lati di un quadrilatero, visualizzare la misura del perimetro.
173
S04UD10.qxd
15-01-2009
9:21
Pagina 174
Sezione 4 - Strutture dei dati
Descrizione della soluzione
Le istruzioni per definire l’array e per assegnargli i valori iniziali sono già state viste in questo paragrafo. Per sommare tutti i lati del quadrato si definisca un ciclo for con l’indice che va da 0 a 3 e che
permette di accedere a tutti e quattro i lati del quadrilatero, vale a dire a tutti e quattro gli elementi
del vettore delle misure.
Pseudocodifica
//struttura dati
vettore delle misure dei lati
//input
//tutti i dati sono definiti all’interno 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]
FINE PER
//somma le misure ad 1 ad 1
scrivi (Perimetro)
FINE
Codice
Perimetro.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
174
#include <iostream>
using namespace std;
//INIZIO
int main ()
{
//struttura del vettore
const int dim=4;
int misure[dim];
int i;
int perim;
//contatore per ciclo for
//dato di output
//inizializza il vettore misure
S04UD10.qxd
15-01-2009
9:21
Pagina 175
Unità didattica 10 - Enumerazioni e array
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
misure[0]
misure[1]
misure[2]
misure[3]
=
=
=
=
15;
8;
7;
16;
//inizializza perimetro
perim = 0;
//visita il vettore
for(i=0; i<dim; i++)
{
perim = perim + misure[i]; //somma le misure ad 1 ad 1
}
//scrivi perimetro
cout<<"Perimetro = "<<perim;
//fine programma
cout << "\n\nFine
system ("pause");
return 0;
";
}
Prova di esecuzione
Analisi del codice
Alla riga 8 viene indicata la dimensione del vettore, che in questo caso è costante, e alla riga 9 viene
definita la struttura del vettore di nome misure e di dimensione dim.
Alle righe da 15 a 18 viene inizializzato il vettore misure assegnando un valore a ogni componente.
Alla riga 24 comincia la “visita” del vettore grazie al ciclo for (con l’indice che, a partire da 0, assume tutti i valori minori di dim).
Alla riga 26 la visita consiste nel sommare in perim ogni elemento del vettore misure.
Le istruzioni di inizializzazione usate nell’esempio precedente possono essere sostituite da una scrittura 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]
misure[1]
misure[2]
misure[3]
=
=
=
=
15;
8;
7;
16;
L’operazione precedente può essere realizzata assegnando direttamente i valori delle componenti in fase di definizione del vettore. Quindi le sette righe di codice
7
8
const int dim=4;
int misure[dim];
175
S04UD10.qxd
15-01-2009
9:21
Pagina 176
Sezione 4 - Strutture dei dati
14
15
15
16
17
18
. . .
//inizializza il vettore misure
misure[0] = 15;
misure[1] = 8;
misure[2] = 7;
misure[3] = 16;
. . .
possono essere sostituite dalla seguente scrittura più “veloce”:
int [] misure = new int [] {15, 8, 7, 16};
Si noti che non è neppure necessario specificare la dimensione del vettore.
...........................................................................................................................................
10.5 Caricamento di un vettore in memoria
Nel paragrafo precedente è stato illustrato un esempio di trattamento di un vettore, ipotizzando che
i suoi valori fossero caricati all’interno del codice del programma. Nell’esempio che segue, viene illustrato come si può fare in modo che sia l’utente a caricare direttamente in un vettore i valori che
desidera. Inizialmente, consideriamo il caso in cui la dimensione del vettore è nota a priori.
Esempio arrayCarica .........................................................................................................
Consentire l’inserimento da tastiera dei valori di un vettore di interi con dimensione fissa = 5.
Descrizione della soluzione
Dopo avere definito un vettore di 5 interi, si eseguono due “visite” sugli elementi del vettore: la prima contiene il blocco di istruzioni che permette di caricare i dati inseriti da tastiera in ciascun elemento del vettore; la seconda viene utilizzata per visualizzare i dati caricati.
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
Unità didattica 10 - Enumerazioni e array
Codice
arrayCarica.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using namespace std;
//INIZIO
int main ()
{
//definisci il vettore di 5 elementi
const int dim = 5;
//definisci la struttura dati
int vett [dim];
//ciclo for x caricare vettore
for (int i=0; i<dim; i++)
{
//richiedi un dato
cout<<"Inserisci un dato ";
cin>>vett[i];
}
cout<<"\nContenuto del vettore: ";
//visita il vettore
for (int i=0; i<dim; i++)
{
cout<<" "<<vett[i];
//scrivi elemento di posto i
}
cout<<"\nVettore visualizzato";
//fine programma
cout << "\n\nFine
system ("pause");
return 0;
";
}
Prova di esecuzione
Analisi del codice
Alla riga 14 viene introdotto il ciclo for per il caricamento dei dati nel vettore. L’indice i è definito
in modo “locale” rispetto all’istruzione for.
177
S04UD10.qxd
15-01-2009
9:21
Pagina 178
Sezione 4 - Strutture dei dati
Alla riga 18 il dato inserito da tastiera viene assegnato all’elemento vett con indice i, dove i, grazie 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.
...........................................................................................................................................
10.6 Array di dimensione variabile
Allo scopo di fornire all’utente strumenti flessibili, vediamo di perfezionare ulteriormente gli esempi fin qui visti, in modo da realizzare un programma che permetta all’utente di caricare un vettore la
cui dimensione è definita dall’utente stesso. Nell’esempio del paragrafo precedente è stata data la
possibilità di caricare i dati di un array da tastiera, ma la dimensione del vettore era definita come costante uguale a 5. Nulla vieta, però, di acquisire da tastiera la dimensione del vettore e di definire il
vettore stesso solo dopo avere avuto a disposizione la dimensione scelta dall’utente.
Esempio arrayVaria............................................................................................................
Permettere l’inserimento da tastiera dei valori di un vettore di interi. Anche la dimensione
del vettore è acquisita da tastiera e deve essere inferiore a 20.
Descrizione della soluzione
L’algoritmo e il programma che viene presentato si discostano dal precedente soltanto perché la dimensione non è definita come costante, ma è letta da tastiera.
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
2
178
#include <iostream>
using namespace std;
S04UD10.qxd
15-01-2009
9:21
Pagina 179
Unità didattica 10 - Enumerazioni e array
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//INIZIO
int main ()
{
const int MAX = 20;
int dim;
int i;
//dimensione massima per il vettore
//definisci il vettore
int vett[MAX];
//acquisisci e controlla la dimensione
do
{
cout<<"\nInserisci la dimensione (max = 20) "
cin>>dim;
}
//controlla il rispetto dei limiti
while (dim < 1 | dim > MAX);
//salta una riga
cout<<"\n";
for (i=0; i<dim; i++)
{
//richiedi un dato e caricalo nel vettore
cout<<"Inserisci un dato ";
cin>>vett[i];
}
cout<<"\nContenuto del vettore: ";
//visita il vettore
for (i=0; i<dim; i++)
{
cout<<" "<<vett[i];
}
cout<<"\nVettore visualizzato";
//fine programma
cout << "\n\nFine
system ("pause");
return 0;
";
}
Prova di esecuzione
179
S04UD10.qxd
15-01-2009
9:21
Pagina 180
Sezione 4 - Strutture dei dati
Analisi del codice
Alla riga 7 viene definita la costante intera MAX, che rappresenta la dimensione massima per il vettore. Tale dimensione è posta pari a 20, così come richiesto dal testo del problema. Alla riga 8 è
definita la variabile dim, in cui viene memorizzata la dimensione effettiva del vettore inserita da tastiera.
Alla riga 12 viene definito il vettore di dimensione MAX, di cui verranno utilizzate soltanto le prime
dim posizioni.
Alle righe 17 e 18 viene rispettivamente richiesto e acquisito il valore di dim; le elaborazioni successive del vettore fanno riferimento solo a questo valore, come si può vedere alle righe 26 e 35.
Alla riga 21 viene eseguito un controllo sul valore dim inserito da tastiera: soltanto se rientra tra i limiti imposti dal problema (è cioè compreso tra 1 e MAX) l’elaborazione può procedere.
Alla riga 24 viene immessa a video una riga vuota, per separare le istruzioni di acquisizione della dimensione dalla fase di caricamento e stampa dei dati del vettore. Tale fase è identica a quella già vista
nell’esempio ArrayCarica.
...........................................................................................................................................
10.7 Matrici
Nei paragrafi precedenti abbiamo visto come lavorare con array a una dimensione, vale a dire con array 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 sintassi del tutto simile a quella riportata di seguito.
const int dim = 4;
int vettore[dim];
Se, per esempio, è dato il vettore:
Dati →
Indice →
37
0
VETTORE
53
11
1
2
28
3
avremo che l’elemento Vettore[2] contiene il valore 11.
Per definire una matrice, invece, occorre specificare due o più dimensioni.
Una matrice è un insieme di dati dello stesso tipo organizzati in una griglia: ogni elemento che compone la matrice è individuato dall’indice di riga e dall’indice di colonna in cui l’elemento è posizionato.
In C++ la definizione della struttura di una matrice è analoga alla definizione di un array a una dimensione. Per esempio, se si scrive:
int matrice[3][4]
180
S04UD10.qxd
15-01-2009
9:21
Pagina 181
Unità didattica 10 - Enumerazioni e array
s’intende che la struttura di nome matrice è composta da 3 righe e 4 colonne, come mostrato nell’esempio che segue.
MATRICE
Righe
0
7
37
24
3
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 individuata da matrice[1][2].
Esempio MatriceCarica .....................................................................................................
Caricare i dati di una matrice di interi con numero di righe e numero di colonne non superiore a 20. Scrivere il contenuto della matrice.
Descrizione della soluzione
Il limite di 20 è posto per non definire in memoria una struttura troppo ingombrante.
Il programma è organizzato in tre parti. La prima parte serve per acquisire il numero di righe e il numero di colonne e per preparare la matrice.
Quando viene acquisito il numero di righe, viene controllato che questo non ecceda il limite di 20:
se ciò accade, il programma richiede di nuovo l’inserimento del dato e così succede per il numero delle colonne.
La matrice è inizialmente definita come un array con dimensioni massime: solo dopo avere acquisito
il numero di righe e di colonne vengono definite le sue dimensioni effettive.
La seconda parte consiste nel caricamento dei dati nella matrice. Vengono utilizzati due indici: i per
le righe e j per le colonne. Per il caricamento si consideri ogni riga della matrice come un vettore e
si proceda come negli esempi del paragrafo precedente al caricamento del vettore attraverso una ripetizione enumerativa con l’indice j che va da 0 al numero di colonne – 1. Tale iterazione viene nidificata in una ripetizione più esterna che ripete l’operazione di acquisizione per tutte le righe della
matrice, con l’indice i che varia da 0 al numero di righe – 1.
Per la terza e ultima parte, la stampa della matrice, di nuovo si devono organizzare due cicli for uno
interno all’altro: il più interno serve per “visitare” gli elementi di una riga mentre l’esterno serve per
ripetere tale operazione su tutte le righe. Occorre avere l’accortezza di scrivere gli elementi di una
stessa riga senza andare a capo e di andare a capo solo alla fine della riga della matrice, cioè alla fine
del ciclo for più interno.
Pseudocodifica
Costante MAX = 20
//struttura dati
Matrice di interi
//input
Righe
Colonne
//limite massimo per le dimensioni della matrice
181
S04UD10.qxd
15-01-2009
9:21
Pagina 182
Sezione 4 - Strutture dei dati
Serie di numeri per caricare la matrice
//output
Matrice
//variabili di lavoro
i indice di riga
j indice di colonna
INIZIO
//acquisisci numero delle righe
RIPETI
leggi (righe)
//controlla rispetto dei limiti
MENTRE righe < 1 OR righe > 20
//acquisisci numero delle colonne
RIPETI
leggi (colonne)
//controlla rispetto dei limiti
MENTRE colonne < 1 OR colonne > 20
//carica dati nella matrice
PER i DA 0 A righe – 1
PER j DA 0 A colonne – 1
chiedi dato
carica dato
FINE PER
FINE PER
//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
2
3
4
5
6
7
8
9
10
11
12
13
182
#include <iostream>
#include <iomanip>
using namespace std;
//INIZIO
int main ()
{
const int MAX = 20;
//dimensione massima per la matrice
//definisci la matrice
int mat[MAX][MAX];
int righe;
int colonne;
S04UD10.qxd
15-01-2009
9:21
Pagina 183
Unità didattica 10 - Enumerazioni e array
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
int i;
int j;
//acquisisci numero delle righe
do
{
cout<<"\nInserisci il numero righe (max="<<MAX<<") ";
cin>>righe;
}
//controlla il rispetto dei limiti
while (righe < 1 | righe > MAX);
//acquisisci numero delle colonne
do
{
cout<<"\nInserisci il numero colonne (max="<<MAX<<") ";
cin>>colonne;
}
//controlla il rispetto dei limiti
while (colonne < 1 | colonne > 20);
cout<<"\n";
//carica dati nella matrice
for (i=0; i<righe; i++)
//per ogni riga della matrice
{
for (j=0; j<colonne; j++)
//per ogni elemento della riga
{
//richiedi un dato e caricalo nella matrice
cout<<"Inserisci un dato ";
cin>>mat [i][j];
}
}
cout<<"\nContenuto della matrice: \n";
//visita la matrice
for (i=0; i<righe; i++)
//per ogni riga della matrice
{
for (j=0; j<colonne; j++)
//per ogni elemento della riga
{
//scrivi gli elementi di una riga
//uno di seguito all'altro, con ingombro pari a 6 caratteri
cout<<setw(6)<<mat[i][j];
}
//alla fine della riga va a capo
cout<<"\n";
}
cout<<"\nmatrice visualizzata";
//fine programma
cout << "\n\nFine
system ("pause");
return 0;
";
}
183
S04UD10.qxd
15-01-2009
9:21
Pagina 184
Sezione 4 - Strutture dei dati
Prova di esecuzione
Analisi del codice
Alla riga 11 viene definita la struttura della matrice, che viene identificata con il nome mat e per la
quale è specificato il numero delle righe e delle colonne.
Alle righe 20 e 21 viene acquisito il numero di righe che compongono la matrice; le istruzioni di acquisizione sono inserite all’interno di una ripetizione che serve per controllare se il numero digitato
rientra nei limiti imposti (da 1 a 20).
Alle righe 29 e 30 viene definito un processo analogo per l’acquisizione del numero di colonne.
Alla riga 38 inizia il caricamento dei dati nella matrice: il primo ciclo for serve per ripetere le operazioni sottostanti per tutte le righe.
Alla riga 40 viene definito il ciclo for più interno, che permette di “muoversi” all’interno di una riga, e per ogni elemento della riga viene acquisito il dato da inserire come indicato alle righe 43 e 44.
In particolare, alla riga 44, il dato letto da tastiera viene assegnato a una “casella” della matrice di nome mat individuata dai due indici i e j.
Alla riga 50 inizia la scrittura dei dati della matrice: l’impostazione generale del codice successivo è
analoga a quella precedente relativa al caricamento dei dati: la differenza principale è che, nel ciclo
for più interno, l’istruzione di scrittura indicata alla riga 56 permette di scrivere i dati uno di seguito all’altro, mentre alla riga 59 è indicata l’istruzione per andare a capo. Tale istruzione non rientra
nel ciclo for interno, ma fa parte del ciclo for esterno, così che essa venga eseguita solo alla fine di
ogni riga e venga ripetuta per ogni riga.
...........................................................................................................................................
Allo scopo di acquisire dimestichezza con i problemi relativi al trattamento delle matrici, viene presentato un secondo esempio.
Esempio TotaleRighe..........................................................................................................
Caricare i dati di una matrice di interi con numero di righe e numero di colonne non superiore a 20. Scrivere il contenuto della matrice e indicare per ogni riga il totale dei valori in
essa contenuti.
Descrizione della soluzione
La prima parte della richiesta del problema è identica a quella dell’esempio precedente; si tratta solo
di intervenire nella parte relativa alla visualizzazione del contenuto della matrice e inserire in questa
parte le istruzioni per comunicare i totali di riga.
184
S04UD10.qxd
15-01-2009
9:21
Pagina 185
Unità didattica 10 - Enumerazioni e array
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 all’esempio 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
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <iomanip>
using namespace std;
//INIZIO
int main ()
{
const int MAX = 20;
//dimensione massima per la matrice
//definisci la matrice
int mat[MAX][MAX];
int righe;
185
S04UD10.qxd
15-01-2009
9:21
Pagina 186
Sezione 4 - Strutture dei dati
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
186
int
int
int
int
colonne;
i;
j;
totRiga;
//acquisisci numero delle righe
do
{
cout<<"\nInserisci il numero righe (max="<<MAX<<") ";
cin>>righe;
}
//controlla il rispetto dei limiti
while (righe < 1 | righe > MAX);
//acquisisci il numero delle colonne
do
{
cout<<"\nInserisci il numero colonne (max="<<MAX<<") ";
cin>>colonne;
}
//controlla il rispetto dei limiti
while (colonne < 1 | colonne > MAX);
//salta una riga
cout<<"\n";
//carica la matrice
for (i=0; i<righe; i++)
//per ogni riga della matrice
{
for (j=0; j<colonne; j++)
//per ogni elemento della riga
{
//richiedi un dato e caricalo nella matrice
cout<<"Inserisci un dato ";
cin>>mat [i][j];
}
}
cout<<"\nContenuto della matrice: \n";
cout<<setw(14)<<"Totale"<<endl;
//visita la matrice
for (i=0; i<righe; i++)
//per ogni riga della matrice
{
totRiga = 0;
for (j=0; j<colonne; j++)
//per ogni elemento della riga
{
//scrivi gli elementi di una riga
//uno di seguito all'altro, con ingombro pari a 4 caratteri
cout<<setw(4)<<mat[i][j];
//accumula i valori in totRiga
totRiga = totRiga + mat[i][j];
}
//alla fine della riga scrivi il totale
//e vai a capo
S04UD10.qxd
15-01-2009
9:21
Pagina 187
Unità didattica 10 - Enumerazioni e array
68
69
70
71
72
73
74
75
76
77
cout<<setw(6)<<totRiga<<endl;
}
cout<<"\nMatrice visualizzata";
//fine programma
cout << "\n\nFine
system ("pause");
return 0;
";
}
Prova di esecuzione
Analisi del codice
Le righe 56 e 68 realizzano rispettivamente l’inizializzazione e la scrittura a video di totRiga; poiché queste due operazioni devono essere fatte una volta sola per ogni riga, esse sono poste all’interno del ciclo for più grande, ma all’esterno del ciclo for più interno.
Alla riga 64 è indicata l’istruzione per totalizzare i singoli valori di ogni elemento di ogni riga, pertanto essa è posta all’interno del ciclo for più interno.
...........................................................................................................................................
10.8 Passaggio di un vettore come parametro a una funzione
Nell’Unità didattica 9 è stato affrontato l’argomento del passaggio dei parametri dal main alla funzione; in particolare, è stata spiegata la differenza tra passaggio per valore e per riferimento. I parametri presi in considerazione erano, tuttavia, dati di tipo semplice, non dati strutturati come un vettore o una matrice. Nel caso in cui i parametri da passare siano array occorre rispettare alcune particolarità sintattiche, che sono oggeto di questo paragrafo.
Vediamo da subito un esempio.
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, leggiVettore, scriviVettore.
187
S04UD10.qxd
15-01-2009
9:21
Pagina 188
Sezione 4 - Strutture dei dati
Lo sviluppo top-down del programma
è illustrato nella figura a destra. E
main
Chiedi
dimensione
Leggi
vettore
Codice
funzioniArray.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
188
#include <iostream>
using namespace std;
const int MAX = 20;
int dim;
int i;
//dimensione massima per il vettore
//dimensione acquisita da tastiera
//funzione per leggere la dimensione
int chiediDim (int &d)
{
//acquisisci e controlla la dimensione
do
{
//chiedi e leggi la dimensione
cout<<"\nInserisci la dimensione ";
cin>>d;
}
//controlla il rispetto dei limiti
while (d < 1 | d > MAX);
return d;
}
//funzione per leggere il vettore
void leggiVettore (int v[], int d)
{
for (i=0; i<d; i++)
{
//richiedi un dato e caricalo nel vettore
cout<<"Inserisci un dato ";
cin>>v[i];
}
}
//funzione per scrivere il vettore
void scriviVettore (int v[], int d)
{
cout<<"\nContenuto del vettore: ";
//visita il vettore
for (i=0; i<d; i++)
{
cout<<" "<<v[i];
}
cout<<"\nVettore visualizzato";
}
Scrivi
vettore
S04UD10.qxd
15-01-2009
9:21
Pagina 189
Unità didattica 10 - Enumerazioni e array
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//INIZIO
int main ()
{
//definisci il vettore con dimensione MAX
int vett[MAX];
//richiama la funzione per acquisire la dimensione del vettore
dim = chiediDim (dim);
//salta una riga
cout<<"\n";
//richiama la funzione leggiVettore
leggiVettore(vett,dim);
//richiama la funzione scriviVettore
scriviVettore(vett,dim);
//fine programma
cout << "\n\nFine
system ("pause");
return 0;
";
}
Prova di esecuzione
Risulta del tutto uguale a quella dell’esempio ArrayVaria.
Analisi del codice
Dalla riga 9 alla riga 21 è sviluppata la funzione chiediDim. Si noti che nell’intestazione della funzione (riga 9) il parametro d richiede il passaggio per riferimento (&d), quindi le variazioni del contenuto
della variabile d hanno effetto sulla variabile globale dim, quando questa verrà passata alla funzione alla riga 53. Alla riga 59 viene richiamata la funzione leggiVettore, che è sviluppata dalla riga 24 alla
riga 32 del codice. Si noti che alla riga 59 l’argomento vett non riporta né la dimensione né l’indicazione che si tratta di un’array, e che il parametro v[] presente nell’intestazione della funzione alla riga
24 si limita a “ricordare”, con la presenza delle parentesi quadre, che si tratta di un vettore e non di un
dato elementare; inoltre v[] non è preceduto dal carattere & per richiederne il passaggio per riferimento, in quanto tale modalità di passaggio di parametri è in questo caso automatica.
Analoghe considerazioni valgono per la funzione scriviVettore: in particolare, è da notare che
il passaggio dei parametri per riferimento è indispensabile per la funzione leggiVettore, ma non
per scriviVettore.
Nel caso in cui si voglia lavorare con array a più di una dimensione i richiami alla funzione leggiVettore (che in questo caso si può chiamare leggiMatrice) mantengono la stessa sintassi indicata nell’esempio, con l’argomento privo di dimensioni, mentre nell’intestazione della funzione il parametro che si riferisce 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 l’istruzione che segue.
leggiMatrice(matr, . . . );
mentre l’intestazione della funzione assume la forma indicata di seguito.
void scriviMatrice (int m[][MAX], . . . )
...........................................................................................................................................
189
S04UD10.qxd
15-01-2009
9:21
Pagina 190
Sezione 4 - Strutture dei dati
Esercizi
Unità didattica 10
1 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), calcolare 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), azzerare il primo elemento del vettore.
3 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), azzerare l’ultimo elemento del vettore.
4 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), azzerare l’elemento 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), calcolare 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), calcolare la media dei valori contenuti nel vettore. Successivamente scrivere gli elementi del vettore che hanno valore superiore alla media.
7 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), calcolare la media dei valori contenuti nel vettore. Successivamente contare gli elementi del vettore che hanno valore superiore alla media.
8 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), calcolare 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), scrivere gli elementi pari contenuti nel vettore.
q0 Dopo aver caricato in memoria un vettore di interi con dimensione d (con d inserito da tastiera), scrivere 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. (Suggerimenti: 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 preesistenti 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 l’ultimo elemento del vettore; per fare spazio al nuovo elemento, basta aumentare la dimensione iniziale).
190