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

​

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

​