Correttezza - Dipartimento di Informatica e Automazione

Fondamenti di informatica
Oggetti e Java
Luca Cabibbo
Correttezza
Capitolo 16
Marzo 2007
1
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
Un metodo non corretto
/* Calcola il fattoriale di n. */
public static int fattoriale(int n) {
// pre: n>=0
int f;
// il fattoriale di n
int i;
// per iterare tra 1 e n
f = 1;
i = 1;
while (i<=n) {
f = f*i;
i = i+1;
Versione corretta
}
return f;
}
2
se n vale 2, non termina
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
Un metodo non corretto
/* Calcola il numero di occorrenze del
* carattere car nella stringa s,
* ovvero il numero di caratteri di s
* che sono uguali a car. */
public static int occorrenze(String s, char car) {
// pre: s!=null
int i;
// indice per scandire i caratteri di s
int occ;
// occorrenze di car in s
occ = 0;
for (i=0; i<=s.length(); i++)
if (s.charAt(i)==car)
occ++
return occ;
}
3
Versione corretta
i<=s.length()-1;
Oppure
i<s.length();
termina sempre con un errore al tempo di esecuzione di tipo
IndexOutOfBoundsException
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
Un metodo corretto
/* Calcola mediante somme ripetute il prodotto n*m
* dei numeri naturali n e m. */
public static int prodottoNaturali(int n, int m) {
// pre: n>=0 && m>=0
int p;
// il prodotto di n e m
int i;
// per iterare tra 1 e n
p = 0;
for (i=1; i<=n; i++)
p = p+m;
return p;
}
4
restituisce proprio n*m – calcolato nell’aritmetica modulare
Ma attenzione: se n*m>231-1, il risultato non e’ piu’ attendibile
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
Esempio: caratteri centrali…
Data una stringa s scrivere un metodo che restituisce i caratteri
centrali della stringa.
Se la stringa e' costituita da un numero pari di elementi vengono
restituiti i due caratteri centrali, se la stringa e' costituita da un
numero dispari di elementi viene restituito il carattere centrale.
Scrivere un'applicazione Java che legge la stringa, invoca il
metodo e stampa il risultato.
5
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
… Esempio: caratteri centrali…
import fiji.io.*;
/*INPUT: stringa non nulla; OUTPUT: se la stringa e' costituita da un numero
pari di elementi vengono restiutiti i due caratteri centrali, se la stringa e' costituita
da un numero dispari di elementi viene restituito il caratettere centrale */
class CaratteriCentrali {
public static void main(String[] args) {
String s;
System.out.println("***** VERIFICA *****");
// stringa vuota
s = "";
System.out.println("car. centrali della stringa vuota " + calcolaCentrali(s));
// stringa composta da un solo carattere
s = "a";
System.out.println("car. centrali di "+ s +" "+ calcolaCentrali(s));
// stringa composta da due caratteri
s = "aa";
System.out.println("car. centrali di "+ s +" "+ calcolaCentrali(s));
6
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
… Esempio: caratteri centrali…
// stringa composta da un numero pari di caratteri
s = "tavolo";
System.out.println("car. centrali di "+ s +" "+ calcolaCentrali(s));
//stringa composta da un numero dispari di caratteri
s = "stringa";
System.out.println("car. centrali di "+ s +" "+ calcolaCentrali(s));
//stringa composta da cifre
s = "39&82";
System.out.println("car. centrali di "+ s +" "+ calcolaCentrali(s));
}
7
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
… Esempio: caratteri centrali
public static String calcolaCentrali(String s) {
String cc; //conterra' i caratteri centrali
int lung; // lunghezza della stringa
lung = s.length();
if (lung == 0) //stringa vuota
CIAO
cc = "";
0123
else {
if (lung%2 == 0) //lunghezza pari
cc = s.substring(lung/2-1,lung/2+1);
else //lunghezza dispari
cc = s.substring(lung/2,lung/2+1);
}
return cc;
0 1 2 34
}//end calcolaCentrali
PROVA
}//end class
8
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
Esempio: tutti uguali…
Data una stringa s scrivere un metodo che verifica se una stringa
non nulla e non vuota e‘ composta da caratteri tutti uguali.
Scrivere un'applicazione Java che legge la stringa, invoca il
metodo e stampa il risultato.
9
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
…Esempio: tutti uguali…
import fiji.io.*;
/**
Applicazione che verifica se una stringa non nulla e non vuota e'
composta da caratteri TUTTI uguali
*/
class CaratteriUguali {
public static void main(String[] args){
String s; //stringa acquisita in lettura
//pre: stringa non nulla e non vuota
//insieme di verifiche definite a priori:
/* stringa con un solo elemento: TRUE */
s = "a";
System.out.println(s + ": " + tuttiUguali(s) + " (TRUE)");
/* stringa con piu' elementi diversi: FALSE */
s = "Buon Giorno!";
System.out.println(s + " = " + tuttiUguali(s)+ " (FALSE)");
10
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
…Esempio: tutti uguali…
/* stringa con caratteri tutti uguali: TRUE */
s = "aaaaaaa";
System.out.println(s + " = " + tuttiUguali(s)+ " (TRUE)");
/* solo il primo carattere e' diverso dagli altri : FALSE */
s = "baaaa";
System.out.println(s + " = " + tuttiUguali(s)+ " (FALSE)");
/* solo l'ultimo carattere e' diverso dagli altri : FALSE */
s = "aaaab";
System.out.println(s + " = " + tuttiUguali(s)+ " (FALSE)");
}//end main
11
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo
…Esempio: tutti uguali
/* metodo che verifica se i caratteri nella stringa s sono tutti uguali. Restituisce true se i
caratteri sono tutti uguali, false altrimenti*/
public static boolean tuttiUguali(String s){
//pre: s non nulla e non vuota
int l; //lunghezza della stringa
int i; //contatore e indice della stringa
char c0; //primo carattere della stringa
boolean uguali; //vero se i caratteri esaminati fino a quel momento sono tutti uguali
c0 = s.charAt(0);
i = 1; // perche' il primo carattere non deve essere esaminato
l = s.length();
uguali = true;
/* se esiste un carattere della stringa che e' diverso dal primo carattere allora i
caratteri nella stringa NON sono tutti uguali. Quindi confronto tutti i caratteri della
stringa con il primo. Esco dal ciclo quando ho esaminato tutti i caratteri, o quando ho
trovato un carattere diverso dal primo */
while (i<l && uguali){
if (c0 != s.charAt(i))
uguali = false;
i = i+1;
}
return uguali;
}}
12
Correttezza
Fondamenti di informatica: Oggetti e Java
Luca Cabibbo