TORNIAMO ALLA - Soluzione del problema su array di stringhe

Corso di Laurea Ingegneria Informatica
Fondamenti di Informatica
Dispensa E10
Esercizi su Array di Stringhe
A. Miola
Gennaio 2012
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
1
Problema su array di stringhe . . .
Dato un array di stringhe, verificare che esiste
almeno una stringa nell’array che sia costituita
da tutti caratteri alfabetici maiuscoli
Ad esempio
{"2100"};
{"PIPPO"};
{"Ab4cd7e00","ABC","pippO"};
{"2001", "odissea", "nello", "spazio"};
{"2001", “ODISSEA", "nello", “SPAZIO"};
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
2
. . . Problema su array di stringhe
 Per risolvere il problema devo di fatto verificare che un
dato array appartenga allo specifico “linguaggio degli
array di stringhe, con almeno una stringa nell’array che
sia costituita da tutti caratteri alfabetici maiuscoli”
 Assumo che l’array sia non nullo e non vuoto e che i
suoi elementi-stringhe siano non nulle e non vuote
 Definisco quindi la grammatica per quel linguaggio
 Definisco una serie di metodi ciascuno dei quali serve a
verificare una delle regole di produzione della
grammatica
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
3
La grammatica . . .
Linguaggio degli array di stringhe, con almeno
una stringa nell’array che sia costituita da tutti
caratteri alfabetici maiuscoli
Il lessico
V = Insieme di tutti i caratteri Unicode
I simboli non terminali
N = {<array> , <seq-stringhe-inz> ,
<seq-stringhe-fin> , <stringa>,
<carattere-unicode>, <stringa-tipoA> ,
<maiuscola> }
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
4
. . . La grammatica . . .
Il simbolo iniziale
S = <array>
Le regole di produzione
<array> ::= {<seq-stringhe-iniz> <stringa-tipoA>
<seq-stringhe-fin> }
<seguenza-stringhe-iniz> ::= { <stringa> , }h
<seguenza-stringhe-fin> ::= { , <stringa> }k
 Nota : con h + k + 1 = n, se n è la dimensione
dell’array
...
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
5
. . . La grammatica
...
<stringa> ::= <carattere-unicode>
{ <carattere-unicode> }
<carattere-unicode> ::= uno dei caratteri unicode
<stringa-tipoA> ::= <maiuscola> {<maiuscola>}
< maiuscola > ::= A | B | ... | Y | Z
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
6
Soluzione del problema su
array di stringhe . . .
 Scrivere un metodo boolean maiuscola(char c) che,
dato un carattere c, verifica se il carattere è una lettera
maiuscola, cioè se (c >= ‘A’ && c <= ‘Z’)
 Il metodo di fatto verifica la regola di produzione
< maiuscola > ::= A | B | ... | Y | Z
public static boolean maiuscola(char c){
return (c >= ‘A’ && c <= ‘Z’); }
public static boolean maiuscola(char c){
boolean ris;
if (c >= ‘A’ && c <= ‘Z’) ris = true
else ris = false;
return ris}
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
7
. . . Soluzione del problema su
array di stringhe . . .
Scrivere un metodo
boolean stringaTipoA(String s)
che, data una stringa s, verifica se la stringa s è
una stringa di tipo A
 Il metodo di fatto verifica la regola di produzione
<stringa-tipoA> ::= <maiuscola> {<maiuscola>}
 cioè verifica se tutti i suoi caratteri sono lettere
maiuscole, cioè quelli per cui il metodo maiuscola
ritorna true
 si tratta di una verifica universale
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
8
. . . Soluzione del problema su
array di stringhe
 Scrivere un metodo
boolean almenoUnaStringaTipoA(String[ ] a)
che, dato un array di stringhe a, verifica se almeno una
stringa sia del tipo A
 Il metodo di fatto verifica la regola di produzione
<array> ::=
{<seq-stringhe-iniz> <stringa-tipoA> <seq-stringhe-fin> }
 cioè verifica se almeno una stringa abbia tutti i suoi caratteri
lettere maiuscole, cioè una stringa per cui il precedente metodo
stringaTipoA ritorna true
 si tratta di una verifica esistenziale
 Scrivere una classe applicazione per i test di ciascuno
dei metodi precedenti
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
9
RICORDIAMOCI - Verifica esistenziale …
 Bisogna determinare se una sequenza di
elementi contiene almeno un elemento che
soddisfa una certa proprietà
 In altre parole:
si vuole verificare che in una sequenza di
elementi a1,…, an esiste almeno un elemento che
verifica una data proprietà p cioè che
 i {1,..,n}, p(ai) = true
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
10
… RICORDIAMOCI - Verifica esistenziale …
 Viene usata una variabile booleana che indica se la sequenza
contiene almeno un elemento che soddisfa la proprietà
 Inizialmente si assegna alla variabile booleana un valore che indica
convenzionalmente che la sequenza non contiene nessun
elemento che soddisfa la proprietà (false)
 A 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)
 Quando si trova un elemento che soddisfa la proprietà ci si ferma
(non ha senso esaminare oltre perché il problema è risolto)
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
11
… RICORDIAMOCI - Schema risolutivo
boolean proprietaSoddisfatta;
// almeno un elemento
// soddisfa la proprietà
proprietaSoddisfatta = false;
... altre eventuali 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 booleana
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
12
RICORDIAMOCI - Verifica universale …
Un problema di verifica universale consiste nel
verificare se tutti gli elementi di una sequenza
a1,…, an soddisfano una certa proprietà p
• una variante (duale) dei problemi di verifica esistenziale
In altre parole:
Un problema di verifica universale è soddisfatto, se tutti gli elementi
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
La verifica universale si può sempre ricondurre
alla verifica esistenziale
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
13
… RICORDIAMOCI - Verifica universale …
 Un problema di verifica universale può essere sempre
