corso di laurea ingegneria informatica fondamenti di ... filecorso di laurea ingegneria informatica...

38
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Fondamenti di Informatica Dispensa E06 Iterazione C. Limongelli Dicembre 2009 Dicembre 2009 1 http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Upload: others

Post on 05-Sep-2019

29 views

Category:

Documents


1 download

TRANSCRIPT

Corso di Laurea Ingegneria InformaticaFondamenti di InformaticaFondamenti di Informatica

Dispensa E06Iterazione

C. LimongelliDicembre 2009Dicembre 2009

1http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Contenuti

Si vogliono formalizzare diverse tecniche per la risoluzione di problemi di:

Accumulazione Conteggio Verifica esistenziale Verifica universaleRicerca

2http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Accumulazione

Calcolare una proprietà sintetica (cumulata) da una di l isequenza di valori

calcolo della somma di una sequenza di valori numerici calcolo del fattoriale di un numero naturalecalcolo del fattoriale di un numero naturale

Tecnica dell’accumulazione i bil di l i ( l t ) l luna variabile di accumulazione (accumulatore) per calcolare

l’informazione cumulativa una operazione di accumulazione, binaria, che deve essere p , ,applicata all’accumulatore e a ciascun elemento della sequenza inizialmente all’accumulatore viene assegnato l’elemento neutro dell’operazione di accumulazionedell operazione di accumulazione

3http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Accumulazione: esempip

Somma della sequenza di n numeriSomma della sequenza di n numeri

Calcolo del fattoriale di un numeroCalcolo del fattoriale di un numero

4http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Somma degli elementi di una sequenzag qint numero; // elemento corrente della sequenza

int somma; // somma degli elementi della sequenza

/* leggi una sequenza di numeri interi e * calcolane la somma */ /* inizialmente somma vale zero */ somma = 0; /* fi hé i lt i l ti ll/* finché ci sono altri elementi nella sequenza, * leggili e sommali a somma */ while (!Lettore.in.eoln()) { // finché ci sono

// altri elementi /* leggi un elemento della sequenza *// leggi un elemento della sequenza / numero = Lettore.in.leggiInt(); /* incrementa somma di numero */ somma = somma + numero;

} / //* visualizza somma */ System.out.println(somma);

sequenza: letta dalla tastierasequenza: letta dalla tastiera accumulatore: somma operazione di accumulazione: +elemento neutro dell’operazione di accumulazione: 0

5http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

elemento neutro dell operazione di accumulazione: 0

Uso dell’accumulatoreSi consideri la variabile somma nel calcolo della somma di una sequenza di numeridi una sequenza di numeri l’obiettivo della variabile somma è quello di memorizzare la somma di tutti gli elementi letti

questo obiettivo viene raggiunto solo dopo aver letto tutti gli elementi della sequenza

più precisamente prima dell’esecuzione dell’istruzione ripetitiva somma vale zero – è uguale alla somma di tutti gli elementi letti fino a quel momento d i i d l d ll’i t i i titidopo ciascuna esecuzione del corpo dell’istruzione ripetitiva, somma vale la somma di tutti gli elementi letti fino a quel momento

in generalein generale somma è uguale alla somma della porzione di sequenza letta ed elaborata fino a quel momento

6http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Accumulazione: schema risolutivo

... dichiarazione della variabile accumulatore ...accumulatore = elemento neutro dell’operazione

di accumulazione ;lt i i i li i i... altre inizializzazioni ...

per ciascun elemento della sequenza {... accedi al prossimo elemento ...accumulatore = applica l’operazione di

accumulazione all’accumulatore e all’elemento corrente;

} ... altre elaborazioni ...

usare un nome opportuno per l’accumulatore

7http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Calcolo di una sottostringa…g

Scrivere un metodo di classe String sottostringa(String s, int inizio, int fine)

che calcola la sottostringa di s che consiste dei caratteri compresi tra

quello di posizione inizio e quello di posizione fine-1 • si comporta come s.substring(inizio, fine) • ad esempio, sottostringa("automobile", 2, 6) deve restituire "tomo"

