Un nuovo tipo di dati - PowerPoint PPT Presentation

1 / 21
About This Presentation
Title:

Un nuovo tipo di dati

Description:

Un nuovo tipo di dati Gli array Un nuovo tipo di dati Gli array Supponiamo di essere in questa situazione Vogliamo memorizzare 1000 valori per poterli manipolare in ... – PowerPoint PPT presentation

Number of Views:53
Avg rating:3.0/5.0
Slides: 22
Provided by: weba162
Category:
Tags: dati | nuovo | perla | tipo

less

Transcript and Presenter's Notes

Title: Un nuovo tipo di dati


1
Un nuovo tipo di dati
  • Gli array

2
Supponiamo 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.
3
Un 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
4
I 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
5
I 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
6
I 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
7
I 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
8
I 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
9
I 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
10
I vettori Per modificare un elemento cout
ltltinserire la posizione dellelemento da
modificare la prima è 0 cingtgt i
coutltltinserire il valore cingtgtvi
11
I 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
12
I vettori esercizio Cosa fa questo codice? int
mv0 for (int i1iltDIMi) if (mltvi)
mvi coutltltm Calcola il valore
massimo contenuto nel vettore
13
I 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
14
include 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
15
I 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
16
I 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.
17
I 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.
18
I 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
19
I 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
20
I 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
21
I 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
Write a Comment
User Comments (0)
About PowerShow.com