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