Informatica Programmazione I Vettori.

b

n

INFORMATICA - PROGRAMMAZIONE: I VETTORI

I VETTORI

Un vettore è un insieme di valori tutti dello stesso tipo, cioè omogenei tra loro; si può pensare come una serie di caselle una vicina all'altra, ognuna chiamata elemento del vettore.

Ogni elemento si distingue dagli altri in base alla sua posizione; il numero corrispondente alla posizione (1, 2, 3 ...) viene detto indice e permette di lavorare direttamente sull'elemento desiderato.

Non esistono operazioni che agiscono sull'intero vettore, ma si lavora sempre su un elemento alla volta; per indicare su quale elemento agire, si deve usare l'indice, che può essere un valore numerico costante oppure una variabile in cui inserire di volta in volta il numero corrispondente ai vari elementi.

Il numero contenuto nell'indice deve sempre fare riferimento ad un elemento valido; deve quindi essere compreso tra 1 e la dimensione del vettore; se l'indice supera la dimensione del vettore (o è 0) in genere si verifica un errore durante l'esecuzione del programma.

Il nome della variabile usata come indice è indifferente; si possono usare variabili diverse riferendosi allo stesso vettore (o la medesima variabile riferendosi a vettori differenti); il nome dell'indice cioè non è legato al vettore.

IL CARICAMENTO DEL VETTORE

I dati in un vettore possono essere caricati mediante una lettura sequenziale, cioè elemento per elemento oppure in modo casuale, specificando attraverso l'indice l'elemento in cui si desidera inserire il valore. In ogni caso si deve operare elemento per elemento. Se si lavora su tutti gli elementi in sequenza e si conosce in anticipo il numero degli elementi su cui operare risulta particolarmente adatto l'uso del ciclo FOR. Utilizzando quest'ultimo e variando l'indice da 1 alla dimensione del vettore si indicano successivamente tutti gli elementi.

ESEMPIO 25

Questo programma chiede all'utente dei numeri che vengono inseriti in un vettore, uno per elemento; stampa poi il contenuto del vettore preparato. Le operazioni di lettura e di stampa devono essere eseguite lavorando su un elemento alla volta all'interno di un ciclo. Descrizione delle variabili:

Vettori Esempio di esecuzione Flow chart Esempio 25 (prima parte)

Flow chart Esempio di esecuzione

Flow chart Esempio 25 (seconda parte)

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figura)

1 inizio 2 emissione richiesta numero elementi 3 lettura DIMENSIONE 4 emissione richiesta valori 5 per INDICE da 1 a DIMENSIONE con passo 1 6 lettura VETTORE(INDICE) 7 fine per 8 per INDICE da 1 DIMENSIONE con passo 1 9 emissione VETTORE(INDICE) 10 fine per 11 fine 2-3.

La dimensione del vettore viene precisata al momento della definizione della variabile;

dalla descrizione delle variabili si vede che gli elementi del vettore usato nel programma sono 20.

Sarebbe molto limitante però dover usare 20 elementi ad ogni esecuzione del programma e dover creare un programma diverso per leggere e stampare un vettore di 5 o di 10 o di 12 elementi ecc.

E' possibile allora chiedere all'utente quanti dei 20 elementi del vettore devono essere effettivamente utilizzati;

il programma così rimane valido per qualsiasi numero di elementi (naturalmente inferiore a 20). da 5 a 7 Ciclo per la lettura degli elementi del vettore.

5 Il ciclo viene ripetuto un numero di volte pari al valore contenuto nella variabile DIMENSIONE, in cui l'utente ha inserito il numero di elementi che intende utilizzare nel corso dell'esecuzione.

6 Lettura di un elemento del vettore.

La variabile INDICE che viene usata come indice del ciclo FOR e come indice del vettore assume i valori da 1 a DIMENSIONE.

da 8 a 10 Ciclo per la stampa del vettore.

Il ciclo viene ripetuto tante volte quanti sono gli elementi utilizzati.

9 Stampa di un elemento.

Come indice del ciclo FOR e del vettore viene usata ancora la variabile INDICE; si sarebbe potuto cambiarne il nome senza alterare assolutamente il programma.

Vettori Esempio di esecuzione

Commenti.

L'algoritmo di lettura e stampa del vettore è valido per vettori con elementi di qualsiasi tipo; se il vettore per esempio è composto da elementi alfanumerici si può inserire un carattere o una parola (o più) in ciascun elemento.

LE OPERAZIONI SUI VETTORI

Su vettori con elementi di tipo numerico sono definite alcune operazioni, come il prodotto per uno scalare (cioè per un numero), la somma di due vettori e il prodotto scalare (chiamato così perché dà come risultato un numero e non un vettore).

- prodotto di un vettore per uno scalare: Il prodotto di un vettore per uno scalare viene eseguito moltiplicando ciascuna componente del vettore per un valore scalare.

- somma di due vettori: La somma di due vettori può essere eseguita soltanto se i due vettori hanno lo stesso numero di elementi.

Si ottiene come risultato un vettore, con lo stesso numero di elementi, in cui ogni componente risulta dalla somma degli elementi corrispondenti dei due vettori di partenza.

- prodotto scalare di due vettori: Tra due vettori con lo stesso numero di elementi è definita una particolare operazione di prodotto detta prodotto scalare.

Il prodotto scalare di due vettori di N elementi è definito come A(1) x B(1) + A(2) x B(2) + ... + A(N) x B(N).

Il risultato è un valore scalare (non indicizzato).

ESEMPIO 26

Prodotto di un vettore per uno scalare. Il risultato è lo stesso vettore in cui ogni elemento è stato moltiplicato per il valore inserito. Ciascuna componente del vettore viene moltiplicata per uno stesso valore introdotto in input.

Qualsiasi operazione da compiere successivamente su tutti gli elementi di un vettore richiede un ciclo.

La moltiplicazione di un elemento per il valore stabilito e l'assegnazione del risultato di tale operazione all'elemento stesso deve essere eseguita componente per componente. Descrizione delle variabili:

Vettori Esempio di esecuzione

Flow chart Esempio 26 (prima parte)

Flow chart Esempio di esecuzione

Flow chart Esempio 26 (seconda parte)

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figura)

