COSTRUTTO FINCHE
Il costrutto finche ha una sintassi molto simile al costrutto se :
finche <espressione> <confronto> <espressione> allora <esegui questo codice> .
Esempio:
finche gatto < 100 allora aumenta gatto di 1 .
questo pezzo di codice aumenta istantaneamente la variabile gatto, portandola a 100.
Questo perché il costrutto finche esegue un ciclo, ovvero svolge una iterazione: ripete l’operazione alla massima velocità di calcolo possibile finche non ottiene il risultato per cui lavora; nel nostro caso finche la variabile gatto non sarà minore di 100, quindi quando gatto sarà maggiore o uguale a 100.
Qual è lo scopo?
Se il nostro obbiettivo è portare istantaneamente la variabile gatto a 100 basta usare una semplice assegnazione:
gatto = 100
perché allora utilizzare un ciclo finche?
La risposta è: per potere fare più cose contemporaneamente utilizzando una sola variabile mentre (while) raggiunge il valore 100,
senza dover scrivere decine di righe di codice simili.
Un esempio pratico
Mettiamo il caso che vogliamo disegnare 20 cerchi equidistanti; possiamo scrivere:
INIZIA CICLO CONTINUO disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*2) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*3) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*4) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*5) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*6) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*7) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*8) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*9) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*10) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*11) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*12) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*13) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*14) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*15) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*16) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*17) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*18) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*19) disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*20)
Questo codice è corretto ma è lungo e ridondante.
La stessa cosa utilizzando finche si può scrivere in questo modo, utilizzando la variabile cerchi come unità immaginaria:
INIZIA cerchi=0 CICLO CONTINUO cerchi=1 finche cerchi < 20 allora disegna cerchio --> (RAGGIO: 30) (COLORE: rosso) (X: 40*cerchi) aumenta cerchi di 1 .
Il funzionamento è il seguente:
- ogni trentesimo di secondo la variabile cerchi viene riportata al valore 1 prima che inizi il ciclo
- ad ogni passaggio del ciclo viene disegnato un cerchio alla posizione x 40 per il numero di cerchi già disegnati
- ad ogni passaggio del ciclo la variabile cerchi viene aumentata di 1, il ciclo avrà quindi 20 passaggi (finche cerchi < 20)
In realtà è possibile fare molto di più, ad esempio modificare il raggio dei cerchi in modo progressivo:
INIZIA cerchi=0 CICLO CONTINUO cerchi=1 finche cerchi < 20 allora disegna cerchio --> (RAGGIO: 5*cerchi) (COLORE: rosso) (X: 40*cerchi) aumenta cerchi di 1 .
Il costrutto finche è lo strumento più potente presente in ATOMIC, le sue applicazioni sono infinite e permettono di automatizzare una valanga di compiti noiosi e ripetitivi.
I cicli finche eseguono il codice finche la condizione è vera, se questa condizione è sempre vera il ciclo non terminerà mai e il programma si bloccherà irrimediabilmente (crash).
Ad esempio, questo codice farà sicuramente crashare il programma (fidatevi, non provatelo!):
INIZIA prova=150 CICLO CONTINUO finche prova > 100 allora disegna cerchio --> (RAGGIO: 5*prova) (COLORE: rosso) (X: 40*prova) aumenta prova di 1 .
la variabile prova è sempre maggiore di 100, quindi il computer dovrebbe disegnare un numero infinito di cerchi:
il programma si blocca in attesa che il computer finisca di calcolare dove disegnare tutti i cerchi… Ma il calcolo non finirà mai!