# Soluzioni: Strutture di Controllo 2
## Esercizio 1: Inserimento Sequenziale di Caratteri con Criterio di Stop
Si scriva un programma che permetta di inserire all'utente un carattere alla volta. Ogni volta che l'utente inserisce un carattere il programma deve stampare:
1. il numero di caratteri inseriti finora;
2. l'ultimo carattere inserito.
Il programma termina quando l'utente inserisce il carattere '*'.
### Versione 1: Controllo direttamente sull'ultimo carattere inserito
```c
#include <stdio.h>
int main(int argc, char* argv[]){
// Variabili
char carattere = 0;
int contatore = 0;
// Ciclo while per l'inserimento sequenziale di caratteri
// La condizione di uscita è proprio quella per cui il carattere inserito è '*'
while(carattere != '*'){
// Inserimento del carattere
printf("Inserisci un carattere: ");
scanf("%c", &carattere);
// consumare il carattere '\n' rimanente
scanf("%*c");
// Incremento del contatore
contatore++;
// Stampa delle informazioni
printf("Il carattere inserito è: %c.\n", carattere);
printf("Numero di caratteri inseriti finora: %d.\n\n", contatore);
}
return 0;
}
```
### Versione 2: Controllo su una variabile di flag
```c
#include <stdio.h>
int main(int argc, char* argv[]){
// Variabili
char carattere = 0;
int contatore = 0, flag = 0;
// Ciclo while per l'inserimento sequenziale di caratteri
// La condizione di uscita è regolata dal flag
// La variabile flag è pensata per essere True quando l'utente inserisce il carattere '*'
while(!flag){
// Inserimento del carattere
printf("Inserisci un carattere: ");
scanf("%c", &carattere);
// consumare il carattere '\n' rimanente
scanf("%*c");
// Incremento del contatore
contatore++;
// Stampa delle informazioni
printf("Il carattere inserito è: %c.\n", carattere);
printf("Numero di caratteri inseriti finora: %d.\n\n", contatore);
// Se l'ultimo carattere inserito è '*'
// allora si assegna alla variabile flag il valore 1
if(carattere == '*') flag = 1;
}
return 0;
}
```
**Bonus**: come fare se non si vuole stampare l'ultimo carattere '*' senza modificare la struttura generale del codice fornito? (Suggerimento: usare break).
---
## Esercizio 2: Stampa delle Tabelline
Si scriva un programma in grado di stampare le tabelline (da 1 a 10) usando solo cicli while.
```c
#include <stdio.h>
int main(int argc, char* argv[]){
// Variabili
int n = 1, i = 0;
// Primo ciclo
while(n <= 10){
i = n;
// Secondo ciclo per stampare
while(i <= 10*n){
printf("%d ", i);
i += n;
}
printf("\n");
n++;
}
return 0;
}
```
<!-- **Bonus**: implementare il programma usando solo cicli `for` invece che i cicli `while`. -->
---
## Esercizio 3: Calcolo delle Cifre di un Numero
Si scriva un programma che permetta all'utente di inserire un numero intero $N$ in input (positivo o negativo). Il programma calcola il numero di cifre di $N$ e lo stampa a schermo.
```c
#include <stdio.h>
int main(int argc, const char * argv[]){
// Variabili
int N, tmp, n_cifre;
// Inserimento del numero da parte dell'utente
printf("Inserisci un numero intero: ");
scanf("%d", &N);
// Calcolo del numero di cifre
tmp = N;
n_cifre = 0;
while(tmp != 0){
tmp /= 10;
n_cifre++;
}
// Sistemo il caso in cui il numero inserito è 0
if(N == 0) n_cifre = 1;
// Stampa del risultato
printf("Il numero %d ha %d cifre.\n", N, n_cifre);
return 0;
}
```
---
## Esercizio 4: Inversione delle Cifre
Si scriva un programma che permetta all'utente di inserire un numero intero positivo $N$ in input. Il programma deve stampare a schermo il numero inserito dall'utente con tutte le cifre invertite. Ad esempio se l'utente inserisce $N=1234$ il programma deve stampare $4321$.
### Versione Intuitiva
```c
#include <stdio.h>
#include <math.h>
int main(int argc, const char * argv[]){
// Dichiarazione delle variabili
int N, n_cifre, res, tmp, i;
// Acquisizione numero da parte dell'utente
printf("Inserisci un numero intero positivo: ");
scanf("%d", &N);
// Verifica che il numero sia postivo
if(N < 0){
printf("Il numero è negativo!.\n");
return 1;
}
// Capisci il numero di cifre del numero
tmp = N;
n_cifre = 0;
while(tmp != 0){
tmp /= 10;
n_cifre++;
}
if(N == 0) n_cifre = 1;
// Inversione cifre
res = 0;
tmp = N;
i = 1;
do {
res += (tmp % 10) * (int)pow(10, n_cifre - i);
tmp = tmp / 10;
i++;
} while(i <= n_cifre);
// Stampa
printf("Numero inserito: %d\n", N);
printf("Numero invertito: %d\n", res);
return 0;
}
```
### Versione Ottimizzata
```c
#include <stdio.h>
#include <math.h>
int main(int argc, const char * argv[]){
// Dichiarazione delle variabili
int N, res, tmp, i;
// Acquisizione numero da parte dell'utente
printf("Inserisci un numero intero positivo: ");
scanf("%d", &N);
// Verifica che il numero sia postivo
if(N < 0){
printf("Il numero è negativo!.\n");
return 1;
}
// Inversione cifre
res = N % 10;
tmp = N / 10;
while(tmp != 0){
res *= 10;
res += tmp % 10;
tmp /= 10;
}
// Stampa
printf("Numero inserito: %d\n", N);
printf("Numero invertito: %d\n", res);
return 0;
}
```
**Bonus**: si faccia anche con la possibilità di avere numeri negativi.
---
## Esercizio 6+7 - Switch: Calcolatrice
Si scriva un programma che replichi il funzionamento di una calcolatrice. Implementare solamente le 4 operazioni: '+', '-', '\*', '/'. Usare il costrutto switch.
```c
#include <stdio.h>
int main(int argc, char* argv[]){
// Variabili
float op1, op2, res;
char operazione;
// Acquisizione da tastiera del primo operando
printf("Inserire il PRIMO operando: ");
scanf("%f", &op1);
scanf("%*c"); // consumo \n in quanto dovrò leggere un char
// Acquisizione da tastiera dell'operazione
printf("Inserire l'operazione da eseguire: ");
scanf("%c", &operazione);
// Acquisizione da tastiera del secondo operando
printf("Inserire il SECONDO operando: ");
scanf("%f", &op2);
// Svolgo l'operazione
switch(operazione){
case '+':
res = op1 + op2;
break;
case '-':
res = op1 - op2;
break;
case '*':
res = op1 * op2;
break;
case '/':
if(op2 != 0) res = op1 / op2;
else{
printf("Errore!\n");
return 1;
}
break;
default:
printf("Operazione non consentita!\n");
return 1;
}
printf("%.2f %c %.2f = %.2f.\n", op1, operazione, op2, res);
return 0;
}
```
---