unità didattica funzioni in c++

36
Unità Didattica Funzioni in C++ Funzioni in C++ ITIS LATTANZIO Materia Informatica Materia Informatica

Upload: bruce-weiss

Post on 01-Jan-2016

254 views

Category:

Documents


15 download

DESCRIPTION

ITIS LATTANZIO Materia Informatica. Unità Didattica Funzioni in C++. Obiettivi. Acquisire ed essere in grado di individuare le parti che compongono un problema, scomponendolo in più sottoproblemi - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Unità Didattica Funzioni in C++

Unità DidatticaFunzioni in C++Funzioni in C++

ITIS LATTANZIOMateria Informatica Materia Informatica

Page 2: Unità Didattica Funzioni in C++

22

Acquisire ed essere in grado di individuare le Acquisire ed essere in grado di individuare le parti che compongono un problema, parti che compongono un problema, scomponendolo in più scomponendolo in più sottoproblemi sottoproblemi

Essere in grado di descrivere Essere in grado di descrivere dettagliatamente il lavoro svolto da ogni dettagliatamente il lavoro svolto da ogni parte in termini di parte in termini di inputinput, , elaborazioneelaborazione, , outputoutput

Essere in grado di implementare in C++ un Essere in grado di implementare in C++ un algoritmo che preveda algoritmo che preveda l’l’utilizzo delle utilizzo delle funzionifunzioni

ObiettiviObiettivi

Page 3: Unità Didattica Funzioni in C++

33

PrerequisitiPrerequisiti

Conoscere il Concetto di Algoritmo e Programma

Conoscere ed Interpretare il Formalismo Pseudo-Codice/Diagrammi a Blocchi

Conoscere le tre strutture di un Algoritmo e le corrispondenti istruzioni in C++ necessarie per implementarle

Conoscenze di Base della Struttura della memoria di un Calcolatore

Page 4: Unità Didattica Funzioni in C++

44

Supponiamo di dover far risolvere al computer il Supponiamo di dover far risolvere al computer il seguenteseguente

problema:problema:

Calcolare e visualizzare il quadratoCalcolare e visualizzare il quadrato

di un numero letto da tastieradi un numero letto da tastiera

La prima domanda da porsi è:La prima domanda da porsi è:

Quante parti compongono il problema?Quante parti compongono il problema?

Solitamente “le parti” sono le azioni da svolgere Solitamente “le parti” sono le azioni da svolgere per ottenere la soluzione. Nel nostro esempio:per ottenere la soluzione. Nel nostro esempio:

Leggere il numeroLeggere il numero Calcolare il quadratoCalcolare il quadrato Visualizzare il risultatoVisualizzare il risultato

Scomposizione in Scomposizione in sottoproblemisottoproblemi

Page 5: Unità Didattica Funzioni in C++

55

Diagramma di strutturaDiagramma di struttura

Calcolo del Calcolo del quadratoquadrato

Leggere il Leggere il numeronumero

Calcolare il Calcolare il quadratoquadrato

Far vedere Far vedere il risultatoil risultato

Rappresentiamo la scomposizione del problema con Rappresentiamo la scomposizione del problema con un grafico ad albero chiamato diagramma di un grafico ad albero chiamato diagramma di strutturastruttura

Page 6: Unità Didattica Funzioni in C++

66

Descrizione dettagliata delle Descrizione dettagliata delle parti che compongono il parti che compongono il

problemaproblemaE’ importante descrivere, per ogni singoloE’ importante descrivere, per ogni singolocompito,chi lo svolge, da dove vengono presi glicompito,chi lo svolge, da dove vengono presi gliinput e a chi viene restituito l’output.input e a chi viene restituito l’output.Alcuni dei compiti individuati possono essere svolti Alcuni dei compiti individuati possono essere svolti dal Main altri da sottoprogrammi diversi.dal Main altri da sottoprogrammi diversi.

LEGGERE IL NUMEROLEGGERE IL NUMERO:: questo lavoro viene svolto dal “Main” che legge da tastiera il numero questo lavoro viene svolto dal “Main” che legge da tastiera il numero

CALCOLARE IL QUADRATOCALCOLARE IL QUADRATO:: questo lavoro viene svolto dal sottoprogramma “Calcola quadrato” che questo lavoro viene svolto dal sottoprogramma “Calcola quadrato” che

riceve come parametro un numero, ne fa il quadrato e lo restituisce al riceve come parametro un numero, ne fa il quadrato e lo restituisce al mainmain

