• Non ci sono risultati.

Unità Didattica

N/A
N/A
Protected

Academic year: 2021

Condividi "Unità Didattica"

Copied!
36
0
0

Testo completo

(1)

Unità Didattica

Funzioni in C++

Funzioni in C++

ITIS LATTANZIO

Materia Informatica

Materia Informatica

(2)

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

Essere in grado di descrivere dettagliatamente il Essere in grado di descrivere dettagliatamente il lavoro svolto da ogni parte in termini di

lavoro svolto da ogni parte in termini di input input , , elaborazione

elaborazione , , output output

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 funzioni utilizzo delle funzioni

Obiettivi

Obiettivi

(3)

Prerequisiti Prerequisiti

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

(4)

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

problema:

problema:

Calcolare e visualizzare il quadrato Calcolare e visualizzare il quadrato

di un numero letto da tastiera di 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 per Solitamente “le parti” sono le azioni da svolgere per ottenere la soluzione. Nel nostro esempio:

ottenere la soluzione. Nel nostro esempio:

Leggere il numero Leggere il numero

Calcolare il quadrato Calcolare il quadrato

Scomposizione in sottoproblemi

Scomposizione in sottoproblemi

(5)

Diagramma di struttura Diagramma di struttura

Calcolo del quadrato Calcolo del quadrato

Leggere il Leggere il

numero

numero Calcolare il Calcolare il quadrato quadrato

Far vedere il Far vedere il

risultato risultato

Rappresentiamo la scomposizione del problema con un Rappresentiamo la scomposizione del problema con un

grafico ad albero chiamato diagramma di struttura

grafico ad albero chiamato diagramma di struttura

(6)

Descrizione dettagliata delle parti Descrizione dettagliata delle parti

che compongono il problema che compongono il problema

E’ importante descrivere, per ogni singolo E’ importante descrivere, per ogni singolo

compito,chi lo svolge, da dove vengono presi gli compito,chi lo svolge, da dove vengono presi gli

input 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 NUMERO LEGGERE 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 QUADRATO

CALCOLARE IL QUADRATO::

questo lavoro viene svolto dal sottoprogramma “Calcola quadrato” che riceve questo lavoro viene svolto dal sottoprogramma “Calcola quadrato” che riceve come parametro un numero, ne fa il quadrato e lo restituisce al main

come parametro un numero, ne fa il quadrato e lo restituisce al main FAR VEDERE IL RISULTATO

FAR VEDERE IL RISULTATO::

Questo lavoro viene svolto dal sottoprogramma “Visualizza output” che riceve Questo lavoro viene svolto dal sottoprogramma “Visualizza output” che riceve

(7)

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 funzioni

Le funzioni

(8)

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 restituito valore restituito

parametro

parametro

(9)

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 9 9 3

(10)

Al momento della chiamata alla funzione il valore contenuto in num viene spostato in a.

Esistono due aree distinte di memoria, una nel main (num) e una nella

funzione (a).

Abbiamo attuato il PASSAGGIO DI PARAMETRI PER VALORE.

In modo analogo il valore contenuto in q viene spostato con l’istruzione

return in ris.

Anche in questo caso esistono due aree diverse di memoria, una per il

main (ris) e una per la funzione (q).

Cosa abbiamo imparato Cosa 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;

}}

(11)

Il parametro Il parametro è l’area di memoria che contiene il valore che la è l’area di memoria che contiene il valore che la funzione usa per svolgere il suo lavoro.

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 definizione quelli indicati nel prototipo e nella definizione della funzione

della funzione

attuali: quelli indicati nella chiamata della funzione quelli indicati nella chiamata della funzione

float calcolaquadrato (

float calcolaquadrato (floatfloat););

int main() {…..

ris = calcolaquadrato (

ris = calcolaquadrato (num););

….

}

float calcolaquadrato (

float calcolaquadrato (float afloat a)) {{

…..

I parametri I parametri

parametri formali parametri formali

parametri attuali

parametri attuali

(12)

I parametri I 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?

(13)

Il risultato del lavoro svolto da una funzione è un

valore 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 valore

restituito (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 al La funzione “visualizzare risultato” non restituisce nulla al

“ “ chiamante”. chiamante”.

Il tipo restituito

Il tipo restituito

(14)

Una differenza importante Una differenza importante

Se 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;

PROTOTIPO PROTOTIPO

CHIAMATA CHIAMATA

DEFINIZIONE DEFINIZIONE

(15)

Diagramma a blocchi per le funzioni Diagramma 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))

risriscalcolaquadrato(num)calcolaquadrato(num)

(16)

Diagramma a blocchi Diagramma 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

riscalcolaquadrato(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 è”<<b;

cout<<“il quadrato del numero è”<<b;

}}

