In questa nona lezione del nostro corso completo di programmazione in C affronteremo un argomento piuttosto simpatico, parleremo delle istruzioni iterative.
Queste istruzioni permettono di ripetere una porzione di codice fino a quando non risulta vera una determinata condizione e, sebbene non indispensabili, sono alla base della programmazione.
Istruzione while
L’istruzione while è la più semplice tra le istruzioni iterative, il suo compito è quello di ripetere la porzione tra le parentesi graffe mentre una data condizione è vera, quando la condizione cesserà di essere vera il programma terminerà il ciclo e riprenderà la sua normale esecuzione.
La sintassi dell’istruzione while è la seguente:
while (espressione) {
...istruzioni...
...istruzioni...
}
Come nel caso del costrutto if come espressione possiamo utilizzare qualsiasi cosa che possa essere vera o falsa. Ad esempio potremmo scrivere:
while (3 < 5 ) {
printf("tre è minore di cinque!!");
}
Ma cos'ha di strano il codice che ho scritto? Che la sua esecuzione non terminerà mai! l'espressione "(3 < 5)" verrà valutata ad ogni iterazione e ad ogni iterazione risulterà invariabilmente vera, quindi il codice entrerà in un loop dal quale non riuscirà mai ad uscire. Bisogna quindi prestare attenzione che all'interno delle istruzioni del ciclo while ci siano sempre delle istruzioni in grado di rendere falsa l'espressione, solo così si potrà essere sicuri di uscire dal ciclo, come in questo esempio.
int a = 1;
while (a < 10) {
printf("a vale: %d\n", a);
a = a + 1;
}
l'output di questo programma sarà:
a vale: 1
a vale: 2
a vale: 3
a vale: 4
a vale: 5
a vale: 6
a vale: 7
a vale: 8
a vale: 9
L'output si ferma a nove, perché alla nona iterazione il valore di a, all'istruzione "a = a + 1" diventa 10, ma all'iterazione successiva l'espressione "a < 10" non è più vera quindi il programma esce dal while e riprende la sua normale esecuzione.
Notare che nel while se l'espressione è già falsa, le istruzioni contenute all'interno del blocco non vengono eseguite neanche una volta.
In un diagramma di flusso il while verrebbe così rappresentato:

Istruzione Do...while
Esiste una istruzione simile al while, ma che può risultare più utile in certi casi, si chiama do...while ed ha la seguente sintassi:
do {
...istruzioni...
...istruzioni...
} while (espressione);
Io oserei definirei speculare il suo comportamento rispetto all'istruzione while, infatti il do...while valuta l'espressione dopo aver eseguito le istruzioni contenute nel blocco e, se l'espressione risulta vera, torna all'inizio del ciclo e lo riesegue, se invece è falsa termina il ciclo.
Poiché quindi le istruzioni del blocco in questo caso vengono eseguite almeno una volta, anche se l'espressione è falsa, si usa il do...while quando si ha necessità di questo comportamento.
Ecco la rappresentazione in un diagramma di flusso del do...while:

Istruzione for
Ho lasciato per ultima l'istruzione iterativa più versatile e più complessa del linguaggio C. Qualcuno storcerà il naso dicendo "il for è una istruzione complessa??" beh, ma magari non proprio complessa, ma a volerne sfruttare tutte le capacità è abbastana tricky.
La sintassi base del for è la seguente:
for (istruzioni di inizializzazione;
condizione di ripetizione del ciclo;
istruzioni di aggiornamento) {
...istruzione...;
...istruzione...;
...
...istruzione...;
}
Prima di entrare dentro il ciclo FOR vengono eseguite le istruzioni di inizializzazione, poi inizia il ciclo e per ogni iterazione viene valutata (se presente) la condizione di ripetizione del ciclo, se tale espressione risulta vera allora vengono eseguite tutte le operazioni contenute all'interno del blocco, e al termine vengono eseguite le istruzioni di aggiornamento e ricomincia il ciclo.
Facciamo un esempio classico:
int i;
for (i = 0; i < 10; i = i + 1) {
printf("Valore di i: %d",i);
}
In questo esempio subito dopo aver dichiarato la variabile i il programma esegue l'istruzione di inizializzazione (i = 0) che ha l'effetto di impostare a zero il valore della variabile i. Poi viene valutata la condizione di ripetizione (i < 10) che risulta essere vera, quindi viene eseguita l'istruzione all'interno del blocco: printf("Valore di i: %d",i); Terminate le istruzioni all'interno del blocco viene eseguita l'istruzione di aggiornamento (i = i + 1); Quello che rende particolarmente versatile il costrutto for è che tutti e tre i parametri sono opzionali e possono essere costituiti da più di una singola istruzione. Questo può portare ad avere cicli for molto complessi come questi:
for ( ; ; ) {
...istruzioni...
}
|
Ciclo infinito, non ci sono istruzioni di aggiornemento,equivale ad un "while (true) { }" |
for (printf("Start ciclo for"), i = 0;
i < 100, printf("Valore di i %d\n",i); i = i + 1); {
...nessuna istruzione...
}
|
l'output è il seguente
ma è stato ottenuto utilizzando esclusivamente le istruzioni di inizializzazione a aggiornamento. |
for (i = 0, j = 1;
j < 10000;
printf("%d %d\n",i,j) , i = i + j , j = i + j) {
...nessuna istruzione...
}
|
Come calcolare i numeri di fibonacci minori di 10000 utilizzando apparentemente solo un ciclo for :) |
For di questo genere sono vivamente sconsigliati, rendono impossibile la lettura del codice, li ho scritti qui e non mi aspetto che vi siano subito chiari, ma li ho inseriti solo per darvi l'idea di quanto il costrutto for può essere "denaturato" fino a farci stare dentro un intero programma.
Adesso che conoscete il costrutto for eccovi una vignetta da veri geek:

