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