Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
I SOTTOPROGRAMMI
2
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.
3
Approccio Top-down Scrivere un algoritmo per la preparazione di un pasto completo: 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. Apparecchiare la tavola Preparare l’antipasto Preparare il primo Preparare il secondo Preparare il dolce
4
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
5
Preparare cena Preparare antipasto Preparare primo Preparare secondo Preparare dolci Preparare digestivo Preparare pasta Preparare sugo … …
6
Approccio Top-down Problema Sottoproblema 1 Sottoproblema 2 …
7
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
8
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.
9
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
10
I Sottoprogrammi I sottoprogrammi consentono di Astrarre Occupare meno memoria Riusare il codice Migliorare la leggibilità del codice.
11
NON è conveniente creare sottoprogrammi quando:
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.
12
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
13
Le procedure e le funzioni
I sottoprogrammi si suddividono in procedure e funzioni. Entrambe sono deputate alla risoluzione di uno specifico problema ma le funzioni restituiscono un risultato al programma chiamante, che può essere assegnato ad una variabile o usato in una espressione. Esempio: In Visual Basic le procedure si dichiarano mediante la parola chiave Sub e le funzioni mediante la parola chiave Function.
14
Nel linguaggio C i sottoprogrammi si definiscono come:
I sottoprogrammi in C Nel linguaggio C i sottoprogrammi si definiscono come: tipo_valore_di_ritorno nome (parametro1, … ) {dichiarazione variabili; elenco istruzioni return (valore di ritorno);} Per le procedure è void. Il default è int. Identificatore della funzione tipo parametro nome parametro
15
#include <stdio.h> int fun(int a, int b) {int c; c=a+b;
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 Sottoprogramma principale Chiamata alla funzione
16
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 Prototipo della funzione Sottoprogramma principale Chiamata alla funzione Definizione della funzione
17
#include <stdio.h> int fun(int a, int b) {int c; c=a+b;
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); …} L’assenza di parametri equivale a void. L’assenza del tipo equivale a int. E’ bene precisare sempre il tipo di parametro! Parametri formali Parametri attuali Devono rispettare numero, ordine e tipo dei parametri formali
18
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
19
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/C++ lo realizzeremo con i puntatori.
20
Passaggio dei parametri per riferimento in C++
#include <iostreamh> fun(int a, int b, int &s) {s=a+b;} main () {… fun(p,q, somma); …} p q somma 2 4 a b s 2 4
21
Esempi Il main è una funzione del tipo int main(void) main () int è sottointeso La funzione pow è del tipo double pow(double, double)
22
Esempi printf è una funzione che riceve un parametro per valore. scanf è una funzione che riceve un parametro per riferimento. Entrambe restituiscono un intero 0 in caso di errore ≠0 in caso di esecuzione corretta
23
Esecuzione dei sottoprogrammi
Fun1 INIZIO … Fun1.1 FINE Fun1.1 INIZIO … FINE Programma principale INIZIO … Fun1 Fun2 FINE Quando 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. Fun2 INIZIO … FINE
24
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.
25
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.
26
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.
27
Visibilità delle variabili
#include <stdio.h> int somma; int fun(int,int); main () int fun(int a, int b) {int p.q; {int c; … c=a+b; somma=fun(p,q); return (c);} …} Variabile globale Variabili locali
28
Visibilità delle variabili
#include <stdio.h> int somma; void fun(int,int); main () void fun(int a, int b) {int p.q; { … somma=a+b; fun(p,q); } …} Variabile globale Variabili locali
29
Visibilità delle variabili
Lo spazio di memoria viene allocato al momento della chiamata della funzione e liberato al momento della return. int calcolo(int); main() {int n=2,s; s=calcolo(n); printf(‘‘s=%d n=%d’’,s,n); } n s s 2 3 2 int calcolo(int n) {int s=0; for(;n>0;n--) s=s+n; return s;} 1 2 3 s=3 n=2
30
#include <stdio.h> int somma=3; main () {int somma; somma=5; …}
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à. #include <stdio.h> int somma=3; main () {int somma; somma=5; …} 3 5
31
Lo shadowing #include <stdio.h> int somma=3; void fun(void); main () void fun(void) {int somma=5; {printf(‘‘%d’’,somma);} printf(‘‘%d’’,somma); fun();} 5 3 Se si usano variabili globali è bene usare identificatori diversi per variabili globali e locali.
32
Visibilità dei sottoprogrammi
Il prototipo della funzione può essere collocato dopo le direttive al preprocessore (ambiente globale) in questo caso la funzione è visibile ovunque e può essere chiamata da qualunque altra funzione. dentro una funzione (ambiente locale) in questo caso la funzione è visibile solo all’interno della funzione in cui è stata dichiarata e può essere chiamata solo in quell’ambito. Per ottenere riusabilità ed astrazione è bene che le funzioni siano dichiarate globali.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.