Laboratorio di Informatica I Struttura della lezione Lezione 11: Istruzioni di controllo iterative: while, for e do .. while • Soluzioni agli esercizi – trovare i primi 10 numeri di Fibonacci – trovare i primi 10 numeri primi • Istruzioni di controllo iterative: Vittorio Scarano – il ciclo while – il ciclo for – il ciclo do .. while Laboratorio di Informatica I Corso di Laurea in Informatica • Esercizi Laboratorio di Informatica 1 Soluzioni agli esercizi Esercizio numero 1: Fibonacci /* fib.c : Trova i numeri di Fibonacci */ #define NUM_FIB 10 • I numeri di Fibonacci sono definiti così: F0 = 0, F1 = 1 Fi = Fi-1 + Fi-2 per i >1 Scrivere un programma C che dà in output i primi 10 numeri di Fibonacci. printf ("Fib(%d)=%d\n", i++, f0); printf ("Fib(%d)=%d\n", i, f1); while (i++ < NUM_FIB){ printf ("Fib(%d)=%d\n", i, f = f1 + f0 ); f0 = f1; f1 = f; } } 3 Vittorio Scarano Esercizio numero 2: i numeri primi /* Trova i primi 10 numeri primi */ #define NUM_PRIMI 10 #define FALSE 0 main() { int i, test=2, trovati=0, divisibile; while (trovati < NUM_PRIMI){ divisibile = FALSE; for (i=2; !divisibile && i < test; i++) divisibile = (test%i == 0); if (!divisibile) { trovati++; printf("%3d %c", test, ((trovati %5)==0)? '\n':'\t'); } test++; } } Laboratorio di Informatica 1 Vittorio Scarano Laboratorio di Informatica 1 • Costante simbolica • Inizializzazione – f0 sarà Fib(i-2) – f1 sarà Fib(i-1) main() { int i=0, f, f1=1, f0=0; • Scrivere un programma che dia in output i primi 10 numeri primi (cioè che sono divisibili solamente per se stessi e per 1). Laboratorio di Informatica 1 2 Vittorio Scarano Vittorio Scarano • Stampa di Fib(0) e Fib(1) • Ciclo while – condizione e incr. – stampa Fib(i) e assegnazione – aggiornamento di Fib(i-1) e Fib(i-2)4 Esercizio numero 2: i numeri primi • Costanti simboliche • Ciclo while • ad ogni ciclo controlla se l’intero test è primo • a fine ciclo test viene incrementato • esce se sono stati trovati NUM_PRIMI primi • trovati viene incrementato se test è primo 5 /* Trova i primi 10 numeri primi */ #define NUM_PRIMI 10 #define FALSE 0 main() { int i, test=2, trovati=0, divisibile; while (trovati < NUM_PRIMI){ divisibile = FALSE; for (i=2; !divisibile && i < test; i++) divisibile = (test % i == 0); if (!divisibile) { trovati++; printf("%3d %c", test, ((trovati %5)==0)? '\n':'\t'); } test++; } } Laboratorio di Informatica 1 Vittorio Scarano • divisibile booleana • Ciclo for • controlla i potenziali divisori i di test • condizione di uscita e shortcut • assegnazione del risultato di un test • se è primo – incrementa trovati – stampa a righe di 5 6 1 Laboratorio di Informatica I La istruzione while() Un esempio di uso del while • Permette di ripetere una istruzione (od un blocco di istruzioni) fino a quando la condizione diventa FALSE • Scrivere un programma C che prende in input un intero positivo e stampa la somma delle sue cifre (compreso gli addendi). Esempio: • Il controllo del test viene effettuato prima dell’inizio di ogni ciclo: – se l’utente digita 215 il programma stamperà • 5+1+2=8 – se all’inizio la condizione risulta FALSE allora non viene eseguita alcuna istruzione. – se l’utente digita 1765, il programma stamperà while (condizione) { istruzione; ..... } Laboratorio di Informatica 1 • 5 + 6 + 7 + 1 = 19 7 Vittorio Scarano Un esempio di uso del while Laboratorio di Informatica 1 Vittorio Scarano 8 Un altro esempio tipico di while /* digit.c Somma le cifre di un intero */ • Input di numero • Ciclo while main() { int numero, somma = 0; printf (“Inserisci un intero positivo”); scanf (“%d”, &numero); while (numero > 0) { somma += numero % 10; printf (“%d %c “, numero %10, (numero > 10)? ‘+’ : ’=‘); numero /= 10; } printf (“%d\n”, somma); } Laboratorio di Informatica 1 Cicli infiniti con uscita a “metà ciclo”: – estrae la cifra più a destra – la stampa con il ‘+’ oppure ‘=‘ a seconda se è l’ultima cifra oppure no – divide per 10 numero per la prossima cifra. • Output somma Vittorio Scarano 9 La istruzione for() Vittorio Scarano 10 Ciclo vuoto (infinito) for ( ; ; ) { ........ } for (inizializ; condizione; step) { istruzione; ..... } for (inizializ; condizione; step) { istruzione; ..... } è equivalente a: • Viene eseguito inizializ a inizio ciclo • La condizione viene valutata ad ogni inizio ciclo • Lo step viene eseguito ad ogni fine ciclo Vittorio Scarano Laboratorio di Informatica 1 Alcuni esempi del for • Permette di ripetere una istruzione (od un blocco di istruzioni) fino a quando la condizione diventa FALSE Laboratorio di Informatica 1 while (TRUE) { ...... if (condizione) break; ...... } inizializ; while (condizione) { .... step; } 11 Laboratorio di Informatica 1 Vittorio Scarano 12 2 Laboratorio di Informatica I Un esempio di uso del for Un esempio di uso del for /* tabella.c * Stampa la tavola pitagorica 10 x 10 */ #define INIZIO 1 #define FINE 10 main() { int riga, col; • Scrivere un programma C che stampa la tavola pitagorica 10 x 10 delle moltiplicazioni • Da notare: – dobbiamo stampare una tabella con due indici – per ogni valore di un indice riga, dobbiamo stampare tutte le colonne (per i valori delle colonne) – Si usano due for innestati Laboratorio di Informatica 1 Vittorio Scarano for (riga = INIZIO; riga <= FINE; riga++){ for (col = INIZIO; col <=FINE; col++) printf ("%3d ", riga*col); printf ("\n"); } } 13 La istruzione do..while() – il corpo viene eseguito almeno una volta do { istruzione; ..... } while (condizione); 15 Vittorio Scarano 14 Laboratorio di Informatica 1 Vittorio Scarano 16 Esercizio 1 • Concatena due espressioni: • Scrivere un programma C che prende in input un intero lunghezza e stampa a schermo: expr1 , expr2 * ** *** **** ***** ****** ... • Funzionamento: – entrambe le espressioni sono valutate – il risultato della intera espressione è il valore di expr2 • Uso tipico nelle assegnazioni di indici: dove l’ultima riga contiene lunghezza asterischi. k = (i =0, j = 21); Vittorio Scarano – a fine riga vai a capo do { printf (“Inserire un intero diverso da 0”); scanf (“%d”, &numero); if (! numero) printf (“Ho detto diverso da zero!\n”); } while (!numero); Operatore virgola Laboratorio di Informatica 1 • stampa tutte le colonne • Supponiamo di voler chiedere in input un intero diverso da zero e di voler controllare che l’utente abbia davvero inserito un numero diverso da zero: • Il controllo del test viene effettuato alla fine di ogni ciclo: Vittorio Scarano Laboratorio di Informatica 1 – varia la riga – ciclo for interno Un esempio di uso del do..while • Permette di ripetere una istruzione (od un blocco di istruzioni) fino a quando la condizione diventa FALSE Laboratorio di Informatica 1 • Costanti simboliche • Ciclo for esterno: 17 Laboratorio di Informatica 1 Vittorio Scarano 18 3 Laboratorio di Informatica I Esercizio 2 Esercizio 3 • Scrivere un programma C che prende in input un intero righe e stampa a schermo: * *** ***** ******* ********* .... • Scrivere un programma C che prende in input una sequenza di interi positivi (interrotti da uno zero) e dà in output i tre interi più grandi. • Il programma deve “rifiutare” i numeri negativi ed usare lo zero come sentinella per numero di righe pari a righe. Laboratorio di Informatica 1 Vittorio Scarano 19 Laboratorio di Informatica 1 Vittorio Scarano 20 4