Leggi num

(17)

Supponiamo ora di dover risolvere il seguente problema:

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

controllando prima che sia positivo controllando 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 1

ESERCIZIO 1

(18)

ESERCIZIO 2

Dati due numeri eseguire la moltiplicazione e la divisione e visualizzare i risultati.

Soluzione ESERCIZIO 3

Scrivere un programma che tramite l’uso di un menù permetta di

eseguire il quadrato, il cubo e la radice quadrata di un numero fornito in input.

ESERCIZIO 4

In un supermercato il prezzo del prodotto è legato alla quantità: se si comperano tre prodotti dello stesso tipo uno è in regalo, se si

comperano uno o due prodotti non c’è regalo. Calcolare il prezzo da pagare per un prodotto del quale si inseriscono da tastiera il prezzo unitario e la quantità.

Soluzione

(19)

SOLUZIONE ESERCIZIO 1:diagramma di struttura SOLUZIONE ESERCIZIO 1:diagramma di struttura

Calcolo della radice Calcolo della radice

quadrata quadrata

Leggere il numero e controllare che sia positivo Leggere il numero e controllare che sia positivo

Calcolare la radice quadrata Calcolare la radice quadrata

Visualizzare il risultato Visualizzare il risultato

Leggere e Leggere e

controllare il controllare il

numero numero

Calcolare la Calcolare la

radice

radice Visualizzare Visualizzare

il risultato

il risultato

(20)

SOLUZIONE ESERCIZIO 1: descrizione dettagliata SOLUZIONE ESERCIZIO 1: descrizione dettagliata

LEGGERE E CONTROLLARE IL NUMERO LEGGERE E CONTROLLARE IL NUMERO::

questo lavoro viene svolto dalla funzione “Main” che legge da tastiera il questo lavoro viene svolto dalla funzione “Main” che legge da tastiera il numero e controlla che il numero sia >0

numero e controlla che il numero sia >0 CALCOLARE LA RADICE

CALCOLARE LA RADICE::

questo lavoro viene svolto dalla funzione “Calcola radice” che riceve come questo lavoro viene svolto dalla funzione “Calcola radice” che riceve come parametro il numero, ne calcola la radice quadrata e la restituisce al main parametro il numero, ne calcola la radice quadrata e la restituisce al main FAR VEDERE IL RISULTATO

FAR VEDERE IL RISULTATO::

Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve come Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve come parametro il numero e lo visualizza sullo schermo

parametro il numero e lo visualizza sullo schermo

(21)

V

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

programma programma

leggi num

1 1) mentre num < 0

riscalcolaradice(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 numero”;

cout<<“digita un 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 b) void visualizzaoutput (float b)

{cout<<“\nil risultato è”;

{cout<<“\nil risultato è”;

Torna indietro Torna indietro

F

(22)

SOLUZIONE ESERCIZIO 2: diagramma di struttura SOLUZIONE ESERCIZIO 2: diagramma di struttura

Prodotto e divisione Prodotto e divisione

di due numeri di due numeri

leggere i leggere i

numeri

numeri calcolare calcolare il prodotto

il prodotto calcolare la calcolare la divisione

divisione visualizzare visualizzare output

output controllare

controllare input

input

(23)

SOLUZIONE ESERCIZIO 2: descrizione dettagliata SOLUZIONE ESERCIZIO 2: descrizione dettagliata

LEGGERE I NUMERI:

LEGGERE I NUMERI:

questo lavoro viene svolto dalla funzione “Main” che legge da tastiera due questo lavoro viene svolto dalla funzione “Main” che legge da tastiera due

numeri numeri

FARE IL PRODOTTO FARE IL PRODOTTO::

questo lavoro viene svolto dalla funzione “Calcola prodotto” che riceve questo lavoro viene svolto dalla funzione “Calcola prodotto” che riceve

come parametri i numeri, ne fa il prodotto e lo restituisce al main come parametri i numeri, ne fa il prodotto e lo restituisce al main

CONTROLLARE INPUT:

CONTROLLARE INPUT:

questo lavoro viene svolto dalla funzione “Main” che, prima di chiamare la questo lavoro viene svolto dalla funzione “Main” che, prima di chiamare la

funzione “Calcola divisione”, controlla che il secondo numero digitato sia funzione “Calcola divisione”, controlla che il secondo numero digitato sia

diverso da zero diverso da zero

FARE LA DIVISIONE:

FARE LA DIVISIONE:

questo lavoro viene svolto dalla funzione “Calcola divisione” che riceve questo lavoro viene svolto dalla funzione “Calcola divisione” che riceve

come parametri i numeri, ne fa la divisione e la restituisce al main come parametri i numeri, ne fa la divisione e la restituisce al main

FAR VEDERE IL RISULTATO FAR VEDERE IL RISULTATO::

Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve

come parametro un numero e lo visualizza sullo schermo come parametro un numero e lo visualizza sullo schermo

(24)

ATTENZIONE:

ATTENZIONE:

Si realizza

Si realizza UNA SOLA FUNZIONE UNA SOLA FUNZIONE “Visualizza output” “Visualizza output”

che verrà chiamata due volte nel main.

che verrà chiamata due volte nel main.

Il compito della funzione “visualizza output” è sempre Il compito della funzione “visualizza output” è sempre

lo stesso indipendentemente dal significato del numero lo stesso indipendentemente dal significato del numero

che deve mostrare sullo schermo.

che deve mostrare sullo schermo.

Nel nostro esempio il numero da far vedere è una volta Nel nostro esempio il numero da far vedere è una volta il risultato di una moltiplicazione ed una volta il risultato il risultato di una moltiplicazione ed una volta il risultato

di una divisione, ma il compito della funzione non di una divisione, ma il compito della funzione non

cambia.

cambia.

(25)

SOLUZIONE ESERCIZIO 2 SOLUZIONE 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 moltiplicazione e’”; cout << “il risultato della 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 e”;cout << “il risultato della divisione e”;

visualizzaoutput(d);visualizzaoutput(d);

} } else else

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;

} }

