Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Slides:



Advertisements
Presentazioni simili
INFORMATICA Algoritmi fondamentali
Advertisements

Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
Algoritmi notevoli.
Array multidimensionali
Algoritmi notevoli In linguaggio C.
PROGRAMMARE IN PASCAL (le basi)
Sviluppo di programmi strutturati
Capitolo 8 Array Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Informatica Generale Marzia Buscemi
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Alberi binari di ricerca
Dallalgoritmo minimax allalgoritmo alfa-beta. MINIMAX int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
PROGRAMMI DI RICERCA E ORDINAMENTO
Esercizi su alberi binari
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
1 Corso di Informatica (Programmazione) Esercitazione 1 (26 novembre 2008)
Corso di Informatica (Programmazione)
1 Corso di Informatica (Programmazione) Esercitazione 2 (3 dicembre 2008)
Esercizio 4 Data una stringa P di lunghezza m e definita sullalfabeto, scrivere un programma PERL per calcolare la seguente funzione: PREFIX_FUNCTION:
1 Corso di Informatica (Programmazione) Esercitazione 3 (5 dicembre 2008)
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
CORSO DI PROGRAMMAZIONE II
e array a più dimensioni
Uso dei cicli y t =c+ty t-1 +e Un uso dei cicli può essere quello di creare una serie storica per cui y t =c+ty t-1 +e dove poniamo c e t scalari ed e~N(0,1).
Array Struttura numerate di dati. Memorizzare molti dati In informatica cè spesso bisogno di memorizzare ed elaborare un insieme costituito da molti dati.
07/04/2003Algoritmi Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure.
Corso di Informatica A.A Corso di Informatica Laurea Triennale - Comunicazione&Dams Dott.ssa Adriana Pietramala Laurea.
Corso di Informatica A.A Corso di Informatica Laurea Triennale - Comunicazione&Dams Dott.ssa Adriana Pietramala Laurea.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Esercizi su alberi binari
Strutture di controllo in C -- Flow Chart --
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Problema Ci sono 5 signore nel parco. Ognuna di loro ha 1 figlio. Ogni bambino ha 10 figurine di calciatori, per un totale quindi di 50 figurine. Questi.
Le funzioni.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
Esercizi Liste.
IL MASSIMO DI UN ARRAY ESERCIZIO
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Introduzione a Javascript
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Algoritmi e Strutture Dati
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
Esercizi.
Fondamenti di informatica T-A Esercitazione 5 : Stringhe ed array AA 2012/2013 Tutor : Domenico Di Carlo.
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
GLI ALGORITMI DI ORDINAMENTO
1 Java secondo contatto Nel tunnel una luce…. 2 Esercizio - Contatore Definire la classe Contatore con le seguenti caratteristiche:  Il metodo getValore.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
30/10/01Array 1  Un array e’ una struttura dati che contiene piu’ valori del medesimo tipo.  La lunghezza di un array e’ stabilita quando l’array viene.
6/11/01Ordinamento 1 Un esempio di algoritmi: ordinamento.
Cicli e Array. 2 Costrutto while while(espressione) { … } Il codice dentro le parentesi graffe viene eseguito finché la condizione è vera Potrebbe non.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Transcript della presentazione:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa E11 Esercizi su array di array C. Limongelli Gennaio 2012 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Contenuti Fusione di due array ordinati, con eliminazione di duplicati Verifica array bidimensionale Generazione di un array con numeri disposti a spirale http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Esercizio Implementare la fusione con rimozione di duplicati di due array ordinati in modo non decrescente ciascuna delle sequenze iniziali può contenere duplicati Gli array sono non vuoti (almeno un elemento) Esempio: a 5 15 15 34 s 5 8 15 34 b 5 8 15 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array I test del problema System.out.println(toString(fusioneSenzaDuplicati (new int[] {0, 1, 4, 5}, new int[] {3, 6, 10}))); (new int[] {0, 1, 4, 5}, new int[] {0, 2, 10}))); (new int[] {0, 1, 4, 5}, new int[] {0, 1, 4}))); (new int[] {0, 1, 4}, new int[] {0, 1, 4}))); (new int[] {1, 1, 1}, new int[] {1, 1, 2}))); (new int[] {1, 2, 3}, new int[] {3, 4, 5}))); (new int[] {1}, new int[] {1}))); http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Algoritmo… Prima di inserire un elemento (di a o di b) in s, bisogna controllare che lo stesso elemento non compaia già in s Sia is l’indice di s in cui verrà memorizzato il prossimo elemento Sia a[ia] (o b[ib]) l’elemento che si vorrebbe inserire in s Bisogna controllare che l’elemento s[is-1] sia diverso da a[ia] (o b[ib]), altrimenti non si deve inserire, ma comunque si deve incrementare l’indice ia (o ib) La prima volta che inserisco un elemento in posizione s[0], non posso fare il controllo su s[-1], quindi devo considerare a parte il primo inserimento. Come? Controllando che is non sia uguale a 0 Se l’elemento non viene inserito in s, l’indice relativo, is, non viene incrementato http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array …Algoritmo… /* supponiamo is = ia = ib = 0 */ /* prima fase della fusione: inserisci da a e b */ while (ia<a.length && ib<b.length) { /* inserisci in s il più piccolo tra a[ia] e b[ib] se non esiste gia' in s */ if (a[ia]<b[ib]) { //provo ad inserire a[ia] in s if (is==0 || a[ia] != s[is-1]){ s[is] = a[ia]; is++; } ia++; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array …Algoritmo… /* prima fase della fusione: inserisci da a e b */ while (ia<a.length && ib<b.length) { if { … } else { // b[ib] <= a[ia] if (is ==0 || b[ib] != s[is-1]){ s[is] = b[ib]; is++; } ib++; Perché quando is = 0 l’accessso a s[is-1] non Produce arrayOutOfBoundsException? http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array …Algoritmo… Anche nella seconda fase della fusione, quando la scansione di uno dei due array è terminata e bisogna inserire il resto dell’altro array, si devono fare le stesse considerazioni poiché gli array a e b non sono vuoti, ci sarà almeno un elemento in s, quindi non bisogna più controllare che l’indice si sia 0 Se la scansione di b è terminata: /* inserisci da a */ while (ia<a.length) { if (s[is-1] != a[ia]){ s[is] = a[ia]; is++; } ia++; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array …Algoritmo… Analogamente per l’inserimento da b: /* inserisci da b */ /* l'array deve essere non vuoto perche' deve aver inserito dal ciclo precedente almeno un elemento in s */ while (ib<b.length) { if(s[is-1] != b[ib]){ s[is] = b[ib]; is++; } ib++; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Considerazioni sulla lunghezza del nuovo array . . . L’array s è sicuramente non vuoto Avrà lunghezza <= alla somma della lunghezza di a e della lunghezza di b La lunghezza sarà uguale alla somma delle lunghezze solo se gli elementi di a e di b sono tutti distinti http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

. . . Considerazioni sulla lunghezza del nuovo array Inizialmente si crea un array di appoggio di lunghezza pari alla somma delle lunghezze di a e di b Dopo l’inserimento degli elementi in s, is (che rappresenta l’indice del prossimo elemento in cui si può inserire in s) è pari al numero di componenti memorizzate fino a quel momento in s, cioè è pari alla lunghezza che dovrà avere s Si crea l’array definitivo con lunghezza pari a is e si ricopiano gli is elementi dell’array di appoggio in quello definitivo http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Gestione della lunghezza del nuovo array int[] s; // risultato della fusione di a e b int[] s1; // risultato definitivo della fusione // di a e b … //copiare i valori significativi di s in un nuovo //array s1; // si può anche usare System.arraycopy(..); s1 = new int[is]; for (i=0; i<s1.length;i++) s1[i] = s[i]; /* ora la fusione è stata completata */ return s1; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Lo schema dell’applicazione public class ArrayFusioneSenzaDuplicati { public static int[] fusioneSenzaDuplicati(int[] a, int[] b) { … } public static String toString(int[] array) { public static void main(String[] args) { http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Modifica del problema Come modificare l’algoritmo in modo che vengano anche accettati array vuoti? Basta effettuare un controllo sull’array vuoto e in caso positivo saltare la prima istruzione while? No perché la seconda parte della fusione prevede che l’array contenga almeno un elemento Bisogna controllare, anche nella seconda parte della fusione che is non sia 0. http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Esercizio Scrivere un metodo che, ricevendo come parametro un array di array A, verifica se A è bidimensionale Ossia che tutti gli elementi di A siano array della stessa lunghezza Verifica universale Schema: la variabile booleana è inizializzata a true Si ipotizza che tutti gli array siano della stessa lunghezza Ad esempio uguali alla lunghezza del primo array L’istruzione while si interrompe non appena un array ha lunghezza diversa dal primo oppure quando è terminato l’esame di tutto l’array http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array I test del problema public static void testBidimensionale(){ int[][] mat; mat = new int[][] {{1}}; stampa(mat); System.out.println("Array bidimensionale? TRUE = "+bidimensionale(mat)); mat = new int[][] {{1,0},{0,1}}; mat = new int[][] {{1,0,0},{0,1}}; System.out.println("Array bidimensionale? FALSE = "+bidimensionale(mat)); mat = new int[][] {{2,0,0},{4,0},{0,0,5}}; mat = new int[][] {{3,0,0,0},{0,2,0,0},{0,0,5,0},{0,0,0,1}}; mat = new int[][] {{3,0,2,0},{0,2,1,0},{0,0,5,0},{}}; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Il metodo bidimensionale public static boolean bidimensionale(int[][] mat){ int i,j; int r; //numero di righe dell'array int lunghezza; // lunghezza che dovrebbero avere tutti i // sottoarray uguale alla lunghezza // del primo sottoarray boolean bidimensionale; lunghezza = mat[0].length; r= mat.length; bidimensionale = true; for(i=1; i<r; i++) if(mat[i].length != lunghezza) bidimensionale = false; return bidimensionale; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Esempio d’esecuzione matrice: 1 Array bidimensionale? TRUE = true 1 0 0 1 1 0 0 Array bidimensionale? FALSE = false 2 0 0 4 0 0 0 5 3 0 0 0 0 2 0 0 0 0 5 0 0 0 0 1 3 0 2 0 0 2 1 0 Press any key to continue . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Esercizio Scrivere un metodo che, dato un numero positivo N, crea e restituisce una matrice quadrata NxN di interi che memorizza i numeri da 1 a N2 disposti “a spirale” Esempio: le matrici a spirale di ordine 3 e 4 1 2 3 8 9 4 7 6 5 12 13 14 11 16 15 10 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Analisi del problema Sia res la matrice risultato che vogliamo costruire Bisogna iniziare dalla componente mat[0][0] inserendo 1 Si scorre verso destra inserendo numeri via via crescenti Quando si deve cambiare direzione? Quando si incontrano le diagonali principale o secondaria Oppure quando ci si trova “sotto” la diagonale principale 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Il problema del cambio di direzione… Convenzioni: da sinistra verso destra: 0 dall'alto verso il basso: 1 da destra verso sinistra: 2 dal basso verso l'alto: 3 Se vado da sinistra verso destra (0) e incontro la diagonale secondaria, devo andare verso il basso (1) Se vado dall’alto verso il basso (1) e incontro la diagonale principale devo andare da destra verso sinistra (2) Se vado da destra verso sinistra (2) e incontro la diagonale secondaria devo andare dal basso verso l’alto (3) Se vado dal basso verso l’alto (3) e mi trovo una riga sotto la diagonale principale devo andare da sinistra verso destra (0) http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

…Il problema del cambio di direzione Quando ci si trova sulla diagonale secondaria i+j = n-1 la direzione diventa 1 o 3 Quando ci si trova nella metà inferiore della diagonale principale i=j e j+j>=n la direzione diventa 2 Quando ci si trova una riga sotto la metà superiore della diagonale principale i= j+1 e i+j<n la direzione diventa 0 Negli altri casi la direzione non varia 2 1 3 12 13 14 11 16 4 5 6 10 9 8 7 15 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Il metodo aggiornaDirezione public static int aggiornaDirezione(int direzione, int i, int j, int n){ /* se ci si trova sulla diagonale secondaria la direzione diventa 1 e 3 */ if (i+j == n-1) direzione++; /* se ci si trova sulla meta' inferiore della diagonale principale la direzione diventa 2 */ if (i==j && j+j>=n) /* se ci si trova su una riga sotto la meta‘ superiore della diagonale principale la direzione diventa 0 */ if (i==j+1 && i+j<n) /*negli altri casi la direzione non varia */ return direzione % 4; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Come aggiornare gli indici Dopo che è stato inserito un numero nella matrice il metodo aggiornaDirezione fornisce la posizione in cui deve essere memorizzato il numero successivo se la nuova (o vecchia) direzione è 1 o 3 la colonna non varia ma ci si sposta di riga Se è 1 l’indice di riga viene incrementato Se è 3 l’indice di riga viene decrementato Se la nuova (o vecchia) direzione è 0 o 2 la riga non varia ma ci si sposta di colonna Se è 0 l’indice di colonna viene incrementato Se è 2 l’indice di colonna viene decremantato http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

I metodi aggiornaRiga e aggiornaColonna public static int aggiornaRiga(int i,int direzione){ int res; if (direzione==1) res=i+1; // muove dall'alto verso // il basso else res=i-1; // muove dal basso verso l'alto return res; } public static int aggiornaColonna(int j,int direzione){ if(direzione==0) res=j+1; // muove da sinistra verso // destra else res=j-1; // muove da destra verso sinistra http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Il metodo spirale… Dichiarazoni e inizializzazioni public static int[][] spirale(int n){ int[][] res; int i,j; // indici della matrice int num; // conterrà di volta in volta l'elemento // da inserire. int direzione; /**** Inizializzazione delle variabili ***/ res = new int[n][n]; // creazione della matrice; i = 0; j = 0; res[i][j] = 1; direzione = 0; // inizializzata per default da //sinistra verso destra http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Il metodo spirale… /* per ogni numero intero da 2 a n*n inserisco nella prossima componente, secondo le indicazioni della direzione */ for(num=2; num<=n*n; num++){ // Calcolo la nuova direzione direzione=aggiornaDirezione(direzione,i,j,n); // se devo andare da dx verso sinistra o viceversa if((direzione==1)||(direzione==3)) // Aggiorno l'indice delle righe dove necessario i=aggiornaRiga(i,direzione); else // Devo andare dall'alto verso basso o viceversa // Aggiorno l'indice di colonna j=aggiornaColonna(j,direzione); // Inserisco il nuovo elemento nella posizione // precedentemente calcolata. res[i][j]=num; } return res; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Esempi d’esecuzione Spirale d'ordine 3 1 2 3 8 9 4 7 6 5 Spirale d'ordine 6 1 2 3 4 5 6 20 21 22 23 24 7 19 32 33 34 25 8 18 31 36 35 26 9 17 30 29 28 27 10 16 15 14 13 12 11 Spirale d'ordine 1 1 Press any key to continue . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Secondo approccio… Si puo’ pensare di scomporre il problema in piu’ step, riempiendo un “anello” della matrice alla volta, dal piu’ esterno al piu’ interno Si noti come i valori di ogni anello sono sequenziali 1 2 3 4 5 6 20 21 22 23 24 7 19 32 33 34 25 8 18 31 36 35 26 9 17 30 29 28 27 10 16 15 14 13 12 11 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Il metodo spirale Quanti anelli occorre fare? N / 2 se N e’ pari (N / 2 + 0,5) se N e’ dispari static int[][] spirale(int n) { int[][] m = new int[n][n]; int value = 1; /* ceil  the smallest value that is not less * than the argument and is equal to a integer */ int max = Math.ceil(m.length / 2d); for (int i = 0; i < max; i++) value = ring(m, i, value); return m; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Il metodo ring… Il metodo ring riempie l’anello a distanza i dal primo elemento (offset) con valori a partire da value; il valore restituito e’ l’ultimo valore inserito + 1 ring(m, 1, 21)  33 offset (righe o colonne) dal primo elemento = 1 1 2 3 4 5 6 20 21 22 23 24 7 19 32 33 34 25 8 18 31 36 35 26 9 17 30 29 28 27 10 16 15 14 13 12 11 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Il metodo offset Prima di ring, realizziamo un metodo che data la distanza dal primo elemento della matrice offset, riga i e colonna j relativi al anello, imposti il valore della matrice a value static void offset(int m[][], int offset, int i, int j, int value) { m[offset + i][offset + j] = value; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array …Il metodo ring… static int ring(int m[][], int iring, int startValue) { /*dimensione di un lato dell’anello*/ int n = m.length - iring*2; /* prima riga */ for (int k = 0; k < n; k++) offset(m,iring,0,k,startValue++); /* colonna destra */ for (int k = 1; k < n; k++) offset(m,iring,k,n-1,startValue++); ... http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array

Esercizi su array di array Il metodo ring ... /* ulrima riga */ for (int k = n - 2; k >= 0; k--) offset(m,iring,n-1,k,startValue++); /* colonna sinstra */ for (int k = n - 2; k > 0; k--) offset(m,iring,k,0,startValue++); return startValue; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi su array di array