Funzioni in C++
Moreno Marzolla
moreno.marzolla@pd.infn.it
Moreno Marzolla Fondamenti di Informatica 2
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 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 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;
}
Moreno Marzolla Fondamenti di Informatica 5
Altro esempio 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
Moreno Marzolla Fondamenti di Informatica 6
Soluzione 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?
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 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
Moreno Marzolla Fondamenti di Informatica 9
Esempio di programma completo 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;
}
Moreno Marzolla Fondamenti di Informatica 10
Funzioni prive di parametri 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 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 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.
Moreno Marzolla Fondamenti di Informatica 13
Soluzione 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;
}
Moreno Marzolla Fondamenti di Informatica 14
Esercizio conclusivo / 1 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 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 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;
}
Moreno Marzolla Fondamenti di Informatica 17
Esercizio 1 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
Moreno Marzolla Fondamenti di Informatica 18
Esempio di input 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 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 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
Moreno Marzolla Fondamenti di Informatica 21
Esercizio 2 / cont 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*
Moreno Marzolla Fondamenti di Informatica 22
Esercizio 3 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 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