Esercizi sulle Funzioni in C++
In questa lezione proponiamo una serie di esercizi guidati sulle funzioni in C++,
suddivisi in tre categorie: funzioni senza parametri, funzioni con parametri
e uso di funzioni predefinite. Ogni esercizio è seguito dalla soluzione
in C++ che puoi aprire o chiudere tramite i box interattivi.
Funzioni senza parametri
1. Definire una funzione che ripeta sul video in tre righe diverse la stringa acquisita da tastiera.
#include <iostream>
#include <string>
using namespace std;
void stampaTreRighe() {
string s;
getline(cin, s);
for(int i=0; i<3; i++)
cout << s << "\n";
}
int main(){
stampaTreRighe();
return 0;
}
2. Organizzare una funzione che acquisisca da tastiera il lato di un quadrato e ne calcoli area e perimetro.
#include <iostream>
using namespace std;
void areaPerimetroQuadrato() {
double lato;
cin >> lato;
cout << "Area: " << lato*lato << endl;
cout << "Perimetro: " << 4*lato << endl;
}
int main(){
areaPerimetroQuadrato();
return 0;
}
Funzioni con parametri
3. Data la parabola y = ax² + bx + c, definire tre funzioni per calcolare: vertice, fuoco, intersezioni con gli assi.
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
struct Punto { double x,y; };
Punto vertice(double a,double b,double c){
double xv=-b/(2*a);
double yv=a*xv*xv+b*xv+c;
return {xv,yv};
}
Punto fuoco(double a,double b,double c){
Punto v=vertice(a,b,c);
return {v.x, v.y + 1.0/(4*a)};
}
vector<Punto> intersezioniAssi(double a,double b,double c){
vector<Punto> v;
v.push_back({0,c}); // asse y
double D=b*b-4*a*c;
if(D>=0){
v.push_back({(-b-sqrt(D))/(2*a),0});
v.push_back({(-b+sqrt(D))/(2*a),0});
}
return v;
}
4. Visualizzare i 5 numeri successivi a un numero dato.
void stampaCinqueSuccessivi(int n){
for(int i=1;i<=5;i++)
cout << n+i << " ";
}
5. Funzione che calcola la media aritmetica noti il numero di valori e la loro somma.
double mediaAritmetica(int n,double somma){
return somma/n;
}
6. Ordinare in ordine decrescente le età di tre persone.
#include <algorithm>
void ordinaEta(int a,int b,int c){
int v[3]={a,b,c};
sort(v,v+3,greater<int>());
for(int i=0;i<3;i++) cout<<v[i]<<" ";
}
7. Restituire l’età di una persona dato l’anno di nascita (anno attuale = 2025).
int calcolaEta(int annoNascita){
const int ANNO=2025;
return ANNO-annoNascita;
}
8. Calcolare il prezzo scontato.
double prezzoScontato(double prezzo,double perc){
return prezzo*(1-perc/100);
}
9. Verificare se due rette y=m₁x+q₁ e y=m₂x+q₂ sono perpendicolari.
bool perpendicolari(double m1,double m2){
return fabs(m1*m2+1)<1e-9;
}
10. Controllare se un punto appartiene a una retta.
bool puntoSuRetta(double m,double q,double x,double y){
return fabs(y-(m*x+q))<1e-9;
}
11. Calcolare l’incasso medio di più reparti.
struct Reparto{string nome; double incasso;};
double mediaIncassi(vector<Reparto> rep){
double somma=0;
for(auto r:rep) somma+=r.incasso;
return somma/rep.size();
}
12. Incrementare il prezzo dei prodotti di una certa percentuale.
struct Prodotto{string nome; double prezzo;};
void incrementaPrezzi(vector<Prodotto>& v,double perc){
for(auto &p:v) p.prezzo *= (1+perc/100);
}
13. Calcolare la percentuale dei voti di due candidati e ordinarli.
struct Candidato{string nome; int voti; double perc;};
pair<Candidato,Candidato> ballottaggio(Candidato a,Candidato b){
int tot=a.voti+b.voti;
a.perc=100.0*a.voti/tot;
b.perc=100.0*b.voti/tot;
if(a.perc<b.perc) swap(a,b);
return {a,b};
}
Funzioni predefinite
14. Calcolare la distanza tra due punti nel piano cartesiano.
double distanza(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
15. Calcolare esponenziale, logaritmo naturale e logaritmo in base 10.
void calcola(double x){
cout << "exp: " << exp(x) << endl;
if(x>0){
cout << "ln: " << log(x) << endl;
cout << "log10: " << log10(x) << endl;
}
}
16. Visualizzare i nomi degli studenti che studiano Inglese.
struct Studente{string nome; string lingua;};
void stampaInglese(vector<Studente> v){
for(auto s:v)
if(s.lingua=="Inglese"||s.lingua=="inglese")
cout << s.nome << endl;
}