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.

 

— ATTENZIONE A NON CREARE CICLI INFINITI! —

 
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!