Il loop è un elemento comune in tutti i linguaggi di programmazione. Delphi ha tre strutture di controllo che eseguono ripetutamente blocchi di codice: per, ripeti ... fino a quando ....
Supponiamo di dover ripetere un'operazione un numero fisso di volte.
// mostra 1,2,3,4,5 finestre di messaggio
var j: intero;
inizio
per j: = 1 per 5 fare
inizio
ShowMessage ('Box:' + IntToStr (j));
fine;
fine;
Il valore di una variabile di controllo (j), che in realtà è solo un contatore, determina quante volte viene eseguita un'istruzione for. La parola chiave per impostare un contatore. Nell'esempio precedente, il valore iniziale per il contatore è impostato su 1. Il valore finale è impostato su 5.
Quando inizia l'esecuzione dell'istruzione for, la variabile del contatore viene impostata sul valore iniziale. Delphi di verifica se il valore per il contatore è inferiore al valore finale. Se il valore è maggiore, non viene fatto nulla (l'esecuzione del programma passa alla riga di codice immediatamente dopo il blocco del codice loop). Se il valore iniziale è inferiore al valore finale, viene eseguito il corpo del loop (qui: viene visualizzata la finestra di messaggio). Infine, Delphi aggiunge 1 al contatore e riavvia il processo.
A volte è necessario contare all'indietro. Il giù verso la parola chiave specifica che il valore di un contatore deve essere decrementato di uno ogni volta che il ciclo viene eseguito (non è possibile specificare un incremento / decremento diverso da uno). Un esempio di un ciclo for che conta indietro.
var j: intero;
inizio
per j: = 5 giù verso 1 fare
inizio
ShowMessage ('T minus' + IntToStr (j) + 'seconds');
fine;
ShowMessage ('Per sequenza eseguita!');
fine;
Nota: è importante non modificare mai il valore della variabile di controllo nel mezzo del ciclo. Ciò potrebbe causare errori.
Scrivere un ciclo for all'interno di un altro ciclo (cicli di annidamento) è molto utile quando si desidera riempire / visualizzare i dati in una tabella o una griglia.
var k, j: intero;
inizio
// questo doppio loop viene eseguito 4x4 = 16 volte
per k: = 1 per 4 fare
per j: = 4 giù verso 1 fare
ShowMessage ('Box:' + IntToStr (k) + ',' + IntToStr (j));
fine;
La regola per annidare i loop per il prossimo è semplice: il loop interno (contatore j) deve essere completato prima che venga trovata l'istruzione successiva per il loop esterno (contatore k). Possiamo avere loop annidati tripli o quadrupli, o anche di più.
Nota: in genere, le parole chiave inizio e fine non sono strettamente richieste, come puoi vedere. Se inizio e fine non vengono utilizzati, l'istruzione immediatamente successiva all'istruzione for viene considerata il corpo del ciclo.
Se si dispone di Delphi 2005 o di una versione più recente, è possibile utilizzare la "nuova" iterazione di stile per elemento nella raccolta su contenitori. L'esempio seguente mostra l'iterazione sulle espressioni di stringa: per ogni carattere nella stringa controlla se il carattere è 'a' o 'e' o 'i'.
const
s = "Informazioni sulla programmazione Delphi";
var
c: char;
inizio
per c nel S fare
inizio
Se c nel [ 'A', 'e', 'i'] poi
inizio
// fare qualcosa
fine;
fine;
fine;
A volte non sapremo esattamente quante volte dovrebbe essere eseguito un ciclo. E se vogliamo ripetere un'operazione fino a quando non raggiungiamo un obiettivo specifico?
La differenza più importante tra il ciclo while-do e il ciclo repeat-until è che il codice dell'istruzione repeat viene sempre eseguito almeno una volta.
Lo schema generale quando scriviamo un tipo ripetitivo (e while) di loop in Delphi è il seguente:
ripetere
inizio
dichiarazioni;
fine;
fino a condizione = vero
mentre condizione = vero fare
inizio
dichiarazioni;
fine;
Ecco il codice per mostrare 5 finestre di messaggio successive usando ripetizione fino a:
var
j: intero;
inizio
j: = 0;
ripetere
inizio
j: = j + 1;
ShowMessage ('Box:' + IntToStr (j));
fine;
fino a j> 5;
fine;
Come puoi vedere, l'istruzione repeat valuta una condizione alla fine del loop (quindi il loop ripetuto viene eseguito sicuramente almeno una volta).
L'istruzione while, d'altra parte, valuta una condizione all'inizio del ciclo. Poiché il test viene eseguito in alto, di solito è necessario assicurarsi che la condizione abbia senso prima che il ciclo venga elaborato, se ciò non è vero il compilatore potrebbe decidere di rimuovere il ciclo dal codice.
var j: intero;
inizio
j: = 0;
mentre j < 5 fare
inizio
j: = j + 1;
ShowMessage ('Box:' + IntToStr (j));
fine;
fine;
Le procedure Break e Continue possono essere utilizzate per controllare il flusso di istruzioni ripetitive: La procedura Break fa sì che il flusso di controllo esca un'istruzione for, while o repeat e continui all'istruzione successiva dopo l'istruzione loop. Continua consente al flusso di controllo di procedere alla successiva iterazione dell'operazione ripetuta.