Cicli , Arr ay eProgrammazionesu Sequenze
Luca Tesei
Universita di Camerino
luca.tesei at unicam.it
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.1/105
Cicli
Fino ad ora il nostro codice Java all’internodei metodi si è limitato ad eseguire istruzioniin sequenza eventualmente prendendo varirami del comando condizionale if-else
Ciò che ci farà raggiungere l’effettiva potenzadi calcolo tipica di tutti i linguaggi diprogrammazione è l’introduzionedell’iterazione
L’iterazione altera la normale sequenza diesecuzione delle istruzioni permettendo diripetere più volte uno stesso pezzo di codice
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.2/105
I terazione e ricorsione
Dal punto di vista della teoria dellacomputazione, affinché un linguaggio diprogrammazione imperativo (C, Pascal,codice nei metodi del Java, ecc.) raggiunga lapotenza di calcolo tipica è necessario cheabbia almeno un costrutto di iterazione o,alternativamente, una meccanismo diricorsione
In Java e in quasi tutti i linguaggi moderniabbiamo sia costrutti iterativi (cicli) siameccanismi per la ricorsione (si possonoscrivere metodi ricorsivi)
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.3/105
Ciclo while
Il ciclo while è uno dei costrutti iterativi delJava.
Vedremo che il ciclo do e il ciclo for possonoessere espressi in termini del ciclo while
Il ciclo while ha questa sintassi:while (BoolExpr) Com
BoolExpr può essere una qualsiasiespressione che ha un valore booleano(esattamente come quella dell’if ). Vienechiamata guardia del ciclo
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.4/105
Ciclo while
Compuò essere un qualsiasi comando Java(tra cui il while stesso)
Viene chiamato corpo del ciclo
Possiamo inserire una sequenza di comandicome corpo del while allo stesso modo dicome abbiamo fatto per il ramo true o falsedell’if : inserendo un blocco di istruzioni fraparentesi graffe
Se il while contiene solo una istruzione nelcorpo è bene non inserire le parentesi, mausare l’indentazione
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.5/105
Ciclo while - Semantica
L’esecuzione del ciclo while (E) C avviene inquesto modo:
1. Viene valutata l’espressione booleana E.(a) Se il valore di E è falso allora si esce dal
ciclo continuando l’esecuzione del codiceche segue il while
(b) Se il valore di E è vero allora si esegue unavolta il corpo C dopodiché si ritorna alpunto 1.
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.6/105
Esempio
Consideriamo un investimento che parte conun capitale iniziale di 10.000 euro
Ogni anno, al 31/12, vengono aggiunti alcapitale gli interessi maturati in quell’anno,cioè il 5% del capitale presente all’1/1
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.7/105
Esempio
La crescita del capitale è rappresentata nellaseguente tabella:
Anno Saldo
0 10.000,001 10.500,002 11.025,003 11.576,254 12.155,065 12.762,82
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.8/105
Esempio
Vogliamo scrivere un frammento di codiceche ci dica quanti anni sono necessariaffinché il capitale arrivi almeno a 20.000 euro.
Dobbiamo fare iterare la capitalizzazionedegli interessi fino a quando non troviamoche il capitale ha raggiunto o superato i20.000 euro
Per questo tipo di problema la soluzione tipicaè quella di usare un ciclo, nel nostro caso ilwhile
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.9/105
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,
double targetBalance){
int years = 0;
while (balance < targetBalance) {
years++;
double interest = balance * rate / 100;
balance = balance + interest;
}
return years;}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.10/105
Esercizio
Implementare un classe Investimento cherappresenta un certo investimento con il suocapitale 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
}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.11/105
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
}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.12/105
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
}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.13/105
Terminazione
L’introduzione dei costrutti iterativi dà potenzapiena al linguaggio di programmazione, maintroduce un problema significativo
Attraverso i cicli si possono scrivereprogrammi che non terminano mai
Ciò può avvenire per volontà delprogrammatore: ad esempio se l’applicazionesi suppone che debba girare continuamente
Più spesso invece succede a causa di unerrore logico del programmatore. In questocaso il comportamento infinito è indesiderato
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.14/105
Terminazione: error i tipici
Esempio: calcolare l’ammontare del capitaledopo 20 anni...int years = 0;while (years < 20) {
// manca years++; !!!double interest = balance * rate / 100balance = balance + interest;
}...
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.15/105
Terminazione: error i tipici
Esempio: calcolare l’ammontare del capitaledopo 20 anni...int years = 20;while (years > 0) {
years++; // ERRORE!!!// doveva essere years--;double interest = balance * rate / 100balance = balance + interest;
}...
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.16/105
Cicli : scelta della guardia
Nel progetto di un ciclo una partefondamentale è la scelta della guardia e deivalori di inizializzazione
Spesso ci sono operatori <,>,≤,≥
Errore tipico: errore per scarto di uno
Cioè usando < (>) invece di ≤ (≥), oviceversa, si esegue il corpo del ciclo unavolta di più o una di meno del necessario
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.17/105
Cicli : scelta della guardia
Esempio: in quanti anni un certo capitale inizialeraddoppia:int years = 0;// capitale inizialedouble balance = initialBalance;while (balance < initialBalance * 2) {
years++;double interest = balance * rate / 100balance = balance + interest;
}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.18/105
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 casodi uso con numeri semplici e poigeneralizzare
Cercare eventualmente di individuare uninvariante
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.19/105
Cicli : invar iante
L’invariante di un ciclo è una condizione cherimane vera al momento della valutazionedella guardia durante tutto il ciclo
Nell’esempio precedente l’invariante è “Lavariabile balance contiene il capitale dopoyears anni”
E’ valido alla prima valutazione della guardia:balance == initialBalance è il valoredel capitale dopo zero anni
Rimane valido alle successive valutazionidella guardia, compresa l’ultima
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.20/105
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 el’esecuzione passa all’istruzionesuccessiva
(b) Se il valore è true allora si riparte dalpunto 1.
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.21/105
Ciclo do: motivazioni di utili zzo
Si usa quando si è sicuri che bisogna farealmeno una iterazione del corpo all’inizio delciclo
Si può esprimere come ciclo while
do Com while (BoolExpr);
è equivalente a
Comwhile (BoolExpr) Com;
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.22/105
Ciclo do: esempio
Ottenere in input un valore intero con il vincoloche non sia negativo....double value;do {
String input =JOptionPane.showInputDialog(
’’Inserisci un numero positivo’’);value = Double.parseDouble(input);
} while (value <= 0);...
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.23/105
Ciclo do: vantaggio
Risolvendo con il while, senza dover ripetere ilcorpo, dobbiamo inserire altri elementi.// indica se e’ stato inserito un valore// correttoboolean done = false;while(!done) {
String input =JOptionPane.showInputDialog(
’’Inserisci un numero positivo’’);value = Double.parseDouble(input);if (value > 0) done = true;
}Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.24/105
Ciclo for
Il ciclo for è un’abbreviazione di un ciclo whileche viene spesso usato in una certa forma. Lasintassi del for è la seguente:
for (Com or Decl; BoolExp; Com) Com;
dove
Comor Decl ::= Com | Decl
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.25/105
Ciclo for : semantica
Esprimiamo il significato del for in termini di ciclowhile.
Il ciclo for (C1; E; C2) Cè equivalente a{
C1while (E) {
CC2
}}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.26/105
Ciclo for : esempio
Determina il valore di un investimento dopo nanni. 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 contestoUniversita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.27/105
I l ciclo emezzo
Può accadere che si debba impostare unciclo in cui l’informazione riguardante ilproseguimento dell’iterazione o l’uscita vienedeterminata nel mezzo dell’esecuzione delcorpo
E’ macchinoso, in questi casi, riportarequesta informazione al momento dellavalutazione della guardia tralasciando di fareil “mezzo ciclo” restante
Il Java ci viene in aiuto mettendo adisposizione due comandi particolari
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.28/105
I l ciclo emezzo: esempio
Supponiamo di prendere in input da unInputStreamReader input una serie dicaratteri e di voler elaborare solo quelli chesono lettere maiuscole
Quando il flusso di caratteri termina (vienerestituito -1) bisogna uscire dal ciclo
Nel mezzo del corpo del ciclo, dopo aver lettoil carattere, sappiamo se il flusso è finito, sebisogna elaborarlo oppure se bisognapassare al carattere successivo
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.29/105
I l ciclo emezzo: 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
}
} }
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.30/105
break econtinue
I comandi break e continue possonoevitare la scrittura di codice troppomacchinoso all’interno del while
L’esecuzione di break provoca l’immediatainterruzione dell’esecuzione del corpo el’usicita dal ciclo corrente (quello più internorispetto al quale si trova il break )
L’esecuzione di continue provocal’immediata interruzione dell’esecuzione delcorpo del ciclo corrente e la rivalutazionedella guardia
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.31/105
Esempio con break econtinue
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
}
}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.32/105
Strutture Dati
Una struttura dati è un raggruppamento didati semplici
Lo scopo di una struttura dati è quello diorganizzare i dati in maniera da favorire:
uno o più algoritmi che operano sui datistessi, in modo da rendere tali algoritmi piùsemplici e/o efficientila rappresentazione della realtà nelmodello fatto dall’applicazione
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.33/105
Strutture Dati
Esempi di strutture dati che già conosciamo:
l’insieme delle variabili istanza di un oggetto,esse sono concettualmente raggruppate eincapsulate (corrispondono al record delPascal o alle strutture del C)
liste
alberi
pile
. . .
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.34/105
Arr ay
Gli array sono strutture dati molto semplici,esistono in quasi tutti i linguaggi diprogrammazione imperativi
Un array è un raggruppamento di un certonumero N di variabili dello stesso tipo
Tali variabili, chiamate elementi, sonoindicizzate da quella di indice 0 a quella diindice N − 1
Un array rappresenta in maniera naturale unasequenza finita, di lunghezza massimapredeterminata, di variabili dello stesso tipo
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.35/105
Arr ay
Un array ha un nome, ad esempio a, un tipodegli elementi, ad esempio int , e unadimensione, 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 indicei ∈ {0, 1, 2} in a
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.36/105
Arr ay - Implementazione
La macchina astratta Java implementa unarray come un oggetto
E’ una differenza fondamentale rispettoall’implementazione classica delle macchineastratte del C, del Pascal, del Fortran o altri
Il fatto che l’array sia allocato nello heappermette di specificare quanto deve esserelungo (la sua dimensione) anche a tempo diesecuzione
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.37/105
Arr ay - Implementazione
In C, Pascal, Fortran, ecc bisogna scriverenel programma la costante numerica cherappresenta la lunghezza dell’array che sidichiara (fatti salvi i casi in cui si allocanozone di memoria e si trattano come array)
In Java invece possiamo dichiarare un arrayanche così:int a[] = new int[n];dove n è una variabile intera il cui valoreviene preso in input, ad esempio
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.38/105
Arr ay - Lunghezza
In ogni caso, una volta che si è creato unarray di una certa lunghezza, non è possibile“allungarlo”
Quello che si può fare è creare un arraynuovo più lungo, copiare i valori del vecchioarray su quello nuovo e buttare via(cancellare il riferimento) al vecchio array
In Java esistono classi che fanno tutto questoautomaticamente (ArrayList<E> ). Levedremo approfonditamente.
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.39/105
Arr ay - Effetto della dichiarazione
La dichiarazione int[] a = new int[3]; hail seguente effetto nella memoria della macchinaastratta Java:
length
0
0
0
3
array int
σHeap
.....a
0:
1:
2:
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.40/105
Arr ay - Implementazione
L’oggetto che rappresenta l’array ha uncampo pubblico length , dichiarato final equindi non modificabile, che contiene ladimensione (lunghezza) dell’array
Quindi a.length è un valore intero cheindica quanto è lungo l’array a
Bisogna sempre ricordare però che l’ultimoindice dell’array non è a.length , maa.length - 1 , poiché il primo indice è 0
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.41/105
Arr ay - Valodi di default
All’interno dell’oggetto che rappresenta l’arraysono presenti le a.length variabili checontengono gli elementi
Esse vengono inizializzate allo stesso mododelle variabili istanza degli oggetti normali
Quindi, in questo caso in cui il tipo è int , ilvalore di default che prendono tutti glielementi è 0
Se, ad esempio, il tipo delle variabili fosseinvece un tipo riferimento ad una classe allorai valori sarebbero inizializzati a null
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.42/105
Arr ay - Uso
Le variabili di un array si comportanoesattamente come se fossero variabili istanzapubbliche di un oggetto
Però per “raggiungerle” si usa la notazionea[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)
...
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.43/105
Arr ay - Uso
Porta nel seguente stato:
σHeap
.....a
0:
1:
2:
length 3
array int
3
5
6
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.44/105
Arr ay di r iferimenti
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...
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.45/105
Arr ay di r iferimenti
σHeap
.....
0:
1:
2:
fa
length
array Foo
4
3: null
null
null
null
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.46/105
Arr ay di r iferimenti
Vediamo l’effetto delle seguenti istruzioni:...fa[0] = new Foo();fa[0].z = 15;fa[0].b = true;...
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.47/105
Arr ay di r iferimenti
b
z
Foo
15
tt
σHeap
.....
0:
1:
2:
fa
length
array Foo
4
3: null
null
null
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.48/105
Arr ay di r iferimenti
Vediamo l’effetto delle seguenti istruzioni:...fa[1] = fa[0];fa[2] = new Foo();...
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.49/105
Arr ay di r iferimenti
b
z
Foo
15
tt
σHeap
.....
0:
1:
2:
fa
length
array Foo
4
3: null
b
z
Foo
0
ff
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.50/105
Arr ay di r iferimenti
Vediamo l’effetto delle seguenti istruzioni:...fa[2].z = 5;fa[1].condInc(fa[2].z);...
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.51/105
Arr ay di r iferimenti
σHeap
.....
0:
1:
2:
fa
length
array Foo
4
3: null
b
z
Foo
ff
5
b
z
Foo
tt
20
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.52/105
Arr ay bidimensionali
In Java è possibile dichiarare array a duedimensioni
Un array a due dimensioni può essereimmaginato come una tabella (matrice) in cuici 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 unelemento del tipo dichiarato per l’array
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.53/105
Arr ay 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 dellamatrice se i è un indice di riga valido
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.54/105
Arr ay bidimensionali
Ogni elemento della matrice è individuato permezzo di due indici, il primo indica la riga e ilsecondo 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
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.55/105
Ciclo for e arr ay
Spesso il ciclo for è quello più naturale per agiresugli array.
Inizializza un array di interi in cui gli elementicontengono le proprie posizioni.
int[] a = new int[10];for (int i = 0; i < a.length; i++)
a[i] = i;
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.56/105
Ciclo for e arr ay
Sposta tutti gli elementi di un array di unaposizione 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 e ancora definita
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.57/105
Esempio: ordinamento di un arr ay
Algoritmo bubble-sort
Ogni posizione i , a partire da 0, vieneconfrontata 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’ultimaposizione dell’array, dove alla fine si troveràautomaticamente un elemento massimo
Uso di due cicli for annidati con indici i e j
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.58/105
Esempio: ordinamento di un arr ay
Ordinamento dell’array di interi aint i; // indice esternoint j; // indice internoint buf; // variabile di appoggiofor (i = 0; i < a.length -1; i++)
for (j = i + 1; j < a.length; j++)if (a[i] > a[j])
{ // scambiobuf = a[i];a[i] = a[j];a[j] = buf;
}Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.59/105
Ciclo for e matr ici
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;
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.60/105
Esercizi
Implementare i metodi della classeScacchiera del Tris
Scrivere un programma che prende in inputun numero n e stampa un triangolo del tipo:
[][][][][][][][][][][][][][][][][][][][][]
di n righe.Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.61/105
Esercizi
Modificare la classe CombinationLock inmodo da creare cassaforti con combinazioniformate da un numero arbitrario n di lettere
Scrivere una classe Forzatore che, ricevuta iningresso una cassaforte così potenziata,tenta di trovare la combinazione con la forzabruta
Versione soft: il forzatore sa di quante lettereè formata la combinazione
Versione hard: il forzatore ignora di quantelettere sia formata la combinazione
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.62/105
Programmazione su sequenze
Vediamo alcuni schemi di programmazione dioperazioni tipiche su sequenze di dati
Come struttura dati per rappresentare lesequenze useremo gli array
Comunque gli schemi di programmazionesono validi per qualunque struttura dati cherappresenta una sequenza: lista, iterazionesu elementi di un insieme, ecc.
Cambierà solamente la sintassi con cuiindicizzare e reperire gli elementi dellasequenza
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.63/105
Schemi di programmazione
Calcolo di aggregati: media, minimo,massimo, somma, ecc.
Ricerca del primo elemento della sequenzache soddisfa una certa proprietà (RicercaLineare Incerta)
Verifica che tutti gli elementi della sequenzasoddisfano una certa proprietà
Varianti in cui si considerano solo certeporzioni della sequenza
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.64/105
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 delvalore dell’elemento della sequenza che si staanalizzando, viene aggiornato l’accumulatore
Alla fine del for si determina il valore cercatoa partire dal valore dell’accumulatore
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.65/105
Esempio: somma emedia
Somma e media degli elementi di una sequenzadi interi (array a)
int somma = 0; // Accumulatorefor (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);
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.66/105
Esempio: elemento massimo
Trovare il valore massimo presente in una sequenza di interi (array a) ela 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);
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.67/105
Ricerca Lineare Incerta
Si usa per cercare, in una sequenza, laposizione del primo elemento che soddisfauna certa proprietà
La proprietà P (v) è definita sui valoricontenuti negli elementi della sequenza (es.array a)
La sequenza potrebbe non contenere nessunelemento che soddisfa la proprietà
Il risultato è la posizione dell’elemento, setrovato. Altrimenti una variabile booleanaindica che l’elemento non è stato trovato
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.68/105
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;
elsei = i + 1;
(1)
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.69/105
RLI: schema
Nel punto (1) del programma:
Se la variabile booleana trovato vale trueallora il primo elemento dell’array chesoddisfa P si trova nella posizione contenutanella variabile i
Se la variabile trovato vale false allora siha che nessun elemento dell’array soddisfa P
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.70/105
RLI: esempio
Supponiamo di dover scrivere un metodo cheprende in input un array di interi a e unnumero n
Si vuole ricercare in a, se c’è, il primoelemento maggiore di n
Se lo si trova il metodo deve rispondere conla posizione dell’elemento trovato
Se non lo si trova il metodo deve risponderecon −1
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.71/105
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;
}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.72/105
Verifica su tutt i gli elementi
Si vuole sapere se tutti gli elementi di unasequenza soddisfano una certa proprietàP (v)
La soluzione più semplice ed efficiente èquella di fare una trasformazione logica delproblema
Si risolve il problema negato: si cerca cioè unelemento della sequenza che non soddisfa P
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.73/105
Verifica su tutt i gli elementi
Si imposta quindi lo schema della RLI pertrovare il primo elemento della sequenza chesoddisfa !P (v)
All’uscita dal ciclo:Se trovato è true allora la risposta alproblema iniziale è NOSe trovato è false allora la risposta alproblema iniziale è SI: tutti gli elementidella sequenza soddisfano la proprietà P
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.74/105
Verifica: esempio
Supponiamo di dover scrivere un metodo cheprende in input un array di interi a e unnumero intero b
Il metodo deve rispondere true se tutti glielementi di a sono divisibili per b, altrimentifalse
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 metodoritornerà il valore booleano appropriato
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.75/105
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;
}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.76/105
Var ianti
In alcuni casi il problema posto richiede che sicambino gli estremi di ricerca/verifica nellasequenza
Ad esempio: controllare se una porzione diun array di interi a sia composta da elementiin ordine crescente
start e stop sono due parametri di inputche indicano la posizione di partenza e diarrivo della porzione di array
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.77/105
Var ianti
Trasformiamo il problema di verifica nellaricerca del primo elemento che rompel’ordinamento crescente
Facciamo partire la ricerca con i = start
Interrompiamo la ricerca se i < stoppoiché l’ultimo elemento della porzione noninfluenza la verifica richiesta
Se l’elemento che rompe l’ordinamento vienetrovato rispondiamo true , altrimenti false
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.78/105
Var ianti: esempio
public booleanporzioneOrdinata(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; }Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.79/105
Arr ayList invece chearr ay
Abbiamo visto che gli array sono una buonastruttura dati per rappresentare sequenze dielementi di uno stesso tipo
Tuttavia hanno il problema che la lorolunghezza massima deve essere specificataal momento della creazione
Se abbiamo bisogno di altro spazio dobbiamoricreare un array più lungo e copiare la primaparte del vecchio array in quello nuovo
In Java esiste già una classe che fa questoautomaticamente
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.80/105
ArrayList<E>
La classe ArrayList<E> del pacchettojava.util permette di creare e gestire unasequenza di oggetti di tipo E
Il numero di oggetti nella sequenza non èpredeterminato: la classe alloca lo spazionecessario al crescere o decrescere deglielementi inseriti
Per creare un ArrayList<Foo> di oggetti diuna classe Foo:
ArrayList<Foo> myList = new ArrayList<Foo>();
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.81/105
ArrayList<E>
La lista viene creata vuota
Per aggiungere un oggetto in fondo alla listacorrente:
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 quelliseguenti vengono spostati verso destra
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.82/105
Inserimento
L’inserimento in una sequenza è un problemaclassico
L’inserimento in fondo non comporta ingenere problemi di implementazione, anchenel caso di array (se l’array non è pieno)
L’inserimento in una posizione interna allasequenza comporta lo spostamento a destradegli elementi interessati
Quest’ultima operazione richiedeun’implementazione adeguata nel caso di unarray
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.83/105
Inserimento
C’è un’altra questione importante da tenerepresente in caso di inserimento di unelemento in una sequenza, sia in fondo chenel mezzo
Bisogna stabilire se la sequenza in questioneammette l’inserimento di elementi giàpresenti, cioè se ammette la presenza dielementi duplicati
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.84/105
Inserimento
Nel caso in cui non si vogliano duplicati sideve dapprima fare una RLI per determinarese l’elemento da inserire è già presente nellasequenza
Solo nel caso in cui la risposta sia negativa sideve poi procedere all’inserimento vero eproprio
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.85/105
ArrayList<E>
Per ottenere il numero attuale di elementidella lista:int n = myList.size();
Per ottenere l’oggetto in posizione i :Foo fooObj = myList.get(i);
Per assegnare un nuovo elemento allaposizione i :myList.set(i,f);
Altre funzionalità della classe possono esseretrovate sulle API
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.86/105
ArrayList<E>: esempio
Scriviamo un metodo che ottiene in input unoggetto ArrayList<Foo> e si occupa dichiamare il metodo m() su ogni oggettocontenuto nella lista
Si applica lo stesso schema del calcolo diaggregati:
public void applyM(ArrayList<Foo> list){for (int i = 0; i < list.size(); i++)
list.get(i).m();}
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.87/105
ArrayList<E>
Tutti gli schemi di programmi che abbiamovisto utilizzavano gli array come struttura datiper 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 sintassiappropriata
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.88/105
ArrayList<E>
Ad esempio, per ottenere il valoredell’elemento in posizione i non si utilizzaa[i] , ma la chiamata di metodo a.get(i)
Oppure, per cambiare il contenuto dellaposizione i , non si utilizza l’assegnamentoa[i] = nuovoElemento , ma si chiama ilmetodo a.set(i, nuovoElemento)
Per ottenere la lunghezza il metodo size()invece che la variabile istanza length , ecc.
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.89/105
Cancellazione
Affrontiamo ora il problema dellacancellazione di un elemento da unasequenza
A prima vista è un problema banale, ma cisono alcuni accorgimenti da prendere perevitare errori logici difficili da individuare
Innanzitutto: se l’elemento in posizione i diuna sequenza deve essere cancellato alloratutti gli elementi dall’i+1 -esimo alla finedevono essere spostati di una posizioneverso sinistra
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.90/105
Cancellazione
Inoltre: se si sta scorrendo la sequenza e sicancella un certo elemento in posizione i ,allora il ciclo di scorrimento deve evitare diincrementare l’indice i in quella iterazione
Questo perché la cancellazione avrà fatto inmodo da spostare l’elemento e cheprecedentemente era in i+1 nella posizione i
Se il ciclo incrementa l’indice i l’elemento enon verrà preso in considerazione nelloscorrimento
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.91/105
Cancellazione earr ay
Gestire la cancellazione con gli array risultaabbastanza insidioso per i motivi visti sopra
In genere se una sequenza è soggetta adaggiunte e cancellazioni dinamiche, e quindiha una lunghezza variabile nonpredeterminabile, è meglio non usare unarray per rappresentare la sequenza
E’ più adatta una struttura dati dinamicacome l’ArrayList<E>
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.92/105
Esercizio
Implementare la cancellazione di unelemento e lo scorrimento con cancellazionesu una sequenza rappresentata con un array
Fare attenzione ai problemi di cui sopra
Tener presente che durante lo scorrimentol’indice deve avanzare solo se l’ultimoelemento controllato non è stato cancellato
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.93/105
Cancellazione eArrayList<E>
La classe ArrayList<E> ha un metodoremove(int index) che implementa lacancellazione in modo corretto: gli elementi adestra del cancellato si spostano tutti di unaposizione verso sinistra
Per effettuare senza errori lo scorrimento concancellazione (detto anche filtraggio) laclasse mette a dispozione un metodoiterator() che restituisce un iteratoresulla sequenza
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.94/105
I terator i
Per una sequenza rappresentata con unArrayList<E> possiamo utilizzare unIterator<E> o un ListIterator<E>
Queste due sono interfaces, non classi. Dalnostro attuale punto di vista in cui ci limitiamoa usare oggetti di questo tipo non c’èdifferenza
Su un oggetto di tipo Iterator<E> (oListIterator<E> ) possiamo chiamare tuttii metodi documentati nelle relative API(package java.util )
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.95/105
I terator i
Un iteratore è un oggetto che permette discorrere (visitare) tutti gli elementi unacollezione (nel nostro caso una lista) una euna sola volta
Durante lo scorrimento è possibile cancellaregli elementi visti, senza incappare neipossibili errori di scorrimento visti sopra
Nella sua versione più semplice mette adisposizione tre metodi
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.96/105
I terator i
1. boolean hasNext() indica se esiste unprossimo elemento da visitare nelloscorrimento. Se dà false allora tutti glielementi sono stati visitati
2. E next() restituisce il prossimo elementoda visitare, se presente
3. void remove() cancella dalla collezione(nel nostro caso lista) l’ultimo elemento che èstato visitato (cioè ottenuto con il metodonext() ) senza saltare elementi nellavisita/scorrimento
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.97/105
I terator i: esempio
Supponiamo di avere in input una lista dioggetti di una classe Foo rappresentata conun ArrayList
Supponiamo che nella classe Foo sia definitoun metodo predicativo isP()
Vogliamo scorrere la lista e “filtrare” glielementi che danno risposta positiva a isP()
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.98/105
I terator i: esempio
In altre parole vogliamo cancellare dalla listatutti gli elementi che rispondono true allachiamata di isP()
Alla fine restituiamo la lista filtrata
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.99/105
I terator i: esempio
public ArrayList<Foo>filterP(ArrayList<Foo> list){
Foo f;Iterator<Foo> it = list.iterator();while(it.hasNext()){
f = it.next();if (f.isP())
it.remove();}
// La lista e stata modificata durante// lo scorrimento con l’iteratore
return list; }Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.100/105
I terator i e insiemi
Gli oggetti della classejava.util.HashSet<E> rappresentano uninsieme di oggetti della classe E
Un insieme si differenzia da una lista nel fattoche gli elementi non sono indicizzati e non cisono elementi uguali ripetuti
Per utilizzare la classe HashSet<E> èobbligatorio ridefinire in maniera appropriata ilmetodo equals e il metodo hashcode per glioggetti della classe E
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.101/105
I terator i e insiemi
Una volta fatto questo per ricercare unoggetto nell’insieme si può utilizzare ilmetodo contains
Per scorrere tutti gli elementi di un insiemepossiamo ottenere un iteratore con il metodoiterator() della classe HashSet<E>
L’iterazione avverrà seguendo un ordinearbitrario
Consultare le API
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.102/105
Aggiornamento
Un altro problema classico sulle sequenze èquello dell’aggiornamento
Si tratta di ricercare un certo elemento e poicambiarlo
Si implementa, ovviamente, dapprima conuna RLI per individuare, se c’è, la posizioneda cambiare
Poi si utilizza l’assegnamento o il metodo set(nel caso di ArrayList) per sostituirel’elemento con un altro diverso o con lostesso elemento aggiornato
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.103/105
Esercizio
Modellare con le opporturne classi un ufficioanagrafe
L’ufficio deve gestire un database di personedi un comune
I dati sono immagazzinati in liste in memoria(eventualmente prevedere delle classi persalvare su disco le liste attuali e ricaricarle dadisco)
L’ufficio deve mettere a disposizione tutti iclassici servizi di: inserimento, ricerca,aggiornamento dati e cancellazione
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.104/105
Esercizio
Modellare con le opportune classi gli automi astati finiti
Un oggetto automa deve permettere diottenere tutti i cammini etichettati su unastringa w data e deve avere un metodo cherisponde true o false a seconda che w siaaccettata o non accettata
Un oggetto automa deve restituire un oggettoautoma deterministico equivalente a sestesso costruito con l’algoritmo di costruzionedei sottoinsiemi
Universita di Camerino - Corso di Laurea in Informatica - Programmazione + Laboratorio di Programmazione - Array, Cicli e Programmazione su Sequenze – p.105/105