pcalcolaprodotto(num1,num2)

dcalcoladivisioneo(num1, num2)

visualizzaoutput(d)

Scrivi “divisione non possibile”

num2≠0? V

F

(26)

SOLUZIONE ESERCIZIO 4: diagramma di struttura SOLUZIONE ESERCIZIO 4: diagramma di struttura

Calcolo prezzo Calcolo prezzo

da pagare da pagare

leggere leggere quantità quantità e prezzo e prezzo

calcolare i calcolare i

pezzi pezzi gratis gratis

calcolare la calcolare la

spesa

spesa visualizzare visualizzare output

output calcolare i

calcolare i

pezzi da

pezzi da

pagare

pagare

(27)

SOLUZIONE ESERCIZIO 4: descrizione dettagliata SOLUZIONE ESERCIZIO 4: descrizione dettagliata

LEGGERE QUANTITA’ E PREZZO UNITARIO:

LEGGERE QUANTITA’ E PREZZO UNITARIO:

questo lavoro viene svolto dalla funzione “Main” che legge da tastiera la questo lavoro viene svolto dalla funzione “Main” che legge da tastiera la

quantità acquistata (di un prodotto) ed il prezzo unitario quantità acquistata (di un prodotto) ed il prezzo unitario

CALCOLARE I PEZZI GRATIS CALCOLARE I PEZZI GRATIS::

questo lavoro viene svolto dalla funzione “Calcola regalo” che riceve come questo lavoro viene svolto dalla funzione “Calcola regalo” che riceve come

parametro la quantità acquistata, calcola la quantità che viene regalata e parametro la quantità acquistata, calcola la quantità che viene regalata e

la restituisce al main la restituisce al main

CALCOLA I PEZZI DA PAGARE:

CALCOLA I PEZZI DA PAGARE:

questo lavoro viene svolto dalla funzione “Main” che SOTTRAE dalla questo lavoro viene svolto dalla funzione “Main” che SOTTRAE dalla

quantità acquistata la quantità che viene regalata.

quantità acquistata la quantità che viene regalata.

CALCOLARE LA SPESA:

CALCOLARE LA SPESA:

questo lavoro viene svolto dalla funzione “Calcola spesa” che riceve come questo lavoro viene svolto dalla funzione “Calcola spesa” che riceve come

parametri quantità e prezzo unitario,li moltiplica e li restituisce al main parametri quantità e prezzo unitario,li moltiplica e li restituisce al main

FAR VEDERE IL RISULTATO FAR VEDERE IL RISULTATO::

Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve Questo lavoro viene svolto dalla funzione “Visualizza output” che riceve

come parametro il prezzo da pagare e lo visualizza sullo schermo come parametro il prezzo da pagare e lo visualizza sullo schermo

(28)

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

programma programma

leggi qta, pr_un

qta_da_pagareqta - 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, pr_un); spe=calcolaspesa(qta_da_pagare, 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;

}} regcalcolaregalo(qta)

specalcolaspesa(qta_da_p agare, pr_un)

(29)

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 PUNTATORE tipo della variabile puntata * NOME PUNTATORE

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