FAR VEDERE IL RISULTATOFAR VEDERE IL RISULTATO:: Questo lavoro viene svolto dal sottoprogramma “Visualizza output” Questo lavoro viene svolto dal sottoprogramma “Visualizza output”

che riceve come parametro un numero e lo visualizza sullo schermoche riceve come parametro un numero e lo visualizza sullo schermo

Page 7: Unità Didattica Funzioni in C++

77

In C i sottoprogrammi si chiamano FUNZIONI

Impariamo la sintassi di scrittura di una funzione

In un programma C, per ogni funzione, si deve scrivere:

IL PROTOTIPO:IL PROTOTIPO:SINTASSI:

tipo restituito NOME FUNZIONE (tipo e nome parametri) ;

LA CHIAMATA :LA CHIAMATA :SINTASSI:

NOME FUNZIONE (nome parametri)

LA DEFINIZIONE (o corpo della funzione):LA DEFINIZIONE (o corpo della funzione):SINTASSI:

- tipo restituito NOME FUNZIONE (tipo e nome parametri)- Istruzioni della funzione

Le funzioniLe funzioni

Page 8: Unità Didattica Funzioni in C++

88

float calcolaquadrato (float);float calcolaquadrato (float);

int main()

{float num, ris;

cout<<“digita un numero”; cin >> num; // legge il numero da tastiera

ris = calcolaquadrato (num);ris = calcolaquadrato (num);}

float calcolaquadrato (float a)float calcolaquadrato (float a)

{float q;{float q;

q=a*a;q=a*a;

return q;return q;

}}

PROTOTIPO

CHIAMATA

DEFINIZIONE

Funzione “calcolare il Funzione “calcolare il quadrato”quadrato”

valore restituitovalore restituito

parametrparametroo

Page 9: Unità Didattica Funzioni in C++

99

Vediamo cosa accade nella RAM e sullo schermo al momento

dell’esecuzione delle istruzioni

float calcolaquadrato(float);int main(){float num, ris;

cout<<“Digita un numero”;cin >> num; ris = calcolaquadrato(num);ris = calcolaquadrato(num);cout<<“Fine”;

}float calcolaquadrato(float a)float calcolaquadrato(float a){float q;{float q; q=a*a;q=a*a; return q;return q;}}

Funzione “calcolare il Funzione “calcolare il quadrato”quadrato”

Schermo

Digita un numero 3

Fine

RAM

MAIN FUNZIONE

num ris q a

3 39 9

Page 10: Unità Didattica Funzioni in C++

1010

Al momento della chiamata allafunzione il valore contenuto in numviene spostato in a.Esistono due aree distinte di

memoria,una nel main (num) e una nellafunzione (a).Abbiamo attuato il PASSAGGIO DIPARAMETRI PER VALORE.

In modo analogo il valore contenuto in

q viene spostato con l’istruzionereturn in ris. Anche in questo caso esistono duearee diverse di memoria, una per ilmain (ris) e una per la funzione (q).

Cosa abbiamo imparatoCosa abbiamo imparato

float calcolaquadrato(float);int main(){float num, ris;

cout<<“Digita un numero”;cin >> num;

ris = calcolaquadrato(num);ris = calcolaquadrato(num);cout<<“Fine”;

}

float calcolaquadrato(float a)float calcolaquadrato(float a)

{float q;{float q;

q=a*a;q=a*a;

return q;return q;

}}

Page 11: Unità Didattica Funzioni in C++

1111

IlIl parametro parametro è l’area di memoria che contiene il valore è l’area di memoria che contiene il valore che la funzione usa per svolgere il suo lavoro.che la funzione usa per svolgere il suo lavoro.I parametri sono di due tipi:I parametri sono di due tipi: formali: quelli indicati nel prototipo e nella quelli indicati nel prototipo e nella definizione della funzionedefinizione della funzione

attuali: quelli indicati nella chiamata della quelli indicati nella chiamata della funzionefunzione

float calcolaquadrato (float calcolaquadrato (floatfloat););int main(){…..ris = calcolaquadrato (ris = calcolaquadrato (num););….}float calcolaquadrato (float calcolaquadrato (float afloat a)){{……..}}

I parametriI parametri

parametri parametri formaliformali

parametri parametri attualiattuali

Page 12: Unità Didattica Funzioni in C++

1212

I parametriI parametri La funzione “calcolare quadrato” riceve

come parametro un numero di cui calcolare il quadrato.

Quali sono i parametri della funzione “visualizza output ?”