1 inizio 2 emissione richiesta numero elementi 3 lettura N 4 emissione richiesta valori 5 per I da 1 a N con passo 1 6 lettura A(I) 7 fine per 8 emissione richiesta fattore da moltiplicare 9 lettura SCALARE 10 per I da 1 a N con passo 1 11 A(I) = A(I) * SCALARE 12 fine per 13 per I da 1 a N con passo 1 14 emissione A(I) 15 fine per 16 fine 2-3 Richiesta del numero di elementi del vettore da considerare. da 5 a 7 Ciclo per la lettura dei valori da inserire negli elementi del vettore. 8-9 Richiesta del fattore per cui moltiplicare ciascun elemento del vettore.

In questo esempio gli elementi del vettore sono numeri interi perciò i valori risultanti saranno corretti se il fattore è in valore assoluto minore di 32767 diviso il valore assoluto del massimo degli elementi del vettore.

Per esempio se il valore massimo inserito nel vettore è 327, il valore massimo del fattore da moltiplicare può essere 10. da 10 a 12 Ciclo per la moltiplicazione di ciascun elemento del vettore per il valore inserito. 11 Il valore contenuto in un elemento viene moltiplicato per il valore inserito nella variabile SCALARE; il risultato così ottenuto viene riassegnato all'elemento stesso.

I risultati sono quindi posti nel vettore iniziale, perdendo i dati di partenza. da 13 a 15 Ciclo per la stampa degli elementi del vettore.

Vettori Esempio di esecuzione

Commenti.

E' conveniente mantenere separate tutte le operazioni logicamente diverse, anche se questo richiede qualche ciclo in più. Per esempio le operazioni di lettura, calcolo e stampa di ciascun elemento si sarebbero potute eseguire con un unico ciclo, ma, trattandosi di operazioni logicamente diverse, conviene effettuarne uno distinto per ogni operazione. Inoltre, l'uso di un unico ciclo comprendente lettura, calcolo e stampa di ciascun elemento comporterebbe una differenza nell'esecuzione del programma. Con tre cicli separati il programma richiede prima l'inserimento di tutti i valori e poi produce la stampa di tutti i risultati; con un unico ciclo il programma, invece, fornisce immediatamente il risultato per ogni dato inserito (si ha cioè alternativamente richiesta di un dato ed emissione del risultato). ESEMPIO 27 Somma di due vettori, che devono avere la stessa dimensione. Il risultato di questo programma è un terzo vettore. Descrizione delle variabili:

Vettori Esempio di esecuzione

Flow chart Esempio 27 (prima parte)

Flow chart Esempio di esecuzione

Flow chart Esempio 27 (seconda parte)

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figura)

1 inizio 2 emissione richiesta numero elementi 3 lettura N 4 emissione richiesta valori primo vettore 5 per I da 1 a N con passo 1 6 lettura A(I) 7 fine per 8 emissione richiesta valori secondo vettore 9 per I da 1 a N con passo 1 10 lettura B(I) 11 fine per 12 per I da 1 a N con passo 1 13 SOMMA(I) = A(I) + B(I) 14 fine per 15 per I da 1 a N con passo 1 16 emissione SOMMA(I) 17 fine per 18 fine 2-3 Richiesta del numero di elementi da utilizzare.

da 5 a 7 Ciclo di lettura del primo vettore. da 9 a 11 Ciclo di lettura del secondo vettore. da 12 a 14 Ciclo per la somma degli elementi corrispondenti dei due vettori inseriti.

13 Quando l'indice I ha valore 1 il primo elemento del vettore A viene sommato al primo elemento del vettore B e il risultato viene posto nel primo elemento del vettore somma;

quando l'indice I ha valore 2 il secondo elemento del vettore A viene sommato al secondo elemento del vettore B e il risultato viene posto nel secondo elemento del vettore somma;

e così via fino al termine degli elementi.

Nei due cicli di lettura è indifferente l'uso di indici uguali o diversi per ciascun ciclo, poiché i due cicli sono indipendenti.

Nel ciclo di somma, invece, l'uso dello stesso indice per i tre vettori A, B e SOMMA ha un significato ben preciso:

indica che per i tre vettori vengono considerati gli elementi corrispondenti, cioè nella stessa posizione.

Se gli elementi del vettore sono numeri interi i valori risultanti sono corretti se la somma di ogni coppia di elementi è compresa nell'intervallo di definizione dei numeri interi.

da 15 a 17 Ciclo per la stampa del vettore SOMMA, risultato dell'operazione.

Vettori Esempio di esecuzione
Vettori Esempio di esecuzione

Commenti.

Pur potendo in uno stesso ciclo eseguire le due letture, conviene eseguire ciascuna lettura con un ciclo separato; infatti nel caso di un solo ciclo si dovrebbero inserire alternativamente i valori dell'uno e dell'altro vettore; con due cicli separati invece vanno inseriti prima tutti i valori del primo vettore, poi tutti quelli del secondo.

ESEMPIO 28

Prodotto scalare di due vettori, che devono avere la stessa dimensione. Il risultato è un numero.

Descrizione delle variabili:

Vettori Esempio di esecuzione

Flow chart Esempio 28

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figura)

1 inizio 2 emissione richiesta numero elementi 3 lettura N 4 emissione richiesta valori primo vettore 5 per I da 1 a N con passo 1 6 lettura A(I) 7 fine per 8 emissione richiesta valori secondo vettore 9 per I da 1 a N con passo 1 10 lettura B(I) 11 fine per 12 PRODSCALARE = 0 13 per I da 1 a N con passo 1 14 PRODSCALARE = PRODSCALARE + A(I) * B(I) 15 fine per 16 emissione PRODSCALARE 17 fine 2-3.

Richiesta del numero di elementi da utilizzare. da 5 a 7 Ciclo di lettura del primo vettore.

da 9 a 11 Ciclo di lettura del secondo vettore.

12 Azzeramanto della variabile PRODSCALARE utilizzata per il calcolo del risultato del prodotto scalare dei due vettori.

da 13 a 15 Ciclo per il calcolo del prodotto scalare dei vettori.

14 Quando l'indice I ha valore 1 il valore del primo elemento del vettore A viene moltiplicato per il valore del primo elemento del vettore B e il risultato viene sommato al valore precedente (la prima volta 0) di PRODSCALARE;

