unità didattica funzioni in c++ itis lattanzio materia informatica
TRANSCRIPT
Unità DidatticaFunzioni in C++Funzioni in C++
ITIS LATTANZIOMateria Informatica Materia Informatica
22
Acquisire ed essere in grado di individuare le parti che compongono Acquisire ed essere in grado di individuare le parti che compongono un problema, scomponendolo in più sottoproblemi un problema, scomponendolo in più sottoproblemi
Essere in grado di descrivere dettagliatamente il lavoro svolto da ogni Essere in grado di descrivere dettagliatamente il lavoro svolto da ogni parte in termini di input, elaborazione, outputparte in termini di input, elaborazione, output
Essere in grado di implementare in C++ un algoritmo che preveda Essere in grado di implementare in C++ un algoritmo che preveda l’utilizzo delle funzionil’utilizzo delle funzioni
ObiettiviObiettivi
33
PrerequisitiPrerequisiti
Conoscere il Concetto di Algoritmo e ProgrammaConoscere il Concetto di Algoritmo e Programma
Conoscere ed Interpretare il Formalismo Pseudo-Codice/Diagrammi a Conoscere ed Interpretare il Formalismo Pseudo-Codice/Diagrammi a BlocchiBlocchi
Conoscere le tre strutture di un Algoritmo e le corrispondenti istruzioni Conoscere le tre strutture di un Algoritmo e le corrispondenti istruzioni in C++ necessarie per implementarlein C++ necessarie per implementarle
Conoscenze di Base della Struttura della memoria di un CalcolatoreConoscenze di Base della Struttura della memoria di un Calcolatore
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
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
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
77
In C i sottoprogrammi si chiamano FUNZIONIIn C i sottoprogrammi si chiamano FUNZIONI
Impariamo la Impariamo la sintassi di scritturasintassi di scrittura di una funzione di una funzione
In un programma C, per ogni funzione, si deve scrivere:In un programma C, per ogni funzione, si deve scrivere:
IL PROTOTIPO:IL PROTOTIPO:SINTASSI:SINTASSI:
tipo restituitotipo restituito NOME FUNZIONE NOME FUNZIONE (parametri)(parametri)
LA CHIAMATA :LA CHIAMATA :SINTASSI:SINTASSI:
NOME FUNZIONE NOME FUNZIONE (parametri)(parametri)
LA DEFINIZIONE (o corpo della funzione):LA DEFINIZIONE (o corpo della funzione):SINTASSI:SINTASSI:
- tipo restituito- tipo restituito NOME FUNZIONE NOME FUNZIONE (parametri)(parametri)- Istruzioni della funzione- Istruzioni della funzione
Le funzioniLe funzioni
88
float calcolaquadrato(float);float calcolaquadrato(float);
int main()int main()
{float num, ris;{float num, ris;
cout<<“digita un numero”; cout<<“digita un numero”;
cin >> num; cin >> num; // legge il numero da tastiera // 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
99
Vediamo cosa accade nella RAM e sullo schermo al Vediamo cosa accade nella RAM e sullo schermo al momentomomento
dell’esecuzione delle istruzionidell’esecuzione delle istruzioni
float calcolaquadrato(float);float calcolaquadrato(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);cout<<“Fine”;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
RAMRAM
MAINMAIN FUNZIONEFUNZIONE
numnum risris qq aa
33 3399 99
1010
Al momento della Al momento della chiamata allachiamata alla
funzionefunzione il valore contenuto in num il valore contenuto in num
viene spostato in a.viene spostato in a.
Esistono due aree distinte di Esistono due aree distinte di memoria,memoria,
una nel main (num) e una nellauna nel main (num) e una nella
funzione (a).funzione (a).
Abbiamo attuato il PASSAGGIO DIAbbiamo attuato il PASSAGGIO DI
PARAMETRI PER VALORE.PARAMETRI PER VALORE.
In modo analogo il valore contenuto In modo analogo il valore contenuto inin
q viene spostato q viene spostato con l’istruzionecon l’istruzione
returnreturn in ris. in ris.
Anche in questo caso esistono dueAnche in questo caso esistono due
aree diverse di memoria, una per ilaree diverse di memoria, una per il
main (ris) e una per la funzione (q). main (ris) e una per la funzione (q).
Cosa abbiamo imparatoCosa abbiamo imparato
float calcolaquadrato(float);float calcolaquadrato(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);
cout<<“Fine”;cout<<“Fine”;
}}
float calcolaquadrato(float a)float calcolaquadrato(float a)
{float q;{float q;
q=a*a;q=a*a;
return q;return q;
}}
1111
Il parametro è l’area di memoria che contiene il Il parametro è l’area di memoria che contiene il valore che la funzione usa per svolgere il suo lavoro.valore che la funzione usa per svolgere il suo lavoro.I parametri sono di due tipi:I parametri sono di due tipi: formali: formali: quelli indicati nel prototipo e nella quelli indicati nel prototipo e nella definizione della funzionedefinizione della funzione
attuali: attuali: quelli indicati nella chiamata della quelli indicati nella chiamata della funzionefunzione
float calcolaquadrato (float);float calcolaquadrato (float);int main()int main(){{……....ris = calcolaquadrato(num);ris = calcolaquadrato(num);……..}}float calcolaquadrato(float a)float calcolaquadrato(float a){{……..}}
I parametriI parametri
parametri parametri formaliformali
parametri parametri attualiattuali
1212
I parametriI parametri La funzione “calcolare quadrato” riceve La funzione “calcolare quadrato” riceve
come parametro un numero di cui come parametro un numero di cui calcolare il quadrato.calcolare il quadrato.
Quali sono i parametri della funzione Quali sono i parametri della funzione “visualizza output ?”“visualizza output ?”
Supponiamo di avere una funzione che Supponiamo di avere una funzione che calcola l’area di un triangolo. Quali sono i calcola l’area di un triangolo. Quali sono i parametri di questa funzione?parametri di questa funzione?
1313
Il risultato del lavoro svolto da una funzione è unIl risultato del lavoro svolto da una funzione è unvalore che la funzione può restituire o no al “chiamante”.valore che la funzione può restituire o no al “chiamante”.
Nel primo caso parliamo di funzione con valoreNel primo caso parliamo di funzione con valorerestituito, nel secondo caso parliamo di mancanza di restituito, nel secondo caso parliamo di mancanza di
valorevalorerestituito (void).restituito (void).
La funzione “calcolare quadrato” restituisce il quadrato La funzione “calcolare quadrato” restituisce il quadrato che 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
1414
Una differenza importanteUna differenza importanteSe la funzione non ha valore restituito cambia l’istruzione di chiamata.Se la funzione non ha valore restituito cambia l’istruzione di chiamata.
Prendendo sempre lo stesso esempio di CALCOLO DEL QUADRATO, vediamo come si Prendendo sempre lo stesso esempio di CALCOLO DEL QUADRATO, vediamo come si sviluppa lasviluppa la
funzione visualizza outputfunzione 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
1515
Diagramma a blocchi per le funzioniDiagramma a blocchi per le funzioni
Le funzioni si rappresentano nel diagramma a blocchi con un Le funzioni si rappresentano nel diagramma a blocchi con un rettangolorettangolo
con doppie righe verticali. Nel rettangolo si scrive l’istruzione con doppie righe verticali. Nel rettangolo si scrive l’istruzione di di
““chiamata della funzione”, come indicato di seguito:chiamata della funzione”, come indicato di seguito:
se la funzione è void: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)
1616
Diagramma a blocchiDiagramma a blocchi
Nel diagramma a blocchi del Nel diagramma a blocchi del main si scrivono i nomi delle main si scrivono i nomi delle variabili che poi saranno variabili che poi saranno utilizzati nel programma utilizzati nel programma sorgente. Per ogni funzione si sorgente. Per ogni funzione si può quindi sviluppare un può quindi sviluppare un proprio diagramma a blocchi. proprio diagramma a blocchi.
leggi numleggi num
risriscalcolaquadratocalcolaquadrato(num)(num)
visualizzaoutput(rivisualizzaoutput(ris)s)
inizioinizio
finefine
float calcolaquadrato(float);float calcolaquadrato(float);void visualizzaoutput(float);void visualizzaoutput(float);void main()void 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<<“il quadrato del numero cout<<“il quadrato del numero
è”<<b;è”<<b;}}
1717
Supponiamo ora di dover risolvere il seguente problema: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 Provate a disegnare il diagramma di struttura, il diagramma a blocchi e ile il
programma in C++programma in C++
SoluzioneSoluzione EserciziEsercizi Passaggio parametri per indirizzoPassaggio parametri per indirizzo
ESERCIZIO 1ESERCIZIO 1
1818
ESERCIZIO 2ESERCIZIO 2Dati due numeri eseguire la moltiplicazione e la divisione eDati due numeri eseguire la moltiplicazione e la divisione evisualizzare i risultativisualizzare i risultati..
SoluzioneSoluzione
ESERCIZIO 3ESERCIZIO 3Scrivere un programma che tramite l’uso di un menù permetta di Scrivere un programma che tramite l’uso di un menù permetta di eseguire il quadrato, il cubo e la radice quadrata di un numero eseguire il quadrato, il cubo e la radice quadrata di un numero
fornito infornito ininput.input.
ESERCIZIO 4ESERCIZIO 4In un supermercato il prezzo del prodotto è legato alla quantità: In un supermercato il prezzo del prodotto è legato alla quantità:
se sise sicomperano tre prodotti dello stesso tipo uno è in regalo, se sicomperano tre prodotti dello stesso tipo uno è in regalo, se sicomperano uno o due prodotti non c’è regalo. Calcolare il prezzo comperano uno o due prodotti non c’è regalo. Calcolare il prezzo
dadapagare per un prodotto del quale si inseriscono da tastiera il pagare per un prodotto del quale si inseriscono da tastiera il
prezzoprezzounitario e la quantità.unitario e la quantità.
SoluzioneSoluzione
1919
SOLUZIONE ESERCIZIO 1:diagramma di SOLUZIONE ESERCIZIO 1:diagramma di strutturastruttura
Calcolo della radice Calcolo della 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 ilcontrollare il numeronumero
Calcolare Calcolare la radicela radice
VisualizzarVisualizzare il e il risultatorisultato
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
2121
SOLUZIONE ESERCIZIO 1: diagramma a SOLUZIONE ESERCIZIO 1: diagramma a blocchi e programmablocchi e programma
leggi numleggi num
11 11) mentre num < 0) mentre num < 0
risriscalcolaradice(num)calcolaradice(num)
visualizzaoutput(rivisualizzaoutput(ris)s)
inizioinizio
finefine
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 indietro
VV
FF
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
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
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.
2525
SOLUZIONE ESERCIZIO 2SOLUZIONE ESERCIZIO 2
leggi num1,num2leggi num1,num2
visualizzaoutput(p)visualizzaoutput(p)
inizioinizio
finefine
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;} }
ppcalcolaprodotto(num1,nucalcolaprodotto(num1,num2)m2)
ddcalcoladivisioneo(nucalcoladivisioneo(num1,num2m1,num2))
visualizzaoutput(d)visualizzaoutput(d)
11
Scrivi Scrivi “divisione“divisione
non possibile”non possibile”
1) Se num2≠01) Se num2≠0
Torna indietro
VVFF
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
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
2828
SOLUZIONE ESERCIZIO 4: diagramma a SOLUZIONE ESERCIZIO 4: diagramma a blocchi e programmablocchi e programma
leggi qta, leggi qta, pr_unpr_un
qta_da_pagareqta_da_pagareqta - qta - regreg
visualizzaoutput(spe)visualizzaoutput(spe)
inizioinizio
finefine
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;} }
regregcalcolaregalo(qta)calcolaregalo(qta)
spespecalcolaspesa(qta_dcalcolaspesa(qta_da_pagare, pr_un)a_pagare, pr_un)
Torna indietro
2929
Il passaggio di parametri per indirizzo (o per riferimento) passa alla Il passaggio di parametri per indirizzo (o per riferimento) passa alla
funzione l’indirizzo di memoria del parametro anziché il valore.funzione l’indirizzo di memoria del parametro anziché il valore.
Non ci sono quindi variabili distinte, una nel main ed una nella Non ci sono quindi variabili distinte, una nel main ed una nella funzione,funzione,
ma la funzione opera sulla stessa area di memoria del main.ma la funzione opera sulla stessa area di memoria del main.
In C gli indirizzi di memoria sono contenuti nelle variabili puntatoriIn 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 puntatatipo della variabile puntata * NOME PUNTATORE * NOME PUNTATORE
p.e.: int * punt p.e.: int * punt dichiara la variabile di nome punt che dichiara la variabile di nome punt che contiene contiene l’indirizzo di una variabile interal’indirizzo di una variabile intera
Viceversa data la variabile intera a per sapere quale è l’indirizzo di Viceversa data la variabile intera a per sapere quale è l’indirizzo di memoriamemoria
di a si usa l’operatore &.di a si usa l’operatore &.
Passaggio di parametri per indirizzoPassaggio di parametri per indirizzo
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 cout <<“indirizzo di a vale”<<&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
3131
Passaggio di parametri per indirizzoPassaggio di parametri per indirizzoVediamo il seguente esempio in cui laVediamo il seguente esempio in cui la
funzione “aggiungi” aggiunge 1 ai duefunzione “aggiungi” aggiunge 1 ai due
parametri ricevuti. Il primo parametro vieneparametri ricevuti. Il primo parametro viene
passato per valore il secondo per indirizzo.passato 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=0; b=0;
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;
}}
RAMRAM
MAINMAIN FUNZIONEFUNZIONE
aa bb xx
Schermo
00 00 00
1111
nella funzione x vale 1nella funzione x vale 1
nel main a vale 0nel main a vale 0
nel main b vale 1nel main b vale 1
// //
3232
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 è allocato è Nel caso dei vettori l’indirizzo di memoria in cui il vettore è allocato è indicatoindicato
con il nome del vettore. Non c’è bisogno quindi di dichiarare con il nome del vettore. Non c’è bisogno quindi di dichiarare puntatori.puntatori.
Nel caso dei vettori il passaggio di parametri per indirizzo è l’unico Nel caso dei vettori il passaggio di parametri per indirizzo è l’unico utilizzabileutilizzabile
3333
SOLUZIONE ESERCIZIO: diagramma di SOLUZIONE ESERCIZIO: 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
3434
// prototipi delle funzioni// prototipi delle funzioni
void inserisci(int v[]);void inserisci(int v[]);
float calcolamedia(int v[]);float calcolamedia(int v[]);
void contaaltezze(int v[],float);void contaaltezze(int v[],float);
#define max 30#define max 30
int main()int main()
{ {
int vett[max];int vett[max];
float media;float media;
inserisci(vett);inserisci(vett);
media=calcolamedia(vett);media=calcolamedia(vett);
contaaltezze(vett,media);contaaltezze(vett,media);
}}
void inserisci(int v[max]) // carico il vettorevoid inserisci(int v[max]) // carico il vettore
{{
for (int i=0;i<max;i++)for (int i=0;i<max;i++)
{cout<<"\ndigita un elemento del {cout<<"\ndigita un elemento del vettore ";vettore ";
cin>>v[i];cin>>v[i];
}}
}}
float calcolamedia(int v[max]) //calcolo la mediafloat calcolamedia(int v[max]) //calcolo la media
{float s,m;{float s,m;
for (int i=0;i<max;i++)for (int i=0;i<max;i++)
s=s+v[i];s=s+v[i];
m=s/max;m=s/max;
cout<<"\nla media e' "<<m;cout<<"\nla media e' "<<m;
return m;return m;
}}
void contaaltezze(int v[max],float m) //calcolo le void contaaltezze(int v[max],float m) //calcolo le // altezze // altezze
{int conta=0;{int conta=0;
for (int i=0;i<max;i++)for (int i=0;i<max;i++)
{ {
if (v[i]>m)if (v[i]>m)
conta++;conta++;
}}
cout<<"\ngli alunni che superano la media sono cout<<"\ngli alunni che superano la media sono "<<conta;"<<conta;
}}
SOLUZIONE ESERCIZIO: programmaSOLUZIONE ESERCIZIO: programma