Supponiamo di avere una funzione che calcola l’area di un triangolo. Quali sono i parametri di questa funzione?

Page 13: Unità Didattica Funzioni in C++

1313

Il risultato del lavoro svolto da una funzione è unvalore che la funzione può restituire o no al “chiamante”.

Nel primo caso parliamo di funzione con valore restituito,

nel secondo caso parliamo di mancanza di valorerestituito (void).

La funzione “calcolare quadrato” restituisce il quadrato che La funzione “calcolare quadrato” restituisce il quadrato che ha calcolato.ha calcolato.

La funzione “visualizzare risultato” non restituisce nulla alLa funzione “visualizzare risultato” non restituisce nulla al““chiamante”.chiamante”.

Il tipo restituitoIl tipo restituito

Page 14: Unità Didattica Funzioni in C++

1414

Una differenza importanteUna differenza importanteSe la funzione non ha valore restituito cambia l’istruzione di chiamata.Prendendo sempre lo stesso esempio di CALCOLO DEL QUADRATO, vediamo

come si sviluppa la funzione visualizza output

float calcolaquadrato (float);float calcolaquadrato (float);

void visualizzaoutput (float);void visualizzaoutput (float);

int main()int main()

{float num, ris;{float num, ris;

cout<<“Digita un numero”;cout<<“Digita un numero”;

cin >> num; cin >> num;

ris = calcolaquadrato (num);ris = calcolaquadrato (num);

visualizzaoutput (ris);visualizzaoutput (ris);

}}

float calcolaquadrato(float a)float calcolaquadrato(float a)

{float q;{float q;

q=a*a;q=a*a;

return q;return q;

}}

void visualizzaoutput (float b)void visualizzaoutput (float b)

{cout<<“\nil risultato è”;{cout<<“\nil risultato è”;

cout<<b;cout<<b;

}}

PROTOTIPOPROTOTIPO

CHIAMATACHIAMATA

DEFINIZIONEDEFINIZIONE

Page 15: Unità Didattica Funzioni in C++

1515

Diagramma a blocchi per le funzioniDiagramma a blocchi per le funzioni

Le funzioni si rappresentano nel diagramma a blocchi con un rettangolo

con doppie righe verticali. Nel rettangolo si scrive l’istruzione di

“chiamata della funzione”, come indicato di seguito:se la funzione è void:

se la funzione ha valore restituito:se la funzione ha valore restituito:

Il diagramma a blocchi del main diventa quindi:Il diagramma a blocchi del main diventa quindi:

visualizzaoutput(risvisualizzaoutput(ris))

risriscalcolaquadrato(num)calcolaquadrato(num)

Page 16: Unità Didattica Funzioni in C++

1616

Diagramma a blocchiDiagramma a blocchi

Nel diagramma a blocchi del main si scrivono i nomi delle variabili che poi saranno utilizzati nel programma sorgente. Per ogni funzione si può quindi sviluppare un proprio diagramma a blocchi.

riscalcolaquadrato(num)

visualizzaoutput(ris)

fine

inizio

float calcolaquadrato(float);void visualizzaoutput(float);void main(){float num, ris;

cout<<“Digita un numero”;cin >> num; ris = calcolaquadrato(num);ris = calcolaquadrato(num);visualizzaoutput(ris);visualizzaoutput(ris);

}float calcolaquadrato(float a)float calcolaquadrato(float a){float q;{float q; q=a*a;q=a*a; return q;return q;}}void visualizzaoutput (float b)void visualizzaoutput (float b){ { cout<<“il quadrato del numero cout<<“il quadrato del numero

è”<<b;è”<<b;}}

Leggi num

Page 17: Unità Didattica Funzioni in C++

1717

Supponiamo ora di dover risolvere il seguente problema:

Calcolare e visualizzare la radice quadrata di un numero letto da Calcolare e visualizzare la radice quadrata di un numero letto da tastieratastiera

controllando prima che sia positivocontrollando prima che sia positivo

Provate a disegnare il diagramma di struttura, il diagramma a blocchi e il

programma in C++

SoluzioneSoluzione EserciziEsercizi Passaggio parametri per indirizzoPassaggio parametri per indirizzo

ESERCIZIO 1ESERCIZIO 1

Page 18: Unità Didattica Funzioni in C++

1818

ESERCIZIO 2Dati due numeri eseguire la moltiplicazione e la divisione evisualizzare i risultati.

Soluzione

ESERCIZIO 3Scrivere un programma che tramite l’uso di un menù permetta di eseguire il quadrato, il cubo e la radice quadrata di un numero

