Funzioni in C++

Moreno Marzolla

moreno.marzolla@pd.infn.it

Copyright © 2006 Moreno Marzolla

This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 2.5 Italy License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/it/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Funzioni

Una funzione in C++ è un blocco di codice che

Riceve dei parametri in ingresso (input)

Produce un risultato in uscita (output)

Nota:

Una funzione potrebbe non avere alcun parametro in ingresso

Una funzione potrebbe non produrre alcun risultato da restituire al chiamante

Esempio molto semplice

Supponiamo di avere una funzione che calcoli il massimo tra due interi x,y passati come parametro. Come la uso?

#include <iostream>

using namespace std;

// la funzione massimo(x,y) è definita in qualche modo...

int main( void )

{

int n = 10;

int m = 20;

int max_m_n = massimo( n, m ); // max_m_n vale 20

return 0;

}

Altro esempio

In C++ esiste la funzione sqrt(x) che restituisce la radice quadrata di un valore x di tipo double

Scrivere un programma che, dati in input due double a e b che denotano i cateti di un triangolo rettangolo, calcolano la lunghezza c dell'ipotenusa

Soluzione

#include <iostream>

#include <cmath> // La funzione sqrt() è definita qui

using namespace std;

int main( void )

{

double a, b, c;

cin >> a;

cin >> b;

c = sqrt( a*a + b*b );

cout << “L'ipotenusa vale “ << c << endl;

return 0;

}

Come dichiaro una funzione?

Le funzioni devono sempre essere dichiarate prima di essere usate

Le dichiarazioni delle funzioni vanno messe prima della funzione main()

tipo_risultato nome_funzione( tipo1 param1,

tipo2 param2,

tipo3 param3 )

{

// corpo della funzione

}

Esempio

Come definisco una funzione che calcola il massimo tra due interi x e y? (il risultato è di tipo intero)

int massimo( int x, int y )

{

if ( x > y ) {

return x;

} else {

return y;

}

}

Restituisce come

risultato il valore x

Restituisce come

risultato il valore y

Esempio di programma completo

#include <iostream>

using namespace std;

int massimo( int x, int y )

{

if ( x > y ) {

return x;

} else {

return y;

}

}

int main( void )

{

int n, m;

cin >> n; // chiede all'utente di inserire n

cin >> m; // chiede all'utente di inserire m

cout << massimo( n, m ) << endl;

return 0;

}

Funzioni prive di parametri

Come definisco una funzione che non prende nessun parametro in ingresso?

Come definisco una funzione che non restituisce alcun risultato?

void stampa_intero( int x )

{

cout << “L'intero vale “ << x << endl;

// notare: niente return

}

int costante_due( void )

{

return 2;

}

Esempio

Scrivere una funzione priva di parametri, che restituisce un intero non negativo come risultato. L'intero deve venire chiesto all'utente; se l'utente inserisce un intero negativo, il numero viene richiesto finché corretto

int chiedi_intero( void )

{

int risultato;

do {

cout << “Inserisci un numero >= 0” << endl;

cin >> risultato;

} while ( risultato < 0 );

return risultato;

}

Esempio / 2

Chiedere all'utente due interi non negativi A e B, usando la funzione appena vista

Stampare il minimo tra A e B, utilizzando una funzione minimo() che accetta due parametri di tipo intero e restituisce un intero.

Soluzione

#include <iostream>

using namespace std;

int chiedi_intero( void )

{

int risultato;

do {

cout << “Inserisci un numero >= 0” << endl;

cin >> risultato;

} while ( risultato < 0 );

return risultato;

}

int minimo( int x, int y )

{

if ( x < y )

return x;

else

return y;

}

int main( void )

{

int A = chiedi_intero();

int B = chiedi_intero();

cout << “Il minimo vale “ << minimo( A, B ) << endl;

return 0;

}

Esercizio conclusivo / 1

