CAPITOLO 13 - STRUTTURE DATI - VETTORI

Похожие документы
PASCAL: I VETTORI TRATTO DA CAMAGNI-NIKOLASSY, CORSO DI INFORMATICA, VOL. 1, HOEPLI. Informatica

La ricerca dicotomica

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

Algoritmo per l ordinamento di un array

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Algoritmi di Ricerca. Esempi di programmi Java

ITI M. FARADAY. Programmazione a. s

Algoritmi di Ricerca. Esempi di programmi Java

RICERCA BINARIA...1 ALBERO BINARIO DI RICERCA (ABR)...3 RICORSIONE...4 ESEMPI DI RICORSIONE IN VISUAL BASIC...5 ESEMPI DI RICORSIONE IN C / C++...

Algoritmi di Ricerca Ordinamento

Programmazione con il linguaggio LibreOffice Basic

C array. Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso.

Caratteristiche generali del linguaggio Visual Basic

Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software

Costanti e Variabili

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Parte 1: tipi primitivi e istruzioni C

Introduzione alla programmazione

Trasformare array paralleli in array di record

Cognome e Nome : Corso e Anno di Immatricolazione: Modalità di Laboratorio (Progetto/Prova) :

Verifica su Record e File

A. Ferrari. algoritmi notevoli. Python. Alberto Ferrari Informatica

(A) CONOSCENZA TERMINOLOGICA (B) CONOSCENZA E COMPETENZA (C) ESERCIZI DI COMPRENSIONE

Fondamenti di Informatica

STRUTTURA E LOGICA DI FUNZIONAMENTO DEL COMPUTER

Esercizi vari. Alberto Montresor. 19 Agosto, 2014

UD 3.2b: Programmazione in Pascal (1)

Excel & VBA. Excel e Visual Basic for Application

Programmazione web lato client con JavaScript. Marco Camurri 1

Fondamenti di Informatica

= < < < < < Matematica 1

Fondamenti di Informatica T-1 Modulo 2

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Fondamenti Teorici e Programmazione

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Esercitazione di Reti degli elaboratori

Informatica (A-K) 5. Algoritmi e pseudocodifica

Gli Array. Dichiarazione di un array

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Javascript. - Corso Web Design - Media Dream Academy. Stefano Gaborin

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

Programmazione con Java

Esercizi Capitolo 7 - Hash

Fondamenti di Informatica

Транскрипт:

INTRODUZIONE Con STRUTTURA DATI intendiamo un raggruppamento di dati tali da poter essere considerati come unico oggetto. In informatica esistono vari tipi di strutture dati, che differiscono per le seguenti caratteristiche: tipo di dati di cui sono composte: Si dicono omogenee le strutture di dati composte da dati dello stesso tipo, eterogenee nel caso contrario; modalità secondo cui è effettuata l allocazione: si dicono statiche se la loro occupazione di memoria, una volta fissata, non può essere modificata, dinamiche se può variare durante l esecuzione; disposizione dei singoli dati di memoria: si dicono sequenziali se i dati occupano locazioni contigue in memoria, non sequenziali nel caso contrario; metodo di accesso: cioè il modo in cui è possibile individuare ogni singolo elemento al loro interno. Si dicono ad accesso sequenziale quelle in cui il reperimento di un elemento avviene scorrendo la struttura dal primo elemento uno dopo l altro; ad accesso diretto quelle in cui è possibile posizionarsi direttamente sull elemento desiderato. L aspetto comune delle strutture dati è che esse vengono memorizzate nella RAM e, quindi, cancellate ogni qualvolta si spegne il computer o a fine esecuzione. LA STRUTTURA DATI VETTORE Proviamo a risolvere il seguente problema: dati in input 4 numeri, visualizzarli nell ordine inverso. La soluzione non appare per nulla complessa: è sufficiente richiedere in input quattro variabili, ad esempio A,B,C,D e visualizzarle nell ordine inverso, cioè D,C,B,A. Complichiamo il problema: dati in input 100 numeri, visualizzarli in ordine inverso. La situazione è un po diversa, in quanto dovremmo richiedere in input ben 100 variabili con nomi diversi (provate solamente a pensare agli inconvenienti legati alla scelta dei nomi). Utilizzando un così elevato numero di variabili, però, la soluzione impostata, anche se corretta, non rispecchia le regole di una buona programmazione. Complichiamo ancora un po : dati in input N numeri, visualizzarli in ordine inverso. Questa volta ci troviamo davvero nei guai, in quanto, con le nostre attuali conoscenze, il problema non può essere risolto: non sappiamo, infatti, quante variabili utilizzare. Potrebbero essere 5, o 100, o 1000. Come fare? E necessario utilizzare una struttura in grado di contenere un insieme di dati delle stesso tipo (nel nostro caso numeri). Abbiamo bisogno di un vettore. Un vettore (o array monodimensionale) è una struttura dati, di tipo sequenziale a carattere statico, costituita da un insieme di elementi omogenei fra loro, individuati per mezzo di un indice. 1

LA DICHIARAZIONE DEI VETTORI I vettori, essendo delle variabili di memoria, devono essere dichiarati primo del loro utilizzo; nella dichiarazione si deve specificare un nome (in modo da poterlo identificare nel codice) ed un numero massimo di elementi che dovrà contenere. Modo 1: Dichiarazione Statica Questo tipo di dichiarazione può essere utilizzata ogni qualvolta si conosce, a priori, il numero massimo di elementi che si necessita memorizzare. Esempio di dichiarazione: Dim VetNumeri(100) As Integer Nella precedente dichiarazione il vettore si chiama VETNUMERI e potrà contenere al massimo 100 numeri interi. Dim VetNomi(20) As String Invece in questa dichiarazione il vettore si chiama VETNOMI e potrà contenere al massimo 20 nomi. Modo 2: Dichiarazione Dinamica In questo tipo di dichiarazione è possibile non specificare, durante la dichiarazione, il numero massimo di elementi che la struttura dovrà ospitare. Ovviamente si tratta solamente di un rinvio in quanto, prima o poi, lo si dovrà fare. Dim VetNumeri() As Integer Nella precedente dichiarazione il vettore si chiama VETNUMERI e inizialmente non potrà contenere elementi. Dim VetNomi() As String In questa dichiarazione, il vettore si chiama VETNOMI e inizialmente non potrà contenere elementi. Per poter utilizzare il vettore dichiarato dinamicamente, è necessario ridimensionarlo (assegnandogli dello spazio) con la seguente sintassi: ReDim Preserve VetNumeri(100) ReDim Preserve VetNomi(20) Preserve è un attributo facoltativo che, se specificato, indica di continuare a mantenere i dati attualmente presenti nel vettore anche dopo il suo ridimensionamento. 2

UTILIZZO DEI VETTORI Nel momento in cui si desidera memorizzare/recuperare dei dati nel/dal vettore, di può utilizzare la seguenti sintassi NomeVettore(Indice)= valore Il nome del vettore deve corrispondere al nome assegnato nella dichiarazione; l indice invece, indica la posizione in cui si desidera memorizzare o recuperare il valore. Nel successivo esempio si mette in evidenza come è possibile dichiarare e inserire dei dati in un vettore. Dim VetNumeri(8) As Integer VetNumeri(1) = 3 VetNumeri(2) = 8 VetNumeri(3) = 1 VetNumeri(4) = 10 VetNumeri(5) = 85 VetNumeri(6) = 90 VetNumeri(7) = 7 VetNumeri(8) = 34 Dichiarazione Utilizzo L organizzazione usata nel vettore è rigida. Ciò comporta alcuni svantaggi quando devono essere eseguite alcune manipolazioni sui suoi elementi. Vediamoli: difficoltà di inserimenti o cancellazioni: L inserimento di un nuovo elemento nella struttura richiederebbe lo spostamento, mediante riscrittura, di tutti gli elementi che lo seguono; un operazione analoga sarebbe richiesta nel caso della eliminazione di un elemento del vettore. Dimensione statica: nella dichiarazione statica è necessario fissare a priori un limite massimo di elementi che il vettore dovrà contenere; solitamente non si è a conoscenza di tale limite il che comporta un sovradimensionamento della struttura da parte del programmatore. 3

