14 marzo 2002
Avvisi:
Ripetizione controllata da valore sentinella
• Variazione al problema:
Sviluppa il programma per il calcolo della media per un
numero arbitrario di voti (diverso per ogni diversa
esecuzione del programma)
– Numero di studenti sconosciuto a-priori
– Come fa il programma a sapere quando l’input termina?
• Valore sentinella
–
–
–
–
..anche valore dummy, valore flag
Indica la “fine dei valori in input.”
Loop finisce quando si immette il valore sentinella
Sceglierlo sempre in modo che non puo’ essere confuso con
un input regolare! (Esempio, in questo caso -1)
Formulazione algoritmo con processo “top-down”
Top-down, raffinamenti successivi
– Inizio con un pseudocodice che rappresenta il livello top:
Determina la media della classe sull’esame
– Divido il livello top in parti sempre piu’ dettagliate
Inizializza le variabili
Input, somma e conta i risultati dell’esame.
Calcola e stampa la media della classe
Formulazione algoritmo con processo “top-down”
Molti programmi possono dividersi in tre fasi:
– Inizializzazione: inizializza le variabili del programma
– Elaborazione: prende in input i dati e imposta le
variabili del programma di conseguenza.
– Conclusione: calcolo e stampa dei risultati finali.
Raffinamento dell’algoritmo
• Inizializza le variabili
Inizializza totale a zero
Inizializza contatore a zero
• Input, somma e conta i risultati dell’esame
Scrivi il primo voto (eventualmente la sentinella)
Finche’ non e’ data in input la sentinella
Aggiungi tale voto al totale corrente
Aggiungi uno al contatore voti
Scrivi il voto successivo (eventualmente la sentinella)
• Calcola e stampa la media della classe
Se il contatore non e’ uguale a zero
Definisci la media uguale al totale diviso per il contatore
Scrivi la media
else
Scrivi “No voto in input”
1 /* Fig. 3.8: fig03_08.c
2
Calcolo della media di una classe con
3
ripetizione controllata da sentinella */
4 #include <stdio.h>
5
6 int main()
7 {
8
float average;
/* new!!! */
9
int counter, grade, total;
10
11
/* inizializzazione */
12
total = 0;
13
counter = 0;
14
15
/* esecuzione */
16
printf( "Enter grade, -1 to end: " );
17
scanf( "%d", &grade );
18
19
while ( grade != -1 ) {
20
total = total + grade;
21
counter = counter + 1;
22
printf( "Enter grade, -1 to end: " );
23
scanf( "%d", &grade );
.
24
}
Sommario
1. Inizializza le
variabili
2. Riceve input da
utente
2.1 Esegue Loop
25
26
27
28
29
30
31
32
33
34
35 }
Enter
Enter
Enter
Enter
Enter
Enter
Enter
Enter
Enter
Class
/* fase finale */
if ( counter != 0 ) {
average = ( float ) total / counter; /*new*/
printf( "Class average is %.2f", average );
}
else
printf( "No grades were entered\n" );
return 0;
3. Calcola la media
3.1 Scrive i risultati
/* programma finisce ok */
grade, -1 to end:
grade, -1 to end:
grade, -1 to end:
grade, -1 to end:
grade, -1 to end:
grade, -1 to end:
grade, -1 to end:
grade, -1 to end:
grade, -1 to end:
average is 82.50
.
Sommario
75
94
97
88
70
64
83
89
-1
Output
Un nuovo tipo di dato…
• Numeri in virgola mobile: float
• Specifica di conversione: %f , %.2f,…
%f produce 6 cifre dopo la virgola, con %.xf se ne
specificano x
Un nuovo operatore…
Il compilatore C puo’ valutare solo espressioni con
operandi tutti dello stesso tipo
• Operatore di conversione: CAST
Operatore unario che opera una conversione temporanea
di tipo della variabile a cui si riferisce
• average = (float) total / counter;
La presenza di (float) crea una copia temporanea della
variabile total del tipo float (conversione esplicita)
Per efftuare la divisione il C crea una copia temporanea di
tipo float anche della variabile (conversione implicita o
promozione).
Formulazione algoritmo con processo
“top-down”
• Problema
Un college ha una lista di risultati di un esame relativa a 10
studenti (1 = promosso, 2 = bocciato).
Scrivere un programma che analizza i risultati. Se ci sono
piu’ di 8 studenti promossi, print “Aumentare le tasse“
• Notare che:
– Il programma deve esaminare 10 risultati di esame
• Uso loop controllato da contatore
– Possiamo usare due contatori:
• Uno per numero promossi , uno per numero bocciati
– Ogni risultato dell’esam1 oppure 2 e
• Se il numero non e’ 1, assumiamo che sia un 2
Formulazione algoritmo con processo
“top-down”
• Top level (Sommario)
Analizza i risultati degli esami e decide se aumentare le tasse
• Primo raffinamento
Inizializza le variabili
Prende in input i risultati dell’esame e conta i promossi e i bocciati
Scrive un sommario dei risultati dell’esame e decide se aumentare le
tasse
Formulazione algoritmo con processo
“top-down”
• Secondo raffinamento
Inizializza le variabili
Inizializza i promossi a zero
Inizializza i bocciati a zero
Inizializza il contatore studenti a uno
Formulazione algoritmo con processo
“top-down”
Prende in input i risultati dell’esame e conta i
promossi e i bocciati
Finche’ il contatore studenti e’ minore o uguale a dieci
Prendi in input il risultato successivo
Se il risultato e’ “promosso”
Aggiungi uno ai promossi
else
Aggiungi uno ai bocciati
Aggiungi uno al contatore studenti
Formulazione algoritmo con processo
“top-down”
Scrive un sommario dei risultati dell’esame e decide
se aumentare le tasse
Scrive numero dei promossi
Scrive numero dei bocciati
Se ci sono piu’ di otto studenti promossi
Scrive “Aumentare le tasse”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* Fig. 3.10: fig03_10.c
Analisi dei risultati dell’esame */
#include <stdio.h>
int main()
{
/* initializing variables in declarations */
int passes = 0, failures = 0, student = 1, result;
/* process 10 students; counter-controlled loop */
while ( student <= 10 ) {
printf( "Enter result ( 1=pass,2=fail ): " );
scanf( "%d", &result );
Sommario
1. Inizializza le
variabili
2. Riceve input e
conta i
promossi/bocciati
if ( result == 1 )
/* if/else nested in while */
passes = passes + 1;
else
failures = failures + 1;
student = student + 1;
}
printf( "Passed %d\n", passes );
printf( "Failed %d\n", failures );
if ( passes > 8 )
printf( “Aumentare le tasse\n" );
return 0;
}
/* finisce ok */
.
3. Print risultati
Enter Result
Enter Result
Enter Result
Enter Result
Enter Result
Enter Result
Enter Result
Enter Result
Enter Result
Enter Result
Passed 6
Failed 4
(1=pass,2=fail):
(1=pass,2=fail):
(1=pass,2=fail):
(1=pass,2=fail):
(1=pass,2=fail):
(1=pass,2=fail):
(1=pass,2=fail):
(1=pass,2=fail):
(1=pass,2=fail):
(1=pass,2=fail):
.
1
2
2
1
1
1
2
1
1
2
Sommario
Output
Operatori di Incremento e Decremento
• Operatore Incremento (++) invece di c+=1
• Operatore Decremento (--) invece di c-=1.
• Pre incremento/decremento
– Operatore prima della variabile (++c o --c)
– Prima cambia variabile, Poi calcola espressione
• Post incremento/decremento
– Operatore dopo la variabile (c++ o c--)
– Prima esegue espressione, Poi cambia variabile
• Se c = 5, allora
printf( "%d", ++c);
printf( "%d", c++);
Scrive 6
Scrive 5
NOTA: Alla fine, c ha il
valore 6 in entrambi i casi
Operatori di Incremento e Decremento
• Quando la variabile non e’ in una espressione…
– Preincrementare e postincrementare ha lo stesso effetto.
++c;
printf(“%d”,c);
e
hanno lo stesso effetto
c++;
printf(“%d”,c);
Regole di precedenza tra operatori:
Operatori
()
++, --, +, -,
(tipo)
*, /, %
+ ,<,<=,>,>=
== , !=
?:
=,+=,-=,
*=,/=, %=
Operazioni
Parentesi
Unari
Moltiplicativi
Ordine di precedenza
(da sinistra verso destra)
(da sinistra verso destra).
(da sinistra verso destra).
(da sinistra verso destra)
(da sinistra verso destra)
(da sinistra verso destra)
(da sinistra verso destra)
Di assegnamento (da sinistra verso destra)
Additivi
Relazionali
Di uguaglianza
Condizionale
Esercizi:
• Esercizio 1
Scrivere un programma che prenda in input 15 valori interi e
determini il minore e il maggiore tra questi. Il programma dovra’
utilizzare soltanto 3 variabili.
Suggerimento (ovvio): usare un ciclo
Esercizi:
• Esercizio 3.33
Scrivere un programma che prenda in input il lato di un quadrato
(valori consentiti tra 1 e 20) e quindi lo disegni utilizzando
asterischi.
• Esercizio 3.34
Come il precedente, pero’ il quadrato viene disegnato “vuoto”.
Esempio
Se il lato fosse 4, i programmi dovrebbero visualizzare:
****
****
Es.3.33
****
Es.3.34
*
*
****
*
*
****
****
Esercizi:
• Esercizio 3.44
Scrivere un programma che prenda in input tre valori di tipo
float e quindi determini e visualizzi se possono
rappresentare i lati di un triangolo.
Scarica

versione power point