CodeGym /Corsi /JAVA 25 SELF /if annidati, logica multilivello

if annidati, logica multilivello

JAVA 25 SELF
Livello 3, Lezione 2
Disponibile

1. Sintassi di base di un if annidato

Nella vita reale è raro trovarsi in una situazione in cui una decisione si prende in base a un solo criterio. Di solito bisogna verificare più condizioni contemporaneamente, e spesso dipendono l’una dall’altra. Per esempio, per entrare a un concerto non basta essere maggiorenni — a volte bisogna anche essere nella lista degli invitati. Qui entra in scena la cosiddetta logica multilivello, e ci aiutano in questo gli operatori if annidati.

Le condizioni annidate sono quando un if vive dentro un altro. Immagina una scatola dentro la scatola: se la condizione esterna è soddisfatta, solo allora viene verificata quella interna. È un potente strumento di controllo del flusso.

Cominciamo da qualcosa di semplice:

if (uslovieA)
{
    // azioni se uslovieA è true (vero)
    if (uslovieB)
    {
        // azioni se entrambe le condizioni sono vere
    }
}
if annidato dentro un altro if

Se ti ricorda una matrioska — stai capendo bene! L’if interno verrà eseguito solo se quello esterno è scattato.

Esempio: ingresso al club

Sviluppiamo la nostra app didattica, dove l’utente in precedenza inseriva nome ed età. Ora aggiungiamo un secondo livello di verifica: supponiamo che, per entrare in un club privato, bisogna avere più di 21 anni e disporre di un codice di invito.

System.out.print("Inserisci il tuo nome: ");
String name = console.nextLine();

System.out.print("Inserisci la tua età: ");
int age = console.nextInt();

if (age >= 21)
{
    System.out.print("Inserisci il codice di invito: ");
    String code = console.nextLine();

    if (code.equals("VIP2024"))
    {
        System.out.println("Benvenuto, " + name + ", nel club VIP!");
    }
    else
    {
        System.out.println("Spiacenti, codice non valido. Accesso negato.");
    }
}
else
{
    System.out.println("Spiacenti, ingresso consentito solo dai 21 anni!");
}

Attenzione: l’if interno controlla il codice solo se l’età ha già superato il controllo. Questo fa risparmiare risorse (e i nervi del buttafuori).

2. Quanti livelli di annidamento sono accettabili?

Tecnicamente — quanti vuoi. Ma in pratica: più livelli annidati ci sono, più è difficile leggere e mantenere il codice. Di solito ci si limita a 2–3 livelli. Se ti ritrovi con una “scaletta” di 4+ if annidati, valuta se puoi semplificare la logica o estrarre i controlli in metodi.

Logica annidata: visualizzazione

3. if ed else annidati: trappole e sfumature

Errore tipico dei principianti: uso disattento delle parentesi graffe.

In Java con else vige una regola rigida: senza parentesi graffe {} all’if o all’else è associata solo la prima istruzione successiva. È una fonte frequente di fastidiosi bug.

Esempio con potenziale errore:

if (age >= 21)
    if (code.equals("VIP2024"))
        System.out.println("Benvenuto!");
else
    System.out.println("Codice non valido.");

Molti si aspettano che l’else si riferisca al controllo dell’età, ma in realtà si riferisce all’if più vicino precedente (il controllo del codice di invito). Perciò i messaggi possono essere mostrati in modo diverso da quanto previsto. Meglio usare sempre le parentesi — anche se dentro c’è solo una riga!

Per evitare ambiguità, il compilatore vede questo codice così:

if (age >= 21)
{    
    if (code.equals("VIP2024"))
        System.out.println("Benvenuto!");
else
    System.out.println("Codice non valido.");
}    

Importante! Ancora una volta: se nella costruzione if-else non metti le parentesi graffe, l’else si riferisce all’if precedente (il più vicino).

4. Alternative: else if in condizioni annidate

A volte, dentro l’if esterno, non vuoi solo verificare una condizione aggiuntiva, ma anche prevedere un’alternativa. Per esempio, se il codice di invito non va bene, puoi offrire un accesso ospite oppure rifiutare.

if (age >= 21)
{
    System.out.print("Inserisci il codice di invito: ");
    String code = console.nextLine();

    if (code.equals("VIP2024"))
    {
        System.out.println("Benvenuto nel club!");
    }
    else if (code.equals("GUEST"))
    {
        System.out.println("Modalità ospite: accesso consentito solo fino alle 23:00.");
    }
    else
    {
        System.out.println("Purtroppo, l'accesso non è possibile.");
    }
}
else
{
    System.out.println("Ingresso consentito solo dai 21 anni.");
}

Qui, all’interno della scelta esterna, facciamo una scelta annidata tra tre scenari: codice VIP, codice ospite e rifiuto.

5. Pratica: calcolatore di sconto con logica multilivello

Supponiamo che all’utente venga applicato uno sconto in base all’età e alla presenza di una tessera del club.

  • Se l’età dell’utente è maggiore o uguale a 60 — sconto del 15 %.
  • Se l’età è inferiore ma l’utente ha una tessera del club — sconto del 7 %.
  • Negli altri casi, nessuno sconto.

Come implementarlo?

System.out.print("Inserisci la tua età: ");
int age = console.nextInt();

double discount = 0.0;

if (age >= 60)
{
    discount = 0.15;
}
else
{
    System.out.print("Hai una tessera del club (sì/no)? ");
    String hasCard = console.nextLine();

    if (hasCard.equals("sì"))
    {
        discount = 0.07;
    }
}

System.out.println("Il tuo sconto: " + (discount * 100) + "%");

Qui abbiamo usato un if annidato nel ramo else: se l’età non soddisfa il requisito, solo allora chiediamo della tessera.

1
Compito
JAVA 25 SELF, livello 3, lezione 2
Bloccato
Controllo accesso alla festa 🥳
Controllo accesso alla festa 🥳
1
Compito
JAVA 25 SELF, livello 3, lezione 2
Bloccato
Accesso al club 🌃
Accesso al club 🌃
1
Compito
JAVA 25 SELF, livello 3, lezione 2
Bloccato
Inviti per la conferenza 🎤
Inviti per la conferenza 🎤
1
Compito
JAVA 25 SELF, livello 3, lezione 2
Bloccato
Programma fedeltà del negozio 🛍️
Programma fedeltà del negozio 🛍️
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION