Laboratorio di Informatica I 1

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