p.e.: int * punt dichiara la variabile di nome punt punt che contiene l’indirizzo di una che contiene l’indirizzo di una

variabile intera variabile intera

Viceversa data la variabile intera a per sapere qual è l’indirizzo di memoria

Passaggio di parametri per indirizzo

Passaggio di parametri per indirizzo

(30)

Passaggio di parametri per indirizzo Passaggio 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 5 a vale 5

indirizzo di a vale

indirizzo di a vale indirizzo della var. aindirizzo della var. a

L’operatore * si usa anche per sapere quale è il valore di una variabile di cui L’operatore * si usa anche per sapere quale è il valore di una variabile di cui conosciamo l’indirizzo.

conosciamo l’indirizzo.

Osserviamo le istruzioni seguenti:

Osserviamo le istruzioni seguenti:

int * punt; // dichiarazione del int * punt; // dichiarazione del

// puntatore punt // puntatore punt a=5;a=5;

punt = &a punt = &a

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

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

Sullo schermo viene prodotto:

Sullo schermo viene prodotto:

a vale 5 a vale 5

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

(31)

Passaggio di parametri per indirizzo Passaggio di parametri per indirizzo

Vediamo il seguente esempio in cui la funzione “aggiungi” aggiunge 1 ai due

parametri ricevuti. Il primo parametro viene 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=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;

RAMRAM

MAINMAIN FUNZIONEFUNZIONE aa bb x x y y

Schermo

00 5 5 00 11 66

nella funzione: x vale 1 nella funzione: x vale 1 nella funzione: y vale 6 nella funzione: y vale 6

nel main: a vale 0 nel main: a vale 0 nel main: b vale 6 nel main: b vale 6

/ / / /

(32)

/* 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 scambio

void Scambio(float x, float y) void Scambio(float x, float y) {{

float temp = x;float temp = x;

x = y;x = y;

Passaggio di parametri per valore Passaggio di parametri per valore

RAMRAM

MAINMAIN FUNZIONEFUNZIONE var1var1 var2var2 x x y y

00 5 5 00 11 66

/ / / /

(33)

/* 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 scambio

void 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 indirizzo

Passaggio di parametri per indirizzo

(34)

Passaggio di parametri con i vettori Passaggio 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 media e Date le altezze di 30 alunni di una classe, calcolare l’altezza media e

stabilire quanti sono gli alunni che superano la media stabilire 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 è indicato con il nome del vettore.

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 è l’unico utilizzabile

utilizzabile

(35)

SOLUZIONE

SOLUZIONE ESERCIZIO ESERCIZIO : diagramma di struttura : diagramma di struttura

Altezze degli alunni Altezze degli alunni di una classe

di una classe

Inserire le Inserire le

altezze in un altezze in un

vettore vettore

Calcolare la Calcolare la media delle media delle altezze

altezze

Contare Contare

quanti alunni quanti alunni

superano la superano la

media

media

(36)

// 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 vettore void inserisci(int v[],int dim) // carico il vettore {{

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) //calcolo la float calcolamedia(int v[],int dim) //calcolo la

media 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 m) void contaaltezze(int v[],int dim,float m)

//calcolo le altezze //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 media cout<<"\ngli alunni che superano la media sono "<<conta;

sono "<<conta;

SOLUZIONE ESERCIZIO: programma

SOLUZIONE ESERCIZIO: programma

Riferimenti

Documenti correlati

Ora considera una diversa ampiezza delle classi e ricalcola tutte le statistiche commentando le differenze [esercizio da svolgere individualmente]..

DUE RETTE INCIDENTI UNA RAPPRESENTAZIONE DEL PUNTO.. Realizzata da @Maes

– l’indice di esempio con 3 cifre prima della virgola, nessuna dopo la virgola, in notazione decimale, – qualora A, B &gt; 0, salvi i valori di A, B con 1 cifra prima della virgola e

Soluzione: Si tratta di valutare il tempo di caduta dovuto al peso del sasso e il tempo di propagazione dell’onda sonora prodotta nell’impatto con il fondo del pozzo.. L’intervallo

[r]

Calcolare il valore di un'espressione letterale per determinati valori numerici attribuiti alle lettere che in esse figurano, vuol dire sostituire a ciascuna

In base alle informazioni fornite dal grafico, possiamo concludere che la popolazione dei camaleonti, che in un lontano passato consisteva di circa 1000 esemplari, `e attualmente

Studia la legge dei punti coniugati (inizio di pag. 292) e scrivi con cura, dopo aver fatto una rappresentazione graca, i passaggi che hanno condotto alla sua formulazione.. Un