Cicli, Array e Programmazione su Sequenze



Documenti analoghi
Iterazione e ricorsione. Cicli, Array e Programmazione su Sequenze. Ciclo while. Cicli

4 3 4 = 4 x x x 10 0 aaa

Funzioni in C. Violetta Lonati

10 - Programmare con gli Array

La selezione binaria

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Algoritmi di Ricerca. Esempi di programmi Java

Lezione 8. La macchina universale

GESTIONE INFORMATICA DEI DATI AZIENDALI

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Esercizi su. Funzioni

Introduzione al MATLAB c Parte 2

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Matlab: Strutture di Controllo. Informatica B

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

Dimensione di uno Spazio vettoriale

Dispense di Informatica per l ITG Valadier

b. Che cosa succede alla frazione di reddito nazionale che viene risparmiata?

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Allocazione dinamica della memoria - riepilogo

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Programmazione dinamica

Corso di Informatica

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

I file di dati. Unità didattica D1 1

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Interesse, sconto, ratei e risconti

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Note su quicksort per ASD (DRAFT)

Esempi di algoritmi. Lezione III

Appunti sulla Macchina di Turing. Macchina di Turing

Calcolo del Valore Attuale Netto (VAN)

Soluzione dell esercizio del 2 Febbraio 2004

Esercizio 1 Dato il gioco ({1, 2, 3}, v) con v funzione caratteristica tale che:

Le variabili. Olga Scotti

Introduzione a Visual Basic Lezione 1 Concetti base e istruzioni condizionali

Arduino: Programmazione

Come modificare la propria Home Page e gli elementi correlati

SISTEMI DI NUMERAZIONE E CODICI

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

dall argomento argomento della malloc()

Il programmatore che c e in noi Lezione 12 Statements

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

Progetto Lauree Scientifiche Liceo Classico L.Ariosto, Ferrara Dipartimento di Matematica Università di Ferrara 24 Gennaio 2012

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

La struttura dati ad albero binario

B+Trees. Introduzione

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS

Algoritmi e strutture dati. Codici di Huffman

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

Introduzione alla programmazione in C

RAPPRESENTAZIONE GRAFICA E ANALISI DEI DATI SPERIMENTALI CON EXCEL

Interesse, sconto, ratei e risconti

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Uso di base delle funzioni in Microsoft Excel

LE FUNZIONI A DUE VARIABILI

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Gestione della memoria centrale

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Matematica in laboratorio

Laboratorio di Informatica

Convertitori numerici in Excel

Cosa è un foglio elettronico

RISOLUTORE AUTOMATICO PER SUDOKU

Ricerca Operativa Esercizi sul metodo del simplesso. Luigi De Giovanni, Laura Brentegani

Introduzione all Information Retrieval

Traduzione e adattamento a cura di Gylas per Giochi Rari

( x) ( x) 0. Equazioni irrazionali

Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno

ESEMPIO 1: eseguire il complemento a 10 di 765

Esercizi Capitolo 6 - Alberi binari di ricerca

Libreria standard Java possiede un enorme libreria di classi standard organizzata in vari package che raccolgono le classi secondo un organizzazione

Appunti di informatica. Lezione 2 anno accademico Mario Verdicchio

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1

Esercitazione N7:Gioco dei 21 fiammiferi (impariamo java giocando)

Leggere un messaggio. Copyright 2009 Apogeo

Informatica. Rappresentazione dei numeri Numerazione binaria

Appunti di Sistemi Elettronici

Corso di Fondamenti di Informatica

SOMMARIO... 3 INTRODUZIONE...

GESTIONE INTERESSI DI MORA. Impostazioni su Gestione Condominio. Addebito interessi su codice spesa 22. Immissione/gestione versamenti

Elementi di semantica denotazionale ed operazionale

Algebra Booleana ed Espressioni Booleane

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0)

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Matematica e giochi di gruppo

Strutturazione logica dei dati: i file

Descrizione di un algoritmo

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007

Transcript:

Cicli, Array e Programmazione su Sequenze Luca Tesei Università di Camerino luca.tesei at unicam.it Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.1/116

Cicli Fino ad ora il nostro codice Java all interno dei metodi si è limitato ad eseguire istruzioni in sequenza eventualmente prendendo vari rami del comando condizionale if-else Ciò che ci farà raggiungere l effettiva potenza di calcolo tipica di tutti i linguaggi di programmazione è l introduzione dell iterazione L iterazione altera la normale sequenza di esecuzione delle istruzioni permettendo di ripetere più volte uno stesso pezzo di codice Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.2/116

Iterazione e ricorsione Dal punto di vista della teoria della computazione, affinché un linguaggio di programmazione imperativo (C, Pascal, codice nei metodi del Java, ecc.) raggiunga la potenza di calcolo tipica è necessario che abbia almeno un costrutto di iterazione o, alternativamente, una meccanismo di ricorsione In Java e in quasi tutti i linguaggi moderni abbiamo sia costrutti iterativi (cicli) sia meccanismi per la ricorsione (si possono scrivere metodi ricorsivi) Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.3/116

