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.