OPERAZIONI SUI VETTORI Un vettore, in un algoritmo, non può mai essere manipolato come se fosse una cosa sola. Si deve sempre operare sui singoli elementi. A livello logico, però, si possono definire delle operazioni proprie di queste strutture. Vediamone alcune. 1. Caricamento del Vettore Il caricamento è l operazione che consente di assegnare un valore agli elementi del vettore. 2. Scansione del Vettore L operazione di scansione consente di accedere a tutti gli elementi della struttura, o solo a una sua parte, per esaminare il contenuto o per effettuare delle variazioni. 3. Ricerca nel vettore L operazione di ricerca su un vettore si effettua ogni qualvolta si ha la necessità di cercare la presenza di un dato. La si effettua con una scansione che può terminare prima di aver scansionato tutti gli elementi (quando l elemento da cercare è stato trovato) oppure alla fine quando l elemento non è esistente. 4. Ordinamento dei dati L operazione di ordinamento consente di riorganizzare i dati presenti nel vettore in base ad un criterio prestabilito (ordinamento crescente o decrescente). 5. Lo Shift degli elementi Lo shift è l operazione che consente di spostare di una posizione (a destra o a sinistra) tutti gli elementi del vettore (shift completo) o solo una sua parte (shift parziale). Nello shift completo a sinistra, tutti gli elementi presenti nel vettore saranno spostati di una posizione verso sinistra (il contenuto della seconda posizione verrà inserito nella prima, il contenuto della terza sarà a sua volta spostato nella seconda, e così via). In tal modo, l elemento presente nella prima posizione sarà perduto, mentre quello presente nell ultima si presenterà due volte. Rispetto all operazione descritta precedentemente, nello shift completo a destra varia solo l ordine in cui vengono eseguite le assegnazioni. Sarà quindi il contenuto dell ultima posizione a essere perso, mentre quello della prima si presenterà due volte. Lo shift parziale sinistro o destro si esegue quando occorre spostare solo alcuni elementi adiacenti del vettore. Per far questo, è indispensabile conoscere gli indici estremi del gruppo che si intende spostare. 6. La rotazione del vettore La rotazione è l operazione attraverso la quale vengono spostati tutti gli elementi del vettore. Lo spostamento verso destra o verso sinistra comprende il primo e l ultimo che, in tal modo, non saranno persi ma si ripresenteranno all altro capo del vettore. Tecnicamente, la rotazione viene realizzata shiftando tutti gli elementi secondo il verso della rotazione e salvando, in un apposita variabile, il valore dell elemento che viene spinto fuori. Terminato lo Shift, tale valore sarà inserito in prima o in ultima posizione del vettore, a seconda del verso in cui si vuol far avvenire la rotazione. 4

ALGORITMI DELLE OPERAZIONE SUI VETTORI Allo scopo di uniformare gli algoritmi trattati in questa sezione, si supponga di avere a disposizione un vettore di 100 elementi di nome VETNUM. CARICAMENTO DI ELEMENTI NEL VETTORE TABELLA DELLE VARIABILI Dim VetNum(100) As Integer Dim N As Integer Dim i As Integer Dim j As Integer Dim Ris As String Dim Ele As Integer Dim Trovato As Boolean Dim sc As Integer VISUALIZZAZIONE DEGLI ELEMENTI DEL VETTORE 5

RICERCA DI UN ELEMENTO NEL VETTORE (RIC.SEQUENZIALE) La ricerca di un elemento in un vettore, detta anche ricerca sequenziale, si applica a vettori che non devono necessariamente essere ordinati. Consiste in una serie di confronti tra il valore ELE da ricercare e tutti gli elementi del vettore. I confronti possono terminare nel momento in cui si trova l elemento cercato, o possono anche continuare sino alla fine del vettore. La funzione che implementa la ricerca sequenziale fa uso di una variabile booleana di nome TROVATO (così chiamata proprio per far riferimento al suo significato intrinseco). Tale variabile assume inizialmente valore FALSO, ma, nel momento in cui il valore richiesto viene trovato, assume il valore VERO. RICERCA DI UN ELEMENTO NEL VETTORE (RIC. BINARIA) Il metodo della Ricerca Binaria o Dicotomica richiede che gli elementi del vettore siano ordinati. Il procedimento è il seguente: innanzitutto bisogna identificare l elemento che occupa la posizione centrale del vettore e confrontare questo elemento con quello X cercato. Si possono verificare tre casi: 1. l elemento X è più piccolo dell elemento centrale: si scartano tutti gli elementi che occupano la metà destra del vettore. E come se, l ultimo elemento del vettore fosse quello precedente a N/2; 2. l elemento X è più grande dell elemento centrale: si scartano tutti gli elementi che occupano la metà sinistra del vettore. E come se, ora, il primo elemento del vettore fosse quello successivo a N/2; 3. l elemento X è uguale all elemento centrale: X appartiene all insieme e si trova in posizione centrale. Per i casi 1 e 2 il discorso va ripetuto sino a quando si verifica il caso 3 o, rimanendo un solo elemento da confrontare nel vettore, l elemento X risulta essere diverso, quindi non è presente nel vettore. 6

ORDINAMENTO DEGLI ELEMENTI DEL VETTORE METODO 1) ORDINAMENTO PER SELEZIONE: Questo algoritmo è il più intuitivo e inefficace metodo di ordinamento; consiste nel confrontare ciascun elemento con tutti quelli di indice superiore. Si cambia il loro contenuto quando si verifica che il valore dell elemento preso in considerazione risulta maggiore di quello con cui viene confrontato (nel caso di ordinamento crescente). Con la fine della prima scansione abbiamo posizionato l elemento di valore più piccolo in prima posizione. Con la seconda posizioniamo il più piccolo in seconda posizione e così via. METODO 2) ORDINAMENTO BUBBLE SORT (A BOLLE) O PER SCAMBIO: Questo algoritmo consiste nel confronto degli elementi a due a due, e cioè il primo con il secondo, secondo con il terzo,, penultimo con ultimo. Questa ripetizione di scambi fra elementi adiacenti permette di far salire verso l alto, proprio come bolle di sapone, gli elementi più grandi (o più piccoli in caso di ordiname nto decrescente); da qui il nome Bubble Sort. La soluzione è quella di ripetere i confronti ripartendo dal primo elemento, tante volte quante ne sarà necessario. Se durante una scansione non si effettuano confronti vuol dire che il vettore è ordinato, altrimenti si continua a confrontare. 7