Ciclo while Il ciclo while è uno dei costrutti iterativi del Java. Vedremo che il ciclo do e il ciclo for possono essere espressi in termini del ciclo while Il ciclo while ha questa sintassi: while (BoolExpr) Com BoolExpr può essere una qualsiasi espressione che ha un valore booleano (esattamente come quella dell if). Viene chiamata guardia del ciclo Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.4/116

Ciclo while Com può essere un qualsiasi comando Java (tra cui il while stesso) Viene chiamato corpo del ciclo Possiamo inserire una sequenza di comandi come corpo del while allo stesso modo di come abbiamo fatto per il ramo true o false dell if: inserendo un blocco di istruzioni fra parentesi graffe Se il while contiene solo una istruzione nel corpo è bene non inserire le parentesi, ma usare l indentazione Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.5/116

Ciclo while - Semantica L esecuzione del ciclo while (E) C avviene in questo modo: 1. Viene valutata l espressione booleana E. (a) Se il valore di E è falso allora si esce dal ciclo continuando l esecuzione del codice che segue il while (b) Se il valore di E è vero allora si esegue una volta il corpo C dopodiché si ritorna al punto 1. Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.6/116

Esempio Consideriamo un investimento che parte con un capitale iniziale di 10.000 euro Ogni anno, al 31/12, vengono aggiunti al capitale gli interessi maturati in quell anno, cioè il 5% del capitale presente all 1/1 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.7/116

Esempio La crescita del capitale è rappresentata nella seguente tabella: Anno Saldo 0 10.000,00 1 10.500,00 2 11.025,00 3 11.576,25 4 12.155,06 5 12.762,82 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.8/116

Esempio Vogliamo scrivere un frammento di codice che ci dica quanti anni sono necessari affinché il capitale arrivi almeno a 20.000 euro. Dobbiamo fare iterare la capitalizzazione degli interessi fino a quando non troviamo che il capitale ha raggiunto o superato i 20.000 euro Per questo tipo di problema la soluzione tipica è quella di usare un ciclo, nel nostro caso il while Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.9/116

Esempio /** @param balance Investimento iniziale * @param targetbalance Cifra a cui si vuole arrivare * @return Il numero di anni necessari per arrivare al * targetbalance */ public int annirichiesti(double balance, double rate, int years = 0; while (balance < targetbalance) { } years++; double targetbalance){ double interest = balance * rate / 100; balance = balance + interest; return years;} Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.10/116

Esercizio Implementare un classe Investimento che rappresenta un certo investimento con il suo capitale iniziale e il suo tasso di interesse: /** Costruisce un Investimento con un saldo iniziale e un tasso di interesse fisso @param abalance saldo iniziale @parem arate il tasso di interesse annuale fisso */ public Investimento(double abalance, double arate){ } // TO DO Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.11/116

