Istruzioni ripetitive

Ogni linguaggio di programmazione offre dei costrutti per permettere di ripetere più volte l'esecuzione di alcune istruzioni, a volte anche più di uno.
Nel seguito presentiamo i principali meccanismi presenti nei linguaggi attuali, e vediamo come sono stati considerati dal C.

Etichette + goto

La forma più primitiva di costrutto per ripetere è il goto:
LABEL: STATEMENT1
       ...
       STATEMENTn
       if COND then goto LABEL;
Eseguire goto LABEL significa che la prossima istruzione che sarà eseguita è quella che segue LABEL.
Le istruzioni jump e jumpz dell'Assembler sono una forma di goto.

Al giorno d'oggi è praticamente dimenticato, anche perchè è possibile mettere etichette e goto in ogni punto dei programmi, rendendoli dei labirinti.

Il C offre il goto e la possibilità di etichettare le istruzioni, ma saranno mai usati in questo corso.


While (mentre)

Mentre una condizione è vera un'istruzione viene ripetuta, e pertanto prima viene verificata la condizione e poi si ripete l'esecuzione.
Questo è in genere il costrutto fondamentale, da cui poi derivare le altre forme presentate nel seguito.
Un costrutto di questo tipo era presente anche nel linguaggio del calcolatore antropomorfo.

Il C ha il costrutto while, la cui forma sintattica è

while (CONDITION)
       STATEMENT
la cui esecuzione è come segue:
(1) viene valutata CONDITION, un'espressione di tipo int;
se il suo valore è 0, non si fa altro
altrimenti si esegue STATEMENT, e dopo si ritorna a (1)

Notare che è possibile che l'istruzione non sia eseguita neanche una volta, quando la condizione è falsa inizialmente.
È importante notare anche che l'esecuzione di questo statement potrebbe non terminare mai (andare in loop); per esempio poichè la condizione non sarà mai falsa.
Questo è uno degli errori più comuni, che si ommettono quando si fanno dei programmi.

ESEMPIO: alcuni programmi C che non termineranno mai

main()
{   
    int A, B;
     
    A = 0;
    B = 0;
    while(A <= B)
        B = B + 1;
    
}

main()
{   
    int A, B;
     
    A = 0;
    B = 0;
    while(A <= B)
        B = B == 1;
        
}

Ripetere fino a che ...

Un'istruzione viene ripetuta fino a che una certa condizione è vera/falsa; pertanto, in questo caso, prima viene eseguita l'istruzione e poi si verifica la condizione.
Il Pascal ha un'istruzione di questo tipo, chiamata repeat- until, che ripete fino a che una condizione sarà falsa.

Il C ha il costrutto do, la cui forma sintattica è

do 
    STATEMENT
while(CONDITION)
la cui esecuzione è come segue:
(1) viene eseguita STATEMENT,
viene valutata CONDITION un'espressione di tipo int;
se il suo valore è 0, non si fa altro
altrimenti si ritorna a (1)

Notare che in questo caso l'istruzione sarà eseguita sempre almeno una volta, anche quando la condizione è falsa inizialmente.
Anche l'esecuzione di questo statement potrebbe non terminare mai; per esempio poichè la condizione non sarà mai falsa.

ESEMPIO: alcuni programmi C che non termineranno mai con l'istruzione do

main()
{   
    int A, B;
     
    A = 0;
    B = 0;
    do 
        B = B + 1; 
    while(A < B);
}

main()
{   
    int A, B;
     
    A = 0;
    B = 0;
    do
         B = B == 1;
    while(B <= A)
       
}

Ripetizione basata su un contatore (for)

Ogni linguaggio di programmazione offre un costrutto particolare da usare quando è noto il numero di volte per cui un'istruzione deve essere ripetuta, anche se in ogni caso è equivalente ad usare una combinazione dei precedenti.
La forma generale di questo costrutto è
for (CONT,EXPRESSION 1,EXPRESSION 2,EXPRESSION 3)
       STATEMENT
CONT è una variabile (di tipo discreto, quindi, per esempio, no reale) che non è modificata in STATEMENT
La sua esecuzione può essere descritta utilizzando l'istruzione while come segue
CONT=EXPRESSION 1;
while(CONT<=EXPRESSION 2){
       STATEMENT
       CONT=CONT+EXPRESSION 3;
}
Il for del C è molto più complesso e permette di fare molto di più che ripetere un'istruzione un numero di volte prefissato.
Per ora ne vediamo una forma semplificata.
for (STATEMENT 1; CONDITION; STATEMENT 2)
   STATEMENT
STATEMENT 1 è una istruzione che determina il valore iniziale del contatore (una variabile di tipo discreto)
CONDITION è un'espressione di tipo intero che rappresenta una condizione sul contatore
STATEMENT 2 è un'istruzione che determina l'incremento del contatore
Anche in questo caso la sua esecuzione può essere descritta utilizzando l'istruzione while come segue
STATEMENT 1;
while(CONDITION){
   STATEMENT
   STATEMENT 2
}
ESEMPIO: programma con il for in cui un'istruzione è eseguita esattamente 23 volte
main()
{   
    int A, B;
     
    B = 0;
    for(A = 12;  A <= 35; A = A+1) 
        B = B + 1; 
}
ESEMPIO: programma con il for che va in loop
main()
{   
    int A, B;
     
    B = 0;
    for(A = 12;  A > B; A = A+1) 
        B = B == 1; 
}