Title: Un nuovo tipo di dati
1Un nuovo tipo di dati
2Supponiamo di essere in questa situazione Vogliamo
memorizzare 1000 valori per poterli manipolare
in momenti diversi Non è possibile pensare a
dichiarare 1000 variabili Pensate solo a scrivere
listruzione che le somma tutte Allora come
possiamo fare? Dobbiamo utilizzare una struttura
dati.
3Un dato strutturato è un tipo di dato che
attraverso una sola dichiarazione di una sua
variabile possiamo memorizzare più dati
contemporaneamente. Vi sono strutture dati
omogenee ed eterogenee Oggi studiamo quelli
appartenenti alla prima classe I vettori
4I vettori Sono strutture dati i cui elementi sono
tutti dello stesso tipo I dati in essi contenuti
possono essere semplici o strutturati Essi sono
caratterizzati da La dimensione che indica
quanti elementi possono contenere Il nome Il tipo
cioè il tipo di dati che possono
contenere Lindice indica il particolare
elemento a cui vogliamo fare riferimento
5I vettori Graficamente essi sono così
rappresentati
2 34 10 25 -16 2 99 1001 7 4
Questo è un vettore di interi Come vedete esso
contiene valori numerici di tipo int Ha
dimensione 10 Può contenere valori uguali È
residente in memoria centrale e pertanto deve
essere inizializzato come tutte le variabili Ecco
due esempi di vettori di char
a b c d d e f h z q
0 1 a
6I vettori Dichiarazione di un vettore in C Le
regole sono ltTipo_datigtlt nome_variabilegtltdimensi
onegt Alcuni esempi int vett10 char
nome20 const int DIM30 float classeDIM
bool a15
7I vettori Come inserire i dati in un vettore? Gli
esempi proposti fanno tutti riferimento a vettori
di tipo intero di dimensione DIM 10, indice
intero i, ma si possono estendere a vettori di
altri tipi. Inizializzazione di un vettore v In
modo statico valido per tutte le esecuzioni del
programma a livello di dichiarazione Int
vDIM0 Azzera tutti gli elementi del
vettore Int vDIM1,3,5,67,34,0,57,12,901,1024
Attribuisce al vettore v sempre gli stessi
valori di partenza
8I vettori Per accede ad un elemento del vettore
devo utilizzare un indice Lindice è generalmente
di tipo intero al più enumerativo come i char o
color Lindice parte da 0 e assume valore massimo
dimensione del vettore -1 Cioè se un vettore ha
dimensione 10 lindice assume i valori da 0 a
9 Lindice non può mai essere di tipo float
perché indica la posizione allinterno del
vettore Dichiarato il seguente vettore int
vett20 int i Se voglio stampare a schermo il
terzo elemento del vettore scriverò coutltltvett2
9I vettori Inizializzazione di un vettore in modo
dinamico e differente per ogni esecuzione for
(int i0iltDIMi) virand()1001 //
inserisce in modo casuale nel vettore numeri
positivi compresi tra 0 e 1000 for (int
i0iltDIMi) cingtgtvi // inserisce
valori dati in input da tastiera Per
visualizzare tutti gli elementi for (int
i0iltDIMi) coutltltvi
10I vettori Per modificare un elemento cout
ltltinserire la posizione dellelemento da
modificare la prima è 0 cingtgt i
coutltltinserire il valore cingtgtvi
11I vettori Il seguente frammento di codice somma
tutti gli elementi del vettore v int s0 for
(int i0iltDIMi) ssvi Mentre il
seguente somma solo quelli di posto pari int
s0 for (int i0iltDIM/2i) ssv2i
12I vettori esercizio Cosa fa questo codice? int
mv0 for (int i1iltDIMi) if (mltvi)
mvi coutltltm Calcola il valore
massimo contenuto nel vettore
13I vettori Come si passa un vettore come parametro
ad una procedura? Supponiamo che si vogliano
creare due vettori a e b il primo lungo 20 e il
secondo lungo 30 si vuole utilizzare ununica
procedura per la creazione, e stampa dei due
vettori. Proponiamo il seguente codice
14include ltcstdlibgt include ltiostreamgt using
namespace std int a20,b30 void carica(int
v, int dim) void stampa(int v, int dim) int
main(int argc, char argv) coutltlt"inserire
i valori del vettore a essi sono 20"ltltendl
carica (a,20) coutltlt"inserire i valori del
vettore b essi sono 30"ltltendl carica
(b,30) coutltlt "ecco il vettore a "ltltendl
stampa (a,20) coutltlt "ecco il vettore b
"ltltendl stampa (b,30) system("PAUSE")
return EXIT_SUCCESS void carica(int v,
int dim) for(int i0iltdimi)
cingtgtvi return void stampa(int v,
int dim) for(int i0iltdimi)
coutltltviltlt" " return
15I vettori la ricerca Costruiamo una funzione che
verifica se un valore è presente nel vettore bool
ricerca (int v,int dim,int x) bool
tfalse for (int i0iltdimi) if
(xvi) ttrue return t Questo
algoritmo ha una complessità computazionale pari
alla dimensione del vettore e si dice che
complessità O(n) dove n indica la lunghezza del
vettore questo vale anche se lelemento da
ricercare è nella prima posizione Si può
migliorare? Vediamo come
16I vettori la ricerca bool ricerca2 (int v,int
dim,int x) bool tfalse Int i0 while (iltdim
tfalse) if (xvi)
ttrue i return t Questo algoritmo
ha una complessità computazionale O(n/2) Si può
migliorare? Se il vettore è ordinatoovviamente
per ottenere un guadagno il termini di tempo di
computazione il numero delle ricerche deve essere
notevolmente maggiore rispetto allordinamento.
17I vettori lordinamento Ordinamento per scambio
è lalgoritmo più elementare ma anche il più
lento Esso consiste nel ricercare lelemento più
piccolo da inserire nella prima posizione, poi
riesegue la ricerca perla seconda e così via void
ordinaperscambio (int v,int dim) for (int
i0iltdim-1i) for (int ji1jltdimj)
if (vigtvj) scambia(vi,vj) r
eturn void scambia(int a,int b) int c
ca ab bc return La sua complessità
algoritmica è n(n-1)/2 cioè O(n2) sempre.
18I vettori lordinamento Ordinamento a bolle
consiste nel confrontare elementi consecutivi del
vettore in modo tale che i valori più alti si
spostano in coda al vettore i confronti si
ripetono finchè ci sono scambisi sfrutta il
preordinamento. void ordinaabolle (int v,int
dim) Int kdim-1 bool scambiotrue while
(scambiotrue) scambiofalse for (int
j0jltkj) if (vjgtvj1)
scambia(vj,vj1) scambiotrue
k-- return
19I vettori lordinamento Ordinamento per
inserimento consiste nellordinare il vettore
come si ordinano in mano un mazzo di carte
partendo dal secondo elemento si fanno scivolare
allindietro tutti gli elementi minori void
ordinaperinserimento (int v,int dim) Int k
for(int i1iltdimi) ki-1
while(kgt0 vkgtvk1)
scambia(vk,vk1) k--
return
20I vettori la ricerca ordinata Se il vettore è
ordinato allora lalgoritmo di ricerca migliora
e diventa bool ricercaordinata (int v,int
dim,int x) bool tfalse Int i0 while (iltdim
tfalse viltx) if (xvi)
ttrue i return t
21I vettori la ricerca binaria Sfruttando
lordinamento dei vettori questa ricerca funziona
come lelenco telefonico si divide il vettore a
metà e si sceglie quella parte il cui intervallo
dei valori appartiene allelemento da cercare
finchè si trova lelemento e i due estremi
dellintervallo coincidono. void ricercabinaria
(int v,int dim,int x ) int centro, primo0,
ultimodim-1 bool tfalse while (primoltultimo
tfalse) centro(primoultimo)/2 if
(vcentrox) ttrue else if
(vcentroltx) primocentro1
else ultimocentro-1 return t