fornito ininput.

ESERCIZIO 4In un supermercato il prezzo del prodotto è legato alla quantità:

se sicomperano tre prodotti dello stesso tipo uno è in regalo, se sicomperano uno o due prodotti non c’è regalo. Calcolare il prezzo

dapagare per un prodotto del quale si inseriscono da tastiera il

prezzounitario e la quantità.

Soluzione

Page 19: Unità Didattica Funzioni in C++

1919

SOLUZIONE ESERCIZIO 1:diagramma di SOLUZIONE ESERCIZIO 1:diagramma di strutturastruttura

Calcolo della Calcolo della radice radice

quadrataquadrata

• Leggere il numero e controllare che sia Leggere il numero e controllare che sia positivopositivo• Calcolare la radice quadrataCalcolare la radice quadrata• Visualizzare il risultatoVisualizzare il risultato

Leggere e Leggere e controllare il controllare il numeronumero

Calcolare Calcolare la radicela radice

VisualizzarVisualizzare il e il risultatorisultato

Page 20: Unità Didattica Funzioni in C++

2020

SOLUZIONE ESERCIZIO 1: descrizione dettagliataSOLUZIONE ESERCIZIO 1: descrizione dettagliata

LEGGERE E CONTROLLARE IL NUMEROLEGGERE E CONTROLLARE IL NUMERO::questo lavoro viene svolto dalla funzione “Main” che legge da questo lavoro viene svolto dalla funzione “Main” che legge da

tastiera il numero e controlla che il numero sia >0tastiera il numero e controlla che il numero sia >0

CALCOLARE LA RADICECALCOLARE LA RADICE::questo lavoro viene svolto dalla funzione “Calcola radice” che questo lavoro viene svolto dalla funzione “Calcola radice” che riceve come parametro il numero, ne calcola la radice quadrata e la riceve come parametro il numero, ne calcola la radice quadrata e la restituisce al mainrestituisce al main

FAR VEDERE IL RISULTATOFAR VEDERE IL RISULTATO::Questo lavoro viene svolto dalla funzione “Visualizza output” che Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve come parametro il numero e lo visualizza sullo schermoriceve come parametro il numero e lo visualizza sullo schermo

Page 21: Unità Didattica Funzioni in C++

V

2121

SOLUZIONE ESERCIZIO 1: diagramma a SOLUZIONE ESERCIZIO 1: diagramma a blocchi e programmablocchi e programma

leggi num

1 1) mentre num < 0

riscalcolaradice(num)

visualizzaoutput(ris)

inizio

fine

float calcolaradice(float);float calcolaradice(float);void visualizzaoutput (float);void visualizzaoutput (float);int main()int main(){float num, ris;{float num, ris; dodo

{{cout<<“digita un cout<<“digita un numero”;numero”;cin >> num; cin >> num; } while (num<0);} while (num<0);

ris = calcolaradice(num);ris = calcolaradice(num); visualizzaoutput(ris);visualizzaoutput(ris);}}float calcolaradice(float a)float calcolaradice(float a){float q;{float q; q=sqrt(a);q=sqrt(a); return q;return q;}}void visualizzaoutput (float void visualizzaoutput (float

b)b){cout<<“\nil risultato è”;{cout<<“\nil risultato è”; cout<<b;cout<<b;} }

Torna indietroTorna indietro

F

Page 22: Unità Didattica Funzioni in C++

2222

SOLUZIONE ESERCIZIO 2: diagramma di SOLUZIONE ESERCIZIO 2: diagramma di strutturastruttura

Prodotto e divisione Prodotto e divisione di due numeridi due numeri

leggere leggere i i numerinumeri

calcolare calcolare il il prodottoprodotto

calcolare calcolare la la divisionedivisione

visualizzarvisualizzare outpute output

controllarcontrollare inpute input

Page 23: Unità Didattica Funzioni in C++

2323

SOLUZIONE ESERCIZIO 2: descrizione dettagliataSOLUZIONE ESERCIZIO 2: descrizione dettagliata

