Controllo del Flusso
if/else, switch, cicli for/while/do-while, break e continue.
if / else if / else
La struttura if permette di eseguire codice solo se una condizione è vera.
#include <stdio.h>
int main() {
int voto;
printf("Inserisci il voto (0-30): ");
scanf("%d", &voto);
if (voto < 0 || voto > 30) {
printf("Voto non valido!\n");
} else if (voto < 18) {
printf("Insufficiente — ripeti l'esame.\n");
} else if (voto < 24) {
printf("Sufficiente.\n");
} else if (voto < 28) {
printf("Buono.\n");
} else if (voto < 30) {
printf("Ottimo!\n");
} else {
printf("30 e lode! Eccellente!\n");
}
return 0;
}
{} anche per blocchi di una sola riga. Evita bug subdoli e rende il codice più leggibile.
switch / case
Ideale quando hai molti casi su una variabile intera o char. Più leggibile di una cascata di if/else.
#include <stdio.h>
int main() {
int giorno;
printf("Inserisci il giorno (1-7): ");
scanf("%d", &giorno);
switch (giorno) {
case 1:
printf("Lunedì\n");
break;
case 2:
printf("Martedì\n");
break;
case 3:
printf("Mercoledì\n");
break;
case 4:
printf("Giovedì\n");
break;
case 5:
printf("Venerdì\n");
break;
case 6:
case 7:
// Fall-through: 6 e 7 eseguono lo stesso blocco
printf("Weekend!\n");
break;
default:
printf("Giorno non valido.\n");
}
// Switch con char
char operazione = '+';
double a = 10.0, b = 3.0;
switch (operazione) {
case '+': printf("%.1f + %.1f = %.1f\n", a, b, a + b); break;
case '-': printf("%.1f - %.1f = %.1f\n", a, b, a - b); break;
case '*': printf("%.1f * %.1f = %.1f\n", a, b, a * b); break;
case '/':
if (b != 0) printf("%.1f / %.1f = %.4f\n", a, b, a / b);
else printf("Divisione per zero!\n");
break;
default:
printf("Operazione sconosciuta.\n");
}
return 0;
}
break alla fine di ogni case, l'esecuzione continua nel case successivo (fall-through). A volte è intenzionale (come per i giorni del weekend), ma di solito è un bug.
Ciclo for
Ideale quando conosci in anticipo il numero di iterazioni.
#include <stdio.h>
int main() {
// Forma base: for (init; condizione; aggiornamento)
for (int i = 0; i < 5; i++) {
printf("i = %d\n", i);
}
// Contare al contrario
for (int i = 10; i >= 0; i -= 2) {
printf("%d ", i);
}
printf("\n");
// For annidati: tavola pitagorica 5x5
printf("\nTavola pitagorica:\n");
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
printf("%4d", i * j);
}
printf("\n");
}
// Somma dei primi N numeri
int n = 100;
long long somma = 0;
for (int i = 1; i <= n; i++) {
somma += i;
}
printf("\nSomma 1..%d = %lld\n", n, somma);
return 0;
}
Tavola pitagorica: 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25 Somma 1..100 = 5050
Ciclo while
Esegue il blocco finché la condizione è vera. Usato quando non sai quante iterazioni servono.
#include <stdio.h>
int main() {
// Indovina il numero (ciclo di input)
int segreto = 42;
int tentativo;
int tentativi = 0;
printf("Indovina il numero (1-100):\n");
while (1) { // ciclo infinito, uscita con break
printf("Tentativo: ");
scanf("%d", &tentativo);
tentativi++;
if (tentativo < segreto) {
printf("Troppo basso!\n");
} else if (tentativo > segreto) {
printf("Troppo alto!\n");
} else {
printf("Corretto! Hai impiegato %d tentativi.\n", tentativi);
break;
}
}
// Collatz conjecture
int n;
printf("\nInserisci un numero per la sequenza di Collatz: ");
scanf("%d", &n);
printf("Sequenza: %d", n);
int passi = 0;
while (n != 1) {
if (n % 2 == 0) n /= 2;
else n = 3 * n + 1;
printf(" -> %d", n);
passi++;
}
printf("\nPassi: %d\n", passi);
return 0;
}
Ciclo do-while
Come il while, ma il corpo viene eseguito almeno una volta (la condizione viene verificata alla fine).
#include <stdio.h>
int main() {
int scelta;
// Validazione input con do-while
do {
printf("\nMenu:\n");
printf(" 1. Nuova partita\n");
printf(" 2. Carica partita\n");
printf(" 3. Esci\n");
printf("Scelta: ");
scanf("%d", &scelta);
if (scelta < 1 || scelta > 3) {
printf("Scelta non valida! Riprova.\n");
}
} while (scelta < 1 || scelta > 3);
printf("Hai scelto l'opzione %d\n", scelta);
return 0;
}
break e continue
#include <stdio.h>
int main() {
// break: esce dal ciclo immediatamente
printf("Numeri pari fino al primo > 10:\n");
for (int i = 0; i <= 20; i++) {
if (i > 10) break; // Uscita anticipata
if (i % 2 != 0) continue; // Salta i dispari
printf("%d ", i);
}
printf("\n");
// continue: salta all'iterazione successiva
printf("\nNumeri da 1 a 20 (salta i multipli di 3):\n");
for (int i = 1; i <= 20; i++) {
if (i % 3 == 0) continue;
printf("%d ", i);
}
printf("\n");
// Trovare il primo numero primo > 100
printf("\nPrimo numero primo > 100: ");
for (int n = 101; ; n++) {
int primo = 1;
for (int d = 2; d * d <= n; d++) {
if (n % d == 0) { primo = 0; break; }
}
if (primo) {
printf("%d\n", n);
break;
}
}
return 0;
}
Crea una calcolatrice interattiva con un menu che mostri le 4 operazioni (+, -, *, /). L'utente sceglie l'operazione, inserisce due numeri, vede il risultato. Il programma continua a girare finché l'utente sceglie "Esci" (opzione 5).
#include <stdio.h>
int main() {
int scelta;
double a, b;
do {
printf("\n=== CALCOLATRICE ===\n");
printf("1. Addizione\n2. Sottrazione\n3. Moltiplicazione\n4. Divisione\n5. Esci\n");
printf("Scelta: ");
scanf("%d", &scelta);
if (scelta >= 1 && scelta <= 4) {
printf("Primo numero: "); scanf("%lf", &a);
printf("Secondo numero: "); scanf("%lf", &b);
}
switch (scelta) {
case 1: printf("Risultato: %.4f\n", a + b); break;
case 2: printf("Risultato: %.4f\n", a - b); break;
case 3: printf("Risultato: %.4f\n", a * b); break;
case 4:
if (b != 0) printf("Risultato: %.4f\n", a / b);
else printf("Errore: divisione per zero!\n");
break;
case 5: printf("Arrivederci!\n"); break;
default: printf("Scelta non valida.\n");
}
} while (scelta != 5);
return 0;
}Leggi un numero N. Stampa un triangolo di numeri con N righe dove la riga i contiene i numeri da 1 a i:
1
1 2
1 2 3
...
#include <stdio.h>
int main() {
int n;
printf("Inserisci N: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
printf("%d ", j);
}
printf("\n");
}
return 0;
}Stampa tutti i numeri primi tra 2 e N (inserito dall'utente). Per ogni numero, controlla se è divisibile per qualsiasi numero da 2 a √n. Stampa anche quanti numeri primi hai trovato.
#include <stdio.h>
int main() {
int n;
printf("Trova primi fino a N: ");
scanf("%d", &n);
int conta = 0;
for (int num = 2; num <= n; num++) {
int primo = 1;
for (int d = 2; d * d <= num; d++) {
if (num % d == 0) { primo = 0; break; }
}
if (primo) {
printf("%d ", num);
conta++;
if (conta % 10 == 0) printf("\n"); // 10 per riga
}
}
printf("\n\nTotale: %d numeri primi trovati.\n", conta);
return 0;
}Leggi un numero dispari N. Stampa un diamante di asterischi di altezza N. Es. con N=5: * ******** *** *
#include <stdio.h>
int main() {
int n;
do {
printf("N (dispari): ");
scanf("%d", &n);
} while (n % 2 == 0 || n < 1);
int meta = n / 2;
// Metà superiore
for (int i = 0; i <= meta; i++) {
for (int s = 0; s < meta - i; s++) printf(" ");
for (int a = 0; a < 2*i+1; a++) printf("*");
printf("\n");
}
// Metà inferiore
for (int i = meta-1; i >= 0; i--) {
for (int s = 0; s < meta - i; s++) printf(" ");
for (int a = 0; a < 2*i+1; a++) printf("*");
printf("\n");
}
return 0;
}Simula un bancomat: saldo iniziale 1000€. Menu: 1) Visualizza saldo, 2) Preleva, 3) Deposita, 4) Storico movimenti (max 10), 5) Esci. Il prelievo non può andare in negativo. Lo storico mostra ogni operazione con segno +/-.
#include <stdio.h>
#define MAX_STORICO 10
int main() {
double saldo = 1000.0;
double storico[MAX_STORICO];
int n_storico = 0;
int scelta;
do {
printf("\n========= BANCOMAT =========\n");
printf("1. Visualizza saldo\n");
printf("2. Preleva\n");
printf("3. Deposita\n");
printf("4. Storico movimenti\n");
printf("5. Esci\n");
printf("Scelta: ");
scanf("%d", &scelta);
switch (scelta) {
case 1:
printf("Saldo attuale: EUR %.2f\n", saldo);
break;
case 2: {
double importo;
printf("Importo da prelevare: ");
scanf("%lf", &importo);
if (importo <= 0) {
printf("Importo non valido.\n");
} else if (importo > saldo) {
printf("Fondi insufficienti!\n");
} else {
saldo -= importo;
if (n_storico < MAX_STORICO)
storico[n_storico++] = -importo;
printf("Prelievo di EUR %.2f effettuato.\n", importo);
}
break;
}
case 3: {
double importo;
printf("Importo da depositare: ");
scanf("%lf", &importo);
if (importo <= 0) {
printf("Importo non valido.\n");
} else {
saldo += importo;
if (n_storico < MAX_STORICO)
storico[n_storico++] = importo;
printf("Deposito di EUR %.2f effettuato.\n", importo);
}
break;
}
case 4:
printf("\n--- Storico movimenti ---\n");
if (n_storico == 0) {
printf("Nessun movimento.\n");
} else {
for (int i = 0; i < n_storico; i++) {
printf("%2d. %+.2f EUR\n", i+1, storico[i]);
}
}
break;
case 5:
printf("Grazie per aver usato il bancomat!\n");
break;
default:
printf("Scelta non valida.\n");
}
} while (scelta != 5);
return 0;
}