GLI ARRAY IN C++
INFORMATICA – ITIS «P. PALEOCAPA» - A.S. 2023/24
ARRAY MONO E BIDIMENSIONALI
Un array è un insieme omogeneo di dati identificato da un nome e
ARRAY E INDICI dove ogni singolo elemento è identificato dal nome dell’array con
associata una lista di indici.
INSIEME OMOGENEO
ARRAY E INDICI
Tutti gli elementi sono dello stesso tipo.
INSIEME IDENTIFICATO DA UN NOME
ARRAY E INDICI All’insieme nel suo complesso viene associato un unico nome di
variabile.
𝟎 𝟏 𝟐 𝟑 𝟒 𝟓
𝐯 8 2 5 1 6 5
OGNI SINGOLO ELEMENTO È IDENTIFICATO
DAL NOME DELL’ARRAY CON ASSOCIATA
ARRAY E INDICI UNA LISTA DI INDICI
v0 =8 v1 =2 v2 =5
v3 =1 v4 =6 v5 =5
𝐭𝐢𝐩𝐨 nome_vettore dimensione_vettore ;
VETTORI La dimensione di un array viene fissata all’atto della sua dichiarazione e
rimane inalterata durante l’esecuzione del programma in cui esso è
utilizzato.
L’inizializzazione di un vettore può avvenire contestualmente alla
sua dichiarazione.
𝐢𝐧𝐭 beta 5 = 3, 2, 5, 4, 3 ;
VETTORI
𝐢𝐧𝐭 beta [ ] = 3, 2, 5, 4, 3 ;
𝐢𝐧𝐭 beta 5 = 0 ;
È possibile modificare singolarmente gli elementi di un vettore
assegnando loro un nuovo valore.
VETTORI beta 2 = 9;
Con questa riga di codice si intende assegnare all’elemento di indice
2 (posizione 3) del vettore beta il valore 9.
Dato che il linguaggio C++ non consente operazioni su interi vettori,
VETTORI ma solo sui singoli elementi, nella gestione degli array rivestono una
particolare importanza i costrutti iterativi del linguaggio.
𝐟𝐨𝐫 (int i = 0; i < 10; i + +)
cout ≪ v i ≪ ‟ ”;
VETTORI Visualizza il contenuto dei primi 10 elementi del vettore v.
L’interposizione di un carattere blank tra ogni valore visualizzato e il
successivo si rende necessaria per far si che questi risultino
chiaramente distinguibili (è possibile utilizzare anche “\t”.
𝐟𝐨𝐫 (int i = 0; i < 10; i + +)
Cin ≫ v i ;
VETTORI
È possibile inserire da tastiera, uno alla volta, i primi 10 elementi del
vettore v.
ARRAY BIDIMENSIONALI
𝐭𝐢𝐩𝐨 nome_matrice n m ;
MATRICI
Si usa dure che una matrice è di dimensione 𝑛 x 𝑚, indicando con 𝑛
il numero delle righe e con 𝑚 il numero delle colonne; se i due valori
di 𝑛 ed 𝑚 sono uguali, la matrice viene detta quadrata.
Come un vettore, anche una matrice può essere inizializzata
contestualmente alla sua dichiarazione:
MATRICI
int matrix 2 3 = { 1, 2, 3 , −1, −2, −3 };
La scansione degli elementi di
una matrice avviene attraverso
due cicli for nidificati.
La matrice viene visualizzata per
righe, nel senso che per ogni
MATRICI singola riga vengono visualizzati
i valori delle singole colonne.
Invertendo l’ordine dei due cicli
for si ottiene una visualizzazione
per colonne.
Nella memoria del computer gli elementi di un array sono disposti
tutti sequenzialmente contigui, indipendentemente dal fatto che si
VETTORI E tratti di un array monodimensionale o bidimensionale.
MATRICI È la modalità con cui accediamo ad essi che mostra la loro
organizzazione in termini di una matrice piuttosto che di un vettore.
Supponendo di avere un vettore di 𝑘 elementi equivalente ad una
matrice di 𝑛 righe ed 𝑚 colonne (con 𝑘 = 𝑛 ∗ 𝑚), è possibile
calcolare:
o Partendo dall’indice 𝑖 del vettore, le coordinate dell’elemento
VETTORI E corrispondente della matrice con le formule:
• 𝑟 = 𝑖/𝑛
MATRICI • 𝑐 = 𝑖%𝑚
o Partendo dalle coordinate 𝑟 e 𝑐 della matrice, l’indice 𝑖
dell’elemento corrispondente del vettore:
• 𝑖 =𝑟∗𝑛+𝑐
STRINGHE DI CARATTERI IN STILE C
Il linguaggio C++ mantiene la gestione delle sequenze di caratteri –
STRINGHE DI definite stringhe – nella tradizionale modalità del linguaggio C; in
questo linguaggio, infatti, non esiste un vero e proprio tipo per le
CARATTERI stringhe di caratteri e queste vengono rappresentate mediante
array monodimensionali di caratteri.
STRINGHE DI char stringa dimensione ;
Ogni vettore di caratteri che contiene una stringa termina con il
CARATTERI valore 0 corrispondente al carattere ′\0′.
𝟎 𝟏 𝟐 𝟑 𝟒 𝟓 𝟔 𝟕 𝟖 𝟗
stringa ‘g’ ‘a’ ‘t’ ‘t’ ‘o’ ‘\0’
Una stringa può essere inizializzata nella dichiarazione come un
qualsiasi array specificandone i singoli caratteri.
STRINGHE DI
CARATTERI char stringa 10 = {m g m , ′am , ′t′, ′t′, ′o′, ′\0′};
char stringa 10 = “gatto”;
STRINGHE DI È necessario prestare attenzione alla lunghezza della stringa
inserita, perché se questa dovesse eccedere la dimensione dell’array
CARATTERI il compilatore segnalerebbe un errore.
STRINGHE DI Il carattere terminatore ′\0′, che contraddistingue la modalità di
elaborazione delle stringhe, è particolarmente utile nella
CARATTERI determinazione della lunghezza della stringa contenuta in un array.
La stringa inserita non può contenere caratteri quali spazio,
STRINGHE DI tabulazione o ritorno a capo, perché questi vengono interpretati
CARATTERI come fine stringa, causando la perdita degli eventuali caratteri che
seguono.
STRINGHE DI Per la gestione delle stringhe in stile C del linguaggio C++ sono
disponibili specifiche funzioni della libreria standard i cui prototipi
CARATTERI sono definiti nel file di inclusione 𝐜𝐬𝐭𝐫𝐢𝐧𝐠.
strlen(const char s[ ])
STRINGHE DI
CARATTERI
Restituisce il numero di caratteri della stringa s
strcpy(char s1 , const char s2 )
STRINGHE DI
CARATTERI
Copia la stringa s2 nella stringa s1
strncpy(char s1 , const char s2 , int n)
STRINGHE DI
CARATTERI
Copia al massimo i primi 𝑛 caratteri della stringa s2 nella stringa s1
strcat(char s1 , const char s2[ ])
STRINGHE DI
CARATTERI
Appende una copia della stringa s2 alla stringa s1
strncat char s1 , const char s2 , int n
STRINGHE DI
CARATTERI Appende al massimo i primi 𝑛 caratteri copiati dalla stringa s2 alla
stringa s1
strcmp(char s1 , const char s2[ ])
STRINGHE DI
CARATTERI Confronta le stringhe s1 ed s2 restituendo: un valore negativo se s1
precede in ordine lessicografico s2, il valore 0 se s1 ed s2 sono
uguali, un valore positivo se s1 segue in ordine lessicografico s2
strncmp char s1 , const char s2 , int n
STRINGHE DI
Confronta al massimo i primi 𝑛 caratteri delle stringhe s1 ed s2
CARATTERI restituendo: un valore negativo se s1 precede in ordine
lessicografico s2, il valore 0 se s1 ed s2 sono uguali, un valore
positivo se s1 segue in ordine lessicografico s2
LA CLASSE 𝐬𝐭𝐫𝐢𝐧𝐠
La classe string, che fornisce una modalità alternativa al ricorso agli
LA CLASSE array di char, obbliga l’impiego delle specifiche funzioni della
libreria del linguaggio C per la gestione delle stringhe di caratteri;
string per utilizzare questa classe in C++ è necessario includere il file
string.
OPERATORE DESCRIZIONE
Assegna a un oggetto di classe string il contenuto di un
= altro oggetto dello stesso tipo, o il contenuto di un
array di char
LA CLASSE string s1 = "pippo";
string s2 = s1;
string // s2: "pippo»
char a[ ] = "pluto";
s1 = a;
// s1: "pluto»
s2 = "paperino";
// s2: "paperino»
OPERATORE DESCRIZIONE
Riferisce un singolo carattere della stringa la cui
posizione è data dall’indice compreso tra i simboli
[]
≪ ≫e≪ ≫
L’indice del primo carattere è 0
LA CLASSE
string string s = "pippo";
char c = s 1 ; // c: ′i′
s 4 = ′a5 ; // s: "pippa”
OPERATORE DESCRIZIONE
size( )
Restituisce il numero di caratteri di una stringa
length( )
LA CLASSE string s;
int n = s. size( ); // n: 0
string s = "pippo";
n = s. length ; // n: 5
OPERATORE DESCRIZIONE
Restituisce 𝐭𝐫𝐮𝐞 se la stringa è vuota, 𝐟𝐚𝐥𝐬𝐞
empty( )
altrimenti
string s;
LA CLASSE bool b = s. emply( );
string // b: true
s = "pippo";
b = s. empty( );
// b: false
OPERATORE DESCRIZIONE
Cancella il contenuto della stringa che diviene
clear( )
vuota
string s = "pippo";
bool b = s. empty( );
LA CLASSE // b: false
string int n = s. size ;
// n: 5
s. clear( );
b = s. empty( );
// b: true
n = s. length ;
// n: 0
OPERATORE DESCRIZIONE
+ Concatena il contenuto di due o più stringhe
string s1 = "pippo";
LA CLASSE string s2 = "pluto";
string string s3 = s1 + " & " + s2;
// s3: "pippo & pluto"
OPERATORE DESCRIZIONE
==, ! =
<, <= Confronta lessicograficamente due stringhe
>, >=
LA CLASSE string s1 = "pippo";
string s2 = "pluto";
string bool b = (s1 < s2);
// b: true
b = (s1 ! = s2);
// b: true
b = (s1 == s2);
// b: false
OPERATORE DESCRIZIONE
Restituisce la sottostringa compresa tra gli indici 𝑖
substr(i, f)
ed 𝑓 inclusi
LA CLASSE string s1 = "pippo";
string string s2 = s1. substr 1, 3 ;
// s2: "ipp"
OPERATORE DESCRIZIONE
Sostituisce la sottostringa compresa tra gli indici 𝑖
replace( 𝑖, 𝑓, 𝑠)
ed 𝑓 inclusi con il contenuto della stringa s.
LA CLASSE string s = "pippo";
string s. replace(1, 3, "lut");
// s: "pluto"
OPERATORE DESCRIZIONE
Rimuove la sottostringa compresa tra gli indici 𝑖
erase( 𝑖, 𝑓)
ed 𝑓inclusi
LA CLASSE string s = "pippo";
string s. erase(2, s. size( ) − 1);
// s1: "pi"
OPERATORE DESCRIZIONE
Restituisce l’indice successivo a 𝑖 da cui ha inizio la
sottostringa 𝑠; nel caso che la sottostringa 𝑠 non
~ind( 𝑠, i) sia compresa nella stringa a partire dall’indice 𝑖
restituisce un valore uguale a string ∷ npos che
rappresenta la dimensione massima di una stringa
LA CLASSE
string string s = "pippo & pluto";
int n = s. 1ind("pluto", 0);
// n: 8
n = s. 1ind("paperino", 0);
bool b = (n == string ∶: npos);
// b: true
OPERATORE DESCRIZIONE
Restituisce un array di char con lo stesso
c_str( )
contenuto della stringa
LA CLASSE string s = "pippo";
char a[10];
string strcpy(a, s. c_str( ));
// a: "pippo"
BUFFER OVERFLOW
L’indicizzazione di elementi di un array inesistenti, cioè precedenti il
BUFFER primo o successivi all’ultimo elemento nello spazio di memoria
riservato alle variabili di un programma, è un grave errore di
OVERFLOW programmazione noto come buffer overflow, talvolta buffer
overrun.
Le seguenti inizializzazioni
char stringa 8 = “ ”;
unsigned char numero = 123;
Allocano nello spazio di memoria del programma i seguenti valori (il
BUFFER valore 0 rappresenta la fine del contenuto di una stringa in un
OVERFLOW vettore di caratteri).
stringa numero
0 0 0 0 0 0 0 0 0 123
L’esecuzione del frammento di codice
BUFFER Genera un buffer overflow che altera il valore della variabile numero
OVERFLOW assegnandole il codice numerico corrispondente alla lettera ′J′.
stringa numero
′A′ ′B′ ′C′ ′D′ ’E′ ′F′ ′G′ ′H′ ′I′ 74