Prof. Remo Misisca
GLI ALGORITMI
LE STRUTTTURE DATI
1
Prof. Remo Misisca
GLI ALGORITMI
ALGORITMI E LORO TIPOLOGIE â– Definizione di Variabili e Costanti
2
Prof. Remo Misisca
GLI ALGORITMI
ALGORITMI E LORO TIPOLOGIE â– Definizione di Variabili e Costanti
Costanti in C
La definizione di una costante cosa fa? Quanto tempo vive una Costante?
3
Prof. Remo Misisca
GLI ALGORITMI
ALGORITMI E LORO TIPOLOGIE ■ Strutture dati e loro tipologie C'è uno stretto legame pure tra algoritmi e strutture dati, in quanto le strutture dati costituiscono gli ingredienti di base degli algoritmi.
Anche l'efficienza di un algoritmo dipende in maniera critica dal modo in cui sono organizzati i dati su cui esso deve operare. Una struttura dati è : un insieme di dati logicamente correlati e opportunamente memorizzati, per i quali sono definiti degli operatori di costruzione, selezione e manipolazione.
4
GLI ALGORITMI
Prof. Remo Misisca
5
ALGORITMI E LORO TIPOLOGIE â– Strutture dati e loro tipologie Le varie strutture dati sono riconducibili a combinazioni di strutture dati appartenenti alle quattro classi fondamentali: Alberi
Array
Liste
Grafi
Prof. Remo Misisca
GLI ALGORITMI
ALGORITMI E LORO TIPOLOGIE ■ Strutture dati e loro tipologie Classificazione delle strutture dati basata sulla loro occupazione di memoria: Strutture dati statiche: la quantità di memoria di cui esse necessitano è determinabile a priori (array). Strutture dati dinamiche: la quantità di memoria di cui esse necessitano varia a tempo d'esecuzione e può essere diversa da esecuzione a esecuzione (liste, alberi, grafi).
6
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Introduzione agli Arrays Le variabili primitive sono progettate per contenere
un solo valore alla volta. Gli array ci consentono di creare una raccolta di valori simili che sono indicizzati. Un array può memorizzare qualsiasi tipo di dati ma
solo un tipo di dati alla volta. Una matrice è una lista di elementi di dati.
7
STRUTTURE DATI : GLI ARRAYS
Prof. Remo Misisca
8
Creare un Arrays • Un array è un oggetto quindi necessita di un riferimento a un
oggetto. // Declare a reference to an array that will hold integers. int[] numbers;
• Il prossimo passo crea l'array e assegna il suo indirizzo alla
variabile numerica. // Create a new array that will hold 6 integers. numbers = new int[6]; 0
0
0
0
0
0
index 0
index 1
index 2
index 3
index 4
index 5
Array element values are initialized to 0. Array indexes always start at 0.
Prof. Remo Misisca
STRUTTURE DATI
GLI ARRAYS
Creare gli Arrays • È possibile dichiarare un riferimento ad array e
crearlo nella stessa dichiarazione. int[] numbers = new int[6];
• Gli array possono essere di qualsiasi tipo. float[] temperatures = new float[100]; char[] letters = new char[41]; long[] units = new long[50]; double[] sizes = new double[1200];
9
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
• La dimensione di una array : non può essere un numero negativo. Può essere un valore letterale, una costante o
variabile. final int ARRAY_SIZE = 6; int[] numbers = new int[ARRAY_SIZE]; • Una volta creato, la dimensione di un array non può
essere modificata.
10
STRUTTURE DATI : GLI ARRAYS
Prof. Remo Misisca
11
Accedere agli elementi di una an Array 20
0
0
0
0
0
numbers[0]
numbers[1]
numbers[2]
numbers[3]
numbers[4]
numbers[5]
• Un array è accessibile con: • Il riferimento al suo nome • un indice che identifica l'elemento nell’array per l'accesso. numbers[0] = 20; //pronounced "numbers sub zero"
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Inputting and Outputting Array Elements • Gli elementi dell'array possono essere trattati come
una qualsiasi altra variabile. • Sono semplicemente accessibili con lo stesso nome e un indice. • È possibile accedere agli indici delle array usando variabili (come per i contatori di loop).
12
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Controllare il limite delle dimesnioni • Gli indici di matrice iniziano sempre da zero e continuano a
(lunghezza dell'array - 1). int values = new int[10]; • In questo array gli indici vanno da 0 a 9.. • Nei loop for, è tipico usare i, j e k come variabili di
conteggio. • Possiamo utilizzare delle variabili per scorrere il contenuto
di un array. In tal caso la variabile viene chiamata “Indice dell’array”
13
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
14
Errore classico : Sbagliare di un valore l’indice • È veramente facile sbagliare quando si accede ad un indice.
// This code has an off-by-one error. int[] numbers = new int[100]; for (int i = 1; i <= 100; i++) numbers[i] = 99; • Here, the equal sign allows the loop to continue on to index 100,
where 99 is the last index in the array. • Questo codice genererebbe un ArrayIndexOutOfBoundsException.
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
15
Inizializzazione di un Array • Quando è necessario inizializzare relativamente pochi elementi,
è possibile utilizzare un elenco di inizializzazione per inizializzare l'array. int[]days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
• I numeri nell'elenco sono memorizzati nell'array nell'ordine: • days[0] is assigned 31, • days[1] is assigned 28, • days[2] is assigned 31, • days[3] is assigned 30, • etc.
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Altre modalità di dichiarazione di array • Precedentemente abbiamo mostrato gli array dichiarati così:
int[] numbers; • Tuttavia, le parentesi possono anche andare qui :
int numbers[]; Questi metodi sono equivalenti, ma il primo stile è quello tipico. • Possiamo dichiarare più array sulla stessa linea.
int[] numbers, codes, scores; • Con la notazione alternativa ogni variabile deve avere parentesi
int numbers[], codes[], scores; • The scores variable in this instance is simply an int variable.
16
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Elaborare il contenuto di un Array • L'elaborazione dei dati in un array è uguale a qualsiasi
altra variabile. grossPay = hours[3] * payRate; • Pre e post incremento funzionano allo stesso modo:
int[] score = {7, 8, 9, 10, 11}; ++score[2]; // Pre-increment operation score[4]++; // Post-increment operation
17
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Elaborare il contenuto di un Array â&#x20AC;˘ Gli elementi dell'array possono essere utilizzati nelle operazioni
relazionali: if(cost[20] < cost[0]) { //statements } â&#x20AC;˘ Possono essere usati come condizioni in un ciclo :
while(value[count] != 0) { //statements }
18
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Lunghezza di un Array • Gli Array sono oggetti che possiedono un campo
pubblico di nome Length che è una costante che può essere testata. double[] temperatures = new double[25]; • La lunghezza di questo array è 25.
• La lunghezza di un array la possiamo ottenere
utilizzando la costante length. int size = temperatures.length; • La variabile size conterrà 25.
19
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Il ciclo for per scorrere gli array • Elaborazione semplificata di un array (sola lettura) • Questo ciclo scorre tutti gli elementi dell’array • Formato generale:
for(datatype elementVariable : array) statement;
20
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Il ciclo for per scorrere gli array Example: int[] numbers = {3, 6, 9}; For(int val : numbers) { System.out.println(“Il prossimo valore è " + val); } //l’output sarà 3 6 9
21
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Dimensione degli Array â&#x20AC;˘ La costante length può essere utilizzata in un ciclo
per fornire il limite superiore automaticamente. Index subscripts start at 0 and end at one less than the array length. for(int i = 0; i < temperatures.length; i++) { System.out.println("Temperatura " + i ": " + temperatures[i]); }
22
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Dimensione degli Array • Puoi consentire all'utente di specificare la dimensione
di un array: int numTests; int[] tests; Scanner keyboard = new Scanner(System.in); System.out.print(“Quanti test devi fare?"); numTests = keyboard.nextInt(); tests = new int[numTests]; • Esercitazione :
Scrivere un programma che chiede la dimensione di un array , lo popola e stampa tutti gli elementi a video.
23
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Riassegnazione di riferimenti di un array • Un riferimento di matrice può essere assegnato a un altro
array dello stesso tipo. // Crea un array a cui fa riferimento la variabile numerica. int[] numbers = new int[10]; // Riassegna alla variabile numbers un nuovo array numbers = new int[5];
• Se il primo array di 10 elementi non ha più riferimenti ad
alcuni elementi (dal sesto al decimo) , questi saranno cancellati (garbage collection).
24
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
25
Riassegnazione di riferimenti di un array La variabile numbers contiene il puntatore (Address) ad un un array di interi.
Address
int[] numbers = new int[10];
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Riassegnazione di riferimenti di un array La variabile numbers contiene il puntatore (Address) ad un un array di interi. Address
This array gets marked for garbage collection
numbers = new int[5];
26
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
27
Copiare gli Array • Questo non è la soluzione di copiare un array. int[] array1 = { 2, 4, 6, 8, 10 }; int[] array2 = array1; // This does not copy array1.
2 array1 holds an address to the array
Address
array2 holds an address to the array
Address
4
6
8 10
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Copiare gli Array • Non è possibile copiare una array semplicemente
assegnando l’indirizzo di una variabile ad un'altra. • È necessario copiare i singoli elementi di un array all’altro int[] firstArray = {5, 10, 15, 20, 25 }; int[] secondArray = new int[5]; for (int i = 0; i < firstArray.length; i++) secondArray[i] = firstArray[i];
• Questo codice assegna ogni elemento di
firstArray al corrispondente elemento di secondArray.
28
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
29
Passare un Array come argomento â&#x20AC;˘ Gli array sono oggetti. â&#x20AC;˘ I loro riferimenti possono essere passati a funzioni e
procedure come qualsiasi altra variabile di riferimento di un oggetto. showArray(numbers);
Address
5 10 15 20 25 30 35 40
Example: PassArray.java
public static void showArray(int[] array) { for (int i = 0; i < array.length; i++) System.out.print(array[i] + " "); }
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
30
Confrontare gli Array • L’operatore == stabilisce solo se i riferimenti (I
puntatori) degli array puntano allo stesso oggetto array. int[] firstArray = { 5, 10, 15, 20, 25 }; int[] secondArray = { 5, 10, 15, 20, 25 }; if (firstArray == secondArray) // Questo è un errore. System.out.println(“Sono lo stesso array."); else System.out.println(“Non sono gli stessi array.");
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
Confrontare gli Array: Esempio int[] firstArray = { 2, 4, 6, 8, 10 }; int[] secondArray = { 2, 4, 6, 8, 10 }; boolean arraysEqual = true; int i = 0; // First determine whether the arrays are the same size. if (firstArray.length != secondArray.length) arraysEqual = false;
// Next determine whether the elements contain the same data. while (arraysEqual && i < firstArray.length) { if (firstArray[i] != secondArray[i]) arraysEqual = false; i++; } if (arraysEqual) System.out.println("The arrays are equal."); else System.out.println("The arrays are not equal.");
31
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
32
Esercitazione 1 : Scrivere una procedura che: 1. verifica se due array dati come input sono o meno uguali 2. Se sono uguali risponde “Gli array sono uguali”. Altrimenti risponde “Gli array sono diversi”.
Prof. Remo Misisca
STRUTTURE DATI : GLI ARRAYS
33
Esercitazione 2 : Scrivere una procedura “InizializzaVettore” che crea un vettore di 10 elementi e lo valorizza con dei dati numerici chiesti all’utente. Esercitazione 3 : Dato il vettore dell’esercitaizone precedente scrivi il programma/la procedure che : a) Trova e stampa il valore Massimo b) Trova e stamp ail valore Minimo c) Stampa la somma di tutti i valori d) Stampa la media di tutti I valori