LEGGERE I NUMERI:LEGGERE I NUMERI:questo lavoro viene svolto dalla funzione “Main” che legge da questo lavoro viene svolto dalla funzione “Main” che legge da tastiera due numeritastiera due numeriFARE IL PRODOTTOFARE IL PRODOTTO::questo lavoro viene svolto dalla funzione “Calcola prodotto” che questo lavoro viene svolto dalla funzione “Calcola prodotto” che riceve come parametri i numeri, ne fa il prodotto e lo restituisce riceve come parametri i numeri, ne fa il prodotto e lo restituisce al mainal mainCONTROLLARE INPUT:CONTROLLARE INPUT:questo lavoro viene svolto dalla funzione “Main” che, prima di questo lavoro viene svolto dalla funzione “Main” che, prima di chiamare la funzione “Calcola divisione”, controlla che il secondo chiamare la funzione “Calcola divisione”, controlla che il secondo numero digitato sia diverso da zeronumero digitato sia diverso da zeroFARE LA DIVISIONE:FARE LA DIVISIONE:questo lavoro viene svolto dalla funzione “Calcola divisione” che questo lavoro viene svolto dalla funzione “Calcola divisione” che riceve come parametri i numeri, ne fa la divisione e la restituisce riceve come parametri i numeri, ne fa la divisione e la restituisce al mainal mainFAR VEDERE IL RISULTATOFAR VEDERE IL RISULTATO::Questo lavoro viene svolto dalla funzione “Visualizza output” che Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve come parametro un numero e lo visualizza sullo schermoriceve come parametro un numero e lo visualizza sullo schermo

Page 24: Unità Didattica Funzioni in C++

2424

ATTENZIONE:ATTENZIONE:

Si realizzaSi realizza UNA SOLA FUNZIONEUNA SOLA FUNZIONE “Visualizza “Visualizza output” che verrà chiamata due volte nel main.output” che verrà chiamata due volte nel main.

Il compito della funzione “visualizza output” è Il compito della funzione “visualizza output” è sempre lo stesso indipendentemente dal sempre lo stesso indipendentemente dal significato del numero che deve mostrare sullo significato del numero che deve mostrare sullo schermo. schermo.

Nel nostro esempio il numero da far vedere è Nel nostro esempio il numero da far vedere è una volta il risultato di una moltiplicazione ed una volta il risultato di una moltiplicazione ed una volta il risultato di una divisione, ma il una volta il risultato di una divisione, ma il compito della funzione non cambia.compito della funzione non cambia.

Page 25: Unità Didattica Funzioni in C++

2525

SOLUZIONE ESERCIZIO 2SOLUZIONE ESERCIZIO 2

leggi num1,num2

visualizzaoutput(p)

inizio

fine

float calcolaprodotto(float,float);float calcolaprodotto(float,float);float calcoladivisione(float,float);float calcoladivisione(float,float);void visualizzaoutput (float);void visualizzaoutput (float);int main()int main(){float num1, num2,p,d;{float num1, num2,p,d; cout<<“digita il primo numero”;cout<<“digita il primo numero”; cin >> num1; cin >> num1; cout<<“digita il secondonumero”;cout<<“digita il secondonumero”; cin >> num2; cin >> num2; p = calcolaprodotto(num1,num2);p = calcolaprodotto(num1,num2); cout << “il risultato della cout << “il risultato della

moltiplicazione e’”;moltiplicazione e’”; visualizzaoutput(p);visualizzaoutput(p); if (num2!=0)if (num2!=0) { d=calcoladivisione(num1,num2);{ d=calcoladivisione(num1,num2); cout << “il risultato della divisione cout << “il risultato della divisione

e”;e”; visualizzaoutput(d);visualizzaoutput(d); }} elseelse cout<<“divisione non possibile”; cout<<“divisione non possibile”; }}float calcolaprodotto(float n1,float n2)float calcolaprodotto(float n1,float n2){float r;{float r; r=n1*n2;r=n1*n2; return r;return r;}}float calcoladivisione(float n1,float n2)float calcoladivisione(float n1,float n2){float r;{float r; r=n1/n2;r=n1/n2; return r;return r;}}void visualizzaoutput (float b)void visualizzaoutput (float b){ cout<<b;{ cout<<b;} }

pcalcolaprodotto(num1,num2)

dcalcoladivisioneo(num1,num2)

visualizzaoutput(d)

Scrivi “divisione

non possibile”

num2≠0?

Torna indietroTorna indietro

VF

Page 26: Unità Didattica Funzioni in C++

2626

SOLUZIONE ESERCIZIO 4: diagramma di SOLUZIONE ESERCIZIO 4: diagramma di strutturastruttura

Calcolo prezzo Calcolo prezzo da pagareda pagare

leggere leggere quantitquantità e à e prezzoprezzo

calcolare calcolare i pezzi i pezzi gratisgratis

calcolare calcolare la spesala spesa

visualizzarvisualizzare outpute output

calcolare calcolare i pezzi da i pezzi da pagarepagare

