I sottoprogrammi si utilizzano quando
- una certa sequenza di istruzioni appare più volte nello stesso programma: la scrivo una sola volta e la chiamo per nome più volte
- appare in programmi diversi: la progetto una volta e poi la utilizzo con copia e incolla in altri programmi
- per semplificare il codice: suddivido il codice in blocchi logici e li progetto uno alla volta
Il codice del sottoprogramma non viene eseguito automaticamente ma ogni volta che comparirà la sua chiamata.
procedure nome { … }
Definisce un sottoprogramma con un nome a piacere.
La chiamata avviene scrivendo semplicemente il nome dove serve.
Esempio: Come disegnare un rettangolo 3×2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
rettangolo procedure rettangolo { paintWhite repeat(2) { forward(2) right forward(3) right } stopPainting } |
procedure nome(p1, p2, …) { … }
Definisce un sottoprogramma con un nome a piacere.
Il sottoprogramma può avere un certo numero di parametri. Saranno utilizzati come variabili nel blocco successivo di istruzioni.
Si consiglia di utilizzare nomi significativi per i parametri.
Esempio: Come disegnare un rettangolo, date le dimensioni orizzontale e verticale
1 2 3 4 5 6 7 8 9 10 11 12 |
procedure rettangolo(base, altezza) { paintWhite repeat(2) { forward(altezza) right forward(base) right } stopPainting } |
nome(a1, a2, …)
La chiamata di un sottoprogramma avviene scrivendo il nome seguito dall’elenco degli argomenti, cioè con i particolari valori che saranno utilizzati dal sottoprogramma.
Il numero di argomenti deve corrispondere al numero di parametri dichiarati nella definizione del sottoprogramma.
Esempio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
rettangolo(3,2) # Un rettangolo 3x2 forward(4) # Avanti di 4 passi rettangolo(1,4) # Un rettangolo 1x4 procedure rettangolo(base, altezza) # Rettangolo con parametri { paintWhite repeat(2) { forward(altezza) right forward(base) right } stopPainting } |
return
Se il sottoprogramma ha raggiunto il suo scopo allora si può decidere di ritornare al punto dove è stata fatta la chiamata e continuare con l’esecuzione delle istruzioni successive.
Si tratta di una scorciatoia che permette di progettare più facilmente una procedura complessa.
Esempio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
trovaFaro # Esegue l'operazione di ricerca del faro trovaPunto # quando ritorna esegue l'operazione di ricerca del punto bianco putDown # e quindi posa il faro procedure trovaFaro { # cerca il faro... if(frontIsBeacon) { pickUp return } # ... } |
L’istruzione di ritorno può contenere un valore che verrà restituito al chiamante, la procedura si comporta come una funzione…
1 2 3 |
... return(x) ... |
Ricorsione
Le procedure possono essere definite in funzione di se stesse…
1 |
... |