quando l'indice I ha valore 2 il secondo elemento del vettore A viene moltiplicato per il secondo elemento del vettore B e il risultato viene sommato a PRODSCALARE;

e così via fino alla fine degli elementi.

16 Stampa del risultato.

Vettori Esempio di esecuzione

I PROBLEMI DI RICERCA IN UN VETTORE

In molti problemi con i vettori si richiede di individuare un elemento del vettore che soddisfi una determinata condizione; il programma deve esaminare ciascun elemento per stabilire quale soddisfi la condizione richiesta e restituire il valore individuato o la sua posizione. In un vettore l'indice rappresenta la posizione di un elemento. Fornendo l'indice si precisa su quale elemento del vettore deve essere eseguita l'elaborazione richiesta. Nei problemi di ricerca si ha il caso opposto: è il programma a dover determinare la posizione di un elemento che soddisfa una determinata condizione; in questo caso il programma deve esaminare ciascun elemento per stabilire quale soddisfi la condizione richiesta e restituire l'indice dell'elemento individuato. Secondo i casi il programma può fornire il valore che soddisfa la condizione richiesta o la sua posizione (o entrambi i dati).

LA RICERCA DI UN VALORE

Cercare un valore in un vettore significa individuare in quale elemento del vettore è presente il dato cercato, oppure stabilire che tale valore non è presente nel vettore. Se il valore viene trovato, per poterlo individuare è necessario conoscere l'indice dell'elemento che lo contiene. Il metodo di ricerca può essere sequenziale o dicotomico. - Ricerca sequenziale: Compiere una ricerca sequenziale significa scandire ordinatamente tutti gli elementi del vettore, confrontandoli col valore cercato. Bisogna cioè esaminare uno alla volta gli elementi, finché si trova il valore cercato oppure si esauriscono gli elementi. - Ricerca dicotomica La ricerca binaria o dicotomica può essere effettuata soltanto su di un insieme ordinato di dati; permette di suddividere i dati su cui si compie la ricerca in insiemi sempre più piccoli, fino ad individuare il valore cercato o a stabilire che tale valore non è presente. Il valore da cercare viene confrontato con quello situato al centro dell'insieme di dati e, secondo l'esito del confronto, si prosegue la ricerca sui dati alla sinistra oppure su quelli alla destra, ripetendo sempre lo stesso procedimento. La ricerca termina quando si trova il valore richiesto, oppure quando l'insieme di ricerca si restringe a due elementi contigui, l'uno minore e l'altro maggiore del valore cercato (in tal caso si può affermare che il valore non è presente). ESEMPIO 29 Ricerca sequenziale di un valore in un vettore. Per determinare l'esito della ricerca si può utilizzare una variabile booleana (una variabile che può contenere due soli valori che indicano se il valore è stato trovato oppure no).

Descrizione delle variabili:

Vettori Esempio di esecuzione

Flow chart Esempio 29 (prima parte)

Flow chart Esempio di esecuzione

Flow chart Esempio 29 (seconda parte)

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figure)

1 inizio 2 emissione richiesta numero elementi 3 lettura N 4 emissione richiesta valori 5 per I da 1 a N con passo 1 6 lettura A(I) 7 fine per 8 emissione richiesta valore da ricercare 9 lettura VALORE 10 TROVATO = falso 11 I = 0 12 mentre I N e TROVATO = falso 13 I = I + 1 14 se A(I) = VALORE allora 15 TROVATO = vero 16 fine se 17 fine mentre 18 se TROVATO = falso allora 19 emissione messaggio non presente 20 altrimenti 21 emissione posizione I 22 fine se 23 fine 2-3 Richiesta del numero di elementi utilizzati. da 5 a 7 Ciclo di lettura del vettore. 8-9 Richiesta del valore che si desidera cercare all'interno del vettore.

10 Inizializzazione della variabile booleana TROVATO a falso; la variabile TROVATO mantiene il valore falso finché non si trova un valore uguale a quello cercato. 11 Inizializzazione della variabile I usata come indice del vettore; viene inizializzata a 0 perché viene incrementata prima di essere usata. da 12 a 17 Ciclo di ricerca; il ciclo termina se viene trovato il valore cercato (cioè TROVATO assume il valore "vero") oppure se sono stati esaminati tutti gli elementi (cioè l'indice I raggiunge il valore N).

Non si usa un ciclo FOR ma un ciclo WHILE perché non si devono sempre esaminare tutti gli elementi del vettore: se il valore viene trovato il ciclo termina.

13 Incremento della variabile I, indice del vettore. 14 Confronto di un elemento del vettore con il valore da ricercare.

15 Se il valore è uguale all'elemento la variabile TROVATO viene impostata a "vero" e causa l'uscita dal ciclo. da 18 a 22 Stampa del risultato della ricerca.

Se la variabile TROVATO ha valore "falso" il valore non è stato trovato e viene emesso un messaggio che lo comunica all'utente.

21 Se la variabile TROVATO ha valore "vero" viene stampato l'indice I che contiene la posizione dell'elemento in cui si trova il valore cercato (infatti non è stato più incrementato dopo il confronto che ha dato esito positivo).

Vettori Esempio di esecuzione
Vettori Esempio di esecuzione

ESEMPIO 30

Ricerca dicotomica in un vettore ordinato.

Descrizione delle variabili:

Vettori Esempio di esecuzione
Vettori Esempio di esecuzione

Flow chart Esempio 30 (prima parte)

Flow chart Esempio di esecuzione

Flow chart Esempio 30 (seconda parte)

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figure)

