Il costrutto sequenziale e quello di selezione non sono sufficienti da soli a risolvere tutti i problemi. Spesso i programmi devono prevedere la ripetizione di uno o più comandi che vanno eseguiti un numero predefinito di volte o fin quando non si verifica una determinata condizione. Per definire in modo rigoroso queste particolari strutture, chiamate strutture di iterazione, dobbiamo ricorrere ancora una volta a modelli rigorosi.
Per le iterazioni che prevedono comandi da eseguire almeno una volta e che vanno ripetuti mentre è vera una particolare condizione (anche definite come cicli a controllo in coda o post-condizionali):
Fai { elenco di istruzioni da eseguire se la condizione risulta vera } Mentre (condizione)
Per le iterazioni che potrebbero non essere mai eseguite e che vanno ripetute mentre è vera una particolare condizione (anche definite come cicli a controllo in testa o pre-condizionali):
Mentre (condizione) { elenco di istruzioni da eseguire se la condizione risulta vera }
Per le iterazioni che devono essere eseguite un numero predefinito di volte (enumerazioni, anche definite come cicli enumerativi):
for (inizio; test; incremento) { elenco di istruzioni da eseguire per un numero stabilito di volte }
A questo punto sono necessarie alcune precisazioni. Per le iterazioni a controllo in testa e a controllo in coda sarà necessario che almeno una delle istruzioni nel corpo del ciclo (le istruzioni da ripetere) sia in grado di cambiare il valore restituito dal test sulla condizione. In caso contrario si rischia di avviare un ciclo che non verrà mai concluso (loop infinito).
Il ciclo enumerativo ha invece bisogno di una variabile, detta contatore del ciclo, cui viene assegnato un valore iniziale in corrispondenza della prima voce tra parentesi tonde (inizio), che viene incrementata automaticamente ad ogni iterazione, come specificato dall'ultima voce tra parentesi tonde (incremento) fino al raggiungimento di un valore finale, come specificato dalla seconda voce tra parentesi tonde (test).