Page 27: Unità Didattica Funzioni in C++

2727

SOLUZIONE ESERCIZIO 4: descrizione dettagliataSOLUZIONE ESERCIZIO 4: descrizione dettagliata

LEGGERE QUANTITA’ E PREZZO UNITARIO:LEGGERE QUANTITA’ E PREZZO UNITARIO:questo lavoro viene svolto dalla funzione “Main” che legge da questo lavoro viene svolto dalla funzione “Main” che legge da tastiera la quantità acquistata (di un prodotto) ed il prezzo tastiera la quantità acquistata (di un prodotto) ed il prezzo unitariounitarioCALCOLARE I PEZZI GRATISCALCOLARE I PEZZI GRATIS::questo lavoro viene svolto dalla funzione “Calcola regalo” che questo lavoro viene svolto dalla funzione “Calcola regalo” che riceve come parametro la quantità acquistata, calcola la quantità riceve come parametro la quantità acquistata, calcola la quantità che viene regalata e la restituisce al mainche viene regalata e la restituisce al mainCALCOLA I PEZZI DA PAGARE:CALCOLA I PEZZI DA PAGARE:questo lavoro viene svolto dalla funzione “Main” che SOTTRAE questo lavoro viene svolto dalla funzione “Main” che SOTTRAE dalla quantità acquistata la quantità che viene regalata.dalla quantità acquistata la quantità che viene regalata.CALCOLARE LA SPESA:CALCOLARE LA SPESA:questo lavoro viene svolto dalla funzione “Calcola spesa” che questo lavoro viene svolto dalla funzione “Calcola spesa” che riceve come parametri quantità e prezzo unitario,li moltiplica e li riceve come parametri quantità e prezzo unitario,li moltiplica e li restituisce al mainrestituisce al mainFAR VEDERE IL RISULTATOFAR VEDERE IL RISULTATO::Questo lavoro viene svolto dalla funzione “Visualizza output” che Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve come parametro il prezzo da pagare e lo visualizza sullo riceve come parametro il prezzo da pagare e lo visualizza sullo schermoschermo

Page 28: Unità Didattica Funzioni in C++

2828

SOLUZIONE ESERCIZIO 4: diagramma a SOLUZIONE ESERCIZIO 4: diagramma a blocchi e programmablocchi e programma

leggi qta, pr_un

qta_da_pagareqta - reg

visualizzaoutput(spe)

inizio

fine

int calcolaregalo(int);int calcolaregalo(int);float calcolaspesa(int,float);float calcolaspesa(int,float);void visualizzaoutput (float);void visualizzaoutput (float);int main()int main(){float pr_un, spe;{float pr_un, spe; int reg, qta, qta_da_pagare;int reg, qta, qta_da_pagare; cout<<“digita la qta da acquistare”;cout<<“digita la qta da acquistare”; cin >> qta; cin >> qta; cout<<“digita il prezzo unitario”;cout<<“digita il prezzo unitario”; cin >> pr_un; cin >> pr_un; reg= calcolaregalo(qta);reg= calcolaregalo(qta); qta_da_pagare=qta – reg;qta_da_pagare=qta – reg; spe=calcolaspesa(qta_da_pagare, spe=calcolaspesa(qta_da_pagare,

pr_un);pr_un); visualizzaoutput(spe);visualizzaoutput(spe); }}int calcolaregalo(int q)int calcolaregalo(int q){int r;{int r; r=q/3;r=q/3; return r;return r;}}float calcolaspesa(int q,float p)float calcolaspesa(int q,float p){float r;{float r; r=q * p;r=q * p; return r;return r;}}void visualizzaoutput (float b)void visualizzaoutput (float b){ cout<<“il prezzo da pagare e’ “<< { cout<<“il prezzo da pagare e’ “<<

b;b;} }

regcalcolaregalo(qta)

specalcolaspesa(qta_da_pagare, pr_un)

Torna indietroTorna indietro

Page 29: Unità Didattica Funzioni in C++

2929

Il passaggio di parametri per indirizzo (o per riferimento) passa alla funzione l’indirizzo di memoria del parametro anziché il valore.Non ci sono quindi variabili distinte, una nel main ed una nella funzione,ma la funzione opera sulla stessa area di memoria del main.

In C gli indirizzi di memoria sono contenuti nelle variabili puntatori

La sintassi di dichiarazione di un puntatore è:La sintassi di dichiarazione di un puntatore è:

tipo della variabile puntata * NOME PUNTATOREtipo della variabile puntata * NOME PUNTATORE