Definire una funzione int pari( int n ) che restituisce il valore 1 se n è pari, altrimenti restituisce 0; n deve essere un intero >=0

Per determinare se n è pari si procede come segue: si sottrae ripetutamente 2 da n. Quando il residuo è uguale a 0, allora il numero n è pari; quando il residuo è uguale a 1, allora il numero n è dispari.

Esercizio conclusivo / 2

Usare la funzione definita in precedenza per risolvere il seguente problema: chiedere all'utente in intero non negativo x; se l'utente inserisce x<0, richiederlo finché x>=0. Stampare a video il messaggio “pari” se x è pari, “dispari” altrimenti

Soluzione

#include <iostream>

using namespace std;

int pari( int n )

{

while ( n > 1 ) {

n = n-2;

}

if ( n == 0 )

return 1; // n è pari

else

return 0; // n è dispari

}

int main( void )

{

int x;

do {

cout << “Inserisci un intero non negativo” << endl;

cin >> x;

} while ( x < 0 );

if ( 1 == pari( x ) )

cout << “Il numero inserito è pari” << endl;

else

cout << “Il numero inserito è dispari” << endl;

return 0;

}

Esercizio 1

Scrivere una funzione calcola_interesse( double s, double i, int t ) che restituisce un double, che calcola gli interessi su un importo s ad un tasso annuo i per un tempo di t giorni come segue:
interesse = s*i*t / 365.0

Il programma deve chiedere ripetutamente all'utente di inserire un importo, un tasso e un tempo. Quando l'utente inserisce un importo negativo, il programma deve stampare la somma di tutti gli interessi su tutti gli importi inseriti fino a quel momento

Esempio di input

Inserisci importo, tasso, tempo

1000 0.1 20

Inserisci importo, tasso, tempo

2000 0.2 50

Inserisci importo, tasso, tempo

500 0.3 20

Inserisci importo, tasso, tempo

-1 0 0

La somma degli interessi vale 68.4930

Esercizio 2

Scrivere una funzione stampa_base( char c ) che riceve in input un carattere c e non restituisce alcun risultato

La funzione deve stampare a video:
adenina se c=='A'
citosina se c=='C'
timina se c=='T'
guanina se c=='G'
*ERRORE* se c è diverso dai caratteri precedenti

Esercizio 2 / cont

Scrivere quindi un programma che usa la funzione precedente per risolvere il seguente problema: è dato un array di 10 caratteri (da richiedere all'utente). L'utente può inserire 10 caratteri qualsiasi. Una volta riempito l'array, il programma usa la funzione stampa_base per stampare il nome di ciascuna base del DNA inserita, oppure il messaggio d'errore

Esercizio 2 / cont

Esempio: se l'utente inserisce
A C C T A X C G G Y

Il programma stampa:
adenina citosina citosina timina adenina *ERRORE* citosina guanina guanina *ERRORE*

Esercizio 3

Definire le seguenti funzioni:
double area_quadrato( double l )
double area_triangolo( double b, double h )
double area_cerchio( double r )
che restituiscono rispettivamente l'area di un quadrato di lato l, di un triangolo di base b e altezza h e di un cerchio di raggio r.

Esercizio 3 / cont

Viene chiesto all'utente di inserire un carattere da tastiera:

Se inserisce 'q', il programma chiede il valore del lato di un quadrato e utilizza la funzione area_quadrato() per stampare l'area di un quadrato il cui lato ha il valore inserito; fatto questo il programma chiede un nuovo carattere

Se inserisce 't', il programma fa la stessa cosa per un triangolo di base e altezza inseriti dall'utente; fatto questo il programma chiede un nuovo carattere

Se inserisce 'c', il programma fa la stessa cosa per un cerchio di raggio inserito dall'utente; fatto questo, il programma chiede un nuovo carattere

Se viene inserito un qualsiasi altro carattere, il programma termina

Moreno Mazolla

2005-09-25T15:46:34