440 likes | 587 Views
Parte 4. Fondamenti di Programmazione Strutture di controllo. Controllo del flusso. Flusso di esecuzione : ordine in cui le istruzioni di un programma sono eseguite Salvo contrordini, è in sequenza Due possibili alterazioni:
E N D
Parte 4 Fondamenti di Programmazione Strutture di controllo
Controllo del flusso • Flusso di esecuzione: ordine in cui le istruzioni di un programma sono eseguite • Salvo contrordini, è in sequenza • Due possibili alterazioni: • selezione: sceglie un’azione da una lista di due o più azioni possibili • ripetizione: continua ad eseguire un’azione fino a quando non si verifica una condizione di termine
Sequenza di default Strutture Java • Selezione • if • if-else • switch • Ripetizione • while • do-while • for
Valori Booleani • boolean: tipo di dato primitivo in Java che può assumere valore true oppure false • Variabili (o espressioni) il cui valore è di tipo boolean sono chiamate variabili (o espressioni) Booleane • Il valore di una variabile (o espressione) Booleana è true oppure false
Espressioni Booleane • Esprimono una condizione che risulta essere vera o falsa • Esempio (A e B sono due dati non necessariamente dello stesso tipo): • A è maggiore di B? • A è uguale a B? • A è minore di oppure uguale a B?
Confronto tra caratteri e stringhe • Si può confrontare caratteri: sono infatti basati su Unicode che definisce un ordinamento per tutti i possibili caratteri che possono essere usati. Dato che in Unicode, per esempio, il carattere ‘a’ viene prima di ‘b’, si può dire che ‘a’ è minore di ‘b’. • Non si possono usare operatori di confronto e di uguaglianza tra stringhe.
Confronto tra valori in virgola mobile • Raramente si usa l’operatore di uguaglianza tra due valori in virgola mobile. • Per testare l’uguaglianza di due valori in virgola mobile si può calcolare il valore assoluto della loro differenza e confrontare il valore così ottenuto con un valore di tolleranza, ad esempio 0,00001.
Operatori logici • AND: && • congiunge due espressioni • valore di ritorno true se e solo se entrambi le espressioni sono vere • OR: || • disgiunge due espressioni • valore di ritorno false se e solo se entrambi le espressioni sono false • Valutazione della seconda espressione condizionata • per avere valutazione completa, usare & e |
Altri operatori logici • NOT: ! • nega un’espressione • valore di ritorno true se e solo se l’espressione è falsa • XOR: ^ • disgiunge due espressioni in modo esclusivo • valore di ritorno true se e solo se le due espressioni hanno diversi valori di ritorno • esprimibile mediante AND, OR e NOT
Operatori Associatività Tipo ++ -- Unario postfisso ++ -- + - ! Unario (type) Conversione * / % Moltiplicativo + - Additivo < <= > >= Relazionale = = != Uguaglianza & AND ^ XOR | OR && AND || OR = += -= *= /= %= &= |= ^= assegnazione Precedenze e associatività
Esempio • 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))
Blocchi di istruzioni • Insiemi di istruzioni racchiuse tra parentesi graffe • corrispondono ad un’azione • parentesi non necessarie se include una sola istruzione • Esempio:{ //inizio del bloccocalorieLess = 500; calorieAllotment = calorieAllotment-calorieLess;} //fine del blocco
true Espressione_Booleana Blocco_1 false Prossima_Istruzione Istruzione if • Selezione semplice: • esegue un’azione se solo se una certa condizione è verificata • Sintassi: if (Espressione_Booleana) Blocco_1 //esegui solo se vera Prossima_Istruzione; //sempre eseguita
Esempio • Se il peso è superiore a quello ideale allora diminuisci il numero totale di calorie che si possono assumere di 500. • Successivamente, imposta il numero di calorie da assumere per colazione ad un terzo del numero totale di calorie • if(weight > ideal) calorieAllotment = calorieAllotment-500;calorieBreakfast = calorieAllotment/3;
Istruzione if-else • Selezione doppia: • esegue un’azione oppure un’altra in base al valore di una condizione • Sintassi: if (Espressione_Booleana) Blocco_1 //esegui solo se vera else Blocco_2 //esegui solo se falsa Prossima_Istruzione; //sempre eseguita
true Blocco_1 false Blocco_2 Prossima_Istruzione Espressione_Booleana Diagramma di flusso
Esempi • Esempio con una singola istruzione: if(balance >=0) balance=balance+(INTEREST_RATE*balance)/12; else balance=balance-OVERDRAWN_PENALTY; • Esempio con un’istruzione composta: if(balance >=0) { interest=(INTEREST_RATE*balance)/12; balance=balance+interest; } else { interst=OVERDRAWN_PENALTY; balance=balance-interest; }
Istruzioni if-elseannidate • Annidamento di istruzioni if-else: • tratta situazioni con più di due possibilità • Attenzione : ogni else si riferisce all’if più vicino • Sintassi: if (Espressione_Booleana_1) Blocco_1 else if (Espressione_Booleana_2) Blocco_2 . else if (Espressione_Booleana_ n) Blocco_n else Blocco_Default
Esempio if (score >= 90) grade = ‘A’; else if (score >= 80) grade = ‘B’; else if (score >= 70) grade = ‘C’; else if (score >= 60) grade = ‘D’; else grade = ‘E’;
Istruzione switch • Selezione multipla • Sintassi: switch(Espressione_Di_Controllo) { case Etichetta_Caso_1: Sequenza_Istruzioni_1 break; case Etichetta_Caso_2: Sequenza_Istruzioni_2 break; ... default: Sequenza_Istruzioni_Default }
Espressione_Di_Controllodeve essere char, int, short o byte • Espressione_Di_Controlloe le varie Etichette_Caso_*devono essere dello stesso tipo • L’istruzione break, che può essere omessa, fa, passare il controllo alla prima istruzione dopo l’istruzione switch • se break non è inclusa, allora l’esecuzione procede con le istruzioni del caso successivo
true Espressione_Di_Controllo = Etichetta_Caso_1 Sequenza_Istruzioni_1 false true break? false true Espressione_Di_Controllo = Etichetta_Caso_2 Sequenza_Istruzioni_2 false true break? ... false true ... default? Sequenza_Istruzioni_Default false Diagramma di flusso
Esempio switch (seatLocationCode) { case 1: type=‘O’; price = 40.00; break; case 2: type=‘M’; price = 30.00; break; case 3: case 4: type=‘B’; price = 15.00; break; default: type=‘U’; }
L’operatore condizionale • È l’unico operatore ternario di Java • Sintassi: • (Espressione Booleana)? Espressione_1:Espressione_2; • Il valore di ritorno è quello di Espressione_1 se Espressione Booleana è vera, altrimenti è quello di Espressione_2
Esempio • max = (n1>n2)?n1:n2; • Equivale a:if (n1>n2)max = n1;elsemax = n2;
Ripetizione: i cicli • Struttura: • corpo del ciclo • condizione di terminazione del ciclo • Organizzazione logica • cicli controllati da condizioni • cicli controllati da contatori • Istruzioni Java per realizzare cicli • while • do-while • for
Ciclo while • Sintassi: while (Espressione_Booleana) Blocco //corpo del ciclo Prossima_Istruzione • Espressione_Booleana rappresenta la condizione di ripetizione del ciclo • si esce dal ciclo, quando è falsa • Blocco rappresenta il corpo del ciclo • Istruzioni di inizializzazione precedono generalmente il ciclo
true Espressione_Booleana Blocco false Prossima_Istruzione Diagramma di flusso
Esempio • Ciclo che calcola la somma dei primi 10 numeri interi int total = 0; int count = 1; while (count <= 10) { total = total + count; count++; }
Minimo numero di iterazioni • Il numero minimo di iterazioni di un ciclo while è 0 dato che la condizione di ingresso può essere immediatamente falsa • Esempio: int next; int total = 0; next = (int)(Math.random()*100)-50; while (next >= 0) { total = total + next; next = (int)(Math.random()*100)-50; }
Ciclo do-while • Sintassi: do Blocco //corpo del ciclo while (Espressione_Booleana); Prossima_Istruzione • Il corpo del ciclo è eseguito almeno una volta dato che la condizione di ripetizione è posta dopo il corpo stesso
Espressione_Booleana true false Blocco Prossima_Istruzione Diagramma di flusso
Esempio int next; int total = 0; do { next = (int)(Math.random()*100)-50; total = total + next; } while (next >= 0);
Cicli infiniti • Cause principali: • errata espressione Booleana • errata (o assente) alterazione delle variabili coinvolte nell’espressione Booleana • Esempio: int total = 0; int count = 1; while (count != 10) { total = total + count; count += 2; }
Ciclo for • Struttura: • azione di inizializzazione • condizione di ripetizione • corpo del ciclo • azione di continuazione • Sintassi: for (Inizializzazione; Espressione_Booleana; Continuazione) Blocco Prossima_Istruzione
Inizializzazione true Espressione_Booleana Blocco false Continuazione Prossima_Istruzione Diagramma di flusso
Esempio • Sommare separatamente i numeri pari e quelli dispari compresi tra 1 e 100 int sumEven = 0, sumOdd = 0; for (int count = 1; count <= 99; count+=2) { sumOdd = sumOdd + count; sumEven = sumEven + count + 1; }
Considerazioni pratiche • Errori comuni: • cicli infiniti (non intenzionali) • cicli con contatore che non eseguono il numero di iterazioni desiderato (scarto di uno). • Testare soprattutto la condizione di ripetizione di un ciclo per evitare possibili errori • Mantenere traccia dei valori delle variabili (facendo uso di stampe su video)
Questioni di stile • Blocchi:{ Sequenza_Istruzioni} • inserire le parentesi graffe anche se il blocco è costituito da una sola istruzione • indentare tutte le istruzioni incluse nella sequenza
Istruzione if:if (Espressione_Booleana)Blocco • Istruzione if-else:if (Espressione_Booleana)Blocco elseBlocco
Istruzione switch:switch (Espressione_Di_Controllo){ case Etichetta_1: Sequenza_Istruzioni_1 case Etichetta_2: Sequenza_Istruzioni_2 ... case Etichetta_n: Sequenza_Istruzioni_n default: Sequenza_Istruzioni_Default}
Istruzione while:while (Espressione_Booleana)Blocco • Istruzione do-while:do Blocco while (Espressione_Booleana); • Istruzione for:for (Inizializzazione ; EB; Continuazione) Blocco