usa solo le seguenti operazioni sulle stringhe • int length() g ()• char charAt() • + (concatenazione)

8http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

…Calcolo di una sottostringa…g

È un problema di accumulazione sequenza • la sequenza dei caratteri di s tra le posizioni inizio (compresa) eq p ( p )

fine (esclusa)

accumulatore • una stringa, ss

operazione di accumulazioneoperazione di accumulazione • la concatenazione +

elemento neutro dell’operazione di accumulazioneelemento neutro dell’operazione di accumulazione • la stringa vuota ""

9http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

…Calcolo di una sottostringag/* Calcola la sottostringa di s compresa tra i * caratteri di posizione da inizio a fine-1. */ public static String sottostringa(String s,

int inizio, int fine) { // pre: s!=null && // inizio>=0 && inizio<=s length() &&// inizio>=0 && inizio<=s.length() && // fine>=inizio && fine<=s.length() String ss; // la sottostringa di s tra inizio e fine int i; // indice per la scansione di s

/* calcola la sottostringa, come concatenazione * dei caratteri tra la posizione inizio (inclusa) * e fine (esclusa) */* e fine (esclusa) */ ss = ""; // la stringa vuota è l'elemento neutro

// della concatenazione for (i=inizio; i<fine; i++) ( )

ss = ss + s.charAt(i); // concatenazione a destra // e conversione automatica

return ss; }

10http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

}

Esercizio

Scrivere un metodo inversa che ha comeScrivere un metodo inversa che ha come

parametro una stringa S e che calcola la stringa

ottenuta da S invertendone l’ordine dei caratteri

ad esempio, inversa("automobile") deve restituire

"elibomotua"elibomotua

11http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Conteggiogg

I problemi di conteggio sono un caso ti l d i bl i di l iparticolare dei problemi di accumulazione

• l’accumulatore è un contatore l’ i di l i è i t it i di• l’operazione di accumulazione è un incremento unitario – vedi oggetto Contatore

• l’aggiornamento deve essere eseguito sempre (conteggio), gg g ( gg )oppure condizionatamente (conteggio condizionale) al soddisfacimento di una proprietà da parte dell’elemento corrente della sequenzadella sequenza

• ad esempio – leggi una sequenza di numeri e calcola la sua lunghezza – conteggio

l i di i l l il d li l ti h l– leggi una sequenza di numeri e calcola il numero degli elementi che valgono zero – conteggio condizionale

– calcola il numero di occorrenze di un carattere in una stringa – conteggio condizionale

12http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

condizionale

Conteggio: schema risolutivoggint contaProprietà; // numero di elementi che

// soddisfano la proprietà// soddisfano la proprietà

contaProprietà = 0; altre inizializzazioni... altre inizializzazioni ...

per ciascun elemento della sequenza { di l i l t... accedi al prossimo elemento ...

if (l’elemento corrente soddisfa la proprietà) contaProprietà++;

} ... altre elaborazioni ...

usare un nome opportuno per il contatore

13http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Esercizio

Scrivere una applicazione che legge dalla tastiera una sequenza di numeri interi e ne conta e visualizza, separatamente, il numero degli elementi positivi e il numero degli elementi negativi (gli zeri non vanno contati)

Scrivi una sequenza di numeri interi 10 20 0 10 4 810 20 0 -10 4 -8La sequenza contiene 3 elementi positivi e 2 negativi

14http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Verifica esistenziale

Bisogna determinare se una sequenza di elementi contiene almeno un elemento che soddisfa una certa proprietà

in altre parole:psi vuole verificare che in una sequenza di elementi a1 a esiste almeno un elemento cheelementi a1,…, an esiste almeno un elemento che verifica una data proprietà p cioè che

∃ i ∈{1 n} p(a ) = true∃ i ∈{1,..,n}, p(ai) = true

15http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Verifica esistenziale: schema risolutivo …Viene usata una variabile booleana che indica se la sequenza contiene almeno un elemento che soddisfa la proprietàcontiene almeno un elemento che soddisfa la proprietà

Inizialmente si assegna alla variabile booleana un valore che indica convenzionalmente che la sequenza non contiene nessunconvenzionalmente che la sequenza non contiene nessun elemento che soddisfa la proprietà (false)