SHIFT A DESTRA DEGLI ELEMENTI DEL VETTORE ROTAZIONE A DESTRA DEGLI ELEMENTI DEL VETTORE VETTORI PARALLELI Prendiamo ora in esame il concetto di Vettori Paralleli (o in posizione corrispondenti): con questo termine si indicano due o più vettori messi l uno sotto l altro in cui, a parità di indice, l elemento di uno o dell altro appartiene sempre alla stessa entità. Per chiarire meglio questo concetto si riporta di seguito un esempio. Supponiamo di voler memorizzare i nomi e le votazioni degli studenti di una classe. Il problema formulato ci pone di fronte a una nuova situazione, perché dobbiamo memorizzare due informazioni per ogni studente. Vanno memorizzati, quindi, due tipi diversi di informazioni: nomi e votazioni, quindi stringhe e numeri. Un vettore, per definizione, non può assolutamente contenere più di una informazione per ogni componente. Per risolvere il problema, quindi, è necessario utilizzare un vettore per ogni tipo di informazione. Nel nostro caso i vettori saranno due, ad esempio NOMI e VOTI: il nome e il voto aventi lo stesso indice corrisponderanno allo stesso studente. Si dice che i due vettori sono vettori paralleli, perché alla stessa posizione corrisponderanno le informazioni relative allo stesso soggetto. Dalla figura precedente si può constatare che l alunno ROSSI ha il voto 9,350 mentre l alunno BIANCHI 9,900. La gestione dei vettori paralleli non differisce assolutamente da quella studiata sinora. Solitamente il caricamento delle informazioni nel vettore avviene contemporaneamente per ogni singolo elemento (si carica prima un nome nel primo vettore e poi il relativo voto nella corrispondente posizione dell altro vettore, e così via). In ogni caso non sarebbe sbagliato caricare prima tutti i nomi e poi tutti i voti. 8

ESEMPIO DI CODIFICA IN VB.NET INTERFACCIA <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:button ID="Button1" runat="server" Text="Gestisci Vettore" /> </form> </body> </html> CODIFICA Partial Class Default2 Inherits System.Web.UI.Page Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim VetNum(100) As Integer Dim N As Integer Dim i As Integer Dim j As Integer Dim Ris As String Dim Ele As Integer Dim Trovato As Boolean Dim sc As Integer ' Caricamento del Vettore N = InputBox("Quanti elementi vuoi Caricare?") For i = 1 To N VetNum(i) = InputBox("Inserisci il " & i & " elemento") ' Visualizza i suoi elementi Ris = "" For i = 1 To N Ris = Ris & VetNum(i) & " " MsgBox("Gli Elementi Caricati nel vettore sono: " & Ris) ' Ricerca di un elemento Ele = InputBox("Inserisci un elemento da ricercare") Trovato = False i = 1 Do While i <= N And Trovato = False If Ele = VetNum(i) Then Trovato = True Else i = i + 1 End If Loop If Trovato = True Then MsgBox("L'elemento " & Ele & " si trova in posizione " & i) Else MsgBox("L'elemento " & Ele & " non è stato trovato") End If ' Ordinamento crescente per SELEZIONE For i = 1 To N - 1 For j = i + 1 To N If VetNum(i) > VetNum(j) Then ' Scambio delgli elementi sc = VetNum(i) VetNum(i) = VetNum(j) VetNum(j) = sc End If ' Visualizza il vettore Ris = "" For i = 1 To N Ris = Ris & VetNum(i) & " " MsgBox("Gli Elementi, dopo l'ordinamento crescente, sono: " & Ris) 9

' Rotazione degli elementi a destra sc = VetNum(N) For i = N To 2 Step -1 VetNum(i) = VetNum(i - 1) VetNum(1) = sc ' Visualizza il vettore Ris = "" For i = 1 To N Ris = Ris & VetNum(i) & " " MsgBox("Gli Elementi, dopo la rotazione a destra sono: " & Ris) End Sub End Class ' Shift degli elementi a destra For i = N To 2 Step -1 VetNum(i) = VetNum(i - 1) ' Visualizza il vettore Ris = "" For i = 1 To N Ris = Ris & VetNum(i) & " " MsgBox("Gli Elementi, dopo lo shift a destra sono: " & Ris) 10