Strutture Dati
Le strutture dati sono entità
entità che permettono di
memorizzare dati in modo organizzato a funzionale
a particolari compiti
‰ Strutture Dati in C++
‰
Fondamenti di Informatica
(lettere J-Z)
C++: Array



Prof. Francesco Lo Presti





Array (Vettori)
‰
‰

‰
‰
N dimensione dell’
dell’array
Due tipi di array in C++

Array
2
Array
4
Array (Vettori)
Array:
Array: collezione finita di N variabili dello stesso
tipo, ognuna identificata da in indice compreso tra
0 e NN-1

Array
Strutture
Classi
Vector
Code
Liste
Stacks
…
array:
array: C-style
vector:
vector: classe Standard Template Library
Le variabili di un array
(elementi) vengono
identificate da un nome
(identificatore)
identificatore) a cui va
aggiunto un indice tra
parentesi quadre

I vari elementi sono
memorizzati in locazioni
successive di memoria
‰ Il numero di elementi di un
array è fisso
‰
Nel primo modulo studieremo il primo tipo di array
Array
Indice compreso fra 0 e NN-1
3
v[0]
v[1]
v[2]
array v
v[N-1]
Dichiarazione di un Array
‰
Dichiarazione di un Array
Sintassi
E’ possibile inizializzare i valori di un array in fase
di dichiarazione
‰
nomeTipo
nomeTiponomeArray
nomeArray[[espressione
espressionecostante
costante];];
int
inttest[5]={-3,67,23,0,5};
test[5]={-3,67,23,0,5};
Definisce l’l’array nomeArray di tipo nomeTipo con
numero di elementi pari ad espressione costante
‰ Esempio
‰
int
intelenco[100];
elenco[100];
‰
int
inttest[
test[]={-3,67,23,0,5};
]={-3,67,23,0,5};
double
doubletemperature[10];
temperature[10];
Dimensione di un array:
array: numero di byte che l’l’array
occupa in memoria

