Unità DidatticaFunzioni in C++Funzioni in C++
ITIS LATTANZIOMateria Informatica Materia Informatica
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
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
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 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
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
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
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;
}}
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
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?
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
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
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)
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
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
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
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
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
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
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,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
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, 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
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
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
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
// //
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// //
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
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
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
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
Top Related