if / else if / else

La struttura if permette di eseguire codice solo se una condizione è vera.

Cif / else if / else
#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;
}
Buona pratica Metti sempre le parentesi graffe {} 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.

Cswitch con break e default
#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;
}
Attenzione — break! Senza 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.

CCiclo for — sintassi e varianti
#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;
}
Output (parziale)
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.

CCiclo while
#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).

Cdo-while — validazione input
#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

Cbreak e continue nei cicli
#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;
}
🏋️ Esercizi
Metti alla prova le tue conoscenze sul controllo del flusso.
1
Calcolatrice con menu
Facileswitch / do-while

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).

C
#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;
}
2
Triangolo di numeri
Facilefor annidati

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
...

C
#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;
}
3
Numeri primi
MedioCrivello / break

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.

Usa sqrt() da math.h o testa fino a d*d <= n per evitarla.
C
#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;
}
4
Pattern a diamante
Mediofor annidati / pattern

Leggi un numero dispari N. Stampa un diamante di asterischi di altezza N. Es. con N=5:
  *
 ***
*****
 ***
  *

C
#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;
}
5
Simulazione di bancomat
Difficilewhile / switch / logica

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 +/-.

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