Strutture di controllo iterative

Linguaggio C
strutture di controllo:
strutture iterative
Università degli Studi di Brescia
Prof. Massimiliano Giacomin
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
1
Istruzioni iterative
•  Sono chiamate anche “cicli”
•  Permettono di eseguire più volte un’istruzione (eventualmente
un blocco) che costituisce il corpo del ciclo
•  Prevedono di specificare una condizione di permanenza del ciclo:
fintantoché la condizione è vera viene eseguita una nuova
iterazione del ciclo (ovvero, le istruzioni nel corpo del ciclo
vengono eseguite)
•  Tipologie di cicli:
- cicli a condizione iniziale: while e for
- cicli a condizione finale: do-while
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
2
Istruzione while
Sintassi
Semantica
while (<condiz>)
<istruzione>
<condiz>
…
•  <condiz> è costruita tipicamente
con operatori relazionali
p.es. (i<5)
•  <istruzione> può essere:
- istruzione non composta
- blocco
Prof. M. Giacomin
F
V
<istruzione>
…
- se <condiz> è vera viene eseguita
<istruzione>, poi si ritorna al
controllo di condiz
- quando <condiz> diventa falsa si
passa alle istruzioni successive
Elementi di Informatica e Programmazione – Università di Brescia
3
Esempio
Acquisizione dall’utente di un intero, continuando a ripetere l’input
se l’utente inserisce un numero strettamente negativo
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
4
Esempio
Acquisizione dall’utente di un intero, continuando a ripetere l’input
se l’utente inserisce un numero strettamente negativo
printf(“Inserire un numero maggiore o uguale a 0\n”);
scanf(“%d”,&n);
while(n<0)
scanf(“%d”,&n);
…
Nota
Poiché la condizione è valutata all’inizio del ciclo, il corpo
del ciclo potrebbe non essere mai eseguito (nell’esempio, se
l’utente inserisce subito un valore positivo)
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
5
Istruzione do-while: ciclo a condizione finale
Sintassi
Semantica
do
<istruzione>
while (<condiz>);
…
•  <condiz> è costruita tipicamente
con operatori relazionali
p.es. (i<5)
•  <istruzione> può essere:
- istruzione non composta
- blocco
Prof. M. Giacomin
<istruzione>
V
<condiz>
F
...
- Viene eseguita <istruzione>
- Se <condiz> è vera viene eseguita
<istruzione> e si prosegue;
quando <condiz> diventa falsa si
passa alle istruzioni successive
Elementi di Informatica e Programmazione – Università di Brescia
6
Uso di do-while (1)
•  A differenza di while (e for), la struttura do-while è un ciclo
a condizione finale: garantisce che venga eseguita sempre
almeno una iterazione del ciclo
•  Dal punto di vista teorico tutto ciò che si può fare con do-while
si può fare anche con while (o for); può essere però conveniente
usare do-while nei casi in cui il corpo del ciclo debba in ogni caso
essere eseguito almeno una volta
•  Vediamo un esempio…
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
7
Uso di do-while (2)
•  Esempio già visto: acquisire un intero da tastiera, ripetendo
l’operazione di input se l’utente inserisce un numero negativo
Versione con while
printf(“Inserire un numero maggiore o uguale a 0\n”);
scanf(“%d”,&n);
while(n<0)
scanf(“%d”,&n);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
8
Uso di do-while (2)
•  Esempio già visto: acquisire un intero da tastiera, ripetendo
l’operazione di input se l’utente inserisce un numero negativo
Versione con while
printf(“Inserire un numero maggiore o uguale a 0\n”);
scanf(“%d”,&n);
while(n<0)
scanf(“%d”,&n);
Versione con do-while
printf(“Inserire un numero maggiore o uguale a 0\n”);
do
scanf(“%d”,&n);
while(n<0);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
9
Esempio: while o do-while, questo è il dilemma
Scrivere un programma che continua ad acquisire un intero fino
a quando l’utente non inserisce un numero strettamente maggiore
di 100, dopodiché lo stampa a video.
Esempio:
L’utente inserisce
-100
34
49
200
Prof. M. Giacomin
A questo punto il calcolatore
stampa 200.
Elementi di Informatica e Programmazione – Università di Brescia
10
Un primo modo…
Ovviamente, mi serve un ciclo che continui ad acquisire
numeri fino a quando il numero inserito non sia “corretto”
(strettamente maggiore di 100).
Dato che devo acquisire almeno un numero, posso pensare di
usare un ciclo do-while (a condizione finale)…
do{
printf(“Inserisci un numero strettamente maggiore di 100\n”);
scanf(“%d”, &n);
}
while (n<=100);
printf(“Numero inserito = %d\n”, n);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
11
Il programma completo
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char*argv[])
{
int n;
do{
printf("Inserisci un numero strettamente maggiore di 100\n");
scanf("%d", &n); }
while (n<=100);
printf("Numero inserito = %d\n", n);
return 0;
}
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
12
Un’altra versione (cambiamo leggermente la richiesta)
Supponiamo che:
•  La prima volta che acquisisco un numero voglio stampare il
messaggio "Inserisci un numero strettamente maggiore di 100"
•  Ogni volta che l’utente sbaglia, voglio inserire un messaggio
diverso, per evidenziare che ha sbagliato
acquisisci numero n (con messaggio iniziale)
while(n scorretto){
stampa messaggio di errore;
acquisisci n;
}
stampa n;
//corretto!
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
13
Il programma completo
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char*argv[]){
int n;
printf("Inserisci un numero strettamente maggiore di 100\n");
scanf("%d", &n);
while (n<=100){
printf(“Forse non mi sono spiegato bene: ");
printf(“il numero deve essere strettamente maggiore di 100\n”);
printf(“Riprova per favore\n”);
scanf("%d", &n);
}
printf("Numero inserito = %d\n", n);
return 0;
}
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
14
CASI PARADIGMATICI
•  Alcuni esempi fondamentali che è necessario comprendere
•  Nella pratica questi schemi vanno “combinati” in vario modo,
a seconda del problema da affrontare: non sono “ricette pronte”
da consultare e applicare pedissequamente, quindi non bisogna
“impararli” ma “assimilarli” come un gesto tecnico sportivo
(come? P.es. ricostruendoli da soli)
•  Saranno proposti esercizi individuali che costituiscono
“varianti” degli esempi successivi
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
15
P1: Iterazione controllata da un contatore
•  Quando il numero delle iterazioni è noto a priori (“iterazione
definita”)
•  Una variabile, detta contatore, tiene traccia del numero
di iterazioni effettuate/da effettuare
•  Idea di base:
o  Il contatore viene inizializzato prima del ciclo
o  Ad ogni iterazione il contatore viene aggiornato
o  Condizione di permanenza: si rimane nel ciclo se il contatore
indica che ci sono ancora iterazioni da effettuare
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
16
ESEMPIO
Stampa 10 asterischi utilizzando un ciclo
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
17
ESEMPIO
Stampa 10 asterischi utilizzando un ciclo
n=1;
while(n<=10){
printf(“*”);
n=n+1;
}
Problemi (collegati tra loro):
- come inizializzare la variabile?
- come scrivere correttamente la condizione di permanenza?
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
18
CONSIGLIO
•  Abituatevi subito a
“dare un significato preciso alle variabili”:
stabilire cosa rappresentano esattamente ad ogni
iterazione (quando viene controllata la condizione)
•  Anche se adesso sembra inutile,
è meglio imparare su esempi facili
•  Se imparate adesso, gli esercizi d’esame
non saranno tanto più difficili di questi;
altrimenti, sembreranno più complicati di
quello che in realtà sono
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
19
Esempio: stampare i numeri da 1 a 5
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
20
Esempio: stampare i numeri da 1 a 5
int num=1;
while(num<=5){
printf(“Numero %d\n”, num);
num=num+1;
}
Prof. M. Giacomin
// prossimo numero da stampare
// esci quando num > 5
Elementi di Informatica e Programmazione – Università di Brescia
21
Esempio: stampare i numeri da 1 a 5
int num=1;
while(num<=5){
printf(“Numero %d\n”, num);
num=num+1;
}
// prossimo numero da stampare
// esci quando num > 5 (!!!)
Variante Esempio: stampare i numeri da 1 a 5
int num=0;
while(num<5){
num=num+1;
printf(“Numero %d\n”, num);
}
Prof. M. Giacomin
// ultimo numero già stampato
// esci quando num = 5 (!!!)
Elementi di Informatica e Programmazione – Università di Brescia
22
Esempio
Vogliamo stampare i numeri da 10 a 1
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
23
Esempio
Vogliamo stampare i numeri da 10 a 1
int n;
n=10;
// prossimo numero da stampare
while(n>=1){
printf(“%d\n”,n);
n=n-1;
}
…
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
24
Esempio
Scrivere un programma che acquisisce un intero positivo n
e stampa tutti i numeri pari da 2 a n.
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
25
Esempio (continua)
Scrivere un programma che acquisisce un intero positivo n
e stampa tutti i numeri pari da 2 a n.
Soluzione
Uso un ciclo while con i che va da 2 a “n” (max pari<=n)
e che scandisce i numeri pari: deve essere incrementata di 2
[es: se n = 11 deve stampare 2, 4, 6, 8, 10]
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
26
Esempio (continua)
Scrivere un programma che acquisisce un intero positivo n
e stampa tutti i numeri pari da 2 a n.
Soluzione
Uso un ciclo while con i che va da 2 a “n” (max pari<=n)
e che scandisce i numeri pari: deve essere incrementata di 2
[es: se n = 11 deve stampare 2, 4, 6, 8, 10]
i=2;
// numero da stampare
while(i<=n){
printf(“%d\n”,i);
i=i+2;
}
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
27
Il programma completo
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char*argv[]){
int n, i;
printf("Inserisci un numero positivo\n");
scanf("%d", &n);
while(i<=n){
printf(“%d\n”,i);
i=i+2;
}
return 0;
}
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
28
P2: Iterazione controllata da sentinella
•  Per elaborare una sequenza di elementi (es: valori in input)
di lunghezza non nota a priori
•  Una proprietà particolare degli elementi (sentinella) indica
la fine della sequenza (es: il valore 0 indica fine valori in input)
•  Idea di base:
o  ad ogni iterazione si acquisisce e gestisce un nuovo elemento
o  la condizione di permanenza controlla l’elemento corrente,
uscendo dal ciclo quando la sentinella lo segnala
•  NB: in questo caso il numero di iterazioni è indefinito
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
29
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dall’utente fino a quando l’utente inserisce il numero 0.
Per ogni numero acquisito (0 escluso), il programma stampa a video
il numero successivo.
ESEMPIO DI ESECUZIONE:
2
Successivo = 3
5
Successivo = 6
0
Premi un tasto per continuare
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
30
Variante 1
int num;
//numero acquisito da processare
printf(“Inserisci la serie di numeri, 0 per terminare\n”);
scanf(“%d”, &num);
while(num!=0){
// esce quando num = 0
(!!!)
printf(“Successivo = %d\n”, num+1);
scanf(“%d”, &num);
}
Variante 2
int num;
//numero acquisito già processato
printf(“Inserisci la serie di numeri, 0 per terminare\n”);
do{
scanf(“%d”, &num);
if(num!=0)
printf(“Successivo = %d\n”, num+1);
}
while(num!=0);
Prof. M. Giacomin
// esce quando num = 0
Elementi di Informatica e Programmazione – Università di Brescia
(!!!)
31
P3: Calcolo di aggregati
•  Per calcolare una proprietà da una sequenza di elementi tale che:
...
aggregatoprec
NUOVO
ELEMENTO
✪
aggregato
•  Esempi: somma/prodotto/minimo/massimo di sequenze di valori
•  Idea di base:
o  Una variabile memorizza l’“aggregato”
o  Si scandiscono gli elementi: per ogni nuovo elemento
la variabile viene aggiornata
o  La variabile deve essere inizializzata a un valore opportuno
(tipicamente: elemento neutro di una operazione
o sulla base del primo elemento delle sequenza)
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
32
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dall’utente fino a quando l’utente inserisce il numero 0 e stampa
la somma degli elementi inseriti (se l’utente inserisce subito 0,
il programma stampa 0).
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
33
int num, somma;
somma=0;
//all’inizio del ciclo, indica somma numeri precedenti
printf(“Inserire la sequenza di numeri, 0 per terminare\n”);
do{
scanf(“%d”, &num);
somma=somma+num;
}
while(num!=0);
printf(“La somma dei numeri inseriti è %d\n", somma);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
34
Esempio
Scrivere un programma che continua ad acquisire un intero fino
a quando l’utente inserisce il numero 0, quindi stampa il minimo
tra i valori inseriti (zero escluso).
Ad esempio, se l’utente inserisce 10 3 4 7 2 9 9 2 0
il programma stampa 2.
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
35
Primo passo: capire il testo e soprattutto il problema (se “non si sa
da che parte prendere”, provare a risolvere qualche
istanza a mano)
10 3 4 7 2 9 9 2 0
Se avessimo una lista lunga, non potremmo usare il
“colpo d’occhio”: partiamo dal primo elemento e
proseguiamo a destra individuando il minimo:
10 3 3 3 2 2 2 2 0
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
36
Secondo passo: individuare un metodo risolutivo
Uso una variabile min che tiene traccia del minimo
corrente e scandisco gli elementi della sequenza
aggiornando min ad ogni elemento, fino alla fine
10 3 4 7 2 9 9 2 0
min = 10
3: 3<min, quindi min diventa 3
4: 4>min, quindi min rimane uguale (3)
7: 7>min, quindi min rimane uguale (3)
2: 2<min, quindi min diventa 2
….
Si userà un ciclo per scandire la sequenza!
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
37
Terzo passo: sviluppare un algoritmo
Prima “bozza”:
Acquisisci primo numero e assegnalo a min
Acquisisci nuovo numero
while(numero!=0){
aggiorna eventualmente min
acquisisci nuovo numero
}
stampa min
Cosa succede se l’utente inserisce direttamente 0?
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
38
Seconda “bozza”:
Acquisisci primo numero e assegnalo a min
if(min==0) stampa messaggio di errore
else{
Acquisisci nuovo numero
while(numero!=0){
aggiorna eventualmente min
acquisisci nuovo numero
}
stampa min
}
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
39
NB: Conviene usare un do-while? All’inizio devo comunque
acquisire un numero e assegnarlo a min…
Acquisisci primo numero e assegnalo a min
if(min==0) stampa messaggio di errore
else{
do{
acquisisci nuovo numero;
if(numero!=0)
aggiorna eventualmente min;
} while(numero!=0);
stampa min}
Ad ogni iterazione
controllo
della condizione…
Entrambe le soluzioni accettabili, nel seguito while
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
40
int num, min;
printf(“Inserire un numero\n”);
scanf(“%d”,&num);
min=num;
if(min==0)
printf(“Nessun numero valido inserito\n”);
else{
printf(“Inserire un numero\n”);
scanf(“%d”,&num);
while(num!=0){
if(num<min)
min=num;
printf(“Inserire un numero\n”);
scanf(“%d”,&num);
}
printf(“Il minimo è %d\n", min);
}
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
41
P4: Verifica esistenziale
•  Per verificare se in una sequenza di elementi (es: valori in input)
esiste almeno un elemento che soddisfa una certa proprietà
•  Idea di base:
o  Una variabile “trovato” viene inizializzata al valore 0
che indica “NO” (elemento non ancora trovato)
o  ad ogni iterazione:
- si considera un nuovo elemento
- se l’elemento soddisfa la proprietà si pone “trovato” a 1
o  All’uscita dal ciclo, “trovato” risulta 0 se non esiste alcun
elemento che soddisfa la proprietà , 1 altrimenti
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
42
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dall’utente fino a quando l’utente inserisce il numero 0 e verifica
se esiste almeno un numero inserito (0 escluso) pari, stampando
un opportuno messaggio.
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
43
int trovato, num;
trovato=0;
//elemento pari non trovato all’inizio
printf(“Inserire la sequenza di numeri, 0 per terminare\n”);
scanf(“%d”, &num);
while(num!=0){
//num nuovo numero da processare
if(num%2==0)
trovato=1;
scanf(“%d”, &num);
}
if(trovato==1)
printf(“Esiste un numero pari\n”);
else printf(“Non esiste alcun numero pari\n”);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
44
P5: Verifica universale
•  Per verificare se in una sequenza di elementi (es: valori in input)
tutti gli elementi soddisfano una certa proprietà
•  Idea di base:
o  Una variabile “soddisfano” viene inizializzata al valore 1
che indica “SI” (tutti gli elementi finora processati soddisfano)
o  ad ogni iterazione:
- si considera un nuovo elemento
- se elemento NON soddisfa la proprietà si pone “soddisfano” a 0
o  All’uscita dal ciclo, “soddisfano” risulta 0 se non è vero che tutti
gli elementi soddisfano la proprietà (= esiste un elemento che
non soddisfa la proprietà!), 1 altrimenti
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
45
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dall’utente fino a quando l’utente inserisce il numero 0 e verifica
se tutti i numeri inseriti (0 escluso) sono pari, stampando
un opportuno messaggio.
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
46
int tuttipari, num;
tuttipari=1;
//all’inizio tutti i numeri pari
printf(“Inserire la sequenza di numeri, 0 per terminare\n”);
scanf(“%d”, &num);
while(num!=0){
//num nuovo numero da processare
if(num%2!=0)
tuttipari=0;
scanf(“%d”, &num);
}
if(tuttipari==1)
printf(“Tutti i numeri inseriti sono pari\n”);
else printf(“Esiste un numero dispari nella sequenza\n”);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
47
P6: Cicli con filtro
•  Quando in una sequenza di elementi (es: valori in input) si vogliono
elaborare solo quelli che soddisfano una certa proprietà
•  Idea di base: si usa un if all’interno del ciclo per testare la proprietà
sull’elemento corrente, considerandolo solo se la proprietà è vera
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
48
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dall’utente fino a quando l’utente inserisce il numero 0 e stampa
la somma dei numeri dispari (0 se non ce ne sono).
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
49
int num, somma;
somma=0;
printf(“Inserire la sequenza di numeri, 0 per terminare\n”);
scanf(“%d”, &num);
while(num!=0){
//num nuovo numero da processare
if(num%2!=0)
somma=somma+num;
scanf(“%d”, &num);
}
printf(“Somma numeri dispari = %d\n”, somma);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
50
L’istruzione iterativa for: un’alternativa al while
Esempio: Stampa dei numeri da 1 a 10
con while
con for
n=1;
for(n=1; n<=10; n=n+1)
while(n<=10){
printf(“%d\n”,n);
printf(“%d\n”,n);
n=n+1;
}
•  E’ una sorta di while che incorpora:
- l’assegnamento di una variabile contatore con un valore iniziale
- la condizione di permanenza
- l’aggiornamento della variabile contatore
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
51
The way back
n=1;
while(n<=10){
for(n=1; n<=10; n=n+1)
printf(“%d\n”,n);
printf(“%d\n”,n);
n=n+1;
}
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
52
ASTRAENDO
Sintassi
Semantica
for(<ass>;<condiz>;<agg>)
<istruz>
<ass>
…
•  <ass>: assegnamento di una variabile
(contatore) con un “valore iniziale”
(ad esempio i=1)
•  <condiz> è la condizione di permanenza,
tipicamente confronta il contatore con un
valore finale (ad esempio i<=5)
<condiz>
F
V
<istruz>
•  <agg> aggiornamento del contatore (es. i=i+1)
<agg>
…
•  <istruz> può essere anche un blocco istruzioni
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
53
ESEMPIO A
Stampa numeri da 10 a 1
int n;
for(n=10; n>=1; n=n-1)
printf(“%d\n”,n);
ESEMPIO B
Acquisizione di n e stampa numeri pari da 2 a n
int i, n;
scanf(“%d”, &n);
for(i=2; i<=n; i=i+2)
printf(“%d\n”,i);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
54
Uso di for vs. while
•  In generale, il for offre una sintassi che risulta più compatta
rispetto al while
•  Sicuramente, conviene usare il for ogni volta che viene usato una
variabile “contatore” per scandire il numero di iterazioni del ciclo,
tipicamente quando si conosce quante volte le istruzioni del corpo
del ciclo devono essere ripetute
•  Esempi:
- acquisire 100 numeri da tastiera
- acquisire n numeri da tastiera
- stampare gli elementi di un vettore (vedi lezioni successive)
- ecc. ecc.
•  Non è comunque raro l’uso del for per qualsiasi tipologia di ciclo,
al posto del while (dipende anche dal gusto personale)
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
55
ISTRUZIONI break e continue
•  Istruzione break: causa l’uscita immediata da un ciclo while,
do…while, for
•  Istruzione continue: causa la terminazione anticipata della
corrente iterazione di un ciclo while, do…while, for
o  nel caso di ciclo for, viene compiuto aggiornamento <agg>
for(n=1;n<=10;n=n+1){
for(n=1;n<=10;n=n+1){
if(n==5) break;
if(n==5) continue;
printf(“%d\n”,n);
printf(“%d\n”,n);
}
}
Stampa 1, 2, 3, 4
Prof. M. Giacomin
Stampa 1, 2, 3, 4, 6, 7, 8, 9, 10
Elementi di Informatica e Programmazione – Università di Brescia
56
Esempio
Scrivere un programma che acquisisce 10 numeri interi dall’utente
e, per ogni numero acquisito, il programma stampa a video
il numero successivo. Inoltre il programma interrompe l’acquisizione
(senza la stampa del successivo) se l’utente inserisce il numero 0.
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
57
L’IDEA: gestiamo il “caso tipico” normalmente, il “caso particolare”
(uscita anticipata dall’acquisizione dei 10 numeri)
con l’istruzione break
int i, num;
printf(“Inserisci 10 numeri interi, 0 per terminare anticipatamente\n”);
for(i=1; i<=10; i=i+1){
// i: indice numero da acquisire
scanf(“%d”, &num);
if(num==0)
break;
printf(“Successivo = %d\n”, num+1);
}
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
58
ERRORI TIPICI
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
59
Errori tipici nell’uso di while (1)
•  Inserire una condizione di terminazione, non di permanenza
Es: per stampare i numeri da 1 a 5
int num=0;
while(num==5){
//non è “finché” ma “mentre”…!
num=num+1;
printf(“Numero %d\n”, num);
}
•  Dimenticare di modificare le variabili che determinano la condizione
int num=0;
while(num<5){
printf(“Numero %d\n”, num);
}
Prof. M. Giacomin
Ciclo infinito: manca n=n+1
Elementi di Informatica e Programmazione – Università di Brescia
60
Errori tipici nell’uso di while (2)
•  Mettere il punto e virgola dopo while(cond): il corpo del ciclo
diventa l’istruzione vuota!
int num=0;
while(num<5);
NB: In
{num=num+1;
printf(“Numero %d\n”, num);
}
questo caso il ciclo è infinito
•  Dimenticare le parentesi graffe nel caso di blocco con più istruzioni
int num=0;
while(num<5)
num=num+1;
printf(“Numero %d\n”, num);
Prof. M. Giacomin
// Ripete solo questa!
// e stampa (solo) 5
Elementi di Informatica e Programmazione – Università di Brescia
61
Errori tipici nell’uso di do-while
(1)
•  Inserire una condizione di terminazione al posto di quella
di permanenza
•  Mettere il punto e virgola dopo do
do;
scanf(“%d”, &n);
while(n<0);
Il compilatore segnala un errore (ci sono due
istruzioni dopo do, non trova while)
•  Dimenticarsi il punto e virgola dopo while
do
Il compilatore segnala un errore
scanf(“%d”, &n);
(dopo scanf c’è un costrutto while!)
while(n<0)
printf(“Numero inserito=%d”,n);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
62
Errori tipici nell’uso di do-while
(2)
•  Dimenticare le parentesi graffe nel caso di blocco con più istruzioni
do
Il compilatore segnala un errore
scanf(“%d”, &n);
(al posto di i=i+1; dovrebbe esserci while(…) )
i=i+1;
while(n<0);
printf(“Numero inserito=%d”,n);
•  Inserire un punto e virgola dopo un blocco di istruzioni
do{
Il compilatore segnala un errore
scanf(“%d”, &n);
(dopo il blocco si aspetta while(…) )
i=i+1;
};
while(n<0);
printf(“Numero inserito=%d”,n);
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
63
Errori tipici nell’uso di for
•  Inserire una condizione di terminazione al posto di quella
di permanenza
•  Mettere il punto e virgola dopo for(…;…;…): in questo caso il
corpo del ciclo diventa l’istruzione vuota
Es.
for(i=1; i<=10;i=i+1);
printf(“numero %d\n”, i);
In questo caso il ciclo viene ripetuto 10 volte, ma senza eseguire
alcuna istruzione! Al termine del ciclo viene eseguita l’istruzione
di stampa con i=11 !
Prof. M. Giacomin
Elementi di Informatica e Programmazione – Università di Brescia
64