Comments
Description
Transcript
Funzioni in C++ - Moreno Marzolla
Funzioni in C++ Copyright © 2006 Moreno Marzolla This work is licensed under the Creative Commons AttributionNoncommercial-Share Alike 2.5 Italy License. To view a copy of this license, visit http://creativecommons.org/licenses/by-ncsa/2.5/it/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. Moreno Marzolla [email protected] Moreno Marzolla Funzioni Riceve dei parametri in ingresso (input) Produce un risultato in uscita (output) Nota: 2 Esempio molto semplice Una funzione in C++ è un blocco di codice che Fondamenti di Informatica Una funzione potrebbe non avere alcun parametro in ingresso Una funzione potrebbe non produrre alcun risultato da restituire al chiamante 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 3 Moreno Marzolla Fondamenti di Informatica 4 Altro esempio Soluzione 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 #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; } 5 Moreno Marzolla Come dichiaro una funzione? Come definisco una funzione che calcola il massimo tra due interi x e y? (il risultato è di tipo intero) tipo_risultato nome_funzione( tipo1 param1, tipo2 param2, tipo3 param3 ) { // corpo della funzione } Fondamenti di Informatica 6 Esempio Le funzioni devono sempre essere dichiarate prima di essere usate Le dichiarazioni delle funzioni vanno messe prima della funzione main() Moreno Marzolla Fondamenti di Informatica int massimo( int x, int y ) { if ( x > y ) { Restituisce come return x; risultato il valore x } else { return y; Restituisce come } risultato il valore y } 7 Moreno Marzolla Fondamenti di Informatica 8 Esempio di programma completo Funzioni prive di parametri #include <iostream> using namespace std; int massimo( int x, int y ) { if ( x > y ) { return x; } else { return y; } } Come definisco una funzione che non prende nessun parametro in ingresso? int costante_due( void ) { return 2; } 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; Come definisco una funzione che non restituisce alcun risultato? void stampa_intero( int x ) { cout << L'intero vale << x << endl; // notare: niente return } return 0; } Moreno Marzolla Fondamenti di Informatica 9 Moreno Marzolla Esempio Fondamenti di Informatica 10 Esempio / 2 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 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. int chiedi_intero( void ) { int risultato; do { cout << Inserisci un numero >= 0 << endl; cin >> risultato; } while ( risultato < 0 ); return risultato; } Moreno Marzolla Fondamenti di Informatica 11 Moreno Marzolla Fondamenti di Informatica 12 #include <iostream> using namespace std; Soluzione Esercizio conclusivo / 1 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 13 Esercizio conclusivo / 2 Fondamenti di Informatica Moreno Marzolla #include <iostream> using namespace std; 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 Moreno Marzolla 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. 15 Fondamenti di Informatica 14 Soluzione 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 16 Esercizio 1 Esempio di input 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 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 17 Moreno Marzolla Esercizio 2 Fondamenti di Informatica 18 Esercizio 2 / cont 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 Moreno Marzolla Fondamenti di Informatica 19 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 20 Esercizio 2 / cont Esercizio 3 Esempio: se l'utente inserisce ACCTAXCGGY Il programma stampa: adenina citosina citosina timina adenina *ERRORE* citosina guanina guanina *ERRORE* Moreno Marzolla Fondamenti di Informatica 21 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 Marzolla Fondamenti di Informatica 23 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. Moreno Marzolla Fondamenti di Informatica 22