1 inizio 2 emissione richiesta numero elementi 3 lettura N 4 emissione richiesta valori 5 per I da 1 a N con passo 1 6 lettura A(I) 7 fine per 8 emissione richiesta valore da ricercare 9 lettura VALORE 10 TROVATO = falso 11 estremo sinistro della ricerca S = 1 12 estremo destro della ricerca D = N 13 se VALORE = A(S) allora 14 POSIZIONE = S 15 TROVATO = vero 16 fine se 17 se VALORE = A(D) allora 18 POSIZIONE = D 19 TROVATO = vero 20 fine se 21 mentre D - S > 1 e TROVATO = falso esegui 22 M = parte intera (S + D) / 2 23 se A(M) = VALORE allora 24 POSIZIONE = M 25 TROVATO = vero 26 altrimenti 27 se A(M) VALORE allora 28 {* si continua nella metà destra *} 29 estremo sinistro S = M 30 altrimenti 31 {* si continua nella metà sinistra *} 32 estremo destro D = M 33 fine se 34 fine se 35 fine mentre 36 se TROVATO = falso allora 37 emissione messaggio non presente 38 altrimenti 39 emissione POSIZIONE 40 fine se 41 fine 2-3 Richiesta del numero di elementi utilizzati. da 5 a 7 Ciclo di lettura del vettore. 8-9 Richiesta del valore che si desidera cercare all'interno del vettore. 10 Inizializzazione della variabile booleana TROVATO a falso; la variabile TROVATO mantiene il valore falso finché non si trova un valore uguale a quello cercato. 11-12 Inizializzazione degli indici degli elementi tra cui effettuare la ricerca; la prima volta vengono considerati tutti gli elementi del vettore qundi l'estremo sinistro viene impostato a 1 e l'estremo destro viene impostato a N (numero degli elementi utilizzati). da 13 a 20 Il valore cercato potrebbe essere in uno degli elementi estremi; viene quindi confrontato con questi elementi. Se il confronto ha esito positivo la variabile TROVATO viene impostata a "vero" e il ciclo di ricerca successivo non viene eseguito. La variabile POSIZIONE viene utilizzata per memorizzare l'indice dell'elemento che contiene il valore cercato. da 13 a 16 Confronto del valore cercato con il primo elemento del vettore. da 17 a 20 Confronto con l'ultimo elemento utilizzato del vettore. da 21 a 35 Ciclo di ricerca del valore nel vettore; il ciclo termina se viene trovato il valore cercato (cioè TROVATO assume il valore "vero") oppure se si può stabilire che il valore non è presente poiché l'intervallo di ricerca si è ristretto a due soli elementi. L'intervallo di ricerca contiene più di due elementi se gli indici degli estremi (S e D) non sono consecutivi, cioè se la loro differenza è maggiore di 1. 22 Determinazione dell'indice M dell'elemento centrale dell'intervallo. Si calcola la media degli indici degli estremi. 23 Confronto del valore cercato con l'elemento centrale dell'intervallo. Se il confronto ha esito positivo la variabile TROVATO viene impostata a "vero" e il ciclo di ricerca termina. Altrimenti l'esito del confronto permette di stabilire se continuare la ricerca nella metà destra dell'intervallo considerato, oppure nella metà sinistra. 27 Se il valore da cercare è maggiore dell'elemento centrale dell'intervallo, visto che il vettore è ordinato, si potranno scartare tutti gli elementi della metà sinistra e continuare la ricerca solo nella metà destra; per ridurre l'intervallo bisogna modificare l'indice dell'estremo sinistro, ponendolo uguale a M. 32 In caso contrario si continua la ricerca solo nella metà sinistra, ponendo l'indice dell'estremo destro uguale a M. da 36 a 40 Stampa del risultato della ricerca. Se la variabile TROVATO ha valore "falso" il valore non è stato trovato e viene emesso un messaggio che lo comunica all'utente. 39 Se la variabile TROVATO ha valore "vero" la variabile POSIZIONE contiene l'indice dell'elemento in cui si trova il valore cercato.

Vettori Esempio di esecuzione
Vettori Esempio di esecuzione

Commenti.

Se ci sono più valori uguali a quello cercato non è prevedibile quale venga segnalato; l'esito dipende dalle suddivisioni operate per la ricerca.

LA RICERCA DICOTOMICA PASSO PER PASSO

Per capire meglio come funziona la ricerca dicotomica vediamo cosa succede durante l'esecuzione del programma: Inserire il numero di elementi ?

10 Inserire uno alla volta gli elementi del vettore ? 3 ? 14 ? 28 ? 35 ? 59 ? 73 ? 87 ? 92 ? 108 ? 115 Inserire il valore da ricercare ? 18 Estremi S= 1 D= 10

Si esaminano questi elementi 3 14 28 35 59 73 87 92 108 115 Indice dell'elemento centrale = 5 Valore di A[5]= 59 Estremi S= 1 D= 5

Si esaminano questi elementi 3 14 28 35 59 Indice dell'elemento centrale = 3 Valore di A[3]= 28 Estremi S= 1 D= 3 Si esaminano questi elementi 3 14 28 Indice dell'elemento centrale = 2 Valore di A[2]= 14 Estremi S= 2 D= 3 Il valore non è presente Inserire il numero di elementi ? 10 Inserire uno alla volta gli elementi del vettore ? 3 ? 14 ? 28 ? 35 ? 59 ? 73 ? 87 ? 92 ? 108 ? 115 Inserire il valore da ricercare ? 87 Estremi S= 1 D= 10 Si esaminano questi elementi 3 14 28 35 59 73 87 92 108 115 Indice dell'elemento centrale = 5 Valore di A[5]= 59 Estremi S= 5 D= 10 Si esaminano questi elementi 59 73 87 92 108 115 Indice dell'elemento centrale = 7 Valore di A[7]= 87 Estremi S= 5 D= 10 Il valore è presente nella posizione 7

I PROBLEMI DI ORDINAMENTO DI UN VETTORE

Ordinare un vettore significa disporre in ordine (crescente o decrescente) i suoi elementi.

