I SOTTOPROGRAMMI -...

9
I SOTTOPROGRAMMI Approccio Top-down Quando dobbiamo affrontare un problema complesso è bene individuare le parti che lo compongono e suddividerlo in problemi minori più agevoli da risolvere. Approccio Top-down Mettere la tovaglia sul tavolo Mettere i piatti Mettere pane, acqua e vino in tavola Tagliare il salame Versare le olive in un contenitore Mettere l’acqua sul fuoco Tagliare la carne Rompere le uova Servire dolci e liquori. Scrivere un algoritmo per la preparazione di un pasto completo: Apparecchiare la tavola Preparare l’antipasto Preparare il secondo Preparare il dolce Preparare il primo Inizio programma principale Apparecchiare la tavola Preparare antipasto Preparare primo Preparare secondo Preparare torta Servire dolci e liquori Fine Inizio sottoprogramma Preparare torta rompere le uova ungere la teglia Fine Preparare cena Preparare antipasto Preparare primo Preparare secondo Preparare dolci Preparare digestivo Preparare pasta Preparare sugo Problema Sottoproblema 1 Sottoproblema 2 Sottoproblema 2.1 Sottoproblema 2.2 Sottoproblema 2.1.1 Approccio Top-down

Transcript of I SOTTOPROGRAMMI -...

I SOTTOPROGRAMMI

Approccio Top-down

Quando dobbiamo affrontare un problema complesso è bene individuare le parti che lo compongono e suddividerlo in problemi minori più agevoli da risolvere.

Approccio Top-down

Mettere la tovaglia sul tavoloMettere i piatti…Mettere pane, acqua e vino in tavola

Tagliare il salame…Versare le olive in un contenitore

Mettere l’acqua sul fuoco…

Tagliare la carne…

Rompere le uova…

Servire dolci e liquori.

Scrivere un algoritmo per la preparazione di un pasto completo:

Apparecchiare la tavola

Preparare l’antipasto

Preparare il secondo

Preparare il dolce

Preparare il primo

Inizio programma principale

Apparecchiare la tavola

Preparare antipasto

Preparare primo

Preparare secondo

Preparare torta

Servire dolci e liquori

Fine

Inizio sottoprogramma Preparare torta

rompere le uova

ungere la teglia

Fine

Preparare cena

Preparare

antipasto

Preparare

primo

Preparare

secondo

Preparare

dolci

Preparare

digestivo

Preparare

pasta

Preparare

sugo

… …

Problema

Sottoproblema 1 Sottoproblema 2 …

Sottoproblema 2.1 Sottoproblema 2.2

Sottoproblema 2.1.1 …

Approccio Top-down

L’approccio top down funziona quando• La scomposizione in sottoproblemi consente di

affrontare problemi più facilmente risolvibili• Si identifica un corretto ordine nell’affrontare i

diversi sottoproblemi• La soluzione dei sottoproblemi conduce alla

soluzione generale

Approccio Top-down

Approccio bottom-up,

● ossia "dal basso verso l'alto",

● privilegia l'aspetto esecutivo rispetto a quello

funzionale, procedendo dal particolare verso il

generale.

● è una strategia induttiva e consente di

concentrarsi subito sui punti cardine del

problema che, però, potrebbero essere di

difficile individuazione iniziale.

I Sottoprogrammi

Un sottoprogramma è una porzione di codice, una parte di un programma, che risolve un particolare sotto-problema e che verrà eseguita quando chiamata dal programma principale.

Ogni sottoprogramma deve avere un nome, deve essere descritto una sola volta e richiamato al bisogno attraverso il suo nome.

I Sottoprogrammi

E’ conveniente creare sottoprogrammi quando:

•Le azioni eseguite dal sottoprogramma sono di interesse generale•Le azioni eseguite dal sottoprogramma non sono di interesse generale ma si presentano più volte all’interno del programma•Si riesce ad ottenere una maggiore leggibilità del programma

I Sottoprogrammi

I sottoprogrammi consentono di •Astrarre•Occupare meno memoria•Riusare il codice•Migliorare la leggibilità del codice.

I Sottoprogrammi

NON è conveniente creare sottoprogrammi quando:

•Le azioni eseguite dal sottoprogramma non sono di interesse generale.•Non si ottiene una maggiore leggibilità del programma.•Non si ottiene una maggiore velocità di esecuzione o un risparmio di spazio in memoria.

Esempio: Creare un sottoprogramma che faccia solo la lettura da tastiera di un dato e lo restituisca al programma principale.

I Sottoprogrammi

Un sottoprogramma deve avere:•Un nome (identificatore)•Una descrizioni (blocco di istruzioni)•Permettere lo scambio di dati col programma principale o altri sottoprogrammi.