numero di elementi*numero di byte per ciascun elemento
Array
5
Elementi di un Array
‰
…omettendo,
omettendo, volendo, la dimensione
‰
Array
6
Accesso agli Elementi di un Array
Gli elementi di un array possono essere usati come
una qualsiasi variabile del tipo dell’
dell’array
L’indice di un array può essere una espr.
espr. costante
intera
‰
cout
cout<<<<elenco[8];
elenco[8];
‰ …o una qualsiasi
……
elenco[5]=3;
elenco[5]=3;
espressione intera
cout
cout<<<<elenco[9];
elenco[9];
……
……
cin
cin>>>>elenco[7];
elenco[7];
for(i=0;i<100;i++)
for(i=0;i<100;i++){{
int
intx;
x;
elenco[0]=elenco[1]-elenco[50];
elenco[0]=elenco[1]-elenco[50];
elenco[i]=i*i;
elenco[i]=i*i;
……
……
cout
cout<<<<elenco[i];
elenco[i];
elenco[x]=elenco[x+1];
elenco[x]=elenco[x+1];
}}
……
Array
7
Array
8
Array: Bound Checking
Esempio
In C++ non è previsto nessun meccanismo di
verifica che un indice di un array cada all’
all’interno
dell’
dell’intervallo [0,…
[0,…,N,N-1]
‰ E’ possibile usare indici negativi o maggiori di NN-1
‰
‰

int
intA[DIM];
A[DIM];
int
minimo;
int minimo;
si accede alle celle di memoria che precedono o seguono
l’area di memoria dove è allocato l’l’array
cout
cout<<<<elenco[-5];
elenco[-5];
……//
//inserimento
inserimentodati
datiininAA
int
inti;i;
elenco[110]=4;
elenco[110]=4;
minimo=A[0];
minimo=A[0];
for(i=1;i<DIM;i++)
for(i=1;i<DIM;i++)
Ö Corruzione dello spazio di memoria
Ö Crash del programma
DA EVITARE!!! Lo considero un errore
if(minimo>A[i])
if(minimo>A[i])
minimo=A[i];
minimo=A[i];
Array
9
Array: Assegnamento
‰
Trovare il valore minimo di un array
……
const
constint
intDIM=50;
DIM=50;
cout
cout<<<<“Il
“Ilminimo
minimoèè““<<<<minimo;
minimo;
……
Array
10
Array: Dimensione Fisica vs. Logica
Per copiare i valori da un array ad un altro si
assegnano i valori elemento per elemento
……
const
constint
intDIM=50;
DIM=50;
int
intA[DIM],
A[DIM],B[DIM];
B[DIM];
……//
inserimento
// inserimentodati
datiininAA
int
inti;i;
for(i=0;i<DIM;i++)
for(i=0;i<DIM;i++)
‰
Un’
Un’ array è una collezione finita di N variabili
(locazioni di memoria) dello stesso tipo
‰
Non significa che si debbano sempre usare tutte le
variabili disponibili
‰
La dimensione logica dell’
dell’array (quanti elementi
sono effettivamente utilizzati) può essere
inferiore alla sua dimensione fisica
‰
La porzione dell’
dell’array effettivamente utilizzata
dipende dai dati di ingresso.
B[i]=A[i];
B[i]=A[i];
……
Array
11
Array
12
Esempio
Esempio
#include<iostream>
#include<iostream>
using
usingnamespace
namespacestd;
std;
Scrivere un programma che:
1. legge da tastiera delle rilevazioni di temperatura
in gradi Kelvin;
Kelvin;
2. memorizza i valori in un array
3. calcola la media dei valori inseriti
‰
if(indice>0)
if(indice>0){ {
media=static_cast<double>(totale)/contatore;
media=static_cast<double>(totale)/contatore;
int
intmain
main( () ){ {
const
constint
intDIM=100;
DIM=100;
cout
cout<<<<“La
“Latemperatura
temperaturamedia
mediae’e’“ “<<<<media;
media;
cout
<<
“\n”;
cout << “\n”;
int
inttemp[DIM];
temp[DIM];
int
intindice=0;
indice=0;
}}
else
else
cout
cout<<<<“Non
“None’e’stato
statoinserito
inseritoalcun
alcunvalore
valore\n”;
\n”;
double
doublemedia;
media;
bool
boolfinito=false;
finito=false;
do
do { {
Ogni serie di dati consta al più
più di 100 valori
‰ Si inserisce il valore -1 per indicare che la serie di
valori è terminata
cout
cout<<<<“Inserire
“Inseriretemperatura
temperaturaoo-1\n”;
-1\n”;
cin
>>
temp[indice];
cin >> temp[indice];
‰
}}
}}
return
return0;0;
finito=temp[indice]==-1;
finito=temp[indice]==-1;
if(
if(!finito)
!finito){ {
totale+=temp[indice];
totale+=temp[indice];
indice++;
indice++;
}}
} }while(!finito);
while(!finito);
Array
13
Array come Parametri
Gli array possono essere usati come parametri di
una funzione
‰ Gli array sono sempre passati per riferimento
//
//Calcola
Calcolaalalmedia
mediadegli
deglielementi
elementi
//
//Assume
Assumeche
cheililnumero
numerodi
dielementi
elementisia
sia>0
>0
int
inttotale=0;
totale=0;
Sintassi
‰ Dichiarazione
‰
‰
Definizione
for(int
for(inti=0;
i=0;i<numero;
i<numero;i++)
i++)
totale+=a[i];
totale+=a[i];
double
doublemedia_array(int
media_array(int[],
[],int)
int)
return
return(double)
(double)totale/numero;
totale/numero;
}}
parametro
parametroformale
formalearray
array==tipo
tipo parametro
parametro[][]
‰
14
double
doublemedia_array(int
media_array(inta[
a[],],int
intnumero)
numero){{
Retaggio del C. L’
L’argomento verrà
verrà ripreso in seguito
tipo
tipoarray
array==tipo
tipo[][]
Array
Esempio
‰

Ösegue
Ösegue
all’
all’interno del corpo della funzione, i parametri
formali di tipo array vengono trattati come array
‰
size fornisce la dimensione logica dell’
dell’array,
array, non
altrimenti nota all’
all’interno dell’
dell’array

Array
15
quanti sono gli elementi effettivamente utilizzati
Array
16
Array come Parametri
Array come Parametri
Chiamata
‰
‰
parametro
parametroattuale
attualearray
array==nome
nomearray.
array.

Vedremo in seguito il caso generale
……
‰ Esempio
const
constint
intDIM=100;
DIM=100;
Al momento della chiamata il nome del parametro
formale per riferimento diventa un sinonimo (alias)
del parametro attuale facente riferimento allo
stesso array

non si crea un nuovo array ma un riferimento ad una array
esistente
9 sicuramente più
più efficiente
int
inttemp[DIM];
temp[DIM];
‰
……//
//riempire
riempireparte
partedi
ditemp
tempcon
convalori
valori
if(indice>0)
if(indice>0){{
media=media_array(temp,indice);
media=media_array(temp,indice);
Modifica degli elementi dell’
dell’array parametro
formale all’
all’interno della funzione rappresenta, in
realtà
realtà, una modifica agli elementi dell’
dell’array
parametro attuale
……
}}
……
Array
17
Array come Parametri
18
Array come Tipo Restituito
Se gli elementi della funzione non devono essere
modificati si può usare const nella specifica dei
parametri formali
‰
Array
‰
Non è possibile usare un array come tipo
restituito di una funzione
double[
double[]]funzione(…)
funzione(…)
double
doublemedia_array(const
media_array(constint
inta[
a[],],int
intnumero)
numero){{
NO!
Soluzioni
1. Passare un array per riferimento
2. Restituire un puntatore ad un array (non locale)
‰
//
//Calcola
Calcolaalalmedia
mediadegli
deglielementi
elementi
//
//Assume
Assumeche
cheililnumero
numerodi
dielementi
elementisia
sia>0
>0
int
inttotale=0;
totale=0;

for(int
for(inti=0;
i=0;i<numero;
i<numero;i++)
i++)
3.
totale+=a[i];
totale+=a[i];
verrà
verrà visto in seguito
Usare classe vector

verrà
verrà visto in seguito
return
return(double)
(double)totale/numero;
totale/numero;
}}
Array
19
Array
20
Esempio
Elementi di un Array come Parametro
Funzione che dato un array calcola il minimo ed il
massimo
‰ Il minimo ed il massimo vengono restituiti tramite
un array a due elementi
‰
‰
int
inti=0;
i=0;
……
void
voidmin_max(const
min_max(constint
intx[
x[],],int
intl,l,int
inty[
y[])])
{{
……
main
main(()){{
const
constint
intDIM=100;
DIM=100;
int
inta[DIM],
a[DIM],m[2],
m[2],indice;
indice;
……//
//riempire
riempireparte
partedidiaacon
convalori
valori
……//
indice
contiene
il
numero
// indice contiene il numerodidielementi
elementi
……//
//didiaautilizzati
utilizzati
min_max(a,indice,m);
min_max(a,indice,m);
Gli elementi di un array possono essere passati
come parametro sia per valore che per riferimento
come variabili qualsiasi
int
intmin,
min,max;
max;
……//
calcola
// calcolaminimo
minimoeemassimo
massimo
int
intx=max(temp[2],temp[5]+temp[7]);
x=max(temp[2],temp[5]+temp[7]);
……
……//
//eememorizzali
memorizzaliininmin
mineemax
max
y[0]=min;
y[0]=min;
swap(temp[i],temp[i+1]);
swap(temp[i],temp[i+1]);
……
y[1]=max;
y[1]=max;
}}
……
}}
Array
Ösegue
Ösegue
21
Array
Array di Caratteri
Array di Caratteri
C’era una volta…
volta…
‰ Array di caratteri – che termina con il carattere
‘\0’ - come unico modo per rappresentare una
stringa
‰
‰

Esempio
char
chars[10];
s[10];
‰
può memorizzare una stringa fino a 10 caratteri

‘\0’ carattere null o terminatore zero
C
Manipolazione stringhe realizzata manipolando
array di tipo char
‰ Esempio
‰
char
charsaluto[5]={‘C’,’i’,’a’,’o’,’\0’};
saluto[5]={‘C’,’i’,’a’,’o’,’\0’};
22
incluso il carattere null
i
a
o
\0
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]
‰
char
charsaluto[
saluto[]={‘C’,’i’,’a’,’o’,’\0’};
]={‘C’,’i’,’a’,’o’,’\0’};
Gli elementi di un array di tipo char possono essere
manipolati come una variabile char
s[2]=‘r’;
s[2]=‘r’;
cout
cout<<<<s[3];
s[3];
char
charsaluto[5]=“Ciao”;
saluto[5]=“Ciao”;
cin
cin>>>>s[1];
s[1];
Array
23
Array
24
Array di Caratteri
A differenza degli altri tipi di array è possibile
stampare un array di caratteri (ovvero la stringa
corrispondente)
‰

char
charsaluto[5]=“Ciao”;
saluto[5]=“Ciao”;
cout
cout<<<<saluto
saluto
‰
i singoli caratteri possono essere modificati come gli
elementi di un array di tipo char
string
stringsaluto=“Ciao”;
saluto=“Ciao”;
saluto[0]=‘M’;
saluto[0]=‘M’;
…come si può leggere da tastiera
cout
cout<<<<saluto;
saluto;
char
charsaluto[20];
saluto[20];
‰
cin
cin>>>>saluto
saluto
‰
Gli oggetti della classe string possono essere visti
come array di caratteri di dimensione grande a
piacere

Attenzione:
Attenzione: la stringa inserita non deve eccedere
la dimensione dell’
dell’array!!
array!!
Array
La classe string fornisce una rappresentazione più
più
astratta di una stringa
è più
più facile lavorare con oggetti della classe string che
con array di caratteri
25
Array
Esempio
Array Multidimensionali
Lunghezza di una stringa
1. Stringa implementata con un oggetto della Classe
string
‰
E’ possibile dichiarare array con più
più di una
dimensione
‰ Sintassi
‰
string
stringsaluto;
saluto;
nomeTipo
nomeTiponomeArray
nomeArray[[dime1
dime1]][[dime2
dime2]]……[[dimen
dimen];];
……
int
inti=saluto.length(
i=saluto.length(););
‰
……
2.
stringa implementata con un array di caratteri
Array a 2 dimensioni vengono solitamente detti
mat
…
matrici
0
2
1
//
//dichiarare
dichiarareuna
unamatrice
matrice
char
charsaluto[50];
saluto[50];
//di
//di10x20
10x20elementi
elementi
……
double
doublemat[10][20];
mat[10][20];
int
inti=0;
i=0;
while(saluto[i]!=‘\0’)
while(saluto[i]!=‘\0’)i++;
i++;
26
19
0
1
…
‰
Array di Caratteri e Stringhe
9
Array
27
Array
28
…
mat
19
0
0
2
mat[1][2]
mat[0][19]
…
…
riga 9
mat[9][19]
29
Inizializzazione
Array
30
Elementi di un Array Multidimensionale
Gli array multidimensionali possono essere
inizializzati con una lista di valori di
inizializzazione racchiusi tra parentesi graffe
‰
nome_tipo
…{riga
-1}};
},},…{
dim1
nome_tiponomeArray
nomeArray[[dim1
dim1][][dim2
dim2]={{
]={{riga
riga00},{
},{riga
riga11},…
rigadim1dim1-1
}};
{0,0,1,0},{0,0,0,1}};
{0,0,1,0},{0,0,0,1}};
mat[0][1]
mat[9][1]
Stesso principio si applica ad array a più
più di 2
dimensioni
int
inta[4][4]={{1,0,0,0},{0,1,0,0},
a[4][4]={{1,0,0,0},{0,1,0,0},
19
mat[9][0]
9
Array
‰
mat[0][0]
…
1
9
‰
…
…
0
mat[1][2]
1
1
mat
…
2
…
mat[1][2];
mat[1][2];
1
Gli array multidimensionali sono memorizzati per
memoria
righe in locazioni contigue
riga 0
nomeArray
] [j];
[i[i]
nomeArray[i]
[j];
0
‰
…
Per accedere all’
all’elemento che si trova nella riga i e
nella colonna j si utilizza la notazione
…
‰
Memorizzazione
…
Array Multidimensionali
a=
Gli elementi di un array multidimensionale possono
essere usati come una qualsiasi variabile del tipo
dell’
dell’array
……
a[2][3]=3;
a[2][3]=3;
0
1
2
cout
cout<<<<a[2][0];
a[2][0];
3
0
1
0
0
0
1
0
1
0
0
a[3][3]=a[1][3]-a[0][2];
a[3][3]=a[1][3]-a[0][2];
2
0
0
1
0
……
3
0
0
0
1
Array
cin
cin>>>>a[0][0];
a[0][0];
31
Array
32
Esempio
Accesso agli Elementi di un Array Multidimensionale
Gli indicii di un array mult.
mult. possono essere espr.
espr.
costanti intere
‰
cout
cout<<<<a[2][3];
a[2][3];
‰ …o una qualsiasi
……
const
constint
intRIGHE=50,
RIGHE=50,COLONNE=20;
COLONNE=20;
espressione intera
……
……
for(i=0;i<100;i++)
for(i=0;i<100;i++){{
int
intx;
x;
a[0][i]=i*i;
a[0][i]=i*i;
……
cout
cout<<<<a[0][i];
a[0][i];
a[1][x]=a[0][x+1];
a[1][x]=a[0][x+1];
Impostare tutti gli elementi di un array ad 1
‰
int
inta[RIGHE][COLONNE];
a[RIGHE][COLONNE];
int
inti,j;
i,j;
for(i=0;i<RIGHE;i++)
for(i=0;i<RIGHE;i++)
for(j=0;
for(j=0;j<COLONNE;
j<COLONNE;j++)
j++)
a[i][j]=1;
a[i][j]=1;
……
}}
……
Array
33
Esempio
34
Esempio
Memorizzare la Tavola Pitagorica
‰
Array
‰
……
Modificare gli elementi di una riga

const
constint
intRIGHE=10,
RIGHE=10,COLONNE=10;
COLONNE=10;
Impostare gli elementi della riga 3 con il relativo numero
di colonna
……
int
inta[RIGHE][COLONNE];
a[RIGHE][COLONNE];
const
constint
intRIGHE=50,
RIGHE=50,COLONNE=20;
COLONNE=20;
int
inti,j;
i,j;
int
inta[RIGHE][COLONNE];
a[RIGHE][COLONNE];
for(i=0;i<RIGHE;i++)
for(i=0;i<RIGHE;i++)
……
for(j=0;
for(j=0;j<COLONNE;
j<COLONNE;j++)
j++)
int
intj;j;
a[i][j]=(i+1)*(j+1);
a[i][j]=(i+1)*(j+1);
for(j=0;
for(j=0;j<COLONNE;
j<COLONNE;j++)
j++)
……
a[3][j]=j;
a[3][j]=j;
……
Array
35
Array
36
Esempio
‰
Array Multidimensionali come Parametri
Modificare gli elementi di una colonna

Nel caso di passaggio di array multidimensionali
nella dichiarazione bisogna specificare
1. Tutte le dimensioni
‰
Copiare gli elementi della colonna 3 sulla colonna 0
……
void
voidstampa(int
stampa(intmat[NRIGHE][NCOLONNE])
mat[NRIGHE][NCOLONNE]){{
int
inti,j;
i,j;
const
constint
intRIGHE=50,
RIGHE=50,COLONNE=20;
COLONNE=20;
for(i=0;
for(i=0;i<NRIGHE;
i<NRIGHE;i++)
i++)
for(j=0;
j<NCOLONNE;
for(j=0; j<NCOLONNE;j++)
j++){{
int
inta[RIGHE][COLONNE];
a[RIGHE][COLONNE];
……
cout
cout<<<<setw(10)
setw(10)<<<<mat[i][j];
mat[i][j];
cout
cout<<<<“\n”;
“\n”;
int
inti;i;
for(i=0;
for(i=0;i<RIGHE;
i<RIGHE;i++)
i++)
}}
a[i][0]=a[i][3];
a[i][0]=a[i][3];
}}
……
Array
37
Array
Array Multidimensionali come Parametri
2.
Esempio: Prodotto Matrici Quadrate
…tutte le dimensioni dalla seconda in poi


38
……
const
constint
intN=5;
N=5;
nel caso di matrici il numero di colonne
è essenziale perché
perché il compilatore sappia come accedere
agli elementi in memoria
void
voidprodotto(double
prodotto(doubleX[
X[][N],
][N],double
doubleY[
Y[][N],
][N],
double
doubleZ[
Z[][N]);
][N]);
int
inti,j,k;
i,j,k;
double
doublesomma;
somma;
for(i=0;
for(i=0;i<N;
i<N;i++)
i++)
void
voidprodotto(double
prodotto(double[[][N],
][N],double
double[[
][N],
][N],double
double[[][N]);
][N]);
void
voidstampa(int
stampa(intmat[
mat[][NCOLONNE],
][NCOLONNE],int
intn)
n){{
int
inti,j;
i,j;
for(j=0;
for(j=0;j<N;
j<N;j++)
j++){{
somma=0;
somma=0;
main
main(()){{
double
doubleA[N][N];
A[N][N];
for(i=0;
for(i=0;i<n;
i<n;i++)
i++)
for(j=0;
j<NCOLONNE;
for(j=0; j<NCOLONNE;j++)
j++){{
for(k=0;k<N;
for(k=0;k<N;k++)
k++)
somma+=X[i][k]*Y[k][j];
somma+=X[i][k]*Y[k][j];
double
doubleB[N][N];
B[N][N];
double
doubleC[N][N];
C[N][N];
cout
cout<<<<setw(10)
setw(10)<<<<mat[i][j];
mat[i][j];
cout
cout<<<<“\n”;
“\n”;
Z[i][j]=somma;
Z[i][j]=somma;
…//
…//inserire
inseriredati
datiininA,
A,BB
prodotto(A,B,C);
prodotto(A,B,C); //
//C=AxB
C=AxB
……
}}
}}
}}
}}
}}
Array
39
Array
40
Ordinamento
Ordinamento
Una delle operazioni più
più comune nell’
nell’elaborazione dati
‰ Problema:
Problema:
‰ Data una sequenza di elementi
‰
Nostra formulazione
‰ Problema:
Problema:
‰ Dato un array di int,
int, double,
double, stringhe, etc.
‰
a0 a1 … an-1
ai interi, double,
double, stringhe,…
stringhe,…
‰
e un relazione di ordinamento ≤ totale tra gli elementi
‰ trovare una permutazione degli indici j0, j1, …, jn-1 tale
che
‰ aj0 aj1 … ajnjn-1 è ordinata, ovvero tale che
‰
riorganizzare i valori dell’
dell’array in modo tale che al
termine gli elementi rispettino una relazione di
ordinamento (non decrescente)
a[0] ≤ a[1] ≤ a[2] ≤… ≤ a[N-1]
aj0 ≤ aj1 ≤ aj2 ≤ … ≤ ajnjn-1



