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