Un sottoprogramma può:•Ricevere dati•Restituire risultati

Esecuzione dei sottoprogrammi

Programma principale

INIZIO

Fun1

Fun2

FINE

Fun1

INIZIO

Fun1.1

FINE

Fun2

INIZIO

FINE

Fun1.1

INIZIO

FINE

uando si attiva un sottoprogramma si sospende l’esecuzione del sottoprogramma chiamante e si memorizza l’indirizzo dell’istruzione successiva a quella di chiamata in modo da sapere da dove proseguire.

Le funzioni

● Una funzione è un sottoprogramma contenente

le istruzioni che risolvono uno specifico

problema

● quando il sottoprogramma viene attivato da

un'istruzione di chiamata, restituisce un valore.

● Il valore della funzione deve essere

● Usato come elemento di un'istruzione.

● richiamata in un'assegnazione a una variabile

oppure all'interno di una generica espressione.

Sintassi#include<iostream>

using namespace std;

tipodidato nomefunzione (<lista dei parametri>); Prototipo della Funzione

int main(){

…......................;

variabile=nomefunzione(<listavariabili>); Chiamata della

Funzione

….....................;

return 0;

}

tipodidato nome funzione(<lista dei parametri>) Definizione della funzione

{

….............;

return(valore);

}

I sottoprogrammi in C

#include <stdio.h>

int fun(int a, int b){ int c; c=a+b; return (c);}main (){…

somma=fun(p,q);…}

Direttive al preprocessore

Definizione della funzione

Chiamata alla funzione

Sottoprogramma principale

I sottoprogrammi in C

#include <stdio.h>

int fun(int,int);main (){…

somma=fun(p,q);…}int fun(int a, int b){

int c;c=a+b;return (c);

}

Direttive al preprocessore

Definizione della funzione

Chiamata alla funzione

Prototipo della funzione

Sottoprogramma principale

Ambiente locale e globale

L’ambiente di un sottoprogramma è l’insieme delle risorse (variabili, costanti, parametri, sottoprogrammi) da esso utilizzabili

Ambiente locale � risorse specifiche del sottoprogramma

Ambiente globale � risorse utilizzabili da tutti i sottoprogrammi

ATTENZIONE: E’ buona regola di programmazione privilegiare l’ambiente locale, minimizzando l’ambiente globale.

Visibilità delle variabili

E' possibile dichiarare delle variabili dentro le funzioni.

Esse sono dette variabili locali e sono visibili solo dentro la funzione in cui vengono dichiarate. Perciò è possibile dichiarare variabili con lo stesso nome in funzioni (ambienti) diversi.

Visibilità delle variabili

E’ possibile dichiarare delle variabili globali e sono visibili e accessibili in tutto il programma.

ATTENZIONE: Le variabili globali potrebbero essere modificate involontariamente o intenzionalmente ed in modo malizioso.

Lo shadowing

Se vengono dichiarate due variabili, anche di tipo diverso, una globale ed una locale, aventi lo stesso identificatore, la variabile locale oscura quella globale, impedendone la visibilità.

3

#include <stdio.h>int somma=3;main (){int somma;somma=5;…}

5

La ricorsione

E’ possibile chiamare un sottoprogramma all’interno di un altro sottoprogramma.

Alcuni linguaggi consentono ad un sottoprogramma di chiamare se stesso, cioè ammettono la ricorsione.

Esercizio

Calcolo della media di due studenti e rilevazione

del migliore

Le procedure e le funzioni

● La procedura è un sottoprogramma contenente le istruzioni che risolvono uno specifico problema.

● L'esecuzione di una procedura viene attivata dall'apposita istruzione di chiamata (invocazione). Essa utilizzando il passaggio per riferimento può modificare il valore di variabili che sono locali in un altro sottoprogramma.

Esempio: In Visual Basic le procedure si dichiarano mediante la parola chiave Sub e le funzioni mediante la parola chiave Function.

Le procedure e le funzioni

● Le procedure sono astrazione di istruzioni

● Le Funzioni di operatori

● Decrivere il problema della distinzione tra i due sottoprogrammi in C++ e troppo lungo.

Sintassi#include<iostream>

using namespace std;

void nomeprocedura (<lista dei parametri>); Prototipo della procedura

int main(){

…......................;

nomeprocedura(<listavariabili>); Chiamata della procedura

….....................;

return 0;

}

void nomeprocedura (<lista dei parametri>) Definizione della procedura

{

….............;

}

I parametri

Servono per scambiare informazioni tra le diverse parti di un programma. Sono caratterizzati da:

– Un identificatore

– Un tipo

– Un valore

– Una direzione

• Input

• Output

• Input/output

Differenza

• I parametri sono una cosa

• Le variabili sono altre cose

Var input e Par input

Leggi (lato)

