Un programma può diventare molto lungo…
- ricorrere a delle linee vuote o di commento
- dare dei nomi a a parti di codice riconoscibili
- separare questi blocchi dal flusso principale
- scrivere una sola volta parti di codice che si ripetono
- …
Se a questi blocchi di codice si da un nome e si separano dal programma principale, scrivendoli prima, diventano dei sottoprogrammi
Procedure P1; Begin Istr11; Istr12; ... End; Procedure P2; Begin Istr21; Istr22; ... End; ... Begin { MAIN } ... P1; P2; ... End.
Per passare il controllo al sottoprogramma è necessario chiamarlo.
Il controllo ritorna al chiamante quando si giunge all’etichetta di fine del sottoprogramma End.
Il blocco principale non ha l’esclusiva di fare le chiamate, anzi ogni sottoprogramma può chiamare tutti gli altri sottoprogrammi.
Parametri per valore
All’atto della chiamata di un sottoprogramma è possibile specificare dei parametri
P1(a, b);
Prima dell’esecuzione del codice del sottoprogramma P1 avviene un passaggio, assegnazione, del valore di a in x e del valore di b in y.
Procedure P1(x: Integer; y: Double);
Il sottoprogramma P1 svolgerà l’operazione per la quale è stato progettato in modo parametrico, cioè in funzione dei valori assunti dai parametri formali (x, y, …) specificati dal chiamante tramite i parametri attuali (a, b, …)
Note
- l’elenco dei parametri attuali deve corrispondere in numero e tipo all’elenco dei parametri formali
- ogni parametro formale viene dichiarato e si comporta come una variabile locale inizializzata al valore specificato con il parametro attuale all’atto della chiamata
- i parametri attuali devono essere valori, quindi possono essere costanti (-1, +5.0), variabili (a, b), espressioni (-a, b+5.0), …
- al termine dell’esecuzione del sottoprogramma le eventuali modifiche dei valori dei parametri formali scompariranno per sempre…
Parametri per variabile
Piuttosto che passare dei valori si può scegliere di passare delle variabili (indirizzi, reference, …).
Procedure P2(Var x: Integer; Var y: Double); Begin ... End; ... P2(a, b);
Si dice che x e y sono solo reference, riferimenti, per a e b
Note
- gli effetti dell’esecuzione del sottoprogramma P2 si manifestano nei valori contenuti nelle variabili utilizzate come parametri attuali all’atto della chiamata
- i parametri attuali devono essere variabili
Parametri misti
Le due modalità di passaggio dei parametri (per valore, per riferimento) possono essere utilizzate contemporaneamente
Procedure P3(Var x: Integer; y: Double); Begin ... End; ... P(a, b);
Alla fine dell’esecuzione del sottoprogramma P3 il valore di a, nel chiamante dipenderà dalle operazioni che sono state eseguite su x in P3.
Funzioni
Quando il sottoprogramma F termina restituisce un risultato che occuperà logicamente lo spazio di codice della chiamata
Function F(x: Integer; y: Double): Char; Begin ... F:=...; End; ... Writeln(F(a,b)); ... z:=F(a,b); ...
Il chiamante riceverà da F (la funzione) un dato, risultato dell’elaborazione, e potrà utilizzarlo come argomento di altre elaborazioni
- visualizzazione
- assegnazione a una variabile
- elaborazione all’interno di un’espressione
- come parametro all’interno di un’altra chiamata
- …
Note
- Si assegna letteralmente il risultato alla funzione.
- L’assegnazione potrebbe avvenire più volte, quindi l’ultima assegnazione determinerà il risultato effettivo.
Ricorsione
Se il linguaggio di programmazione prevede la ricorsione… un sottoprogramma PR può chiamare il sottoprogramma PR, se stesso, per svolgere lo stesso compito ma con un’stanza diversa
Procedure PR(parametri_formali); Begin ... PR(parametri_attuali); ... End;
Il sottoprogramma PR chiama il sottoprogramma PR … finché non succede qualcosa (l’istanza diventa un caso particolare che non necessita di un’ulteriore chiamata ricorsiva) e si ritorna all’indietro fino alla prima chiamata…
Può essere una funzione FR …
Function FR(parametri_formali): Double; Begin ... x=FR(parametri_attuali); ... FR:=espr; End;
La ricorsione può essere anche indiretta: il sottoprogramma PR1 chiama il sottoprogramma PR2 che a sua volta … che a sua volta chiama PR1.
Conclusioni
Si può immaginare un sottoprogramma come uno strumento del quale non si conosce l’implementazione (scatola nera) ma si conoscono
- il nome
- la funzionalità che offre
- l’elenco dei parametri formali (con la loro modalità di passaggio e il loro ruolo)
- l’eventuale tipo del valore di ritorno