Capitolo 5. Decisioni. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Documenti analoghi
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Un esempio di if annidati

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

public double getlato() restituisce la lunghezza del lato del quadrato che esegue il metodo.

Il tipo di dati char (capitolo 4)

Capitolo 4. Tipi di dati fondamentali. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

Corso di Fondamenti di Informatica Classi di istruzioni 2

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

Esercizio: la classe CashRegister

If a cascata, switch, boolean

PROGRAMMAZIONE STRUTTURATA

Strutturare il codice: sottoprogrammi

Istruzioni di ripetizione in Java 1

Individuazione di sottoproblemi

VISUAL BASIC FOR APPLICATION

Fare calcoli e grafici con Excel

Gestione di files Motivazioni

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Informatica/ Ing. Meccanica/ Prof. Verdicchio/ 14/02/2012 / Foglio delle domande / VERSIONE 1

Strutture Dinamiche. Fondamenti di Informatica

Definizione di metodi in Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Linguaggio C: introduzione

Le variabili. Olga Scotti

Esercitazione 3. Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf

Laboratorio di Programmazione Lezione 1. Cristian Del Fabbro

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

Definizione di metodi

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Fondamenti di Informatica T1 Mappe

Uso di metodi statici. Walter Didimo

Esercitazione 3. Espressioni booleane I comandi if-else e while

Operazioni di scrittura e lettura con periferici in linguaggio Java

Array multidimensionali e stringhe

Unità 2 I file binari

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

Problema: calcolare il massimo tra K numeri

SULL USO DEI CARATTERI. char x; si legge con ( %c,&x) e si stampa con ( %c,x) ma anche con ( %d,x) DUE ESEMPI

Corso di Laurea Ingegneria Informatica Laboratorio di Informatica

UD4 - MATLAB. M-file. Efficienza degli algoritmi. Formati d uscita

Esercizi classi e array

SQL [2] Concetti avanzati di SQL. Esempi di interrogazioni

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Fondamenti di Programmazione

Programmazione Orientata agli Oggetti

La gestione dei caratteri in C

Matlab 5. Funzioni. Slide basate sul corso di C. Blundo. A.A. 2010/ GPersiano. Laboratorio di Informatica per Fisici 1

Algoritmi di Ricerca. Esempi di programmi Java

4 GLI ARRAY E LE STRINGHE

Diagrammi a blocchi 1

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Lezione 7: La Formalizzazione degli Algoritmi - Strutture di Controllo e Selettive La Programmazione Strutturata (3 p) Giovedì 21 Ottobre 2010

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

Un oggetto per la lettura dalla tastiera

Procedura operativa per la gestione della funzione di formazione classi prime

FILE E INDICI Architettura DBMS

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013

L accesso ai dispositivi esterni (tastiera, monitor, file,...) viene gestito mediante canali di comunicazione.

Strutture di controllo in C++

Mini-Corso di Informatica

Algoritmi e Linguaggi

Lezione 9 programmazione in Java Classi come contenitori

Informatica 3 secondo recupero 13 Settembre 2002

ACCESS. Database: archivio elettronico, dotato di un programma di interfaccia che facilita la registrazione e la ricerca dei dati.

Esame Informatica Generale 13/04/2016 Tema A

Esonero del corso di Programmazione a Oggetti

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

Le Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Gestione delle eccezioni in Java

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Eccezioni. Gestione degli errori. Eccezioni per codificare errori. Eccezioni. Gestione di eccezioni. Approccio tradizionale: Problemi

AXO - Architettura dei Calcolatori e Sistema Operativo. organizzazione strutturata dei calcolatori

SISTEMI OPERATIVI, RETI, INTERNET

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO VI.2014

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

Sommario. Note alla traduzione... xix

Programmazione ad oggetti

Somma di numeri floating point. Algoritmi di moltiplicazione e divisione per numeri interi

Esercitazione 4. Comandi iterativi for, while, do-while

DESCRIZIONE CREAZIONE APP Si suddivide in 4 fasi di lavoro: 1. PIANIFICAZIONE; 2. PROGETTAZIONE; 3. SVILUPPO; 4. DISTRIBUZIONE.

// inizializzazione della biblioteca con utenti, libri e prestiti // non richiesta Biblioteca.inizializza();

ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 28 Gennaio 1999 PROVA SCRITTA

Laboratorio di Informatica Lezione 2

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Ingegneria del Software

Strumenti per la costruzione di modelli economici in Excel. Parte 1. Funzioni di Base

Progettazione logica

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Istruzioni iterative. Istruzioni iterative

Transcript:

Capitolo 5 Decisioni Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Obiettivi del capitolo Saper realizzare decisioni usando enunciati if Capire come raggruppare enunciati in blocchi Imparare a confrontare numeri interi, numeri in virgola mobile, stringhe e oggetti Identificare il corretto ordine delle decisioni nelle ramificazioni multiple Programmare condizioni usando operatori e variabili booleani Comprendere l importanza della copertura del collaudo

L'enunciato if L'enunciato if consente a un programma di compiere azioni diverse in dipendenza dal verificarsi di una condizione. if (amount <= balance) balance = balance - amount; Figura 1: Diagramma di flusso di un enunciato if

L'enunciato if/else if (amount <= balance) balance = balance - amount; else balance = balance - OVERDRAFT_PENALTY; Figura 2: Diagramma di flusso di un enunciato if/else

Tipi di enunciati Enunciato semplice balance = balance - amount; Enunciato composto Anche while, for, ecc. (cicli Capitolo 7) if (x >= 0) y = x; Blocco di enunciati { } double newbalance = balance - amount; balance = newbalance;

Sintassi 5.1: L'enunciato if if(condizione) enunciato if (condizione) enunciato1 else enunciato2 Esempio: if (amount <= balance) balance = balance - amount; if (amount <= balance) balance = balance - amount; else balance = balance - OVERDRAFT_PENALTY; Obiettivo: Eseguire un enunciato quando una condizione è vera o falsa

