20 marzo 2002 Avvisi: • Giovedi 28 marzo la lezione e’ sospesa. • Nuovo indirizzo di e-mail: [email protected] Spedire messaggi e esercizi solo qui!!! Qualche minuto di “laboratorio”… Analizziamo le soluzioni proposte da voi agli esercizi della volta scorsa 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 (oltre il contatore per il ciclo). Vediamo le soluzioni che avete proposto…. • 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 * * **** * * **** **** Vediamo le soluzioni che avete proposto…. • 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. Vediamo le soluzioni che avete proposto…. Esercizio 3.44 a, b, c a,b,c >=0 lati di un triangolo b c a Comuqnue prendo un lato, questo deve essere minore della somma degli altri due. Il lato maggiore deve essere minore della somma degli altri due. c b a a < b+c b < a+c c < a+b a < b+c b-c < a c-b < a Sia a>b e a>c allora a < b+c • Adesso sappiamo scrivere (e comprendere) semplici programmi in C • Cominciamo a introdurre piu’ dettagli…. Elementi fondamentali della iterazione • Loop – Gruppo di istruzioni da eseguire ripetutamente finche’ certe condizioni rimangono vere • Iterazione controllata da contatore – Iterazione definita – si conosce il numero di volte che verra’ eseguita – Variabile di controllo usata per contare il numero di iterazioni • Iterazione controllata da sentinella – Iterazione indefinita – Usata quando non si conosce il numero di iterazioni – Il valore sentinella indica la “fine dei dati" Iterazione controllata da contatore • Richiede: – nome della variabile di controllo (contatore del loop). – valore iniziale di tale variabile. – Condizione che testa il valore finale di tale variabile (cioe’ se il loop deve continuare). – incremento (o decremento) del quale la variable di controllo e’ modificata ogni volta che si esegue il loop. Iterazione controllata da contatore • Esempio: int counter =1; //inizializzazione while (counter <= 10){ //condizione di ripetizione printf( "%d\n", counter ); ++counter; //incremento } –int counter = 1; il nome counter, dichiarato –come intero, riserva uno spazio in memoria ed e’ ha il valore iniziale 1 Struttura di iterazione for • Formato per il loop for for ( inizializzazione; condizione di iterazione; incremento) istruzione Esempio: for( int counter = 1; counter <= 10; counter++ ) printf( "%d\n", counter ); – Scrive i numeri interi da 1 a 10. Struttura di iterazione for • I loop for si possono riscrivere come loop while for ( inizializzazione; condizione di iterazione; incremento) istruzione E’ (quasi) sempre equivalente a: inizializzazione; while (condizione di iterazione){ istruzione incremento; } Struttura for : Note e Osservazioni • Inizializzazione e incremento – Possono essere una lista separata da virgole for (int i = 0, j = 0; j + i <= 10; j++, i++) printf( "%d\n", j + i ); • Espressioni aritmetiche – Inizializzazione, condizione di iterazione, e incremento possono contenere espressioni aritmentiche. Supp. che x=2 e y=10. Le seguenti istruzioni sono equivalenti: for ( j = x; j <= 4 * x * y; j += y / x ) for ( j = 2; j <= 80; j += 5 ) Struttura for : Note e Osservazioni • Se la condizione del loop e’ false all’inizio – Il corpo del for non viene eseguito – Il controllo presegue con l’istruzione dopo la struttura for • Nella condizione del loop usare preferibilmente il <= o il >= – Garantisce che il numero di iterazioni sia esattamente quello che pensiamo…. Struttura for : Note e Osservazioni • "Incremento" puo’ essere negativo (decremento) • Variabile di controllo – Spesso stampata o usata nel corpo for, a volte pero’ e’ usata solo per l’iterazione. • Flowchart del for simile al while 1 /* Fig. 4.5: fig04_05.c 2 Summation with for */ 3 #include <stdio.h> 4 5 int main() 6 { 7 int sum = 0, number; 8 9 for ( number = 2; number <= 100; number += 2 ) 10 sum += number; 11 12 printf( "Sum is %d\n", sum ); 13 14 return 0; 15 } Sum is 2550 Sommario Somma dei numeri pari da 2 a 100 Output La struttura di iterazione do/while • La struttura di iterazione do/while – Simile alla struttra while – La condizione di iterazione e’ testata dopo il corpo del loop da eseguire • Tutte le azioni sono eseguite almeno una volta • Formato: do { istruzione } while ( condizione ); – E’ buona pratica mettere le parentesi anche se non sono necessarie (per distinguerla dall’istruzione while) La struttura di iterazione do/while • Esempio ( Supponi counter = 1) do { printf( "%d ", counter ); } while (++counter <= 10); Scrive i numeri interi da 1 a 10 La struttura di iterazione do/while azioni true Condizione false 1 /* Fig. 4.9: fig04_09.c 2 Sommario Using the do/while repetition structure */ 3 #include <stdio.h> 4 5 int main() 6 { 7 Inizializza variabile int counter = 1; 8 9 do { 10 printf( "%d 11 ", counter ); Loop Print } while ( ++counter <= 10 ); 12 13 return 0; 14 } 1 2 3 4 5 6 7 8 9 10 Output La struttura di selezione multipla switch • switch – Utile quando una variabile (o un espressione) e’ testata per tutti i possibili valori che puo’ assumere e devono essere compiute azioni differenti • Formato – Serie di etichette case e un caso opzionale di default switch ( value ){ case '1': actions case '2': actions default: actions } – break; provoca l’uscita dalla struttura La struttura di selezione multipla switch caso a true azioni caso a break Azioni caso b break Azioni caso z break false caso b true false . . . caso z false Azioni default true 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 31 32 /* Fig. 4.7: fig04_07.c Counting letter grades */ #include <stdio.h> Sommario int main() { int grade; int aCount = 0, bCount = 0, cCount = 0, dCount = 0, fCount = 0; printf( printf( "Enter the letter grades.\n" ); "Enter the EOF character to end input.\n" 1. Inizializzazione ); while ( ( grade = getchar() ) != EOF ) { switch ( grade ) { /* switch nested in while */ case 'A': case 'a': ++aCount; break; /* grade was uppercase A */ /* or lowercase a */ case 'B': case 'b': ++bCount; break; /* grade was uppercase B */ /* or lowercase b */ case 'C': case 'c': ++cCount; break; /* grade was uppercase C */ /* or lowercase c */ case 'D': case 'd': ++dCount; break; /* grade was uppercase D */ /* or lowercase d */ 2. Input dei dati 2.1 switch loop per aggiornare count 33 34 case 'F': case 'f': 35 ++fCount; 36 break; /* or lowercase f */ 2.1 37 38 case '\n': case' ': 39 /* ignore these in input */ 3. Print results 41 default: /* catch all other characters */ 42 printf( "Incorrect letter grade entered." ); 43 printf( " Enter a new grade.\n" ); 44 break; 45 } } 47 48 printf( "\nTotals for each letter grade are:\n" ); 49 printf( "A: %d\n", aCount ); 50 printf( "B: %d\n", bCount ); 51 printf( "C: %d\n", cCount ); 52 printf( "D: %d\n", dCount ); 53 printf( "F: %d\n", fCount ); 54 55 56 } Use switch loop to update count break; 40 46 Sommario /* grade was uppercase F */ return 0; Enter the letter grades. Enter the EOF character to end input. A B C C A D F C E Incorrect letter grade entered. Enter a new grade. D A B Totals for each letter grade are: A: 3 B: 2 C: 3 D: 2 F: 1 Sommario Output