# Soluzioni Esercitazione Funzioni # Parte 1 ## Esercizio 00 - Somma, Diff, SommaDiff Scrivere un programma che richieda all'utente di inserire un numero Naturale. Si scrivano le funzioni: - `leggiN()`: legge da input e restituisce un numero naturale; - `somma()`: dati due interi, restituisce la somma dei due - `diff()`: come `somma()`, ma per la differenza - `sommaDiff()`: prende in input `n1`, `n2`, e restituisce sia `n1+n2` che `n1-n2`. :warning: ==Quando viene detto "prende in input", potrebbero essere anche necessari altri valori __non__ esplicitamente indicati.== ```c #include <stdio.h> int leggiN(); int somma(int, int); int diff(int, int); void sommaDiff(int, int, int*, int*); int main(){ int n1, n2, s, d, somma2, diff2; n1 = leggiN(); n2 = leggiN(); s = somma(n1, n2); // NB: diff(n1, n2) != diff(n2, n1) d = diff(n1, n2); printf("Somma = %d\n", s); printf("Diff = %d\n", d); sommaDiff(n1, n2, &somma2, &diff2); printf("Somma2 = %d\n", somma2); printf("Diff2 = %d\n", diff2); return 0; } int leggiN(){ int a; printf("Inserisci un numero intero: "); scanf("%d", &a); return a; } int somma(int a, int b){ int c; c = a + b; return c; // OPPURE return a + b; } int diff(int a, int b){ return a - b; } void sommaDiff(int a, int b, int *ps, int *pd){ // Passaggio per RIFERIMENTO dei puntatori *ps = somma(a, b); *pd = diff(a, b); } ``` ## Esercizio 01 - Divisori di Un Numero Scrivere un programma che chiede all’utente di inserire un numero naturale. Il programma stampa tutti i divisori del numero. Scrivere le funzioni: - `leggiNumeroNaturale()` : che legge da input e restituisce un numero naturale - `stampaDivisori()`: che dato un numero naturale, stampa tutti i suoi divisori **Nota:** si può ottimizzare fermandosi a `sqrt(n)` e se i è un divisore di `n`, lo è anche `n/i`. ```c #include <stdio.h> int leggiNumeroNaturale(); void stampaDivisori(int); int main(){ // Variabili int num; // Leggi il numero num = leggiNumeroNaturale(); // Stampa i divisori stampaDivisori(num); return 0; } int leggiNumeroNaturale(){ int numero; do { printf("Inserisci un numero: "); scanf("%d", &numero); } while(numero < 0); return numero; } void stampaDivisori(int numero){ int i; printf("Divisori di %d: ", numero); for(i=1; i <= numero; i++){ if(numero % i == 0) printf("%d, ", i); } printf("\n"); } ``` --- ## Esercizio 02 - Numeri Amici Scrivere un programma che: 1. prende in input due numeri naturali `n1` e `n2` 2. verifica che i numeri siano amici 3. stampa se i numeri sono amici o meno **Nota:** `n1` e `n2` sono amici se `n1` è uguale alla somma dei divisori propri (i.e., eccetto se stesso) di `n2` e viceversa. Scrivere le funzioni: - `leggiNumeroNaturale()`: che legge e restituisce un numero naturale - `sommaDivisori()`: che restituisce la somma di tutti i divisori di un numero dato in input - `numeriAmici()`: che prende in input due numeri naturali e restituisce 1 quando i numeri sono amici, 0 altrimenti. ```c #include <stdio.h> int leggiNumeroNaturale(); int sommaDivisori(int); int numeriAmici(int, int); int main(){ // Variabili int num1, num2, flag; // Leggi il numero num1 = leggiNumeroNaturale(); num2 = leggiNumeroNaturale(); // Verifica se il numero è perfetto flag = numeriAmici(num1, num2); if(flag) printf("%d e %d amici\n", num1, num2); else printf("%d e %d non amici\n", num1, num2); return 0; } int leggiNumeroNaturale(){ int numero; do { printf("Inserisci un numero: "); scanf("%d", &numero); } while(numero < 0); return numero; } int sommaDivisori(int n){ int i, somma=0; for(i=1; i<=n; i++){ if(n % i == 0) somma += i; } return somma; } int numeriAmici(int n1, int n2){ int somma1, somma2; somma1 = sommaDivisori(n1) - n1; somma2 = sommaDivisori(n2) - n2; return somma1 == n2 && somma2 == n1; } ``` --- ## Esercizio 03 - Numeri Perfetti Scrivere un programma che chiede all’utente di inserire un numero naturale. Il programma verifica che il numero sia perfetto. **Nota:** un numero si dice perfetto quando è uguale all somma di tutti i suoi divisori (eccetto se stesso). Scrivere le funzioni: - `leggiNumeroNaturale()` : che legge da input e restituisce un numero naturale - `sommaDivisori()`: che dato un numero naturale, restituisce la somma di tutti i suoi divisori - `numeroPerfetto()`: che dato un numero naturale, restituisce 1 se il numero è perfetto, 0 altrimenti. ```c #include <stdio.h> int leggiNumeroNaturale(); int sommaDivisori(int); int numeroPerfetto(int); int main(){ // Variabili int num, flag; // Leggi il numero num = leggiNumeroNaturale(); // Verifica se il numero è perfetto flag = numeroPerfetto(num); if(flag) printf("%d perfetto\n", num); else printf("%d non perfetto\n", num); return 0; } int leggiNumeroNaturale(){ int numero; do { printf("Inserisci un numero: "); scanf("%d", &numero); } while(numero < 0); return numero; } int sommaDivisori(int n){ int i, somma=0; for(i=1; i<=n; i++){ if(n % i == 0) somma += i; } return somma; } int numeroPerfetto(int numero){ int somma; somma = sommaDivisori(numero); return somma - numero == numero; } ``` --- ## Esercizio 04 - Numeri Perfetti, Difettivi e Abbondanti Scrivere un programma che chiede all’utente di inserire un numero naturale. Il programma verifica che il numero sia perfetto, abbondante o difettivo. **Nota:** un numero si dice perfetto quando è uguale all somma di tutti i suoi divisori (eccetto se stesso). Un numero è abbondante quando è `<` della somma dei suoi divisori (eccetto se stesso). Un numero è difettivo quando è `>` della somma dei suoi divisori (eccetto se stesso). Scrivere le funzioni: - `leggiNumeroNaturale()` : che legge da input e restituisce un numero naturale - `sommaDivisori()`: che dato un numero naturale, restituisce la somma di tutti i suoi divisori - `numeroPerfettoPlus()`: che dato un numero naturale, restituisce 1 se il numero è perfetto , 0 altrimenti. Se il numero non è perfetto, la funzione deve essere in grado di comunicare al main se il numero è abbondante o difettivo. ```c #include <stdio.h> int leggiNumeroNaturale(); int sommaDivisori(int); int numeroPerfettoPlus(int, int*); int main(){ // Variabili int num, flag, res; // Leggi il numero num = leggiNumeroNaturale(); // Verifica se il numero è perfetto flag = numeroPerfettoPlus(num, &res); if(flag) printf("%d perfetto\n", num); else{ if(res > 0) printf("%d abbondante\n", num); else printf("%d difettivo\n", num); } return 0; } int leggiNumeroNaturale(){ int numero; do { printf("Inserisci un numero: "); scanf("%d", &numero); } while(numero < 0); return numero; } int sommaDivisori(int n){ int i, somma=0; for(i=1; i<=n; i++){ if(n % i == 0) somma += i; } return somma; } int numeroPerfettoPlus(int numero, int* pres){ int somma; somma = sommaDivisori(numero); *pres = somma - numero - numero; return somma - numero == numero; } ``` --- ## Esercizio 05 - Calcolo Potenze Scrivere un programma che calcola la potenza di un numero elevato a un esponente. Il programma deve: chiedere due numero in input all’utente, uno sarà la base (anche negativo), l’altro l’esponente (da considerarsi solo positivo); calcolare la base elevata alla potenza. Scrivere le funzioni: - `leggiNum()`: che legge e restituisce un numero intero - `leggiNumPos()`: che legge e restituisce un numero intero positivo - `pow()`: che prende in input base ed esponente e restituisce la base elevata all’esponente ```c #include <stdio.h> int pow(int, int); int leggiNum(); int leggiNumPos(); int main(){ // Variabili int num, exp, res; // Leggi numero num = leggiNum(); // Leggi esponente exp = leggiNumPos(); // Calcola potenza res = pow(num, exp); printf("%d^%d = %d\n", num, exp, res); return 0; } int leggiNum(){ int a; printf("Inserisci un numero: "); scanf("%d", &a); return a; } int leggiNumPos(){ int a; do { printf("Inserisci un numero positivo: "); scanf("%d", &a); } while(a < 0); return a; } int pow(int num, int exp){ int res, i; // Se exp è 0 restituisco 1 if(exp == 0) return 1; // calcolo la potenza res = num; for(int i = 2; i <= exp; i++) res *= num; return res; } ``` --- ## Esercizio 06 - Serie di Fibonacci Scrivere un programma che: 1. chiede in input un numero naturale positivo 2. stampa la serie di fibonacci fino a quel numero Scrivere le funzioni: - `leggiNumeroPositivo()` :che legge e restituisce un intero positivo - `stampaFibonacci()`: che prende in input un intero positivo e stampa la serie di fibonacci fino a qual punto $$ \begin{cases} F_0 = 0\\ F_1 = 1\\ F_n = F_{n-1} + F_{n-2} \end{cases} $$ 0, 1, 1, 2, 3, 5, 8, 13, 21, … ```c #include <stdio.h> int leggiNumero(); void stampaFibonacci(int); int main(){ int n; n = leggiNumero(); stampaFibonacci(n); return 0; } int leggiNumero(){ int a; do { printf("Inserisci un valore > 0: "); scanf("%d", &a); } while (a <= 0); return a; } void stampaFibonacci(int n){ int i, a=0, b=1, prossimo; for(i=0; i<n; i++){ if(i<=1) prossimo = i; else{ prossimo = a + b; a = b; b = prossimo; } printf("%d, ", prossimo); } printf("\n"); } ``` --- ## Esercizio 07 - Calcolatrice Perpetua (Calcolatrice 2.0) Scrivere un programma che, fin quando l’utente non ordina la terminazione inserendo ‘q’ o ‘Q’, permette di: 1. inserire due numeri 2. inserire un tipo di operazione: +, -, *, / 3. svolge e stampa a schermo il risultato dell’operazione Scrivere le funzioni: - `somma()`: presi due numeri ne restituisce la somma - `differenza()`: presi due numeri ne restituisce la differenza - `prodotto()`: presi due numeri ne restituisce il prodotto - `divisione()`: presi due numeri ne restituisce la divisione e se il secondo operando è 0, comunica al chiamante che c’è stato un errore - `leggiNumero()`: che legge e restituisce un numero lasciando il buffer pulito - `leggiCarattere()`: che legge e restituisce un carattere lasciando il buffer pulito - `menu()`: che implementa la logica della calcolatrice in un ciclo che dura fin quando l’utente lo vuole. Non ha nulla in input e non restituisce nulla ```c #include <stdio.h> void menu(); char leggiCarattere(); float leggiNumero(); float somma(float, float); float differenza(float, float); float prodotto(float, float); float divisione(float, float, int*); int main(){ menu(); return 0; } char leggiCarattere(){ char c; scanf("%c", &c); scanf("%*c"); return c; } float leggiNumero(){ float n; scanf("%f", &n); scanf("%*c"); return n; } float somma(float a, float b){ return a+b; } float differenza(float a, float b){ return a-b; } float prodotto(float a, float b){ return a*b; } float divisione(float a, float b, int* err){ if(b == 0){ printf("Errore\n"); *err = 1; return 0; } return a/b; } void menu(){ int flag = 1, err = 0; float n1, n2, res; char op; while(flag){ printf("Inserisci il primo numero: "); n1 = leggiNumero(); printf("Inserisci il secondo numero: "); n2 = leggiNumero(); printf("Inserisci l'operazione da eseguire (premi Q per uscire): "); op = leggiCarattere(); switch (op) { case '+': res = somma(n1, n2); break; case '-': res = differenza(n1, n2); break; case '*': res = prodotto(n1, n2); break; case '/': res = divisione(n1, n2, &err); break; case 'q': case 'Q': flag = 0; break; default: err = 1; printf("Operazione non disponibile!\n"); break; } if(err==0 && flag==1) printf("%f %c %f = %f\n", n1, op, n2, res); else err = 0; } } ``` --- ## Esercizio Aggiuntivo: Somma o Differenza per Riferimento Scrivere in programma che legge due numeri e ne stampa la somma e la differenza. Scrivere le funzioni: - `leggiNumero()`: che legge e restituisce un numero - `sommaODifferenza()`: che prende in input due numeri, un puntatore a intero e un carattere. Il carattere può essere + o - e indica quale operazione fare. La funzione non restituisce nulla e salva il risultato in un’area di memoria accessibile dalla funzione chiamante ```c #include <stdio.h> int leggiNumero(); void sommaODifferenza(int, int, int*, char); int main(){ int a, b, res; a = leggiNumero(); b = leggiNumero(); sommaODifferenza(a, b, &res, '+'); printf("%d + %d = %d\n", a, b, res); sommaODifferenza(a, b, &res, '-'); printf("%d - %d = %d\n", a, b, res); return 0; } int leggiNumero(){ int a; printf("Inserisci un valore: "); scanf("%d", &a); return a; } void sommaODifferenza(int a, int b, int* res, char op){ switch (op) { case '+': *res = a+b; break; case '-': *res = a-b; break; default: printf("Errore: %c non valido.\n"); break; } } ``` ---