Sintassi 5.2: Blocco di enunciati } { enunciato1 enunciato2... Esempio: { double newbalance = balance - amount; balance = newbalance; } Obiettivo: Raggruppare diversi enunciati per formare un enunciato unico

Confrontare valori: Operatori relazionali Gli operatori relazionali confrontano valori. L operatore == verifica l uguaglianza. a = 5; // assegna 5 ad a if (a == 5)... // verifica se a è uguale a 5

Confrontare numeri in virgola mobile Il codice: double r = Math.sqrt(2); double d = r * r -2; if (d == 0) System.out.println("sqrt(2)squared minus 2 is 0"); else System.out.println("sqrt(2)squared minus 2 is not 0 but " + d); stampa: sqrt(2)squared minus 2 is not 0 but 4.440892098500626E-16

Confrontare numeri in virgola mobile Confrontando numeri in virgola mobile, non fate verifiche di uguaglianza (= =), ma controllate se i valori sono sufficientemente prossimi. Per confrontare numeri double, di solito si usa un valore di ε uguale a 10 14. Analogamente, potete verificare se due numeri sono prossimi l uno all altro controllando se la loro differenza è prossima a 0. x - y ε final double EPSILON = 1E-14; if (Math.abs(x - y) <= EPSILON) // x è quasi uguale a y

Confrontare stringhe Non utilizzare == per le stringhe if (string1 == string2) // inutile Utilizzare il metodo equals: if (input.equals("y")) == verifica se le due variabili stringa si riferiscono al medesimo oggetto stringa. equals verifica che il contenuto sia uguale. Per ignorare le differenze tra maiuscolo e minuscolo usate il metodo equalsignorecase if (input.equalsignorecase("y"))

Confrontare stringhe s.compareto(t) < 0 significa che s precede la t in ordine alfabetico. "car" precede "cargo" Tutte le lettere maiuscole precedono quelle minuscole B precede a

Confronto lessicografico Figura 3: Confronto lessicografico

Confrontare oggetti L operatore == verifica se due riferimenti a oggetto sono identici. Per confrontare, invece, i contenuti di oggetti, si deve usare il metodo equals. Rectangle box1 = new Rectangle(5, 10, 20, 30); Rectangle box2 = box1; Rectangle box3 = new Rectangle(5, 10, 20, 30); non box1 == box3, ma box1.equals(box3) equals deve essere definito nella classe

Confrontare oggetti Figura 4: Confronto tra riferimenti a oggetti

Confrontare con null Il riferimento null non fa riferimento ad alcun oggetto. String middleinitial = null; // Valore iniziale non valido if (... ) middleinitial = middlename.substring(0, 1); Per verificare se un riferimento è null si usa l operatore == (e non equals): if (middleinitial == null) System.out.println(firstName + " " + lastname); else System.out.println(firstName + " " + middleinitial + ". " + lastname);

Confrontare con null Un riferimento null è diverso da una stringa vuota "". La stringa vuota è una stringa valida di lunghezza 0, mentre il valore null indica che una variabile di tipo stringa non si riferisce ad alcuna stringa.

Alternative multiple: Sequenze di confronti if (condizione1) enunciato1; else if (condizione2) enunciato2;... else enunciato4; La prima sequenza di confronti è eseguita Ordinare le condizioni if (richter >= 0) // sempre vero r = "Generally not felt by people"; else if (richter >= 3.5) // mai verificato r = "Felt by many people, no destruction...

Alternative multiple: Sequenze di confronti Non dimenticareelse if (richter >= 8.0) r = "Most structures fall"; if (richter >= 7.0) // else mancante -- ERRORE r = "Many buildings destroyed

File Earthquake.java 01: /** 02: Una classe che descrive gli effetti di un terremoto. 03: */ 04: public class Earthquake 05: { 06: /** 07: Costruisce un oggetto che rappresenta un terremoto. 08: @param magnitude the magnitude on the Richter scale 09: */ 10: public Earthquake(double magnitude) 11: { 12: richter = magnitude; 13: } 14: 15: /** 16: Restituisce la descrizione dell'effetto del terremoto. 17: @return the la descrizione dell'effetto 18: */ Segue

File Earthquake.java 19: public String getdescription() 20: { 21: String r; 22: if (richter >= 8.0) 23: r = "Most structures fall"; 24: else if (richter >= 7.0) 25: r = "Many buildings destroyed"; 26: else if (richter >= 6.0) 27: r = "Many buildings considerably damaged, some collapse"; 28: else if (richter >= 4.5) 29: r = "Damage to poorly constructed buildings"; 30: else if (richter >= 3.5) 31: r = "Felt by many people, no destruction"; 32: else if (richter >= 0) 33: r = "Generally not felt by people"; 34: else 35: r = "Negative numbers are not valid"; 36: return r; 37: } Segue

File Earthquake.java 38: 39: private double richter; 40: }

File EarthquakeRunner.java 01: import java.util.scanner; 02: 03: /** 04: Programma che visualizza la descrizione di un terremoto. 05: */ 06: public class EarthquakeRunner 07: { 08: public static void main(string[] args) 09: { 10: Scanner in = new Scanner(System.in); 11: 12: System.out.print("Enter a magnitude on the Richter scale: "); 13: double magnitude = in.nextdouble(); 14: Earthquake quake = new Earthquake(magnitude); 15: System.out.println(quake.getDescription()); 16: } 17: } Visualizza: Enter a magnitude on the Richter scale: 7.1 Many buildings destroyed

Alternative multiple: Diramazioni annidate Una diramazione all'interno di un'altra if (condizione1) { if (condizione1a) enunciato1a; else enunciato1b; } else enunciato2;

Tabella 1 Tabella 1 Aliquote per categorie d'imposta federali (1992)

Diramazioni annidate Calcolare il carico fiscale, fornendo uno stato civile e l importo di un reddito. 1. scegliere la diramazione relativa allo stato civile 2. per ciascuno stato civile, imboccare un altra diramazione in base allo scaglione di reddito Il processo decisionale a due livelli si traduce mediante due livelli di enunciati if Si dice che la verifica del reddito è annidata all interno di quella per la classificazione dello stato civile

Diramazioni annidate Figura 5 Schema per il calcolo dell'imposta sul reddito 1992 Figura 5: Income Tax Computation Using 1992 Schedule

File TaxReturn.java 01: /** 02: Dichiarazione dei redditi per un contribuente nel 1992. 03: */ 04: public class TaxReturn 05: { 06: /** 07: Costruisce una dichiarazione per un dato importo 08: del reddito e per un dato stato civile 09: @param anincome il reddito del contribuente 10: @param astatus la costante SINGLE o MARRIED 11: */ 12: public TaxReturn(double anincome, int astatus) 13: { 14: income = anincome; 15: status = astatus; 16: } Segue 17:

File TaxReturn.java 18: public double gettax() 19: { 20: double tax = 0; 21: 22: if (status == SINGLE) 23: { 24: if (income <= SINGLE_BRACKET1) 25: tax = RATE1 * income; 26: else if (income <= SINGLE_BRACKET2) 27: tax = RATE1 * SINGLE_BRACKET1 28: + RATE2 * (income - SINGLE_BRACKET1); 29: else 30: tax = RATE1 * SINGLE_BRACKET1 31: + RATE2 * (SINGLE_BRACKET2 SINGLE_BRACKET1) 32: + RATE3 * (income - SINGLE_BRACKET2); 33: } Segue

File TaxReturn.java 34: else 35: { 36: if (income <= MARRIED_BRACKET1) 37: tax = RATE1 * income; 38: else if (income <= MARRIED_BRACKET2) 39: tax = RATE1 * MARRIED_BRACKET1 40: + RATE2 * (income - MARRIED_BRACKET1); 41: else 42: tax = RATE1 * MARRIED_BRACKET1 43: + RATE2 * (MARRIED_BRACKET2 - MARRIED_BRACKET1) 44: + RATE3 * (income - MARRIED_BRACKET2); 45: } 46: 47: return tax; 48: } 49: 50: public static final int SINGLE = 1; 51: public static final int MARRIED = 2; 52: Segue

File TaxReturn.java 53: private static final double RATE1 = 0.15; 54: private static final double RATE2 = 0.28; 55: private static final double RATE3 = 0.31; 56: 57: private static final double SINGLE_BRACKET1 = 21450; 58: private static final double SINGLE_BRACKET2 = 51900; 59: 60: private static final double MARRIED_BRACKET1 = 35800; 61: private static final double MARRIED_BRACKET2 = 86500; 62: 63: private double income; 64: private int status; 65: }

File TaxCalculator.java 01: import java.util.scanner; 02: 03: /** 04: Programma che calcola una semplice dichiarazione dei redditi. 05: */ 06: public class TaxCalculator 07: { 08: public static void main(string[] args) 09: { 10: Scanner in = new Scanner(System.in); 11: 12: System.out.print("Please enter your income: "); 13: double income = in.nextdouble(); 14: 15: System.out.print("Are you married? (Y/N) "); 16: String input = in.next(); 17: int status; 18: if (input.equalsignorecase("y")) 19: status = TaxReturn.MARRIED; 20: else 21: status = TaxReturn.SINGLE; 22:

File TaxCalculator.java 23: TaxReturn ataxreturn = new TaxReturn(income, status); 24: 25: System.out.println("Tax: " 26: + ataxreturn.gettax()); 27: } 28: } Visualizza: Please enter your income: 50000 Are you married? (Y/N) N Tax: 11211.5

Utilizzare le espressioni booleane Il tipo boolean George Boole (1815-1864): pioniere nello studio della logica Il valore dell'espressione amount < 1000 è true o false. Il tipo boolean ha due valori: true e false

Utilizzare le espressioni booleane Metodi predicativi Un metodo predicativo restituisce un valore booleano public boolean isoverdrawn() { return balance < 0; } Il valore restituito dal metodo può essere utilizzato come condizione di un enunciato if: if (harryschecking.isoverdrawn())... Segue

Utilizzare le espressioni booleane Metodi predicativi Nella classe Character sono presenti parecchi utili metodi predicativi statici: isdigit isletter isuppercase islowercase che consentono di verificare i caratteri if (Character.isUpperCase(ch))... La classe Scanner ha metodi predicativi utili per verificare se una successiva richiesta di dati in ingresso andrà a buon fine: hasnextint e hasnextdoubleouble() if (in.hasnextint()) n = in.nextint();

Utilizzare le espressioni booleane Gli operatori booleani && and or! not if (0 < amount && amount < 1000)... if (input.equals("s") input.equals("m"))...

&& Gli operatori booleani Figura 6 Diagrammi di flusso con operatori && e

Riepilogo delle tre operazioni logiche A B A && B vero vero vero vero falso falso falso qualsiasi valore falso A B A B vero qualsiasi valore vero falso vero vero falso falso falso A!A vero falso falso vero

Utilizzare variabili booleane private boolean married; Il risultato della verifica di una condizione può essere memorizzato in una variabile booleana. if (married)... else... if (!married)... Le variabili booleane sono dette flag, perché hanno solo due stati, "su" o "giù".

Utilizzare variabili booleane Valutare attentamente i nomi da assegnare alle variabili booleane dà i risultati migliori. Da non fare if (married == true)... // Da non fare Usare una condizione semplice if (married)...

Tipi enumerativi Una variabile di un tipo enumerativo può assumere soltanto un valore che appartenga a un insieme appositamente definito Al posto delle costanti public static final int SINGLE = 1; public static final int MARRIED = 2; Nella classe, al livello degli attributi si dichiara il tipo public enum FilingStatus { SINGLE, MARRIED } private FilingStatus status; FilingStatus status = FilingStatus.SINGLE;

Copertura del collaudo IIl collaudo a scatola chiusa (black-box testing) descrive una metodologia di collaudo che non prende in considerazione la struttura dell implementazione. Il collaudo trasparente (white-box testing) usa informazioni sulla struttura del programma. La copertura di un collaudo è una misura di quante parti di un programma siano state collaudate.

Copertura del collaudo Assicurarsi che ogni porzione del programma venga collaudata da almeno uno dei casi di prova. Considerate anche i casi limite: valori validi dei dati di ingresso che si trovano al limite di tali valori accettabili. Suggerimento: calcolare alcuni casi di prova prima di scrivere il programma. Questa pratica aiuta a comprendere la natura del problema e agevola la realizzazione del programma stesso.

Copertura del collaudo

Logging Invece di usare System.out.println( status is SINGLE ); Usare Logger.getGlobal().info( status is SINGLE ); I messaggi di tracciamento possono essere disattivati dopo aver completato il collaudo Logger.getGlobal().setLevel(Level.OFF);