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