ricondotto a un problema di verifica esistenziale
 il problema diventa quello di verificare se non esiste alcun
elemento della sequenza che non soddisfa la proprietà
 inizialmente si assegna alla variabile booleana un valore che
indica convenzionalmente che tutti gli elementi della sequenza
soddisfano la proprietà (true)
 per ogni elemento della sequenza, si verifica se l’elemento
corrente non soddisfa la proprietà
• se l’elemento corrente non soddisfa la proprietà, allora si assegna
alla variabile booleana un valore che indica convenzionalmente che
non tutti gli elementi della sequenza soddisfano la proprietà (false)
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
14
… RICORDIAMOCI - Schema risolutivo
boolean proprietaSoddisfatta;
/* assumo che tutti gli elementi soddisfano
la proprieta’ */
proprietaSoddisfatta = true;
... altre inizializzazioni ...
finche’ non trovo un elemento che non soddisfa
la proprieta
while (proprietaSoddisfatta &&
la sequenza non e’ finita){
... accedi al prossimo elemento ...
if (l’elemento corrente non soddisfa la
proprietà)
proprietàSoddisfatta = false;
}
... altre elaborazioni ...
usare un nome opportuno per la variabile booleana
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
15
TORNIAMO ALLA - Soluzione del problema
su array di stringhe
Scrivere un metodo
boolean stringaTipoA(String s)
che, data una stringa s, verifica se la stringa s è
una stringa di tipo A
 Il metodo di fatto verifica la regola di produzione
<stringa-tipoA> ::= <maiuscola> {<maiuscola>}
 cioè verifica se tutti i suoi caratteri sono lettere
maiuscole, cioè quelli per cui il metodo maiuscola
ritorna true
 si tratta di una verifica universale
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
16
Il metodo stringaTipoA
public static boolean stringaTipoA(String s) {
int i;
boolean tutteMaiuscole;
/* verifica universale: inizialmente la variabile
booleana è vera finché non trovo un elemento della
sequenza che non soddisfa la proprietà richiesta */
tutteMaiuscole = true;
i = 0;
while (tutteMaiuscole && i<s.length() ) {
if (!(maiuscola(s.charAt(i)) )
tutteMaiuscole = false;
i++;
}
return tutteMaiuscole;
}
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
17
TORNIAMO ALLA - Soluzione del problema
su array di stringhe
Scrivere un metodo
boolean almenoUnaStringaTipoA(String[ ] a)
che, dato un array di stringhe a, verifica se
almeno una stringa sia del tipo A
 Il metodo di fatto verifica la regola di produzione
<array> ::= {<seq-stringhe-iniz> <stringa-tipoA>
<seq-stringhe-fin> }
 cioè verifica se almeno una stringa abbia tutti i suoi
caratteri lettere maiuscole, cioè una stringa per cui il
precedente metodo stringaTipoA ritorna true
 si tratta di una verifica esistenziale
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
18
Il metodo stringaTipoA
public static boolean almenoUnaStringaTipoA(String[] a){
int i;
boolean almenoUna;
/* verifica esistenziale: inizialmente la variabile
booleana e' falsa: non appena trovo l'elemento che
soddisfa la verifica, la varabile booleana diventa
vera */
almenoUna = false;
i = 0;
while (!almenoUna && i<a.length ) {
if (stringaTipoA(a[i]) )
almenoUna = true;
i++;
}
return almenoUna ;
}
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
19
Problema su array di stringhe
Dato un array di stringhe, verificare che tutte le
stringhe dell’array contengono almeno una
coppia di lettere maiuscole adiacenti
 Per risolvere il problema devo di fatto verificare che
un dato array appartenga allo specifico “linguaggio
degli array di stringhe, con tutte le stringhe dell’array
contengono almeno una coppia di lettere maiuscole
adiacenti”
 Assumo che l’array sia non nullo e non vuoto e che i
suoi elementi-stringhe siano non nulle e non vuote
 Definisco quindi la grammatica per quel linguaggio
 Definisco una serie di metodi ciascuno dei quali
serve a verificare una delle regole di produzione della
grammatica
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
20
La grammatica . . .
Linguaggio degli array di stringhe, con tutte le
stringhe dell’array contenenti almeno una
coppia di lettere maiuscole adiacenti
Il lessico
V = Insieme di tutti i caratteri Unicode
I simboli non terminali
N = {<array> , <carattere-unicode>,
<stringa-tipoB> , <maiuscola> }
Il simbolo iniziale
S = <array>
...
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
21
. . . La grammatica
...
Le regole di produzione
<array> ::= { <stringa-tipoB> } |
{ <stringa-tipoB> { , < stringa-tipoB > }n-1 }
<stringa-tipoB> ::=
{ <carattere-unicode> } <maiuscola>
<maiuscola> {< carattere-unicode >}
<carattere-unicode> ::= uno dei caratteri unicode
< maiuscola > ::= A | B | ... | Y | Z
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
22
Soluzione del problema su
array di stringhe
Scrivere tutti i metodi necessari
AUGURI !
http://www.dia.uniroma3.it/~java/fondinf/
Esercizi su array
23