Ci sono diversi metodi per eseguire l'ordinamento del vettore; i più semplici sono il metodo per selezione e il metodo a bolle o bubble sort. ¦ Ordinamento per selezione L'ordinamento viene eseguito prendendo il minimo del vettore e portandolo al primo posto (scambiandolo con l'elemento che si trova al primo posto).

Si procede poi sempre allo stesso modo, lavorando sulla parte non ordinata del vettore (trovando il minimo degli elementi da 2 a N, poi da 3 a N e così via, e mettendolo al posto dell'elemento di indice 2, poi di indice 3 ecc.).

ESEMPIO 31

Ordinamento di un vettore con il metodo di selezione.

Descrizione delle variabili:

Vettori Esempio di esecuzione

Flow chart Esempio 31 (prima parte)

Flow chart Esempio di esecuzione

Flow chart Esempio 31 (seconda parte)

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figure)

1 inizio 2 emissione richiesta numero elementi 3 lettura N 4 emissione richiesta valori 5 per I da 1 a N con passo 1 6 lettura A(I) 7 fine per 8 per I da 1 a N-1 con passo 1 9 MINIMO = A(I) 10 INDICEMINIMO = I 11 per J da I+1 a N con passo 1 12 se A(J) MINIMO allora 13 MINIMO = A(J) 14 INDICEMINIMO = J 15 fine se 16 fine per 17 A(INDICEMINIMO) = A(I) 18 A(I) = MINIMO 19 fine per 20 per I da 1 a N con passo 1 21 emissione A(I) 22 fine per 23 fine 2-3 Richiesta del numero di elementi utilizzati.

da 5 a 7 Ciclo di lettura del vettore.

da 8 a 19 Ciclo per l'ordinamento del vettore. Il ciclo viene ripetuto N-1 volte se N è il numero di elementi del vettore, perché l'ultimo elemento risulterà automaticamente in ordine.

da 9 a 16 Ricerca del minimo tra gli elementi considerati che sono la prima volta tutti gli elementi del vettore, la seconda volta tutti tranne il primo, la terza volta tutti tranne i primi due ecc.

9-10 Il minimo viene posto uguale al primo degli elementi considerati, cioè la prima volta al primo elemento del vettore, la seconda volta al secondo elemento, la terza volta al terzo ecc.

La variabile INDICEMINIMO viene posta uguale all'indice corrispondente.

da 11 a 16 In questo ciclo vengono confrontati con il contenuto della variabile MINIMO gli elementi successivi, per determinare l'indice dell'elemento minore tra quelli considerati.

da 12 a 15 Se il valore dell'elemento considerato è minore di quello memorizzato in MINIMO, ne viene memorizzato il valore in MINIMO e l'indice in INDICEMINIMO.

17-18 Scambio dell'elemento minore con il primo tra quelli non ancora ordinati. Tutti gli elementi fino a questo risulteranno allora in ordine.

da 20 a 22 Ciclo di stampa del vettore ordinato.

Vettori Esempio di esecuzione

L'ORDINAMENTO DI UN VETTORE CON IL METODO DI SELEZIONE PASSO PER PASSO

Per capire meglio come funziona l'ordinamento con il metodo di selezione vediamo cosa succede durante l'esecuzione del programma: Inserire il numero di elementi ? 15 Inserire uno alla volta gli elementi del vettore ? 78 ? 5 ? 97 ? 32 ? 12 ? 2 ? 121 ? 54 ? 85 ? 36 ? 132 ? 18 ? 4 ? 41 ? 65 78 5 97 32 12 2 121 54 85 36 132 18 4 41 65 Indice dell'elemento minimo = 6 2 5 97 32 12 78 121 54 85 36 132 18 4 41 65 Indice dell'elemento minimo = 13 2 4 97 32 12 78 121 54 85 36 132 18 5 41 65 Indice dell'elemento minimo = 13 2 4 5 32 12 78 121 54 85 36 132 18 97 41 65 Indice dell'elemento minimo = 5 2 4 5 12 32 78 121 54 85 36 132 18 97 41 65 Indice dell'elemento minimo = 12 2 4 5 12 18 78 121 54 85 36 132 32 97 41 65 Indice dell'elemento minimo = 12 2 4 5 12 18 32 121 54 85 36 132 78 97 41 65 Indice dell'elemento minimo = 10 2 4 5 12 18 32 36 54 85 121 132 78 97 41 65 Indice dell'elemento minimo = 14 2 4 5 12 18 32 36 41 85 121 132 78 97 54 65 Indice dell'elemento minimo = 14 2 4 5 12 18 32 36 41 54 121 132 78 97 85 65 Indice dell'elemento minimo = 15 2 4 5 12 18 32 36 41 54 65 132 78 97 85 121 Indice dell'elemento minimo = 12 2 4 5 12 18 32 36 41 54 65 78 132 97 85 121 Indice dell'elemento minimo = 14 2 4 5 12 18 32 36 41 54 65 78 85 97 132 121 Indice dell'elemento minimo = 13 2 4 5 12 18 32 36 41 54 65 78 85 97 132 121 Indice dell'elemento minimo = 15 2 4 5 12 18 32 36 41 54 65 78 85 97 121 132 Gli elementi del vettore dopo l'ordinamento sono 2 4 5 12 18 32 36 41 54 65 78 85 97 121 132 ¦ Ordinamento a bolle o bubble sort Con questo metodo di ordinamento si confrontano a due a due gli elementi del vettore, scambiandoli se non sono in ordine. Si controlla più volte il vettore, partendo dall'ultimo elemento verso il primo, terminando quando, durante l'ultimo controllo, non sono stati effettuati scambi (ciò significa che il vettore è ordinato).

ESEMPIO 32

Ordinamento di un vettore con il metodo bubble sort. Descrizione delle variabili:

Vettori Esempio di esecuzione

Flow chart Esempio 32 (prima parte)

Flow chart Esempio di esecuzione

Flow chart Esempio 32 (seconda parte)

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figure)

