Esercitazione 3 Espressioni booleane I comandi if-else e while Esercizio Si consideri la seguente istruzione: if (C1) if (C2) S1; else S2; A quali delle seguenti interpretazioni corrisponde ? if (C1) if (C2) S1; else S2; if (C1) if (C2) S1; else S2; Soluzione: In entrambi i casi il ramo else si riferisce al secondo if Esercizio Se si vuole che il ramo else si riferisca al primo if dobbiamo usare le parentesi: if (C1) { if (C2) S1; } else S2; che corrisponde a if (C1) { if (C2) S1; } else S2; Esercizio Scrivere un algoritmo che + legge tre numeri in ingresso, + quindi verifica se questi possono essere la lunghezza dei tre lati di un triangolo (la lunghezza di ogni lato deve essere minore della somma degli altri due), + infine determina se il triangolo avente come lati le lunghezze indicate è scaleno, isoscele oppure equilatero. Algoritmo 1. Leggi i tre dati, x, y e z. 2. Verifica che ognuno dei tre dati sia minore della somma degli altri due: in caso contrario stampa il messaggio “I dati letti non corrispondono ad alcun triangolo”; in caso positivo procedi come segue: 2.1 verifica se x, y e z sono tutti e tre uguali: in tal caso stampa il messaggio “I dati letti corrispondono a un triangolo equilatero”; 2.2 altrimenti, se almeno due di essi sono tra loro uguali, stampa il messaggio “I dati letti corrispondono a un triangolo isoscele”; 2.3 altrimenti, stampa il messaggio “I dati letti corrispondono a un triangolo scaleno”. /* programma Triangolo */ #include <stdio.h> int main( ) { int x, y, z; printf (“Inserisci i valori dei tre lati: ”); scanf (“%d%d%d”, &x, &y, &z); if ((x<y+z) && (y<x+z) && (z<x+y)) if (x==y && y==z) printf (“I dati letti corrispondono a un triangolo equilatero”); else if (x==y | | y==z | | x==z) printf (“I dati letti corrispondono a un triangolo isoscele”); else printf (“I dati letti corrispondono a un triangolo scaleno”); else printf (“I dati letti non corrispondono ad alcun triangolo”); } Il comando di iterazione Finché • Comando di iterazione – Consente al programmatore di specificare che una azione dovrà essere ripetuta finché alcune condizioni rimarranno vere – Pseudocodice: Finché ci sono ancora articoli nella mia lista della spesa Compra il prossimo articolo e cancellalo dalla mia lista – Il ciclo finché sarà ripetuto fino a che la condizione diventi falsa Il comando di iterazione Finché • Esempio int product = 2; while (product <= 1000) product = 2 * product; Iterazione controllata da un contatore – Ciclo ripetuto fino a che un contatore raggiunge un certo valore – Iterazione definita: il numero delle iterazioni è noto – Esempio: Una classe di dieci studenti sostiene un esame. Avete a disposizione le votazioni (degli interi nell’intervallo da 0 a 100) per questo esame. Determinare la media della classe in questo esame. – Pseudocodice: Inizializzare il totale a zero Inizializzare il contatore dei voti a uno Finchè il contatore resta minore o uguale a dieci Prendere dall’input il prossimo voto Aggiungere il voto al totale Aggiungere uno al contatore Impostare il valore della media al totale diviso dieci Visualizzare la media Formulazione degli algoritmi con il processo top-down per raffinamenti successivi Sviluppate un programma per il calcolo della media di una classe, che elaborerà un numero arbitrario di votazioni ogni volta che il programma sarà eseguito. – Il numero di studenti é sconosciuto a priori – In quale modo il programma potrà determinare quando terminare l’immissione delle votazioni? • Si usa un valore sentinella – Anche chiamato valore di segnalazione, valore fittizio o valore bandiera – Indica la “fine della immissione dei dati” – L’iterazione finisce quando l’utente inserisce il valore sentinella – Il valore sentinella dovrà essere scelto in modo che non possa essere confuso con un valore di input accettabile (come -1 in questo caso) Formulazione degli algoritmi con il processo top-down per raffinamenti successivi Raffinamenti successivi top down – Cominciamo con una rappresentazione in pseudocodice del top: Determinare la media della classe per l’esame – Dividiamo il top in piccole attività e elenchiamole in ordine: Inizializzare le variabili Prendere in input, sommare e contare le votazioni dell’esame Calcolare e visualizzare la media della classe • Molti programmi hanno tre fasi: – Inizializzazione: inizializza le variabili del programma – Elaborazione: prende in input i valori dei dati e imposta conseguentemente le variabili del programma – Chiusura: calcola e visualizza i risultati finali Formulazione degli algoritmi con il processo top-down per raffinamenti successivi Raffiniamo la fase di inizializzazione da Inizializzare le varibili in: Inizializzare il totale a zero Inizializzare il contatore a zero • Raffiniamo Prendere in input, sommare e contare le votazioni dell’esame in: Prendere in input la prima valutazione (o forse il valore sentinella) Finché l’utente non ha ancora immesso il valore sentinella Aggiungere questa valutazione al totale corrente Aggiungere uno al contatore di valutazioni Prendere in input la prossima valutazione (o forse il valore sentinella) Formulazione degli algoritmi con il processo top-down per raffinamenti successivi Raffiniamo Calcolare e visualizzare la media della classe in: Se il contatore non è uguale a zero Impostare la media con il totale diviso per il contatore Visualizzare la media altrimenti Visualizzare “Non sono state immesse valutazioni” Formulazione degli algoritmi con il processo top-down per raffinamenti successivi Inizializzare il totale a zero Inizializzare il contatore a zero Prendere in input la prima valutazione (o forse il valore sentinella) Finché l’utente non ha ancora immesso il valore sentinella Aggiungere questa valutazione al totale corrente Aggiungere uno al contatore di valutazioni Prendere in input la prossima valutazione (o forse il valore sentinella) Se il contatore non è uguale a zero Impostare la media con il totale diviso per il contatore Visualizzare la media altrimenti Visualizzare “Non sono state immesse valutazioni” Determinare il massimo fra N numeri interi Algoritmo max_N 1. Leggi il valore di N dall’esterno 2. Leggi i primi due numeri 3. Trova il maggiore m fra i primi due numeri (con max) 4. Finchè (hai esaminato meno di N numeri) • a. Leggi un nuovo numero x • b. Trova il maggiore fra m e x usando l’algoritmo max • c. Assegna il valore del maggiore a m 5. Stampa ‘il massimo è…’ ed il valore di m e termina DF per il problema del massimo di N numeri Inizio Leggi i primi due numeri e memorizzali nelle variabili a e b m = max(a,b) Si Leggi un nuovo numero in a Ancora numeri da esaminare ? No Scrivi ‘max è m’ Fine m = max(a,m) Supponiamo N fissato DF e programmi I DF sono un primo passo verso la formalizzazione di un algoritmo in modo non ambiguo Per ottenere una codifica interpretabile direttamente dalla macchina dobbiamo però specificare molti più dettagli : – trasformare tutte le ‘frasi’ in variabili e modifiche su di esse : • es : ‘ancora numeri da esaminare’ deve essere tradotto in qualcosa di calcolabile dalla macchina usando solo le operazioni elementari Leggi N Inizio Leggi i primi due numeri e memorizzali nelle variabili a e b m = max(a,b) Si I<N? I=I+1 Leggi un nuovo numero in a m = max(a,m) I=2 No Scrivi ‘max è m’ Fine DF per il problema del massimo di N numeri (seconda versione) Supponiamo N almeno 2 Programma: max_N in C main() /* calcola max_N */ { int m, i, a, b; i=2; scanf ("%d %d”, &a, &b); m = max(a,b); while (i < N) { scanf ("%d ”, &a) ; m = max(a,m); i = i+1; } printf (”il max è %d”, &m) ; return ; } Programma: max_N in C (cont.) int max(int x, int y) /* sottoprogramma che calcola max */ { int d; d=x-y; if (d > 0) return x; else return y; }