….

lato

Sottoprogramma

Var output e Par input

scrivi (lato)

….

lato

Sottoprogramma

Var input e Par output

leggi (lato)

….

Sottoprogramma

lato

Var lavoro e Par output

Lato=lato+4

….

Sottoprogramma

lato

Var lavoro e Par output/output

Lato=Lato+4

….

Sottoprogramma

LatoLato

I sottoprogrammi in C

#include <stdio.h>

int fun(int a, int b){int c;c=a+b;return (c);}

main (){…somma=fun(p,q);…}

Parametri

formali

Parametri attuali

Devono rispettare numero, ordine e tipo dei parametri formali

L’assenza di parametri equivale a void.L’assenza del tipo equivale a int.E’ bene precisare sempre il tipo di parametro!

I parametri

I parametri possono essere passati alla funzione

• Per valore

Viene predisposta una nuova cella di memoria (parametro formale) e lì copiato il valore del parametro attuale. Qualunque modifica al parametro formale non viene percepita dal parametro attuale.

• Per riferimento

I parametri formali contengono l’indirizzo di memoria del parametro attuale. Si lavora quindi sulla variabile originaria, il cui valore può essere modificato.

Esempio: In Visual Basic si usa la parola chiave ByVal.

Esempio: In Visual Basic si usa la parola chiave ByRef. In C lo simuleremo con i puntatori.

I sottoprogrammi – passaggio per riferimento

Ricordiamo che i parametri possono essere passati alla funzione per riferimento.

In C++ il passaggio per riferimento viene simulato attraverso l’uso del & che indica l'indirizzo

I sottoprogrammi – passaggio per Valore

Esempio: Scrivere una procedura che restituisca la somma di due numeri ricevuti dal main.

void fun(int x, int y, &int z);

int main(){

int a,b, somma;cin<<a;

cin<<b;fun(a,b,somma);

cout>>somma;

retun 0;}

void fun(int x, int y, int &z)

{z=x+y;

}

I sottoprogrammi – passaggio per riferimento

2 3

a b

2

somma

3

5

5

x y

z

void fun(int x, int y, int &z){

z=x+y;}

void fun(int x, int y, &int z); int main()

{int a,b, somma;

cin<<a;

cin<<b;fun(a,b,somma);

cout>>somma;retun 0;

}

I sottoprogrammi – passaggio per valore

2 3

a b

2

somma

3

5

x y z

void fun(int x, int y, int z)

{

z=x+y;}

void fun(int x, int y, int z); int main()

{int a,b, somma;

cin<<a;cin<<b;

fun(a,b,somma);cout>>somma;

retun 0;}

5

I sottoprogrammi – passaggio per riferimento

Esempio: Scrivere una funzione che restituisca l’area ed il perimetro di un quadrato, il cui lato viene letto nel main.

I sottoprogrammi – passaggio per riferimento

main()

{int I=2,area, perimetro;

fun(l,area,perimetro);

cout<<”area=”<<area;

cout<<”perimetro”<<perimetro;}

void fun(int x, int &y, int &z)

{y=pow(x,2);

z=4*x;}

2

a area

2

perimetro

4 8

8

x

y z

4

I sottoprogrammi – passaggio per riferimentoscambio valori di due variabili

void fun(int x, int y );

main()

{int a=2, b=3;

fun(a,b);

cout<<a<<” “<<b;}

void fun(int x, int y)

{int aux;

aux=x; x=y; y=aux;}

2 3

a b

2

aux

3

2 3

x y

3 22

I sottoprogrammi – passaggio per riferimento scambio valori di due variabili

void fun(int *, int *);

main()

{int a=2, b=3;

fun(a,b);

cout<<a<<” “<<b;}

void fun(int &x, int &y)

{int aux;

aux=x; x=y; y=aux;}

2 3

a b

aux

3 2

x y 2

3 2

I sottoprogrammi – passaggio per riferimento

Il passaggio per riferimento si rende necessario quando

È opportuno effettuare un passaggio per valore quando l'informazione è solo di input per il sottoprogramma.

È opportuno effettuare un passaggio per indirizzo quando vogliamo la restituzione del valore del parametro formale (parametro di output), .

I sottoprogrammi – passaggio per riferimento● Le procedure devono comunicare con l'esterno

esclusivamente tramite parametri.

● Non si deve utilizzare un numero eccessivo di

parametri (se ciò dovesse accadere, forse sarebbe utile

rivedere la progettazione).

● Le procedure non devono utilizzare le variabili globali

e, in particolar modo, non devono modificarle

● Le procedure che risolvono un certo problema non

devono usare al loro interno istruzioni di input/output:

devono comunicare i dati solo attraverso i parametri.

● La gestione dell'input/output deve avvenire tramite

apposite procedure.