Questa volta vorrei lasciarvi con un paio di esercizi, siamo già alla nona lezione ed è proprio il momento che iniziate a picchiare sulla tastiera! Io sono un teorico come indole, ma se poi vogliamo programmare davvero bisognerà iniziare a sporcarsi le mani!
Gli esercizi sono questi:
1) Far stampare a schermo un rettangolo composto da asterischi come quello qui in basso, il lato deve essere di 10 per 5 asterischi:
**********
**********
**********
**********
**********
2) Far stampare a schermo un triangolo composto da asterischi come quello qui in basso:
*
**
***
****
*****
******
*******
********
*********
3) Far stampare a schermo un triangolo composto da asterischi come quello qui in basso:
**********
*********
********
*******
******
*****
****
***
**
*
Vi do un piccolo aiuto, provate ad utilizzare due cicli for, uno dentro l'altro.
Alla prossima!!
Letture consigliate:
Il linguaggio C. Principi di programmazione e manuale di riferimento (Accademica)
Brian W. Kernighan - Dennis M. Ritchie
Editore: Pearson | Lingua: Italiano | Brossura: 313 pagine
Prezzo Listino: EUR 27,00
Prezzo Promozione: EUR 22,95 con Spedizione gratuita
C. Corso completo di programmazione
Paul J. Deitel - Harvey M. Deitel
Editore: Apogeo | Lingua: Italiano | Brossura: 640 pagine
Prezzo Listino: EUR 39,00
Prezzo Promozione: EUR 33,15 con Spedizione gratuita










57 Responses to “9. Istruzioni iterative”
8 Novembre 2011
paperoduck// soluzione secondo esercizio
#include
int main()
{
int altezzaTriangolo;
int numeroAsterischi;
for (altezzaTriangolo = 0; altezzaTriangolo < 10; altezzaTriangolo = altezzaTriangolo + 1) {
for (numeroAsterischi = 1; numeroAsterischi <= altezzaTriangolo; numeroAsterischi = numeroAsterischi + 1) {
printf ("*");
}
printf("\n");
}
return 0;
}
// soluzione terzo esercizio
#include
int main()
{
int altezzaTriangolo;
int numeroAsterischi;
for (altezzaTriangolo = 0; altezzaTriangolo = altezzaTriangolo; numeroAsterischi = numeroAsterischi – 1) {
printf (“*”);
}
printf(“\n”);
}
return 0;
}
8 Novembre 2011
paperoduckscusate c’è un errore di formattazione del testo al terzo esercizio che incollo di nuovo qui:
#include
int main()
{
int altezzaTriangolo;
int numeroAsterischi;
for (altezzaTriangolo = 0; altezzaTriangolo = altezzaTriangolo; numeroAsterischi = numeroAsterischi – 1) {
printf (“*”);
}
printf(“\n”);
}
return 0;
}
8 Novembre 2011
paperoduckniente da fare, lo scrivo qui:
#include
int main()
{
int altezzaTriangolo;
int numeroAsterischi;
for (altezzaTriangolo = 0; altezzaTriangolo = altezzaTriangolo;
numeroAsterischi – 1) {
printf (“*”);
}
printf (“\n”);
}
return 0
}
/* sono andato accapo nello scrivere gli argomenti di for per non rischiare errori di formattazione testo */
8 Novembre 2011
paperoduckfaccio preghiera al moderatore di cancellare i miei post, non capisco perché mi si mangiano le righe. Gulp! Incollo o scrivo una cosa e me ne pubblica un’altra…
8 Novembre 2011
paperoduck…e chiedo scusa perche ho letto il commento di ignazioc solo dopo.
Grazie!
16 Maggio 2013
AlessandroCiao a tutti quando provo a scrivere gli esercizi, dopo aver corretto tutti gli errori, mi si blocca la compilazione su un errore
[ERRORE SU SHELL]
c:\Users\Alessandro\Desktop>gcc triangolo.c
triangolo.c:2:1: error: expected identifier or ‘(‘ before ‘{‘ token
[/ERRORE SU SHELL]
[CODE]
#include
{
int *;
int a;
for(a=1;a<=9;a+1)
{
printf("%a/n");
return 0;
}
}
[/CODE]
17 Maggio 2013
IgnaziocScrivi sul forum dove il codice si legge meglio. Non si se sia colpa dell’html ma manca qualcosa dopo #include e dopo int *