IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico
Informatica - Secondo Anno
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico
MODULO 2
Fondamenti di programmazione�Sottoprogrammi
Modulo 2 - Sottoprogrammi
Sottoprogrammi e programmazione TOP-DOWN
Risoluzione di problemi complessi attraverso la scomposizione in sottoproblemi più semplici
La somma delle difficoltà dei singoli sottoproblemi è minore della difficoltà
del problema nel suo complesso
Facilita la manutenzione del SW
Il riutilizzo di moduli evita la duplicazione di porzioni di codice
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Abbiamo detto che esistono due tipi di sottoprogrammi
FUNZIONI
che restituiscono un risultato al chiamante
PROCEDURE
che eseguono istruzioni senza restituire un risultato al chiamante
il tipo di ritorno è quindi vuoto (void)�
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Esempio di procedura
Le procedure si riconoscono perchè il tipo di ritorno è sempre void e non c’è bisogno di alcun return alla fine delle istruzioni�
void nome_della_funzione ( <lista parametri> ) {
<istruzioni>
}
Rimangono invece valide le regole per i parametri in input
<lista parametri> è la lista dei parametri di input, con tipo e nome
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Un esempio facile: Le procedure di stampa
Scriviamo una funzione che riceve un numero N intero e stampa N volte la parola “ciao” �
void stampaCiao ( int n ) {
for (int i=0; i<n; i++) {
cout << “Ciao!” << endl;
}
}
Una procedura abbastanza sciocca ma fa quel che deve senza restituire nulla a chi l’ja invocata
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Un altro esempio. �Scriviamo una funzione che riceve un array di interi e la sua dimensione N e ne stampa N il contenuto� void stampaArray ( int v[ ], int n ) {
for (int i=0; i<n; i++) {
cout << v[i] << endl;
}
}
NOTA: Nel passaggio ad un sottoprogramma NON è necessario specificare la dimensione dell’Array nel parametro formale! Serve invece un altro parametro per sapere la dimensione !
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Ancora uno. �Scriviamo una funzione che riceve un array di interi e stampa il massimo valore dell’array� void stampaMassimo ( int v[ ], int n ) {� int massimo;
for (int i=0; i<n; i++) {
if (v[i]>massimo or i==0) massimo=v[i];
}
cout << massimo << endl;
}
NOTA: Nel passaggio ad un sottoprogramma NON è necessario specificare la dimensione dell’Array nel parametro formale! Serve invece un altro parametro per sapere la dimensione !
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Sembra tutto molto bello!��Però però…
Proviamo questa:
Una procedura per scambiare due variabili ??
Facile no? Proviamo un attimo…�
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Cosa sta succedendo??��Funziona per i parametri formali ma non per quelli attuali !
E PERCHÉ??
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Passaggio dei parametri per riferimento�
Abbiamo visto nella scorsa lezione che i parametri formali passati per VALORE sono una COPIA dei valori dei parametri attuali
Nel passaggio dei parametri per RIFERIMENTO invece le modifiche ai valori dei parametri formali SI RIVERBERANO sui valori dei parametri attuali
VEDIAMO BENE PERCHÉ!
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Passaggio dei parametri per riferimento�
Ricordiamo che OGNI VARIABILE è una LOCAZIONE di MEMORIA
Nel passaggio dei parametri per RIFERIMENTO stiamo passano il valore della locazione di memoria e NON il contenuto della stessa
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Ricordiamoci che le variabili sono indirizzi di memoria
indirizzo | valore |
0000 | |
0004 | 3 |
0008 | |
000B | |
0010 | |
0014 | 5 |
0018 | |
x
y
main
a
b
procedura
0004
0014
0004
0014
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Nel passaggio per riferimeno vengono copiati gli indirizzi di memoria dei parametri attuali
indirizzo | valore |
0000 | |
0004 | 3 |
0008 | |
000B | |
0010 | |
0014 | 5 |
0018 | |
x
y
main
a
b
procedura
0004
0014
0004
0014
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
I parametri formali puntano alle stesse locazioni di memoria di quelli attuali
indirizzo | valore |
0000 | |
0004 | 3 |
0008 | |
000B | |
0010 | |
0014 | 5 |
0018 | |
x
y
main
a
b
procedura
0004
0014
0004
0014
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
OGNI MODIFICA AI VALORI DELLE VARIABILI FORMALI SI RIVERBERA SUI VALORI DELLE VARIABILI ATTUALI
indirizzo | valore |
0000 | |
0004 | 3 |
0008 | |
000B | |
0010 | |
0014 | 5 |
0018 | |
x
y
main
a
b
procedura
0004
0014
0004
0014
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
IMPORTANTISSIMO!!!
NEL PASSAGGIO DI PARAMETRO �PER RIFERIMENTO LE MODIFICHE �AI VALORI DEI PARAMETRI FORMALI �NELLA FUNZIONE/PROCEDURE
SI RIVERBERANO SUI VALORI �DEI PARAMETRI ATTUALI
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
IMPORTANTISSIMO!!!
I passaggi per riferimento si indicano �con il simbolo & davanti al parametro formale nell’intestazione �della procedura
La nostra procedura diventa quindi:
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Proviamo
�Scriviamo la procedura incrementa
che riceve in input un numero intero x�e lo incrementa di 1
�void incrementa(int &x);
5 minuti!!!
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Soluzione
�void incrementa(int &x) {
x++;
}
int main() {
int a = 1;
incrementa(a);
cout << “a vale ” << a;
return 0;
}
in azzurro i parametri formali,
in viola i parametri attuali
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Un’altra…
�Scriviamo la procedura reverse
che riceve in input una stringa s�e la ribalta
�void reverse(string &s);
// ricorda: una stringa puoi trattarla come un array di char�// la sua lunghezza la puoi sapere con il metodo length�// es: se s = “CIAO” , s.length() = 4
5 minuti!!!
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Soluzione
�void reverse(string &s) {
string result="";
for (int i=0; i<s.length(); i++) {
result = s[i] + result;
}
s = result;
}
int main() {
int x = “ciao”;
reverse(x);
return 0;
}
in azzurro i parametri formali,
in viola i parametri attuali�in marrone le variabili locali alla procedura
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate
Modulo 2 - Sottoprogrammi
Esercizi per casa
IIS Blaise Pascal - Reggio Emilia
Tecnico Informatico - Scienze Applicate