Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
4 C 13 14 Istruzioni Ciclo
4 C 13 14 Istruzioni Ciclo
Introduzione al C
Ciclo indefinito:
Finché l’utente non sceglie di smettere,
stampa un * e chiedi all’utente se smettere.
• Numero di iterazioni noto a tempo di esecuzione.
Sintassi
while (condizione)!
istruzione!
• condizione è un’espressione
• istruzione (detta anche il corpo del ciclo) è una
singola istruzione (anche composta come un
blocco di istruzioni)
Istruzioni di Ciclo - Unità 4 2013/2014 Pagina 7
Semantica
1. La condizione è valutata.
2. Se la condizione è vera, allora l’istruzione è
eseguita e successivamente si ritorna sulla
valutazione della condizione, procedendo così
fino a quando la condizione risulta falsa.
3. Si esegue poi l’istruzione successiva al ciclo
while.
Il corpo del ciclo viene eseguito finché la condizione si
mantiene vera. Non appena questa diventa falsa, si esce
dal ciclo e si continua l’esecuzione con l’istruzione
successiva al while.
Istruzioni di Ciclo - Unità 4 2013/2014 Pagina 8
Esempio
≠0
while(condizione){! vero
!istruzione-1! condizione
!…!
!istruzione-n!
}! 0
istruzione-n+1! istruzione-1 falso
…
istruzione-n
istruzione-n+1
while (condizione) {
operazione Calcolo del risultato parziale
ad ogni iterazione del ciclo
passo successivo (nel corpo del ciclo)
}
Operazione di incremento/decremento
della variabile che controlla le
ripetizioni del ciclo (nel corpo del ciclo)
int i = 0;
while (i <= 10) { // corretto: (i < 10)
printf("*");
i++;
}
inizializzazione ;
while (condizione) {
istruzione
incremento ;
}
Nota: C’è un’eccezione che riguarda l’istruzione
continue, che viene tradotta in modo più complicato.
istruzione-1 0
…
falso
istruzione-n
incremento
istruzione-n+1
Esempio:
for(;;)
int i;
for (i = 33; i <= 62; i++) {
char c = (char)i;
printf("i = %d -> c = %c\n", i, c);
}
istruzione ;
while (condizione)!
!istruzione!
Quindi:
• viene prima eseguita istruzione
• poi viene valutata condizione, se è vera, si torna ad eseguire istruzione,
procedendo così fino a quando condizione diventa falsa
• a questo punto, si passa ad eseguire l’istruzione che segue il ciclo do
Istruzioni di Ciclo - Unità 4 2013/2014 Pagina 47
Esempio
int i = 0;
do {
printf("*");
i++;
} while (i < 100);
#include <stdio.h>
int main() {
int i;
int somma = 0;
do {
printf("inserisci intero (0 per terminare):\n");
scanf("%d", &i);
somma = somma + i;
} while (i != 0);
printf("\nTotale = %d\n", somma);
return 0;
}
Istruzioni di Ciclo - Unità 4 2013/2014 Pagina 50
Domanda
Cosa stampa il frammento di codice seguente?
int i;
do {
i = 0;
printf("*");
i++;
} while (i < 100);
Esempio
mcd(12, 8) = mcd(12 – 8, 8) = mcd(4, 8 - 4) = 4
http://it.wikipedia.org/wiki/Algoritmo_di_Euclide
int main ()
{
int x = 210;
int y = 63;
while (x != y) {
if (x > y)
x = x - y;
else // significa che y > x
y = y - x;
}
printf("mcd = %d\n", x);
return 0;
}
Istruzioni di Ciclo - Unità 4 2013/2014 Pagina 67
MCD: ammissibilità dei valori degli
argomenti
Se x = y = 0?
Il risultato è 0.
Se x = 0 e y > 0 (o viceversa)?
Il risultato dovrebbe essere y, ma l'algoritmo
entra in un ciclo infinito.
int main ()
{
int x = 210;
int y = 63;
if ((x > 0) && (y > 0)) {
while (x != y)
if (x > y)
x = x - y;
else // significa che y > x
y = y - x;
printf("mcd = %d\n", x);
}
else
printf("dati errati\n");
return 0;
}
Istruzioni di Ciclo - Unità 4 2013/2014 Pagina 69
MCD usando il metodo di Euclide con i
resti (1/2)
Cosa succede nel precedente algoritmo se x è molto
maggiore di y (o viceversa)?
Metodo di Euclide
double a;
int i;
for (i = 0; i < 10; i++) {
printf("Immetti un reale non negativo: ");
scanf("%lf", &a);
if (a >= 0)
printf("%f\n", sqrt(a));
else {
printf("Errore\n");
break;
}
}
Istruzioni di Ciclo - Unità 4 2013/2014 Pagina 81
Istruzione break per uscire da un
ciclo (2/2)
int i;
for (i = 0; i < n; i++) {
if (i % 2 == 0)
continue;
printf("%d\n", i);
}
Esempio:
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 5; i++) {
if(i == 3) {
continue;
}
printf("i = %d\n", i);
}
return 0;
}
etichetta : istruzione-ciclo;
Semantica
L'esecuzione del programma prosegue con la
istruzione specificata dall'etichetta
Return Value
On success, the function returns the number of items successfully read.
This count can match the expected number of readings or fewer, even zero, if
a matching failure happens.
In the case of an input failure before any data could be successfully
read, EOF is returned.
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
Istruzioni di Ciclo - Unità 4 2013/2014 Pagina 97
Esercizio su break e continue!
Si chiede di realizzare un programma in grado di leggere
da tastiera dei valori int ed elaborarli in accordo con le
seguenti condizioni:
Se il valore che viene letto è negativo, si vuole stampare un
messaggio di errore e terminare il programma.
Se il valore letto è maggiore di 100, si vuole ignorarlo e
continuare con il successivo valore in input.
Se il valore è 0, si vuole terminare il ciclo con un
messaggio di avvenuta terminazione corretta.
Altrimenti si vuole stampare il doppio dell’intero letto