1 inizio 2 emissione richiesta numero elementi 3 lettura N 4 emissione richiesta valori 5 per I da 1 a N con passo 1 6 lettura A(I) 7 fine per 8 SCAMBI = vero 9 mentre SCAMBI = vero esegui 10 SCAMBI = falso 11 per I da N a 2 con passo -1 12 se A(I) A(I-1) allora 13 SALVA = A(I) 14 A(I) = A(I-1) 15 A(I-1) = SALVA 16 SCAMBI = vero 17 fine se 18 fine per 19 fine mentre 20 per I da 1 a N con passo 1 21 emissione A(I) 22 fine per 23 fine 2-3 Richiesta del numero di elementi utilizzati. da 5 a 7 Ciclo di lettura del vettore. 8 Inizializzazione della variabile SCAMBI a "vero" per garantire l'inizio del ciclo WHILE (si poteva realizzare la stessa cosa con un ciclo UNTIL, senza la necessità di questa inizializzazione). da 9 a 19 Ciclo per l'ordinamento del vettore. Il ciclo termina quando non è più necessario effettuare scambi tra gli elementi, cioè quando la variabile SCAMBI ha il valore "falso". 10 Ad ogni ciclo la variabile SCAMBI viene impostata a "falso"; se avviene almeno uno scambio il valore della variabile SCAMBI viene modificato in "vero". da 11 a 18 In questo ciclo vengono confrontati a due a due gli elementi del vettore per vedere se sono necessari degli scambi per ordinare gli elementi; il confronto parte dagli ultimi due elementi poiché si cerca di portare in fondo i valori più grandi; il ciclo FOR ha quindi passo negativo. Si potrebbe lavorare nel modo inverso, cominciando i confronti dal primo elemento e portando verso l'inizio i valori più piccoli. 12 Se il valore di un elemento è più piccolo di quello che lo precede i due elementi vengono scambiati. da 13 a 15 Scambio dei valori di due elementi, utilizzando la variabile di comodo SALVA. 16 Se è stato effettuato uno scambio la variabile SCAMBI viene posta uguale a "vero"; potrebbe non trattarsi del primo scambio, e quindi la variabile SCAMBI potrebbe avere già il valore "vero", ma è più comodo non effettuare un test e ripetere in ogni caso l'assegnazione. da 20 a 22 Stampa del vettore ordinato.

Vettori Esempio di esecuzione

Commenti.

Il ciclo FOR per il confronto a due a due sugli elementi viene ripetuto sempre su tutti gli elementi del vettore. Si potrebbe ridurre il numero dei confronti poiché, dopo la prima volta, una parte del vettore risulta già ordinata; bisognerebbe tener conto della posizione dell'elemento su cui è stato effettuato l'ultimo scambio e utilizzare questo valore come valore finale del ciclo FOR.

L'ORDINAMENTO DI UN VETTORE CON IL METODO BUBBLE SORT PASSO PER PASSO

Per capire meglio come funziona l'ordinamento con il metodo bubble sort vediamo cosa succede durante l'esecuzione del programma: Inserire il numero di elementi ? 15 Inserire uno alla volta gli elementi del vettore ? 78 ? 5 ? 97 ? 32 ? 12 ? 2 ? 121 ? 54 ? 85 ? 36 ? 132 ? 18 ? 4 ? 41 ? 65 PRIMO CICLO Vettore iniziale: 78 5 97 32 12 2 121 54 85 36 132 18 4 41 65 Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 12 , 13 78 5 97 32 12 2 121 54 85 36 132 4 18 41 65 Indici degli elementi da scambiare = 11 , 12 78 5 97 32 12 2 121 54 85 36 4 132 18 41 65 Indici degli elementi da scambiare = 10 , 11 78 5 97 32 12 2 121 54 85 4 36 132 18 41 65 Indici degli elementi da scambiare = 9 , 10 78 5 97 32 12 2 121 54 4 85 36 132 18 41 65 Indici degli elementi da scambiare = 8 , 9 78 5 97 32 12 2 121 4 54 85 36 132 18 41 65 Indici degli elementi da scambiare = 7 , 8 78 5 97 32 12 2 4 121 54 85 36 132 18 41 65 Indici degli elementi da scambiare = 5 , 6 78 5 97 32 2 12 4 121 54 85 36 132 18 41 65 Indici degli elementi da scambiare = 4 , 5 78 5 97 2 32 12 4 121 54 85 36 132 18 41 65 Indici degli elementi da scambiare = 3 , 4 78 5 2 97 32 12 4 121 54 85 36 132 18 41 65 Indici degli elementi da scambiare = 2 , 3 78 2 5 97 32 12 4 121 54 85 36 132 18 41 65 Indici degli elementi da scambiare = 1 , 2 2 78 5 97 32 12 4 121 54 85 36 132 18 41 65 SECONDO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 12 , 13 2 78 5 97 32 12 4 121 54 85 36 18 132 41 65 Indici degli elementi da scambiare = 11 , 12 2 78 5 97 32 12 4 121 54 85 18 36 132 41 65 Indici degli elementi da scambiare = 10 , 11 2 78 5 97 32 12 4 121 54 18 85 36 132 41 65 Indici degli elementi da scambiare = 9 , 10 2 78 5 97 32 12 4 121 18 54 85 36 132 41 65 Indici degli elementi da scambiare = 8 , 9 2 78 5 97 32 12 4 18 121 54 85 36 132 41 65 Indici degli elementi da scambiare = 6 , 7 2 78 5 97 32 4 12 18 121 54 85 36 132 41 65 Indici degli elementi da scambiare = 5 , 6 2 78 5 97 4 32 12 18 121 54 85 36 132 41 65 Indici degli elementi da scambiare = 4 , 5 2 78 5 4 97 32 12 18 121 54 85 36 132 41 65 Indici degli elementi da scambiare = 3 , 4 2 78 4 5 97 32 12 18 121 54 85 36 132 41 65 Indici degli elementi da scambiare = 2 , 3 2 4 78 5 97 32 12 18 121 54 85 36 132 41 65 TERZO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 13 , 14 2 4 78 5 97 32 12 18 121 54 85 36 41 132 65 Indici degli elementi da scambiare = 11 , 12 2 4 78 5 97 32 12 18 121 54 36 85 41 132 65 Indici degli elementi da scambiare = 10 , 11 2 4 78 5 97 32 12 18 121 36 54 85 41 132 65 Indici degli elementi da scambiare = 9 , 10 2 4 78 5 97 32 12 18 36 121 54 85 41 132 65 Indici degli elementi da scambiare = 6 , 7 2 4 78 5 97 12 32 18 36 121 54 85 41 132 65 Indici degli elementi da scambiare = 5 , 6 2 4 78 5 12 97 32 18 36 121 54 85 41 132 65 Indici degli elementi da scambiare = 3 , 4 2 4 5 78 12 97 32 18 36 121 54 85 41 132 65 QUARTO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 14 , 15 2 4 5 78 12 97 32 18 36 121 54 85 41 65 132 Indici degli elementi da scambiare = 12 , 13 2 4 5 78 12 97 32 18 36 121 54 41 85 65 132 Indici degli elementi da scambiare = 11 , 12 2 4 5 78 12 97 32 18 36 121 41 54 85 65 132 Indici degli elementi da scambiare = 10 , 11 2 4 5 78 12 97 32 18 36 41 121 54 85 65 132 Indici degli elementi da scambiare = 7 , 8 2 4 5 78 12 97 18 32 36 41 121 54 85 65 132 Indici degli elementi da scambiare = 6 , 7 2 4 5 78 12 18 97 32 36 41 121 54 85 65 132 Indici degli elementi da scambiare = 4 , 5 2 4 5 12 78 18 97 32 36 41 121 54 85 65 132 QUINTO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 13 , 14 2 4 5 12 78 18 97 32 36 41 121 54 65 85 132 Indici degli elementi da scambiare = 11 , 12 2 4 5 12 78 18 97 32 36 41 54 121 65 85 132 Indici degli elementi da scambiare = 7 , 8 2 4 5 12 78 18 32 97 36 41 54 121 65 85 132 Indici degli elementi da scambiare = 5 , 6 2 4 5 12 18 78 32 97 36 41 54 121 65 85 132 SESTO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 12 , 13 2 4 5 12 18 78 32 97 36 41 54 65 121 85 132 Indici degli elementi da scambiare = 8 , 9 2 4 5 12 18 78 32 36 97 41 54 65 121 85 132 Indici degli elementi da scambiare = 6 , 7 2 4 5 12 18 32 78 36 97 41 54 65 121 85 132 SETTIMO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 13 , 14 2 4 5 12 18 32 78 36 97 41 54 65 85 121 132 Indici degli elementi da scambiare = 9 , 10 2 4 5 12 18 32 78 36 41 97 54 65 85 121 132 Indici degli elementi da scambiare = 7 , 8 2 4 5 12 18 32 36 78 41 97 54 65 85 121 132 OTTAVO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 10 , 11 2 4 5 12 18 32 36 78 41 54 97 65 85 121 132 Indici degli elementi da scambiare = 8 , 9 2 4 5 12 18 32 36 41 78 54 97 65 85 121 132 NONO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 11 , 12 2 4 5 12 18 32 36 41 78 54 65 97 85 121 132 Indici degli elementi da scambiare = 9 , 10 2 4 5 12 18 32 36 41 54 78 65 97 85 121 132 DECIMO CICLO Si comincia l'esame dalla fine del vettore Indici degli elementi da scambiare = 12 , 13 2 4 5 12 18 32 36 41 54 78 65 85 97 121 132 Indici degli elementi da scambiare = 10 , 11 2 4 5 12 18 32 36 41 54 65 78 85 97 121 132 UNDICESIMO CICLO Si comincia l'esame dalla fine del vettore -- Non ci sono scambi -- Gli elementi del vettore dopo l'ordinamento sono 2 4 5 12 18 32 36 41 54 65 78 85 97 121 132