A partire dal primo elemento della sequenza si verifica seA partire dal primo elemento della sequenza si verifica se l’elemento corrente soddisfa la proprietà

• se l’elemento corrente soddisfa la proprietà, allora si assegna alla variabile booleana un valore che indica convenzionalmente che la sequenza contiene almeno un elemento che soddisfa la proprietà (true)p p ( )

Quando si trova un elemento che soddisfa la proprietà ci si ferma (non ha senso esaminare oltre perché il problema è risolto)

16http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

(non ha senso esaminare oltre perché il problema è risolto)

… Verifica esistenziale: schema risolutivoboolean proprietaSoddisfatta; // almeno un elemento

// ddi f l i tà// soddisfa la proprietà

proprietaSoddisfatta = false; ... altre inizializzazioni ...

finche’ non trovo un elemento che soddisfa la proprieta’while (!proprietaSoddisfatta && sequenza non

terminata) { ... accedi al prossimo elemento ...if (l’elemento corrente soddisfa la proprietà)

proprietaSoddisfatta = true; } ... altre elaborazioni ...

usare un nome opportuno per la variabile booleana17http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

usare un nome opportuno per la variabile booleana

Un errore comuneUn errore comune nella verifica esistenziale• ri-assegnare alla variabile booleana usata per la verifica esistenziale il valore• ri-assegnare alla variabile booleana usata per la verifica esistenziale il valore

che gli è stato assegnato nella sua inizializzazione