Array
41
Array
Ordinamento: Bubblesort
‰ Si scandisce la lista di elementi
confrontando coppie di elementi
successivi
a[0] <<-> a[1]
a[1] <<-> a[2]
…
a[na[n-2] <<-> a[na[n-1]
Algoritmo
Algoritmo di
di Ordinamento
Ordinamento
‰ Per ogni coppia:

{1,2,4,12,12,21,23,34,45,78,90}
‰
‰
‰ Ripetere fintanto che si
Esistono diversi algoritmi di ordinamento

effettua almeno uno scambio
Bubblesort,
Bubblesort, Insertion sort,
sort, Quicksort,
Quicksort, Mergesort,
Mergesort,
Heapsort,
Heapsort, etc…
etc…
Noi vedremo uno dei più
più sempici:
sempici:
Bubblesort – Ordinamento a bolle
se i due elementi non sono in
ordine (a[i]>a[i+1]) scambiare gli
elementi

Array
43
9 12 4 6 34 25
9 4 12 6 34 25
9 4 6 12 34 25
pass 1
Esempio
{34,12,78,90,4,2,45,23,12,1,21}
‰
42
9 4 6 12 25 34
4 9 6 12 25 34
4 6 9 12 25 34
4 6 9 12 25 34
pass 2
Ordinamento
‰
interi, double:
double: crescente, non decrescente, …
stringhe: lessicografico (del dizionario)
altro: da definire volta per volta
pass 3

a[0] a[1] a[2] … a[N-1]
al più
più n ripetizioni
Array
44
Bubblesort
Ricerca
‰
void
voidbubblesort(int
bubblesort(inta[
a[],],int
intn)
n){{
int
inti;i;
bool
boolswapped;
swapped;
Scrivere una funzione che dato un array di interi a
ed un numero x restituisce vero o falso a seconda
che x occorra o meno in a
bool
boolricerca(int
ricerca(inta[
a[],],int
intn,n,int
intx)
x){{
bool
booltrovato=false;
trovato=false;
do
do{{
swapped=false;
swapped=false;
int
inti=0;
i=0;
while(i<n
while(i<nand
and!trovato)
!trovato){{
for(i=0;
for(i=0;i<n-1;
i<n-1;i++)
i++)
if(a[i]>a[i+1])
if(a[i]>a[i+1]){{
if(a[i]==x)
if(a[i]==x)
trovato=true;
trovato=true;
swap(a[i],a[i+1]);
swap(a[i],a[i+1]);
}}
return
returntrovato;
trovato;
swapped=true;
swapped=true;
}}
}}
}} while(swapped);
while(swapped);
}}
Array
45
Ricerca
‰
‰
il numero di operazioni richieste è in media proporzionale
alla metà
metà del numero di elementi dell’
dell’array
Si assuma che l’l’array sia ordinato in senso non
decrescente

‰
Se il vettore è ordinato, è l’algoritmo di ricerca
può essere notevolmente migliorato
‰ Algoritmo di Ricerca Binaria
1.
‰

2.
3.
il numero di operazioni richieste è in media proporzionale
al logaritmo (in base 2) del numero di elementi dell’
dell’array
4.
numero di elementi N=1.000.000
N=1.000.000


a[0]≤
a[0]≤a[1]…
[1]… ≤a[n]
Algoritmo
first=0, last=nlast=n-1, med=(
med=(first+last)/2
first+last)/2
Si confronta l’l’elemento cercato x con l’l’elemento
mediano del vettore a[med
a[med]]
Se x=a[
[
med],
],
ho
terminato
x=a med
Altrimenti, se il vettore ha almeno due elementi

‰
46
Ricerca Binaria
L’algoritmo di ricerca precedente ha complessità
complessità
lineare

Array
se x<a[med
x<a[med]] si ripete la ricerca nella prima metà
metà del
vettore (da a[0] a a[meda[med-1])
9 aggiornare last e med,
med, andare al passo 2
N/2=500.000
log2N≈20

Array
47
se x>a[med
x>a[med]] si ripete la ricerca nella seconda metà
metà del
vettore (da a[med+1] a a[last
])
a[last])
9 aggiornare first e med,
med, andare al passo 2
Array
48
Ricerca Binaria
Strutture
‰
bool
boolricerca_binaria(int
ricerca_binaria(inta[
a[],],int
intn,n,int
intx)
x){{
bool
booltrovato=false;
trovato=false;
int
intfirst=0,
first=0,last=n-1,
last=n-1,med=(first+last)/2;
med=(first+last)/2;
while(first<=last
&&
!trovato)
while(first<=last && !trovato){{

‰
if(a[med]==x)
if(a[med]==x) trovato=true;
trovato=true;
else
if(x<a[med]
else if(x<a[med]))last=med-1;
last=med-1;
presente anche nel C
Sintassi
struct
nome_struttura{{
structnome_struttura
tipo1
tipo1 nome_variabile1
nome_variabile1;;
else
elsefirst=med+1;
first=med+1;
med=(first+last)/2;
med=(first+last)/2;
}}
}}
return
returntrovato;
trovato;
‰
}}
‰
Una struttura è una collezione finita di variabili –
dette campi - non necessariamente dello stesso
tipo, ognuna identificata da un nome
è possibile scrivere l’l’algoritmo in forma ricorsiva
Array
……
tipon
tiponnome_variabilen
nome_variabilen;;
Definisce un nuovo tipo di dato. Differentemente
da una classe


tutte le variabili sono pubbliche
non ci sono funzioni membro associate ad una struttura
49
Array
Esempio
Strutture
Archivio libri di una biblioteca
‰ Un libro è caratterizzato da:
‰
Una volta definita una variabile struttura, si
accede ai singoli campi mediante la notazione punto
‰ I campi di una struttura possono essere usati come
qualunque variabile dello stesso tipo
‰

titolo, autore, numero copie, ci sono copie disponibili?
struct
structdatilibro
datilibro{{
string
stringtitolo,
titolo,autore;
autore;
Definizione Struttura
……
libro1.num_copie=2;
libro1.num_copie=2;
int
intnum_copie;
num_copie;
bool
boolprestito;
prestito;
};};
……
50
cout
cout<<<<libro1.titolo;
libro1.titolo;
libro2.nun_copie++;
libro2.nun_copie++;
Dichiarazioni variabili Struttura
……
datilibro
datilibrolibro1,
libro1,libro2,
libro2,libri[20];
libri[20];
datilibro
libro3={“Divina
datilibro libro3={“DivinaCommedia”,
Commedia”,“Dante”,
“Dante”,3,
3,true};
true};
Array
51
Array
52
Strutture
‰
‰
1.
2.
3.
Esempio
Una volta definito, un tipo dati struttura si
comporta come un qualsiasi altro tipo di dati (che
non sia un tipo “array di”
di”)
In particolare, è possibile:
assegnare una variabile struttura ad un’
un’altra
che una funzione restituisca una struttura
passare strutture sia per valore che per
riferimento
‰
Assegnare una variabile struttura ad un’
un’altra
……
datilibro
datilibrolibro1={“I
libro1={“IPromessi
PromessiSposi”,
Sposi”,“Manzoni”,
“Manzoni”,2,
2,true};
true};
datilibro
datilibrolibro2=libro1;
libro2=libro1;
……
‰
che una funzione restituisca una struttura
datilibro
datilibrofunzione(…)
funzione(…){{
……
}}
Array
53
Esempio
‰
passare strutture sia per valore che per
riferimento
void
voidstampa_libro(datilibro
stampa_libro(datilibrox)
x){{
cout
cout<<<<“Autore:
“Autore:““<<<<x.autore
x.autore<<<<“\n”
“\n”<<<<“Titolo:
“Titolo:““<<<<x.titolo
x.titolo<<<<“\n”;
“\n”;
cout
cout<<<<“Copie
“CopieDisponibili:
Disponibili:““<<<<x.num_copie
x.num_copie<<<<“Prestito:
“Prestito:““<<<<x.prestito
x.prestito<<<<
“\n”;
“\n”;
}}
void
voidaggiungi
aggiungicopia(datilibro&
copia(datilibro&x)
x){{
x.num_copie++;
x.num_copie++;
}}
Array
55
Array
54