LA FUSIONE O MERGE DI DUE VETTORI ORDINATI

L'operazione di merge o fusione può essere eseguita soltanto se gli insiemi di partenza sono già ordinati nello stesso senso, si supponga crescente per semplicità. Il merge consiste nel prendere dai 2 vettori i valori e disporli in un terzo vettore, in modo che quest'ultimo risulti ordinato. E' necessario quindi prendere via via i valori minori dai due vettori di partenza, scandendoli un elemento alla volta. Terminati gli elementi di un vettore, bisogna inserire in quello nuovo i restanti elementi dell'altro vettore. ESEMPIO 33 Merge di due vettori ordinati. Il risultato è un terzo vettore contenente tutti i valori dei due vettori di partenza, posti ancora in ordine. Descrizione delle variabili:

Esempio di esecuzione

Flow chart Esempio 33 (prima parte)

Flow chart Esempio di esecuzione

Flow chart Esempio 33 (seconda parte)

Flow chart Esempio di esecuzione

Pseudocodifica (vedi Figure)

1 inizio 2 emissione richiesta numero elementi primo vettore 3 lettura N 4 emissione richiesta valori primo vettore 5 per I da 1 a N con passo 1 6 lettura A(I) 7 fine per 8 emissione richiesta numero elementi secondo vettore 9 lettura M 10 emissione richiesta valori secondo vettore 11 per I da 1 a M con passo 1 12 lettura B(I) 13 fine per 14 I = 1 15 J = 1 16 K = 0 17 mentre I = N e J = M 18 K = K + 1 19 se A(I) B(J) allora 20 C(K) = A(I) 21 I = I + 1 22 altrimenti 23 C(K) = B(J) 24 J = J + 1 25 fine se 26 fine mentre 27 se I = N allora 28 {* ci sono ancora dati solo nel primo vettore *} 29 per H da I a N con passo 1 30 K = K + 1 31 C(K) = A(H) 32 fine per 33 altrimenti 34 {* ci sono ancora dati solo nel secondo vettore *} 35 per H da J a M con passo 1 36 K = K + 1 37 C(K) = B(H) 38 fine per 39 fine se 40 per I da 1 a K con passo 1 41 emissione C(I) 42 fine per 43 fine 2-3 Richiesta del numero di elementi utilizzati del primo vettore. da 5 a 7 Ciclo di lettura del primo vettore. 8-9 Richiesta del numero di elementi utilizzati del secondo vettore. (Ogni vettore può contenere un numero diverso di elementi). Il vettore risultante utilizzerà un numero di elementi pari alla somma di quelli utilizzati dal primo più quelli utilizzati dal secondo. da 5 a 7 Ciclo di lettura del secondo vettore. 14-15 Inizializzazione a 1 degli indici I e J utilizzati rispettivamente per il primo e per il secondo vettore. 16 Inizializzazione a 0 dell'indice K usato per il vettore risultante (il vettore in questo momento è vuoto). da 17 a 26 Ciclo principale per la fusione dei due vettori; viene ripetuto finché ci sono ancora elementi in ciascuno dei due vettori iniziali; quando tutti i valori di uno dei due vettori sono stati copiati nel vettore risultante, questo ciclo termina e i dati rimasti nell'altro vettore vengono completati in modo diverso. 18 Viene incrementato l'indice del vettore risultante in modo che si riferisca alla prima posizione libera. 19 Confronto tra il primo valore non ancora copiato di ciascun vettore. 20-21 Se è più piccolo il valore considerato nel primo vettore, l'elemento del primo vettore viene copiato nella prima posizione libera del vettore risultante; viene inoltre incrementato l'indice I, in modo che si riferisca al primo valore non ancora copiato del primo vettore. 23-24 In caso contrario viene copiato l'elemento del secondo vettore e viene incrementato l'indice J, in modo che si riferisca al primo valore non ancora copiato del secondo vettore. da 27 a 39 Quando gli elementi di uno dei due vettori sono stati completamente copiati nel vettore risultante, basta copiare tutti i valori rimanenti del vettore non ancora completato. 27 Questo test permette di stabilire quale dei due vettori contiene ancora dati da copiare. Se ci sono ancora dati nel primo vettore vengono eseguite le istruzioni da 29 a 32; se ci sono ancora dati nel secondo vettore vengono eseguite le istruzioni da 35 a 37. da 29 a 32 Ciclo per copiare i valori restanti del primo vettore; bisogna usare un indice diverso da I, poiché I viene usato come valore iniziale del ciclo (gli elementi fino alla posizione I sono già stati copiati, sono rimasti quelli da I in poi). da 35 a 37 Ciclo per copiare i valori restanti del secondo vettore; bisogna usare un indice diverso da J, poiché J viene usato come valore iniziale del ciclo. da 40 a 42 Stampa del vettore risultante.

