1 of 24

IIS Blaise Pascal - Reggio Emilia

Tecnico Informatico

Informatica - Secondo Anno

2 of 24

IIS Blaise Pascal - Reggio Emilia

Tecnico Informatico

MODULO 2

Fondamenti di programmazione�Sottoprogrammi

3 of 24

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

4 of 24

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

5 of 24

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

6 of 24

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

7 of 24

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 contenutovoid 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

8 of 24

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

9 of 24

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

10 of 24

Modulo 2 - Sottoprogrammi

IIS Blaise Pascal - Reggio Emilia

Tecnico Informatico - Scienze Applicate

11 of 24

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

12 of 24

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

13 of 24

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

14 of 24

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

15 of 24

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

16 of 24

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

17 of 24

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

18 of 24

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

19 of 24

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

20 of 24

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

21 of 24

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

22 of 24

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

23 of 24

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

24 of 24

Modulo 2 - Sottoprogrammi

Esercizi per casa

  1. Scrivi la funzione void aggiungi che prende in input due numeri interi�X e Y e aggiunge Y ad X
  2. Scrivi la funzione void leggiNumero che prende in input�un numero intero X e chiede all’utente il valore da assegnargli
  3. Scrivi la funzione void leggiNumeroPositivo che prende in input�un numero intero X e chiede all’utente un valore da assegnargli�che sia positivo
  4. Scrivi la funzione void leggiNumeroRange che prende in input�un numero intero X, un valore intero minimo a e un valore massimo b �e chiede all’utente un valore da assegnargli che sia compreso in [a, b]

IIS Blaise Pascal - Reggio Emilia

Tecnico Informatico - Scienze Applicate