contieneZero = false; hil (!L tt i l ()&& ! ti Z ) {while (!Lettore.in.eoln()&& !contieneZero) {

/* legge il prossimo elemento della sequenza */ numero = Lettore.in.leggiInt(); /* se numero vale zero, allora la sequenza

/* contiene almeno uno zero */ if (numero==0)

contieneZero = true; else

contieneZero = false;}

• Se nella condizione del while non compare !contieneZero ilSe nella condizione del while non compare !contieneZero il programma verifica se l’ultimo elemento della sequenza letta vale zero

• Se nella condizione del while compare !contieneZero l’ultimo else e’ inutile

18http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Verifica se una sequenza contiene almeno uno zeroalmeno uno zero... legge una sequenza di numeri interi e

verifica se contiene almeno uno zero ...verifica se contiene almeno uno zero ...int numero; // elemento corrente della sequenza boolean contieneZero; // la sequenza contiene almeno

// un elemento uguale a zero

... visualizza un messaggio ... /* legge la sequenza e verifica * se contiene almeno uno zero */ se contiene almeno uno zero / contieneZero = false; while (!Lettore.in.eoln()) {

/* legge il prossimo elemento della sequenza */ ()numero = Lettore.in.leggiInt();

/* se numero vale zero, allora la sequenza * contiene almeno uno zero */ if (numero==0)if (numero 0)

contieneZero = true; }

il risultato è contieneZero

19http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

... il risultato è contieneZero ...

Verifica universalee ca u e sa eUn problema di verifica universale consiste nel

verificare se tutti gli elementi di una sequenzaverificare se tutti gli elementi di una sequenza a1,…, an soddisfano una certa proprietà p

• una variante (duale) dei problemi di verifica esistenzialeuna variante (duale) dei problemi di verifica esistenziale

In altre parole:Un problema di verifica universale è soddisfatto, se tutti gli elementi p , g

verificano una data proprietà p:∀ i ∈ {1,..,n}, p(ai) = true

Oppure un problema di verifica universale non è soddisfatto se esiste almeno un elemento che non verifica p:

∃ i ∈ {1 n} p(ai) = false∃ i ∈ {1,..,n}, p(ai) = false

La verifica universale si può sempre ricondurre ll ifi i t i l

20http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

alla verifica esistenziale

Verifica universale: schema risolutivoUn problema di verifica universale può essere sempre ricondotto a un problema di verificasempre ricondotto a un problema di verifica esistenziale

il problema diventa quello di verificare se non esisteil problema diventa quello di verificare se non esiste nessun elemento della sequenza che non soddisfa la proprietà inizialmente si assegna alla variabile booleana un valoreinizialmente si assegna alla variabile booleana un valore che indica convenzionalmente che tutti gli elementi della sequenza soddisfano la proprietà (true)

i l t d ll i ifiper ogni elemento della sequenza, si verifica se l’elemento corrente non soddisfa la proprietà

• se l’elemento corrente non soddisfa la proprietà, allora si p passegna alla variabile booleana un valore che indica convenzionalmente che non tutti gli elementi della sequenza soddisfano la proprietà (false)

21http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Verifica universale:schema risolutivoboolean proprietaSoddisfatta;

/* assumo che tutti gli elementi soddisfano la proprieta’ */proprietaSoddisfatta = true;proprietaSoddisfatta true;

... altre inizializzazioni ...

finche’ non trovo un elemento che non soddisfafinche non trovo un elemento che non soddisfa la proprieta

while (proprietaSoddisfatta && la sequenza non e’ finita){

di l i l t... accedi al prossimo elemento ...if (l’elemento corrente non soddisfa la

proprietà) proprietàSoddisfatta = false; p p

}

... altre elaborazioni ...

22http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

usare un nome opportuno per la variabile booleana

Verifica se una sequenza di dieci elementi è crescenteelementi è crescente... legge una sequenza di dieci numeri interi e

verifica se è crescente ...i t // l t t d llint numero; // elemento corrente della sequenza int precedente; // elemento che precede numero

// nella sequenza int i; // per contare i numeri letti

// èboolean crescente; // la sequenza è crescente

/* il primo elemento della sequenza è il * precedente del prossimo che sarà letto */ precedente = Lettore.in.leggiInt(); /* finora la sequenza letta è crescente */ crescente = true; i=0; /* legge e elabora gli altri elementi della sequenza */ gg g qwhile(i<10 && crescente) {

/* legge il prossimo numero e verifica che * la sequenza sia ancora crescente */ numero = Lettore.in.leggiInt(); gg ();if (precedente>=numero)

crescente = false; i++;/* prepara la prossima iterazione */ precedente = numero;

23http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

precedente numero; } ... il risultato della verifica è crescente ...

Verifica l’uguaglianza tra stringheg g g

Scrivere un metodo boolean uguali(String s, String t) che verifica se le stringhe s e t sono uguali si comporta come s.equals(t)• ad esempio, uguali("alfa", "alfa") deve restituire true, mentre

li(" lf " "b t ") d tit i f luguali("alfa", "beta") deve restituire false

due stringhe s e t sono uguali se • s e t hanno la stessa lunghezza• ciascun carattere della stringa s è uguale al carattere della stringa

t che occupa la stessa posizionet che occupa la stessa posizione

24http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Uguaglianza tra stringheg g g

Algoritmo: • continua il confronto tra le stringhe solo se finora non sono state

riscontrate differenze /* verifica se s e t sono uguali *// verifica se s e t sono uguali / if (s.length()==t.length()) {

/* s e t hanno la stessa lunghezza: s e t/* possono essere uguali, ma sono diverse p g ,* se contengono almeno un carattere diverso */ uguali = true; i = 0;while (uguali && i<s.length()) {

if (s.charAt(i) != t.charAt(i)) uguali = false;

i = i+1;}

else /*s e t hanno lunghezza diversa, quindi sono diverse */ li f l

25http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

uguali = false;

Verifica esistenziale e verifica universale

Verifica esistenziale:Si vuole verificare che in una sequenza di elementi

a1,…, an esiste almeno un elemento che verifica una data proprietà pcioè checioè che

∃ i ∈{1,..,n}, p(ai) = trueVerifica universale:

Si vuole verificare che in una sequenza di elementi a1,…, an tutti gli elementi della sequenza verificano una data proprietà

i è hp cioè che∀ i ∈ {1,..,n}, p(ai) = true

Oppure si può verificare che esiste almeno un elemento che nonOppure si può verificare che esiste almeno un elemento che non verifica la proprietà p: in tal caso la verifica universale non è soddisfatta

∃ i {1 } ( ) f l26http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

∃ i ∈ {1,..,n}, p(ai) = false

Esercizi

Scrivere un metodo boolean primo(int n) che verifica se il t l è iil numero naturale n è primo

• ad esempio, primo(8) deve restituire false

Scrivere un metodo boolean caratteriUguali(String s)che verifica se i caratteri di s sono tra loro tutti uguali

d i tt iU li(" ") d tit i t• ad esempio, caratteriUguali("aaa") deve restituire true

Scrivere un metodo boolean prefisso(String s, String t)che verifica se la stringa t è un prefisso della stringa s

• ad esempio, prefisso("alfabeto", "alfa") deve restituire true

Scrivere un metodo boolean suffisso(String s, String t)che verifica se la stringa t è un suffisso della stringa s

27http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

• ad esempio, suffisso("aereo", "reo") deve restituire true

Esercizi

Scrivere un metodo boolean palindroma(String s) che verifica se la stringa s è palindroma

• ad esempio, palindroma("abcba") deve restituire true

Scrivere un metodo Sc e e u etodoboolean anagramma(String s, String t)

che verifica se le stringhe s e t sono tra loro degliche verifica se le stringhe s e t sono tra loro degli anagrammi

ad esempio anagramma("carpa" "capra") deve restituire true• ad esempio, anagramma("carpa", "capra") deve restituire true

28http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Ricerca

I problemi di ricerca sono un caso più generale dei problemi di verifica esistenziale bisogna verificare se una sequenza contiene almeno un

elemento che soddisfa una certa proprietà in caso affermativo, bisogna calcolare delle ulteriori

informazioni circa uno degli elementi che soddisfa la proprietà esempio • ricerca di un numero telefonico in un elenco telefonico a partire

dal cognome e nome di un utente

29http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Indice di un carattere in una stringag

Scrivere un metodo int posizioneDi(String s, char car) che

verifica se la stringa s contiene almeno un carattere uguale averifica se la stringa s contiene almeno un carattere uguale a carrestituisce la posizione della prima occorrenza del carattere p p

car nella stringa s• oppure il valore -1 – se s non contiene nessun carattere uguale a car

si comporta come s.indexOf(car)• ad esempio, posizioneDi("alfa", 'f') deve restituire 2,

posizioneDi("alfa" 'a') deve restituire 1 mentre posizioneDi("alfa"posizioneDi( alfa , a ) deve restituire 1, mentre posizioneDi( alfa , 'b') deve restituire -1

30http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Indice di un carattere in una stringag/* Verifica se la stringa s contiene il carattere car, * restituisce la posizione della prima * di i 1 */* occorrenza di car in s, oppure -1. */ public static int posizioneDi(String s, char car) {

// pre: s!=null int posizione; // posizione di car in sint posizione; // posizione di car in s int i; // indice per la scansione di s

/* scandisce i caratteri di s alla ricerca della /* prima occorrenza di car in s */ /* finora non è stata trovato nessun car in s */ posizione = -1; i 0i=0;while (posizione==-1 && i<s.length()) {

if (s.charAt(i)==car) /* è stato trovato car in posizione i *//* è stato trovato car in posizione i */ posizione = i;

i = i+1;}

31http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

} return posizione;

}

Indice di un carattere in una stringag/* finora non è stata trovato nessun car in s */ posizione = -1;posizione = -1; i = 0;while(posizione==-1 && i<s.length()) {

if (s.charAt(i)==car) ( ( ) )/* è stato trovato car in posizione i */ posizione = i;

i++; }}

La variabile posizione viene utilizzata come seguesegue

• posizione rappresenta la posizione della prima occorrenza di carin s

• posizione vale -1 se s non contiene nessuna occorrenza del pcarattere car

– il valore -1 denota un “posizione non valida” s• inizialmente posizione vale -1 e, scandendo i caratteri di s, se ne

viene trovato uno uguale a car la posizione di questo carattere

32http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

viene trovato uno uguale a car, la posizione di questo carattere viene assegnata a posizione

Ricerca: schema risolutivo

... info; // informazione associata // all’elemento cercato

info = informazione non trovata ;info = informazione non trovata ;... altre inizializzazioni ...

finche’ non trovo un elemento della sequenzache soddisfa la proprieta’ {

... accedi al prossimo elemento ...if (l’elemento corrente soddisfa la proprietà)

info = informazione associatainfo = informazione associata all’elemento corrente ;

}

33http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

... altre elaborazioni ...

Indice di una sottostringa in una stringag g

Scrivere un metodo int posizioneDi(String s, String t) che

• verifica se la stringa s contiene almeno una sottostringa uguale g g galla stringa t

• restituisce la posizione in cui inizia la prima sottostringa di s uguale a t

– oppure -1 se s non contiene nessuna sottostringa uguale a t

i i d Of( )• si comporta come s.indexOf(t)– ad esempio, posizioneDi("sottostringa", "otto") deve restituire 1,

posizioneDi("mamma", "ma") deve restituire 0, p ( , ) ,mentre posizioneDi("mamma", "pa") deve restituire -1

34http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Indice di una sottostringa in una stringag g/* Verifica se la stringa s contiene la sottostringa t * e restituisce la posizione della prima * occorrenza di t in s, oppure -1. */ public static int posizioneDi(String s, String t) {

// pre: s!=null && t!=null i i i // i i d ll i iint posizione; // posizione della sottostringa t in s int ls, lt; // lunghezza di s e lunghezza di t int i; // indice per la scansione

// d ll tt t i h di// delle sottostringhe di s int j; // indice per la scansione di t boolean ssug; // la sottostringa di s che inizia in

// i ed ha lunghezza lt è uguale a t// i ed ha lunghezza lt è uguale a t

/* inizializzazioni */ ls = s length();ls = s.length(); lt = t.length();

... segue ...

35http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

... segue ...

Indice di una sottostringa in una stringag g/* scandisce le sottostringhe di s

* alla ricerca di una sottostringa uguale a t */ alla ricerca di una sottostringa uguale a t / posizione = -1; for (i=0; posizione==-1 && i<=ls-lt; i++) {

/* scandisce i caratteri di t per verificare * l tt t i di i i i t* se la sottostringa di s iniziante * in posizione i e lunga lt è uguale a t */ ssug = true; for (j=0; ssug && j<lt; j++) {for (j 0; ssug && j<lt; j++) {

if (s.charAt(i+j) != t.charAt(j)) ssug = false;

j++; // passa al prossimo carattere di t} if (ssug) // sottostringa di s uguale a t trovata

posizione = i; // allora t è sottostringa di s }} return posizione;

}

36http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

Un’altra soluzionepublic static int posizioneDi(String s, String t) {

// pre: s!=null && t!=null int posizione; // posizione della sottostringa t in s int ls, lt; // lunghezza di s e lunghezza di t int i; // indice per la scansione

// delle sottostringhe di s// delle sottostringhe di s

/* inizializzazioni */ ls = s.length(); lt = t.length();

/* scandisce le sottostringhe di s alla ricerca di * una sottostringa uguale a t */* una sottostringa uguale a t */ posizione = -1; for (i=0; posizione==-1 && i<=ls-lt; i++) {

if ( uguali(s,i,i+lt,t) ) ( g ( , , , ) )posizione = i;

} return posizione;

}

37http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

}

Esercizi

Scrivere un metodo int parole(String s) che calcola il numero di parole che compaiono in s

• per parola si intende una sequenza massimale di caratteri contigui che non contiene nessuno spazio bianco

• ad esempio, parole("la mia casa") deve restituire 3, mentre l (" d t ") d tit i 1parole(" uno,due.tre ") deve restituire 1

Scrivere un metodo String tagliaSpazi(String s)Sc e e u etodo St g tag aSpa (St g s)che calcola e restituisce i caratteri di s ad eccezione degli eventuali spazi bianchi iniziali eeccezione degli eventuali spazi bianchi iniziali e finali

• ad esempio tagliaSpazi(" a b c ") deve restituire "a b c"

38http://www.dia.uniroma3.it/~java/fondinf/ Iterazione

• ad esempio, tagliaSpazi(" a b c ") deve restituire "a b c"