Vettori Esempio di esecuzione
Vettori esempi di esecuzione

Commenti.

Se ci sono valori uguali nei due vettori vengono presi entrambi; nel caso particolare che i due vettori iniziali siano uguali il vettore risultante presenta ogni valore raddoppiato.

IL MERGE DI DUE VETTORI PASSO PER PASSO

Per capire meglio come funziona l'operazione di merge di due vettori vediamo cosa succede durante l'esecuzione del programma: Inserire il numero di elementi del primo vettore ? 6 Inserire uno alla volta gli elementi del primo vettore ? 7 ? 13 ? 26 ? 32 ? 43 ? 52 Inserire il numero di elementi del secondo vettore ? 9 Inserire uno alla volta gli elementi del secondo vettore ? 3 ? 5 ? 11 ? 18 ? 22 ? 41 ? 55 ? 63 ? 71 Vettori di partenza 7 13 26 32 43 52 3 5 11 18 22 41 55 63 71 Vettore risultante 3 Valori ancora da copiare dai vettori di partenza 7 13 26 32 43 52 5 11 18 22 41 55 63 71 Vettore risultante 3 5 Valori ancora da copiare dai vettori di partenza 7 13 26 32 43 52 11 18 22 41 55 63 71 Vettore risultante 3 5 7 Valori ancora da copiare dai vettori di partenza 13 26 32 43 52 11 18 22 41 55 63 71 Vettore risultante 3 5 7 11 Valori ancora da copiare dai vettori di partenza 13 26 32 43 52 18 22 41 55 63 71 Vettore risultante 3 5 7 11 13 Valori ancora da copiare dai vettori di partenza 26 32 43 52 18 22 41 55 63 71 Vettore risultante 3 5 7 11 13 18 Valori ancora da copiare dai vettori di partenza 26 32 43 52 22 41 55 63 71 Vettore risultante 3 5 7 11 13 18 22 Valori ancora da copiare dai vettori di partenza 26 32 43 52 41 55 63 71 Vettore risultante 3 5 7 11 13 18 22 26 Valori ancora da copiare dai vettori di partenza 32 43 52 41 55 63 71 Vettore risultante 3 5 7 11 13 18 22 26 32 Valori ancora da copiare dai vettori di partenza 43 52 41 55 63 71 Vettore risultante 3 5 7 11 13 18 22 26 32 41 Valori ancora da copiare dai vettori di partenza 43 52 55 63 71 Vettore risultante 3 5 7 11 13 18 22 26 32 41 43 Valori ancora da copiare dai vettori di partenza 52 55 63 71 Vettore risultante 3 5 7 11 13 18 22 26 32 41 43 52 Valori ancora da copiare dai vettori di partenza ---- 55 63 71 Vettore risultante 3 5 7 11 13 18 22 26 32 41 43 52 55 Valori ancora da copiare dai vettori di partenza ---- 63 71 Vettore risultante 3 5 7 11 13 18 22 26 32 41 43 52 55 63 Valori ancora da copiare dai vettori di partenza ---- 71 Vettore risultante 3 5 7 11 13 18 22 26 32 41 43 52 55 63 71 Gli elementi del vettore di merge sono: 3 5 7 11 13 18 22 26 32 41 43 52 55 63 71 Inserire il numero di elementi del primo vettore ? 5 Inserire uno alla volta gli elementi del primo vettore ? 29 ? 41 ? 58 ? 62 ? 77 Inserire il numero di elementi del secondo vettore ? 4 Inserire uno alla volta gli elementi del secondo vettore ? 5 ? 14 ? 19 ? 21 Vettori di partenza 29 41 58 62 77 5 14 19 21 Vettore risultante 5 Valori ancora da copiare dai vettori di partenza 29 41 58 62 77 14 19 21 Vettore risultante 5 14 Valori ancora da copiare dai vettori di partenza 29 41 58 62 77 19 21 Vettore risultante 5 14 19 Valori ancora da copiare dai vettori di partenza 29 41 58 62 77 21 Vettore risultante 5 14 19 21 Valori ancora da copiare dai vettori di partenza 29 41 58 62 77 ------- Vettore risultante 5 14 19 21 29 Valori ancora da copiare dai vettori di partenza 41 58 62 77 ------- Vettore risultante 5 14 19 21 29 41 Valori ancora da copiare dai vettori di partenza 58 62 77 ------- Vettore risultante 5 14 19 21 29 41 58 Valori ancora da copiare dai vettori di partenza 62 77 ------- Vettore risultante 5 14 19 21 29 41 58 62 Valori ancora da copiare dai vettori di partenza 77 ------- Vettore risultante 5 14 19 21 29 41 58 62 77 Gli elementi del vettore di merge sono: 5 14 19 21 29 41 58 62 77

Google

C

p

i

l

eMail_to_trapaninfo.it

f

w

gbm w3c

^up^

Web Trapanese eXTReMe Tracker

TP Comuni

Copyright (c) 2002 -   trapaninfo.it home disclaim

w

WhatsApp-Chat

Ultima modifica :