Sottoprogrammi: astrazione procedurale Incapsulamento di un segmento di programma presente = false; j = 0; while ( (j<len) &&!presente ) if ( x == lista[j] ) presente = true; else j++; Variabili di ingresso: lista, len, x Variabili di uscita: presente, j void ricerca ( const int *a, const int n, const int x, bool &trov, int &pos ) { int i; trov = false; i = 0; while ( (i<n) &&!(trov) ) if ( x == a[i] ) trov = true; else i++; pos = i;
Prototipo di un sottoprogramma Nome preceduto dalla parola chiave void Lista dei parametri formali tra parentesi (obbligatorie) tipo e nome parametri di ingresso, di uscita e di ingresso/uscita Corpo del sottoprogramma dichiarazione di variabli automatiche (locali) parte eseguibile Se non vi sono parametri formali al posto della lista vuota è preferibile mettere la parola chiave void
Parametri effettivi e parametri formali chiamante int lista[maxlen]; int len, val; int i; bool presente; ricerca(lista, len, val, presente, i); parametri effettivi /* continua l elaborazione usando i parametri di uscita presente e i */ chiamato parametri formali void ricerca ( const int *a, const int n, const int x, bool &trov, int &pos ) { int i; trov = false; i = 0; while ( (i<n) &&!(trov) ) if ( x == a[i] ) trov = true; else i++; pos = i;
Esecuzione di sottoprogrammi: chiamata, ritorno e main () { int x, y, z;... bin(x+1, y, z);... chiamata void bin ( int n, int k, int &result ) { int temp; temp = fact(k)*fact(n-k); result = fact(n) / temp; ritorno x y z x y z x y z n k result temp di bin tempo chiamata di bin creazione del esecuzione di bin distruzione del ritorno a main
Modi di passaggio dei parametri Passaggio per valore il parametro formale è una variabile che viene inizializzata con il valore del parametro effettivo: il codice del sottoprogramma opera su una copia del parametro effettivo Passaggio per riferimento il parametro formale sta per il parametro effettivo: il codice del sottoprogramma opera sul parametro effettivo
Modi di passaggio dei parametri Possono essere passati per valore solo i parametri di ingresso I parametri di uscita e quelli di ingresso/uscita, poiché devono essere modificati, devono essere passati per riferimento I parametri effettivi corrispondenti a parametri passati per valore devono essere espressioni I parametri effettivi corrispondenti a parametri passati per riferimento devono essere delle variabili
Passaggio dei parametri in C/C++ tempo main () { int x, y, z;... bin(x+1, y, z);... passaggio per valore void bin ( int n, int k, int &result ) { int temp; temp = fact(k)*fact(n-k); result = fact(n) / temp; passaggio per riferimento x: 4 y: 2 z:? x: 4 y: 2 z:? x: 4 y: 2 z: 10 n: 5 k: 2 result: temp di bin chiamata di bin creazione del esecuzione di bin distruzione del ritorno a main
Parametri array Poiché il nome di un array rappresenta il suo indirizzo iniziale il tipo del parametro formale corrispondente deve essere un puntatore al tipo base dell array void ricerca ( const int *a, const int n, const int x, bool &trov, int &pos ); Si può usare la notazione equivalente int nome[] per mettere in risalto che il parametro effettivo deve essere l indirizzo di un array void ricerca ( const int a[], const int n, const int x, bool &trov, int &pos );
Parametri array main () { int n, x, i, L[M]; bool pres;... ricerca(l, n, x, pres, i);... n : 2 x : 3 i :? pres :? L[0] : 1 L[1] : 3 (al momento della chiamata) void ricerca ( int a[], int n, int x, bool &trov, int &pos ) { int i; trov = false; i = 0; while ( (i<n) &&!(trov) ) if ( x == a[i] ) trov = true; else i++; pos = i; di ricerca L[2] :?... L[M-1]:? chiamata a : n : 2 x : 3 trov : pos : flag : 1 i : 1 ritorno n : 2 x : 3 i : 1 pres : 1 L[0] : 1 L[1] : 3 L[2] :?... L[M-1]:? (al momento del ritorno)
Esempio Riceve in ingresso una lista di numeri e la ricopia in uscita eliminando i doppioni inizializza (lista,len) a lista vuota ; cin >> n; for ( i=0; i<n; i++ ) { cin >> x; if ( (lista,len) non contiene x ) { aggiungi x a (lista,len); cout << x;
Esercizio void init_vuota ( int *lista, int &len ); /* inizializza (lista,len) a lista vuota */ void ricerca ( const int *lista, const int len, const int x, bool &trov ); /* trov = (lista,len) contiene x */ void aggiungi ( int *lista, int &len, const int x ); /* aggiunge x a (lista,len) */ init_vuota(lista,len); cin >> n; for ( i=0; i<n; i++ ) { cin >> x; ricerca(lista,len,x,presente); if (!presente ) { aggiungi(lista,len,x); cout << x;
Soluzione senza i sottoprogrammi /* inizializza (lista,len) a lista vuota */ len = 0; cin >> n; for ( i=0; i<n; i++ ) { cin >> x; /* presente = (lista,len) contiene x */ presente = false; j = 0; while ( (j<len) &&!presente ) if ( x == lista[j] ) presente = true; else j++; if (!presente ) { /* aggiunge x a (lista,len) */ lista[len] = x; len++; cout << x;