14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa...

22
14 marzo 2002 Avvisi:

Transcript of 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa...

Page 1: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

14 marzo 2002

Avvisi:

Page 2: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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)

Page 3: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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 variabiliInput, somma e conta i risultati dell’esame. Calcola e stampa la media della classe

Page 4: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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.

Page 5: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

Raffinamento dell’algoritmo• Inizializza le variabili

Inizializza totale a zeroInizializza contatore a zero

• Input, somma e conta i risultati dell’esameScrivi 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 classeSe il contatore non e’ uguale a zero

Definisci la media uguale al totale diviso per il contatore

Scrivi la mediaelse

Scrivi “No voto in input”

Page 6: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

.

Sommario

1. Inizializza le variabili

2. Riceve input da utente

2.1 Esegue Loop

1 /* Fig. 3.8: fig03_08.c2 Calcolo della media di una classe con 3 ripetizione controllata da sentinella */4 #include <stdio.h>56 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 }

Page 7: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

.

Sommario

3. Calcola la media

3.1 Scrive i risultati

Output

2526 /* fase finale */27 if ( counter != 0 ) {28 average = ( float ) total / counter; /*new*/29 printf( "Class average is %.2f", average );30 }31 else32 printf( "No grades were entered\n" );3334 return 0; /* programma finisce ok */35 }

Enter grade, -1 to end: 75Enter grade, -1 to end: 94Enter grade, -1 to end: 97Enter grade, -1 to end: 88Enter grade, -1 to end: 70Enter grade, -1 to end: 64Enter grade, -1 to end: 83Enter grade, -1 to end: 89Enter grade, -1 to end: -1Class average is 82.50

Page 8: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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

Page 9: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

Un nuovo operatore…

• 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).

Il compilatore C puo’ valutare solo espressioni con

operandi tutti dello stesso tipo

Page 10: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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

Page 11: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

Formulazione algoritmo con processo “top-down”

• Top level (Sommario)Analizza i risultati degli esami e decide se aumentare le tasse

• Primo raffinamentoInizializza 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

Page 12: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

Formulazione algoritmo con processo “top-down”

• Secondo raffinamento

Inizializza le variabiliInizializza i promossi a zeroInizializza i bocciati a zeroInizializza il contatore studenti a uno

Page 13: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

Formulazione algoritmo con processo “top-down”

Prende in input i risultati dell’esame e conta i promossi e i bocciatiFinche’ 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

Page 14: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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 bocciatiSe ci sono piu’ di otto studenti promossi

Scrive “Aumentare le tasse”

Page 15: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

.

Sommario

1. Inizializza le variabili

2. Riceve input e conta i promossi/bocciati

3. Print risultati

1 /* Fig. 3.10: fig03_10.c2 Analisi dei risultati dell’esame */3 #include <stdio.h>45 int main()6 {7 /* initializing variables in declarations */8 int passes = 0, failures = 0, student = 1, result;910 /* process 10 students; counter-controlled loop */11 while ( student <= 10 ) {12 printf( "Enter result ( 1=pass,2=fail ): " );13 scanf( "%d", &result );1415 if ( result == 1 ) /* if/else nested in while */16 passes = passes + 1;17 else18 failures = failures + 1;1920 student = student + 1;21 }2223 printf( "Passed %d\n", passes );24 printf( "Failed %d\n", failures );2526 if ( passes > 8 )27 printf( “Aumentare le tasse\n" );2829 return 0; /* finisce ok */30 }

Page 16: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

.

Sommario

Output

Enter Result (1=pass,2=fail): 1Enter Result (1=pass,2=fail): 2Enter Result (1=pass,2=fail): 2Enter Result (1=pass,2=fail): 1Enter Result (1=pass,2=fail): 1Enter Result (1=pass,2=fail): 1Enter Result (1=pass,2=fail): 2Enter Result (1=pass,2=fail): 1Enter Result (1=pass,2=fail): 1Enter Result (1=pass,2=fail): 2Passed 6Failed 4

Page 17: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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); Scrive 6

printf( "%d", c++); Scrive 5

NOTA: Alla fine, c ha il valore 6 in entrambi i casi

Page 18: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

Operatori di Incremento e Decremento

• Quando la variabile non e’ in una espressione…– Preincrementare e postincrementare ha lo stesso effetto.

hanno lo stesso effetto

++c; printf(“%d”,c);

c++; printf(“%d”,c);

e

Page 19: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

Regole di precedenza tra operatori:

Operatori Operazioni Ordine di precedenza

() Parentesi (da sinistra verso destra)

++, --, +, -, (tipo)

Unari (da sinistra verso destra).

*, /, % Moltiplicativi (da sinistra verso destra).

+ , - Additivi (da sinistra verso destra) <,<=,>,>= Relazionali (da sinistra verso destra) == , != Di uguaglianza (da sinistra verso destra) ?: Condizionale (da sinistra verso destra) =,+=,-=, *=,/=, %= Di assegnamento (da sinistra verso destra)

Page 20: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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

Page 21: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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 * * * * * * * * * * * * * * * *

Page 22: 14 marzo 2002 Avvisi:. Ripetizione controllata da valore sentinella Variazione al problema: Sviluppa il programma per il calcolo della media per un numero.

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.