Esercizio /** Continua ad accumulare interessi finché il saldo non raggiunge un valore desiderato @param targetbalance il saldo desiderato */ public void waitforbalance(double targetbalance) { // TO DO } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.12/116

Esercizio /** Restituisce il saldo attuale dell Investimento @return il saldo attuale */ public double getbalance() { // TO DO } /** Restituisce il numero di anni per i quali l investimento ha accumulato interessi @return il numero di anni trascorsi dall inizio dell investimento */ public int getyears() { // TO DO } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.13/116

Terminazione L introduzione dei costrutti iterativi dà potenza piena al linguaggio di programmazione, ma introduce un problema significativo Attraverso i cicli si possono scrivere programmi che non terminano mai Ciò può avvenire per volontà del programmatore: ad esempio se l applicazione si suppone che debba girare continuamente Più spesso invece succede a causa di un errore logico del programmatore. In questo caso il comportamento infinito è indesiderato Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.14/116

Terminazione: errori tipici Esempio: calcolare l ammontare del capitale dopo 20 anni... int years = 0; while (years < 20) { // manca years++;!!! double interest = balance * rate / 100 balance = balance + interest; }... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.15/116

Terminazione: errori tipici Esempio: calcolare l ammontare del capitale dopo 20 anni... int years = 20; while (years > 0) { years++; // ERRORE!!! // doveva essere years--; double interest = balance * rate / 100 balance = balance + interest; }... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.16/116

Cicli: scelta della guardia Nel progetto di un ciclo una parte fondamentale è la scelta della guardia e dei valori di inizializzazione Spesso ci sono operatori <,>,, Errore tipico: errore per scarto di uno Cioè usando < (>) invece di ( ), o viceversa, si esegue il corpo del ciclo una volta di più o una di meno del necessario Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.17/116

Cicli: scelta della guardia Esempio: in quanti anni un certo capitale iniziale raddoppia: int years = 0; // capitale iniziale double balance = initialbalance; while (balance < initialbalance * 2) { years++; double interest = balance * rate / 100 balance = balance + interest; } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.18/116

Cicli: scelta della guardia Il conteggio degli anni, nella variabile years, deve cominciare da 0 o da 1? La guardia giusta è balance < initialbalance * 2 oppure balance <= initialbalance * 2? Tecnica semplice di risoluzione: fare un caso di uso con numeri semplici e poi generalizzare Cercare eventualmente di individuare un invariante Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.19/116

Cicli: invariante L invariante di un ciclo è una condizione che rimane vera al momento della valutazione della guardia durante tutto il ciclo Nell esempio precedente l invariante è La variabile balance contiene il capitale dopo years anni E valido alla prima valutazione della guardia: balance == initialbalance è il valore del capitale dopo zero anni Rimane valido alle successive valutazioni della guardia, compresa l ultima Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.20/116

Ciclo do Il ciclo do-while ha questa sintassi: do Com while (BoolExpr); Semantica: 1. Viene eseguito il comando (o il blocco) Com 2. Viene valutata l espressione BoolExpr (a) Se il valore è false allora il ciclo esce e l esecuzione passa all istruzione successiva (b) Se il valore è true allora si riparte dal punto 1. Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.21/116

Ciclo do: motivazioni di utilizzo Si usa quando si è sicuri che bisogna fare almeno una iterazione del corpo all inizio del ciclo Si può esprimere come ciclo while do Com while (BoolExpr); è equivalente a Com while (BoolExpr) Com; Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.22/116

Ciclo do: esempio Ottenere in input un valore intero con il vincolo che non sia negativo.... double value; do { String input = JOptionPane.showInputDialog( Inserisci un numero positivo ); value = Double.parseDouble(input); } while (value <= 0);... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.23/116

Ciclo do: vantaggio Risolvendo con il while, senza dover ripetere il corpo, dobbiamo inserire altri elementi. // indica se e stato inserito un valore // corretto boolean done = false; while(!done) { String input = JOptionPane.showInputDialog( Inserisci un numero positivo ); value = Double.parseDouble(input); if (value > 0) done = true; } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.24/116

Ciclo for Il ciclo for è un abbreviazione di un ciclo while che viene spesso usato in una certa forma. La sintassi del for è la seguente: for (Com or Decl; BoolExp; Com) Com; dove Com or Decl ::= Com Decl Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.25/116

Ciclo for: semantica Esprimiamo il significato del for in termini di ciclo while. Il ciclo for (C1; E; C2) C è equivalente a { C1 while (E) { C C2 } } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.26/116

Ciclo for: esempio Determina il valore di un investimento dopo n anni. Uso tipico. for (int i = 1; i <= n; i++) { double interest = balance * rate / 100; balance += interest; } Osservazione: il comando i++ dovrebbe essere seguito normalmente da ; In questo caso non va messo perché la parentesi chiude il contesto Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.27/116

Il ciclo e mezzo Può accadere che si debba impostare un ciclo in cui l informazione riguardante il proseguimento dell iterazione o l uscita viene determinata nel mezzo dell esecuzione del corpo E macchinoso, in questi casi, riportare questa informazione al momento della valutazione della guardia tralasciando di fare il mezzo ciclo restante Il Java ci viene in aiuto mettendo a disposizione due comandi particolari Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.28/116

Il ciclo e mezzo: esempio Supponiamo di prendere in input da un InputStreamReader input una serie di caratteri e di voler elaborare solo quelli che sono lettere maiuscole Quando il flusso di caratteri termina (viene restituito -1) bisogna uscire dal ciclo Nel mezzo del corpo del ciclo, dopo aver letto il carattere, sappiamo se il flusso è finito, se bisogna elaborarlo oppure se bisogna passare al carattere successivo Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.29/116

Il ciclo e mezzo: esempio int x; char c; boolean fineflusso = false; while (!fineflusso) { x = input.read(); if (x == -1){ fineflusso = true; } else { c = (char) x; if (Character.isLetter(c) && Character.isUpper(c)) { // Elaborazione } } } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.30/116

break e continue I comandi break e continue possono evitare la scrittura di codice troppo macchinoso all interno del while L esecuzione di break provoca l immediata interruzione dell esecuzione del corpo e l usicita dal ciclo corrente (quello più interno rispetto al quale si trova il break) L esecuzione di continue provoca l immediata interruzione dell esecuzione del corpo del ciclo corrente e la rivalutazione della guardia Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.31/116

Esempio con break e continue int x; char c; while (true) { x = input.read(); if (x == -1){ break; // Esce dal ciclo c = (char) x; if (!Character.isLetter(c)!Character.isUpper(c)) continue; // Salta l elaborazione // ELABORAZIONE } } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.32/116

Strutture Dati Una struttura dati è un raggruppamento di dati semplici Lo scopo di una struttura dati è quello di organizzare i dati in maniera da favorire: uno o più algoritmi che operano sui dati stessi, in modo da rendere tali algoritmi più semplici e/o efficienti la rappresentazione della realtà nel modello fatto dall applicazione Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.33/116

Strutture Dati Esempi di strutture dati che già conosciamo: l insieme delle variabili istanza di un oggetto, esse sono concettualmente raggruppate e incapsulate (corrispondono al record del Pascal o alle strutture del C) liste alberi pile... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.34/116

Array Gli array sono strutture dati molto semplici, esistono in quasi tutti i linguaggi di programmazione imperativi Un array è un raggruppamento di un certo numero N di variabili dello stesso tipo Tali variabili, chiamate elementi, sono indicizzate da quella di indice 0 a quella di indice N 1 Un array rappresenta in maniera naturale una sequenza finita, di lunghezza massima predeterminata, di variabili dello stesso tipo Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.35/116

Array Un array ha un nome, ad esempio a, un tipo degli elementi, ad esempio int, e una dimensione, ad esempio 3 In Java, per dichiarare un array di questo tipo, si scrive: int[] a = new int[3]; oppure, equivalentemente, int a[] = new int[3]; a[i] denota la variabile di tipo int con indice i {0,1,2} in a Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.36/116

Array - Implementazione La macchina astratta Java implementa un array come un oggetto E una differenza fondamentale rispetto all implementazione classica delle macchine astratte del C, del Pascal, del Fortran o altri Il fatto che l array sia allocato nello heap permette di specificare quanto deve essere lungo (la sua dimensione) anche a tempo di esecuzione Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.37/116

Array - Implementazione In C, Pascal, Fortran, ecc bisogna scrivere nel programma la costante numerica che rappresenta la lunghezza dell array che si dichiara (fatti salvi i casi in cui si allocano zone di memoria e si trattano come array) In Java invece possiamo dichiarare un array anche così: int a[] = new int[n]; dove n è una variabile intera il cui valore viene preso in input, ad esempio Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.38/116

Array - Lunghezza In ogni caso, una volta che si è creato un array di una certa lunghezza, non è possibile allungarlo Quello che si può fare è creare un array nuovo più lungo, copiare i valori del vecchio array su quello nuovo e buttare via (cancellare il riferimento) al vecchio array In Java esistono classi che fanno tutto questo automaticamente (ArrayList<E>). Le vedremo approfonditamente. Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.39/116

Array - Effetto della dichiarazione La dichiarazione int[] a = new int[3]; ha il seguente effetto nella memoria della macchina astratta Java: σ a... Heap array int length 0: 1: 2: 3 0 0 0 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.40/116

Array - Implementazione L oggetto che rappresenta l array ha un campo pubblico length, dichiarato final e quindi non modificabile, che contiene la dimensione (lunghezza) dell array Quindi a.length è un valore intero che indica quanto è lungo l array a Bisogna sempre ricordare però che l ultimo indice dell array non è a.length, ma a.length - 1, poiché il primo indice è 0 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.41/116

Array - Valodi di default All interno dell oggetto che rappresenta l array sono presenti le a.length variabili che contengono gli elementi Esse vengono inizializzate allo stesso modo delle variabili istanza degli oggetti normali Quindi, in questo caso in cui il tipo è int, il valore di default che prendono tutti gli elementi è 0 Se, ad esempio, il tipo delle variabili fosse invece un tipo riferimento ad una classe allora i valori sarebbero inizializzati a null Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.42/116

Array - Uso... Le variabili di un array si comportano esattamente come se fossero variabili istanza pubbliche di un oggetto Però per raggiungerle si usa la notazione a[i] invece che a.nome. Ad esempio: int i=0; a[i]=3; (1) a[i+1]=5; (2) a[a.length - 1]= (i + 2) * a.length; (3)... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.43/116

Array - Uso Porta nel seguente stato: σ a... Heap array int length 3 0: 3 1: 5 2: 6 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.44/116

Array di riferimenti Supponiamo di avere una classe: public class Foo { public int z; public boolean b; public void condinc(int y) { } if (this.b) this.z = this.z + y; } Allora la dichiarazione: Foo[] fa = new Foo[4]; ha il seguente effetto... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.45/116

Array di riferimenti σ fa... Heap array Foo length 4 0: null 1: null 2: null 3: null Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.46/116

Array di riferimenti Vediamo l effetto delle seguenti istruzioni:... fa[0] = new Foo(); fa[0].z = 15; fa[0].b = true;... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.47/116

Array di riferimenti σ fa... Heap array Foo length 4 0: 1: null 2: null 3: null Foo z 15 b tt Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.48/116

Array di riferimenti Vediamo l effetto delle seguenti istruzioni:... fa[1] = fa[0]; fa[2] = new Foo();... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.49/116

Array di riferimenti σ fa... Heap array Foo length 4 0: 1: 2: 3: null Foo z 15 b tt Foo z 0 b ff Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.50/116

Array di riferimenti Vediamo l effetto delle seguenti istruzioni:... fa[2].z = 5; fa[1].condinc(fa[2].z);... Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.51/116

Array di riferimenti σ fa... Heap array Foo length 4 0: 1: 2: 3: null Foo z 20 b tt Foo z 5 b ff Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.52/116

Array bidimensionali In Java è possibile dichiarare array a due dimensioni Un array a due dimensioni può essere immaginato come una tabella (matrice) in cui ci sono N righe ed M colonne Le righe sono indicizzate da 0 a N 1 Le colonne sono indicizzate da 0 a M 1 Ogni casella della matrice contiene un elemento del tipo dichiarato per l array Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.53/116

Array bidimensionali Ad esempio la dichiarazione: int[][] m = new int[3][4]; crea una matrice 3 4 di interi 0 0 0 0 0 0 0 0 0 0 0 0 m.length dà il numero di righe della matrice m[i].length dà il numero di colonne della matrice se i è un indice di riga valido Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.54/116

Array bidimensionali Ogni elemento della matrice è individuato per mezzo di due indici, il primo indica la riga e il secondo la colonna. Ad esempio, m[1][2] = 3; 0 1 2 3 0 0 0 0 0 1 0 0 3 0 2 0 0 0 0 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.55/116

Ciclo for e array Spesso il ciclo for è quello più naturale per agire sugli array. Inizializza un array di interi in cui gli elementi contengono le proprie posizioni. int[] a = new int[10]; for (int i = 0; i < a.length; i++) a[i] = i; Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.56/116

Ciclo for e array Sposta tutti gli elementi di un array di una posizione verso sinistra. Il primo elemento viene perduto nella posizione finale dell array spostato viene posto a zero int i; // Dichiaro i fuori // dal blocco del for for (i = 0; i < a.length - 1; i++) a[i] = a[i+1]; a[i] = 0; // i è ancora definita Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.57/116

Esempio: ordinamento di un array Algoritmo bubble-sort Ogni posizione i, a partire da 0, viene confrontata con tutte le posizioni successive Se l elemento attualmente in posizione i è maggiore di quello in posizione successiva, allora vengono scambiati di posto Tutto questo non accade per l ultima posizione dell array, dove alla fine si troverà automaticamente un elemento massimo Uso di due cicli for annidati con indici i e j Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.58/116

Esempio: ordinamento di un array Ordinamento dell array di interi a int i; // indice esterno int j; // indice interno int buf; // variabile di appoggio for (i = 0; i < a.length -1; i++) for (j = i + 1; j < a.length; j++) if (a[i] > a[j]) { // scambio buf = a[i]; a[i] = a[j]; a[j] = buf; } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.59/116

Ciclo for e matrici Esempio: azzeramento di una matrice di interi. for (int i = 0; i < m.length; i++) for (int j = 0; j < m[0].length; j++) m[i][j] = 0; Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.60/116

Esercizi Implementare i metodi della classe Scacchiera del Tris Scrivere un programma che prende in input un numero n e stampa un triangolo del tipo: [] [][] [][][] [][][][] [][][][][] [][][][][][] di n righe. Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.61/116

Esercizi Modificare la classe CombinationLock in modo da creare cassaforti con combinazioni formate da un numero arbitrario n di lettere Scrivere una classe Forzatore che, ricevuta in ingresso una cassaforte così potenziata, tenta di trovare la combinazione con la forza bruta Versione soft: il forzatore sa di quante lettere è formata la combinazione Versione hard: il forzatore ignora di quante lettere sia formata la combinazione Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.62/116

Esercizi Leggere da input una serie di numeri x i e memorizzarli in un array Calcolare la media µ dei valori Cercare il primo elemento dell array minore o uguale alla media Calcolare la deviazione standard (attenti agli indici: nella formula partono da 1!) σ = n i=1 (x i µ) 2 n 1 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.63/116

Esercizio Scrivere una classe FactorGenerator che serva a calcolare tutti i fattori di un certo numero dato Ad esempio per il numero 150 deve dare i fattori: 2 3 5 5 Mettere a disposizione i metodi nextfactor() e hasmorefactor() Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.64/116

Esercizio Scrivere una classe PrimeGenerator che permetta di calcolare tutti i numeri primi minori di un certo numero dato Ad esempio per 20 deve stampare: 2 3 5 7 11 13 17 19 Mettere a disposizione il metodo nextprime() Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.65/116

Esercizio Determinare il valore di e elevato a un certo numero reale x utilizzando la seguente serie di potenze e x = n=0 x n n! Il calcolo si deve fermare quando l addendo attuale della somma diventa minore di una certa soglia ǫ fissata Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.66/116

Esercizio: Il gioco del Nim Ci sono n biglie in un mucchio Due giocatori prelevano a turno biglie dal mucchio Ad ogni mossa un giocatore deve prendere almeno una biglia e non può prenderne più della metà di quelle che sono attualmente nel mucchio Perde chi è costretto a prendere l ultima biglia Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.67/116

Il gioco del Nim Scrivere un programma che giochi contro lutente al gioco del Nim Utilizzare la classe java.util.random (vedere API) per generare numeri pseudocasuali Il programma deve seguire i seguenti passi: Genera un numero casuale tra 10 e 100 che indica il numero iniziale di biglie Genera un numero casuale tra 0 e 1 per decidere chi dei due giocatori inizia Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.68/116

Il gioco del Nim Genera un numero casuale tra 0 e 1 per decidere se giocare in maniera stupida o utilizzare la strategia vincente Se gioca in maniera stupida ad ogni sua mossa il programma prenderà un numero casuale di biglie fra 1 e il massimo di biglie prelevabili La strategia vincente consiste nel prelevare, ad ogni mossa, un numero di biglie tali che quelle che restano siano una potenza di due meno 1 (cioè 3, 7, 15, 31, 63,... ) Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.69/116

Il gioco del Nim È sempre una mossa valida tranne quando il numero di biglie disponibili è proprio una potenza di due meno 1 Se è questo il caso allora il computer toglie un numero casuale di biglie purché ammissibile Se il computer inizia la partita e decide di usare la strategia vincente risulterà imbattibile Negli altri casi si può vincere Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.70/116

Programmazione su sequenze Vediamo alcuni schemi di programmazione di operazioni tipiche su sequenze di dati Come struttura dati per rappresentare le sequenze useremo gli array Comunque gli schemi di programmazione sono validi per qualunque struttura dati che rappresenta una sequenza: lista, iterazione su elementi di un insieme, ecc. Cambierà solamente la sintassi con cui indicizzare e reperire gli elementi della sequenza Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.71/116

Schemi di programmazione Calcolo di aggregati: media, minimo, massimo, somma, ecc. Ricerca del primo elemento della sequenza che soddisfa una certa proprietà (Ricerca Lineare Incerta) Verifica che tutti gli elementi della sequenza soddisfano una certa proprietà Varianti in cui si considerano solo certe porzioni della sequenza Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.72/116

Calcolo di aggregati Si deve scorrere tutta la sequenza: ciclo for Si definiscono una o più variabili accumulatori, inizializzate opportunamente Ad ogni iterazione del ciclo, a seconda del valore dell elemento della sequenza che si sta analizzando, viene aggiornato l accumulatore Alla fine del for si determina il valore cercato a partire dal valore dell accumulatore Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.73/116

Esempio: somma e media Somma e media degli elementi di una sequenza di interi (array a) int somma = 0; // Accumulatore for (int i = 0; i < a.length; i++) somma = somma + a[i]; System.out.println("Somma: " + somma); double media = (double) somma / a.length; System.out.println("Media: " + media); Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.74/116

Esempio: elemento massimo Trovare il valore massimo presente in una sequenza di interi (array a) e la posizione del primo elemento che ha questo valore nella sequenza // Accumulatore inizializzato al primo elemento int massimo = a[0]; int posizionemax = 0; for (int i = 1; i < a.length; i++) if (a[i] > massimo) { } massimo = a[i]; posizionemax = i; System.out.println("Valore massimo: " + massimo); System.out.println( "Posizione primo elemento massimo: " + posizionemax); Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.75/116

Ricerca Lineare Incerta Si usa per cercare, in una sequenza, la posizione del primo elemento che soddisfa una certa proprietà La proprietà P(v) è definita sui valori contenuti negli elementi della sequenza (es. array a) La sequenza potrebbe non contenere nessun elemento che soddisfa la proprietà Il risultato è la posizione dell elemento, se trovato. Altrimenti una variabile booleana indica che l elemento non è stato trovato Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.76/116

RLI: schema Schema di RLI su una sequenza (array a) int i = 0; boolean trovato = false; while (i < a.length &&!trovato) if (P(a[i])) trovato = true; else i = i + 1; (1) Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.77/116

RLI: schema Nel punto (1) del programma: Se la variabile booleana trovato vale true allora il primo elemento dell array che soddisfa P si trova nella posizione contenuta nella variabile i Se la variabile trovato vale false allora si ha che nessun elemento dell array soddisfa P Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.78/116

RLI: esempio Supponiamo di dover scrivere un metodo che prende in input un array di interi a e un numero n Si vuole ricercare in a, se c è, il primo elemento maggiore di n Se lo si trova il metodo deve rispondere con la posizione dell elemento trovato Se non lo si trova il metodo deve rispondere con 1 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.79/116

RLI: esempio public int m1(int[] a, int n){ int i = 0; boolean trovato = false; while (i < a.length &&!trovato) if (a[i] > n) trovato = true; else i = i + 1; if (trovato) return i; else return -1; } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.80/116

Verifica su tutti gli elementi Si vuole sapere se tutti gli elementi di una sequenza soddisfano una certa proprietà P(v) La soluzione più semplice ed efficiente è quella di fare una trasformazione logica del problema Si risolve il problema negato: si cerca cioè un elemento della sequenza che non soddisfa P Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.81/116

Verifica su tutti gli elementi Si imposta quindi lo schema della RLI per trovare il primo elemento della sequenza che soddisfa!p(v) All uscita dal ciclo: Se trovato è true allora la risposta al problema iniziale è NO Se trovato è false allora la risposta al problema iniziale è SI: tutti gli elementi della sequenza soddisfano la proprietà P Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.82/116

Verifica: esempio Supponiamo di dover scrivere un metodo che prende in input un array di interi a e un numero intero b Il metodo deve rispondere true se tutti gli elementi di a sono divisibili per b, altrimenti false Trasformiamo il problema e cerchiamo quindi, se c è, il primo elemento di a che non è divisibile per b. In base al valore di trovato il metodo ritornerà il valore booleano appropriato Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.83/116

Verifica: esempio public boolean m2(int[] a, int b){ int i = 0; boolean trovato = false; while (i < a.length &&!trovato) if (a[i] % b!= 0) trovato = true; else i++; if (trovato) return false; else return true; } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.84/116

Varianti In alcuni casi il problema posto richiede che si cambino gli estremi di ricerca/verifica nella sequenza Ad esempio: controllare se una porzione di un array di interi a sia composta da elementi in ordine crescente start e stop sono due parametri di input che indicano la posizione di partenza e di arrivo della porzione di array Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.85/116

Varianti Trasformiamo il problema di verifica nella ricerca del primo elemento che rompe l ordinamento crescente Facciamo partire la ricerca con i = start Interrompiamo la ricerca se i < stop poiché l ultimo elemento della porzione non influenza la verifica richiesta Se l elemento che rompe l ordinamento viene trovato rispondiamo true, altrimenti false Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.86/116

Varianti: esempio public boolean porzioneordinata(int[] a, int start, int stop){ int i = start; boolean trovato = false; while (i < stop &&!trovato) if (a[i]>a[i+1]) trovato = true; else i++; // Invece di if (trovato) return false; // else return true; return!trovato; } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.87/116

ArrayList invece che array Abbiamo visto che gli array sono una buona struttura dati per rappresentare sequenze di elementi di uno stesso tipo Tuttavia hanno il problema che la loro lunghezza massima deve essere specificata al momento della creazione Se abbiamo bisogno di altro spazio dobbiamo ricreare un array più lungo e copiare la prima parte del vecchio array in quello nuovo In Java esiste già una classe che fa questo automaticamente Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.88/116

ArrayList<E> La classe ArrayList<E> del pacchetto java.util permette di creare e gestire una sequenza di oggetti di tipo E Il numero di oggetti nella sequenza non è predeterminato: la classe alloca lo spazio necessario al crescere o decrescere degli elementi inseriti Per creare un ArrayList<Foo> di oggetti di una classe Foo: ArrayList<Foo> mylist = new ArrayList<Foo>(); Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.89/116

ArrayList<E> La lista viene creata vuota Per aggiungere un oggetto in fondo alla lista corrente: Foo f = new Foo(); mylist.add(f); Per aggiungere un oggetto in posizione i: f = new Foo(); mylist.add(i,f); L oggetto attualmente in posizione i e quelli seguenti vengono spostati verso destra Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.90/116

Inserimento L inserimento in una sequenza è un problema classico L inserimento in fondo non comporta in genere problemi di implementazione, anche nel caso di array (se l array non è pieno) L inserimento in una posizione interna alla sequenza comporta lo spostamento a destra degli elementi interessati Quest ultima operazione richiede un implementazione adeguata nel caso di un array Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.91/116

Inserimento C è un altra questione importante da tenere presente in caso di inserimento di un elemento in una sequenza, sia in fondo che nel mezzo Bisogna stabilire se la sequenza in questione ammette l inserimento di elementi già presenti, cioè se ammette la presenza di elementi duplicati Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.92/116

Inserimento Nel caso in cui non si vogliano duplicati si deve dapprima fare una RLI per determinare se l elemento da inserire è già presente nella sequenza Solo nel caso in cui la risposta sia negativa si deve poi procedere all inserimento vero e proprio Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.93/116

ArrayList<E> Per ottenere il numero attuale di elementi della lista: int n = mylist.size(); Per ottenere l oggetto in posizione i: Foo fooobj = mylist.get(i); Per assegnare un nuovo elemento alla posizione i: mylist.set(i,f); Altre funzionalità della classe possono essere trovate sulle API Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.94/116

ArrayList<E>: esempio Scriviamo un metodo che ottiene in input un oggetto ArrayList<Foo> e si occupa di chiamare il metodo m() su ogni oggetto contenuto nella lista Si applica lo stesso schema del calcolo di aggregati: public void applym(arraylist<foo> list){ for (int i = 0; i < list.size(); i++) list.get(i).m(); } Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.95/116

ArrayList<E> Tutti gli schemi di programmi che abbiamo visto utilizzavano gli array come struttura dati per rappresentare una sequenza Ovviamente gli stessi schemi valgono, inalterati, anche nel caso in cui la sequenza è rappresentata con un ArrayList<E> Basta semplicemente utilizzare la sintassi appropriata Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.96/116

ArrayList<E> Ad esempio, per ottenere il valore dell elemento in posizione i non si utilizza a[i], ma la chiamata di metodo a.get(i) Oppure, per cambiare il contenuto della posizione i, non si utilizza l assegnamento a[i] = nuovoelemento, ma si chiama il metodo a.set(i, nuovoelemento) Per ottenere la lunghezza il metodo size() invece che la variabile istanza length, ecc. Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.97/116

Inserimento ordinato Spesso è utile mantenere gli elementi di una lista list secondo un certo ordinamento Per ottenere questo, all inserimento di un nuovo elemento e: 1. Si deve impostare una RLI del primo elemento di list che è maggiore di e 2. Se si trova l elemento, in posizione i, allora si inserisce e in posizione i 3. Se non si trova l elemento allora si inserisce e in posizione 0 Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.98/116

Inserimento ordinato: esempio Inseriamo un nuovo intero n in un una list di tipo ArrayList<Integer>: int i = 0; boolean trovato = false; while (i < list.size() &&!trovato) if (list.get(i).intvalue() > n) trovato = true; else i++; if (trovato) list.add(i, new Integer(n)); else list.add(0, new Integer(n)); Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.99/116

Inserimento ordinato Si noti che l algoritmo proposto funziona anche se la lista list è vuota Se essa infatti risulta vuota (ma non null) allora non si troverà nessun elemento maggiore di quello da inserire E quindi l algoritmo provvederà ad inserire il nuovo elemento in posizione 0 Ciò è corretto poiché la posizione 0 è la prima della lista Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.100/116

Cancellazione Affrontiamo ora il problema della cancellazione di un elemento da una sequenza A prima vista è un problema banale, ma ci sono alcuni accorgimenti da prendere per evitare errori logici difficili da individuare Innanzitutto: se l elemento in posizione i di una sequenza deve essere cancellato allora tutti gli elementi dall i+1-esimo alla fine devono essere spostati di una posizione verso sinistra Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.101/116

Cancellazione Inoltre: se si sta scorrendo la sequenza e si cancella un certo elemento in posizione i, allora il ciclo di scorrimento deve evitare di incrementare l indice i in quella iterazione Questo perché la cancellazione avrà fatto in modo da spostare l elemento e che precedentemente era in i+1 nella posizione i Se il ciclo incrementa l indice i l elemento e non verrà preso in considerazione nello scorrimento Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.102/116

Cancellazione e array Gestire la cancellazione con gli array risulta abbastanza insidioso per i motivi visti sopra In genere se una sequenza è soggetta ad aggiunte e cancellazioni dinamiche, e quindi ha una lunghezza variabile non predeterminabile, è meglio non usare un array per rappresentare la sequenza E più adatta una struttura dati dinamica come l ArrayList<E> Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.103/116

Esercizio Implementare la cancellazione di un elemento e lo scorrimento con cancellazione su una sequenza rappresentata con un array Fare attenzione ai problemi di cui sopra Tener presente che durante lo scorrimento l indice deve avanzare solo se l ultimo elemento controllato non è stato cancellato Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.104/116

Cancellazione e ArrayList<E> La classe ArrayList<E> ha un metodo remove(int index) che implementa la cancellazione in modo corretto: gli elementi a destra del cancellato si spostano tutti di una posizione verso sinistra Per effettuare senza errori lo scorrimento con cancellazione (detto anche filtraggio) la classe mette a dispozione un metodo iterator() che restituisce un iteratore sulla sequenza Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.105/116

Iteratori Per una sequenza rappresentata con un ArrayList<E> possiamo utilizzare un Iterator<E> o un ListIterator<E> Queste due sono interfaces, non classi. Dal nostro attuale punto di vista in cui ci limitiamo a usare oggetti di questo tipo non c è differenza Su un oggetto di tipo Iterator<E> (o ListIterator<E>) possiamo chiamare tutti i metodi documentati nelle relative API (package java.util) Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.106/116

Iteratori Un iteratore è un oggetto che permette di scorrere (visitare) tutti gli elementi una collezione (nel nostro caso una lista) una e una sola volta Durante lo scorrimento è possibile cancellare gli elementi visti, senza incappare nei possibili errori di scorrimento visti sopra Nella sua versione più semplice mette a disposizione tre metodi Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.107/116

Iteratori 1. boolean hasnext() indica se esiste un prossimo elemento da visitare nello scorrimento. Se dà false allora tutti gli elementi sono stati visitati 2. E next() restituisce il prossimo elemento da visitare, se presente 3. void remove() cancella dalla collezione (nel nostro caso lista) l ultimo elemento che è stato visitato (cioè ottenuto con il metodo next()) senza saltare elementi nella visita/scorrimento Università di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze p.108/116