Programmazione in Java (I modulo) Lezione 7 • Operatori logici • Espressioni booleane • Valutazione short circ • Controllare la correttezza input • break e continue Il tipo boolean • Il tipo boolean è tipo primitivo con solo due valori : true e false. • In memoria occupa solo un bit • Le variabili di tipo Boolean rendono i programmi più leggibili. if (trovatoDiv) Invece di if( num % x ==0) Variabili Booleane • Variabili, costanti di tipo boolean hanno valori true o false. • Uso operatore di assegnamento = • Assegno il risultato di una espressione booleana boolean trovatoDiv; trovatoDiv =( num % x ==0); Input e Output di valori boolean • Esempio boolean booleanVar = false; System.out.println(booleanVar); System.out.println("Scrivi un valore booleano:"); Scanner tastiera= new Scanner(System.in); booleanVar = tastiera(); System.out.println("hai scritto" + booleanVar); Espressioni Booleane • Il valore di una boolean expression è true o false. • Semplici esempi con operatori di confronto: t1 < t2 bal <= 0 Operatori di confronto Java Espressioni booleane • Possono comporre espressioni booleane usando gli operatori logici AND, OR , NOT • (Espress_1) && (Espress_2) • (Espress_1) || (Espress_2) • !(Espress_1) Operatori logici in Java Tabella degli operatori booleani && (and), || (or) , ! (not) Operatore di negazione Esempio.. (a || b) && !(a && b) Precedenza degli operatori Regole di precedenza In quale ordine vengono eseguite queste operazioni? score < min/2 - 10 || score > 90 score < (min/2) - 10 || score > 90 score < ((min/2) - 10) || score > 90 (score < ((min/2) - 10)) || score > 90 (score < ((min/2) - 10)) || (score > 90) Esempio: x = 5; int y = 10, z = 15; boolean b; b b b b = (x < 5 && y > x); =(x < 5 || y > x); =(x > 3 || y < 10 && z == 15); =(!(x > 3) && x != z || x + y == z); Calcolo delle espressioni booleane (Short-circuit) • A volte basta calcolare solo una parte di una espressione booleana per determinarne il valore Se il primo operando di una espressione con || è true, l'espressione è true. Esempio: <espress1> || <espress2> Se il primo operando di una espressione con && è false, l'espressione è false. Esempio: <espress1> && <espress2> • Si chiama calcolo a short-circuit o anche lazy. Calcolo con Short-circuit • Il calcolo con short-circuit non solo è efficiente ma a volte è cruciale! • Possiamo per esempio evitare un errore di esecuzione per divisione per 0 : if ((num != 0) && (somma/num > 5)) • Se vogliamo forzare il calcolo completo dobbiamo sostituire & a posto di && o| a posto di ||. Qualche altra nozione sui cicli... L'istruzione break • Termina il ciclo e porta direttamente alla istruzione successiva al ciclo. • Spesso è comoda, anche se può sempre essere evitata scrivendo bene le condizioni nella espressione booleana che controlla il ciclo.. • Esempio: un break dentro un ciclo for può essere evitato riscrivendo il ciclo con un while L'istruzione continue Termina l'iterazione corrente del ciclo e inizia la successiva Si raccomanda di non utilizzarla (meglio usare un if..else) Il metodo exit • A volte invece potrebbe servire una istruzione per uscire direttamente dal programma (certi valori delle variabili potrebbero rendere inutile continuare l'esecuizione) • Un programma può essere interrotto con l'istruzione System.exit(0). Il metodo exit • Esempio if (numEsami== 0) { System.out.println ("Error: Dividing by zero."); System.exit (0); } else { media= somma/ numEsami; System.out.println ("La media dei voti ottenuti e' :" + media); } Usare cicli per controllare input Spesso si chiede di introdurre un input di un certo tipo, ma non si vuole interrompere il programma se l'utente è "distratto".... do { System.out.println("\nInserisci un valore positivo: "); val = tastiera.nextInt(); } while ( val <= 0); O anche : System.out.println("\nInserisci un valore positivo: "); val = tastiera.nextInt(); while ( val <= 0){ System.out.println("\nValore errato. Ripeti inserimento!"); val = tastiera.nextInt(); } ESEMPIO: Scrivere un programma che chiede all'utente di inserire 10 voti (numeri compresi tra 18 e 30 ) e ne calcola la media. int x, voto; int somma=0; double media; for(x=1; x<=10; x++){ System.out.println("\nInserisci un voto d'esame: "); voto = tastiera.nextInt(); while ( voto<18 || voto > 30){ // condizione "contraria" System.out.println("\nValore errato. Ripeti inserimento!"); voto = tastiera.nextInt(); } somma = somma + voto; } media = (float) somma /10; TRIANGOLI Ricordando un po' di geometria... • Un triangolo si dice RETTANGOLO se ha un angolo retto. • I lati che includono l’angolo retto si dicono CATETI, mentre l’altro lato di dice IPOTENUSA. • Se un triangolo è rettangolo vale il: Teorema di Pitagora: la somma dei quadrati dei cateti è uguale al quadrato dell’ipotenusa. • Tre numeri interi positivi x,y,z si dice che sono una TERNA PITAGORICA se possono essere i lati di un triangolo rettangolo cioè se vale che x2 + y 2 = z 2 • PROBLEMA: calcolare quanti sono i triangoli rettangoli con lati interi ≤ 500. • ALGORITMO: genero tutte le terne (x,y,z) tali che 0 ≤ x ≤ y ≤ z ≤ 500 e, per ciascuna, verifico che sia una terna pitagorica cioè che x2 + y2 = z2 • Problema Opzionale: Elencare tutte le terne pitagoriche (x,y,z) tali che 0 ≤ x ≤ y ≤ z ≤ 500. Esercizi codice Ese07_x • Esercizio 1: Scrivere un programma Java che calcola quanti sono i triangoli rettangoli con lati interi ≤ 500. Opzionale : produrre in input tutte le terne pitagoriche trovate. • Esercizio 2: Scrivere un programma che chiede all’utente di inserire un carattere c e un intero x , 3 ≤ x ≤ 30 , e disegna, uno sotto l’altro i seguenti triangoli rettangoli con i cateti = x (esempio per x=4 e c=o) o oo ooo oooo o oo ooo oooo oooo ooo oo o oooo ooo oo o Esercizi codice Ese07_x • Esercizio 3 Scrivere un programma Java per risolvere il seguente quesito: Esiste un numero formato da 8 cifre che moltiplicato per un numero primo dà come risultato un numero di 9 cifre uguali?