p.e.: int * punt dichiara la variabile di nome p.e.: int * punt dichiara la variabile di nome puntpunt

che contiene l’indirizzo di una che contiene l’indirizzo di una variabile interavariabile intera

Viceversa data la variabile intera a per sapere qual è l’indirizzo di memoriadi a si usa l’operatore &.

Passaggio di parametri per indirizzoPassaggio di parametri per indirizzo

Page 30: Unità Didattica Funzioni in C++

3030

Passaggio di parametri per indirizzoPassaggio di parametri per indirizzo

Osserviamo le istruzioni seguenti:Osserviamo le istruzioni seguenti:

int a;int a;

a=5;a=5;

cout <<“a vale”<<a;cout <<“a vale”<<a;

cout <<“indirizzo di a vale”<<&a;cout <<“indirizzo di a vale”<<&a;

Sullo schermo viene prodotto:Sullo schermo viene prodotto: a vale 5a vale 5

indirizzo di a vale indirizzo di a vale indirizzo della var. indirizzo della var. aa

L’operatore * si usa anche per sapere quale è il valore di una variabile L’operatore * si usa anche per sapere quale è il valore di una variabile di cuidi cui

conosciamo l’indirizzo.conosciamo l’indirizzo.

Osserviamo le istruzioni Osserviamo le istruzioni seguenti:seguenti:

int * punt; // dichiarazione int * punt; // dichiarazione del del // puntatore // puntatore puntpunt

a=5;a=5;

punt = &apunt = &a

cout <<“a vale”<<* punt; cout <<“a vale”<<* punt;

Sullo schermo viene prodotto:Sullo schermo viene prodotto:

a vale 5a vale 5

ottenuto con l’istruzione *punt ottenuto con l’istruzione *punt

Page 31: Unità Didattica Funzioni in C++

3131

Passaggio di parametri per indirizzoPassaggio di parametri per indirizzoVediamo il seguente esempio in cui lafunzione “aggiungi” aggiunge 1 ai dueparametri ricevuti. Il primo parametro

vienepassato per valore il secondo per

indirizzo.

void aggiungi(int, int &);void aggiungi(int, int &);

int main()int main()

{{ int a,b;int a,b;

a=0;a=0;

b=5; b=5;

aggiungi(a, b);aggiungi(a, b);

cout<<“nel main a vale”<<a;cout<<“nel main a vale”<<a;

cout<<“nel main b vale”<<b;cout<<“nel main b vale”<<b;

}}void aggiungi(int x, int &y)void aggiungi(int x, int &y){x++;{x++; y++;y++; cout<<“nella funzione x vale”<<x;cout<<“nella funzione x vale”<<x; cout<<“nella funzione y vale”<<y;cout<<“nella funzione y vale”<<y; }}

RAMRAM

MAINMAIN FUNZIONEFUNZIONE

aa bb xx yy

Schermo

00 5 5 00

1166

nella funzione: x vale 1nella funzione: x vale 1

nella funzione: y vale 6nella funzione: y vale 6

nel main: a vale 0nel main: a vale 0

nel main: b vale 6nel main: b vale 6

// //

Page 32: Unità Didattica Funzioni in C++

3232

/* Scambio del valore di due variabili mediante /* Scambio del valore di due variabili mediante valore valore */*/#include <iostream>#include <iostream>using namespace std;using namespace std;/* x e y sono dichiarate come due reference a variabili di tipo float */

void Scambio(float , float ); void Scambio(float , float ); // prototipo

