Lezione 3

Transcript

Lezione 3
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;
}