Esercizi - Funzioni in C++
Esercizio 1
Domanda: Il seguente programma compila ed esegue? Qual è il valore stampato? Qual è lo scope della variabile x dentro e fuori dalla funzione?
#include <iostream>
using namespace std;
void cambiaX() {
int x = 10;
cout << "Dentro cambiaX: " << x << endl;
}
int main() {
int x = 5;
cambiaX();
cout << "Dentro main: " << x << endl;
return 0;
}
Esercizio 2
Domanda: Il seguente programma compila ed esegue? Cosa stampa in output ciascuna funzione? Qual è la differenza tra le due funzioni?
#include <iostream>
using namespace std;
void incrementa1(int n) {
n = n + 1;
}
void incrementa2(int& n) {
n = n + 1;
}
int main() {
int numero = 5;
incrementa1(numero);
cout << "Dopo incrementa1: " << numero << endl;
incrementa2(numero);
cout << "Dopo incrementa2: " << numero << endl;
return 0;
}
Esercizio 3
Domanda: Sulla base dell’esercizio precedente: 1. prevedere l’output del programma, motivando la risposta 2. eseguire il programma 3. scrivere considerazione finale, il passaggio di un array avviene per valore o riferimento?
#include <iostream>
using namespace std;
void modificaArray(int arr[], int size) {
for(int i = 0; i < size; i++) {
arr[i] = arr[i] * 2;
}
}
int main() {
int numeri[3] = {1, 2, 3};
modificaArray(numeri, 3);
for(int i = 0; i < 3; i++) {
cout << numeri[i] << " ";
}
cout << endl;
return 0;
}
Esercizio 4
Domanda: Sulla base dell’esercizio precedente
- prevedere l’output del programma, motivando la risposta
- eseguire il programma
- scrivere considerazione finale, il passaggio di un array avviene per valore o riferimento?
#include <iostream>
using namespace std;
struct Contenitore {
int arr[3];
};
void modificaOggetto(Contenitore c) {
c.arr[0] = 100; // modifica su copia
}
void modificaOggettoRiferimento(Contenitore& c) {
c.arr[0] = 200; // modifica sull'oggetto originale
}
int main() {
Contenitore obj = 1;
modificaOggetto(obj); //chiamata funzione su copia
cout << "Dopo modificaOggetto: " << obj.arr[0] << endl;
modificaOggettoRiferimento(obj); //chiamata funzione su riferimento
cout << "Dopo modificaOggettoRiferimento: " << obj.arr[0] << endl;
return 0;
}
Esercizio 5
Domanda: Questo codice è scritto in maniera chiara? Migliorare la sua leggibilità creando una funzione per ogni funzionalità.
tip Che cosa fa la funzione stampaMedia?
#include <iostream>
using namespace std;
void stampaMedia(string nomeStudente, int voti[], int n) {
int somma = 0;
for(int i = 0; i < n; i++) {
somma += voti[i];
}
double media = double(somma) / n;
cout << "La media di " << nomeStudente << " è: " << media << endl;
}
int main() {
string studente = "Mario Rossi";
const int NUM_VOTI = 5;
int voti[NUM_VOTI] = {7, 8, 6, 9, 10};
stampaMedia(studente, voti, NUM_VOTI);
return 0;
}
Esercizio 6
Domanda: Modificare la funzione doppio in modo che cambi effettivamente il valore della variabile passata, senza usare il valore di ritorno.
#include <iostream>
using namespace std;
int doppio(int n) {
return n * 2;
}
int main() {
int numero = 7;
numero = doppio(numero);
cout << numero << endl;
return 0;
}
Esercizio 7
Domanda: Valutare il seguente codice 1. Prevedere l’output o eventuale errore motivando la risposta 2. Eseguire il programma e verificare la previsione 3. In caso di errore, modificare
#include <iostream>
using namespace std;
void stampaStudente(string nome) {
cout << "Studente: " << nome << endl;
}
int main() {
string studente = "Luca Bianchi";
cout << stampaStudente(studente) << endl;
return 0;
}