int main()int main(){{ float var1 = 3.14, var2 = 1.41;float var1 = 3.14, var2 = 1.41; // variabili locali cout << "Prima dello scambio: var1 = " << var1 << " var2 = " << var2 << endl;cout << "Prima dello scambio: var1 = " << var1 << " var2 = " << var2 << endl; // A Scambio sono passati gli indirizzi a var1 e var2

Scambio (var1, var2); Scambio (var1, var2); // chiamata di funzione cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << endl;cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << endl;}}

// Funzione Scambio che effettua lo scambiovoid Scambio(float x, float y)void Scambio(float x, float y){{ float temp = x;float temp = x; x = y;x = y; y = temp;y = temp;}}

Passaggio di parametri per valorePassaggio di parametri per valore

RAMRAM

MAINMAIN FUNZIONEFUNZIONE

var1var1 var2var2 xx yy

00 5 5 00

1166// //

Page 33: Unità Didattica Funzioni in C++

3333

/* Scambio del valore di due variabili mediante /* Scambio del valore di due variabili mediante indirizzoindirizzo */ */#include <iostream>#include <iostream>using namespace std;using namespace std;/* x e y sono dichiarate come due reference a variabili di tipo float */

void Scambio(float &, float &); void Scambio(float &, float &); // prototipo

int main()int main(){{ float var1 = 3.14, var2 = 1.41;float var1 = 3.14, var2 = 1.41; // variabili locali cout << "Prima dello scambio: var1 = " << var1 << " var2 = " << var2 << endl;cout << "Prima dello scambio: var1 = " << var1 << " var2 = " << var2 << endl; // A Scambio sono passati gli indirizzi a var1 e var2

Scambio (var1, var2); Scambio (var1, var2); // chiamata di funzione cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << endl;cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << endl;}}

// Funzione Scambio che effettua lo scambiovoid Scambio(float &x, float &y)void Scambio(float &x, float &y){{ float temp = x;float temp = x; x = y;x = y; y = temp;y = temp;}}

Passaggio di parametri per indirizzoPassaggio di parametri per indirizzo

Page 34: Unità Didattica Funzioni in C++

3434

Passaggio di parametri con i vettoriPassaggio di parametri con i vettori

Risolviamo il seguente problema:Risolviamo il seguente problema:

Date le altezze di 30 alunni di una classe, calcolare l’altezza Date le altezze di 30 alunni di una classe, calcolare l’altezza media emedia e

stabilire quanti sono gli alunni che superano la mediastabilire quanti sono gli alunni che superano la media

Nel caso dei vettori l’indirizzo di memoria in cui il vettore è Nel caso dei vettori l’indirizzo di memoria in cui il vettore è allocato è indicato con il nome del vettore. allocato è indicato con il nome del vettore.

Non c’è bisogno quindi di dichiarare puntatori.Non c’è bisogno quindi di dichiarare puntatori.

Nel caso dei vettori il Nel caso dei vettori il passaggio di parametri per indirizzo è è l’unico utilizzabilel’unico utilizzabile

Page 35: Unità Didattica Funzioni in C++

3535

SOLUZIONE SOLUZIONE ESERCIZIOESERCIZIO: diagramma di : diagramma di strutturastruttura

Altezze degli alunniAltezze degli alunnidi una classedi una classe

Inserire le Inserire le altezze in un altezze in un vettorevettore

Calcolare Calcolare la media la media delle delle altezzealtezze

Contare Contare quanti quanti alunni alunni superano la superano la mediamedia

Page 36: Unità Didattica Funzioni in C++

3636

// prototipi delle funzioni// prototipi delle funzioni

void inserisci(int v[],int);void inserisci(int v[],int);

float calcolamedia(int v[],int);float calcolamedia(int v[],int);

void contaaltezze(int v[],int,float);void contaaltezze(int v[],int,float);

int main()int main(){ { int const max=30;int const max=30;int vett[max];int vett[max];float media;float media;inserisci(vett,max);inserisci(vett,max);media=calcolamedia(vett,max);media=calcolamedia(vett,max);contaaltezze(vett,max,media);contaaltezze(vett,max,media);}}

void inserisci(int v[],int dim) // carico il void inserisci(int v[],int dim) // carico il vettorevettore

{{

for (int i=0;i<dim;i++)for (int i=0;i<dim;i++)

{cout<<"\ndigita un elemento del vettore {cout<<"\ndigita un elemento del vettore ";";

cin>>v[i];cin>>v[i];

}}}}

float calcolamedia(int v[],int dim) float calcolamedia(int v[],int dim) //calcolo la media//calcolo la media

{float s,m;{float s,m;

for (int i=0;i<dim;i++)for (int i=0;i<dim;i++)

s=s+v[i];s=s+v[i];

m=s/dim;m=s/dim;

cout<<"\nla media e' "<<m;cout<<"\nla media e' "<<m;

return m;return m;

}}

void contaaltezze(int v[],int dim,float void contaaltezze(int v[],int dim,float m) //calcolo le altezzem) //calcolo le altezze

{int conta=0;{int conta=0;

for (int i=0;i<dim;i++)for (int i=0;i<dim;i++)

{ {

if (v[i]>m)if (v[i]>m)

conta++;conta++;

}}

cout<<"\ngli alunni che superano la cout<<"\ngli alunni che superano la media sono "<<conta;media sono "<<conta;

}}

SOLUZIONE ESERCIZIO: programmaSOLUZIONE ESERCIZIO: programma