Esercizio - Creare una logica decisionale annidata con if, else if ed else

Completato

Nell'unità precedente sono state usate più istruzioni if per implementare le regole di un gioco. Alla fine dell'unità si è tuttavia notato che sono necessarie istruzioni if più espressive per correggere un piccolo bug nel codice.

In questo esercizio si useranno le istruzioni if, elsee else if per migliorare le opzioni di diramazione nel codice e correggere un bug della logica.

Usare le istruzioni if e else invece di due istruzioni if distinte

Invece di eseguire due controlli per visualizzare il messaggio "Hai vinto!" o "Spiacenti, hai perso", si userà la parola chiave else.

  1. Verificare che il codice di Program.cs corrisponda al seguente:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles! +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3)) 
    {
        Console.WriteLine("You rolled triples! +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    Questo è il codice completato nell'unità precedente.

  2. Esaminare le due istruzioni if alla fine del file:

    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    Si noti che entrambe le istruzioni if confrontano total con lo stesso valore numerico. Questa è l'opportunità perfetta per usare un'istruzione else.

  3. Aggiornare le due istruzioni if come indicato di seguito:

    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    In questo caso, se total >= 15 è false, verrà eseguito il blocco di codice sotto la parola chiave else. Poiché i due risultati sono opposti, si tratta di uno scenario perfetto per la parola chiave else.

  4. Il file Program.cs aggiornato deve contenere il codice seguente:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles!  +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3))
    {
        Console.WriteLine("You rolled triples!  +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

Modificare il codice per rimuovere il doppio bonus per aver ottenuto due e tre volte lo stesso punteggio tramite l'annidamento

Nell'unità precedente è stato rilevato che è stato introdotto un piccolo bug logico nell'applicazione. È possibile risolvere il problema annidando le istruzioni if.

L'annidamento consente di inserire blocchi di codice all'interno di blocchi di codice. In questo caso si anniderà una combinazione di if e else (il controllo dei duplicati) all'interno di un'altra istruzione if (il controllo dei triplicati) per impedire che entrambi i bonus vengano assegnati.

  1. Modificare il codice in modo che corrisponda al listato di codice seguente:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        if ((roll1 == roll2) && (roll2 == roll3))
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6;
        }
        else
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    
  2. Esaminare le istruzioni if annidate.

    L'obiettivo è creare un costrutto interno if-else in cui i due risultati sono opposti correlati e quindi usare i risultati opposti (se/true ed else/false) per assegnare i punti bonus per triplicati e duplicati. Per raggiungere questo obiettivo, verificare la presenza di duplicati nell'istruzione if esterna e quindi di triplicati nell'istruzione if interna. Questo criterio garantisce che quando il controllo interno per rilevare triplicati restituisce false, il blocco di codice else può assegnare i punti per i duplicati.

    In seguito si applicherà la modalità "hardcoded" ai risultati dei tre lanci per testare la logica del codice.

  3. Creare una riga di codice vuota sopra la riga di dichiarazione e inizializzazione di total.

  4. Per testare un lancio che risulta in duplicati, immettere il codice seguente:

    roll1 = 6;
    roll2 = 6;
    roll3 = 5;
    

    L'impostazione su hardcoded per le tre variabili roll consente di testare il codice senza dover eseguire l'applicazione decine di volte.

  5. Fare clic su Salva nel menu File di Visual Studio Code.

  6. Nel pannello ESPLORA RISORSE per aprire un terminale nel percorso della cartella TestProject, fare clic con il pulsante destro del mouse su TestProject e quindi scegliere Apri nel terminale integrato.

    Verrà aperto un pannello del terminale con un prompt dei comandi che indica che il terminale è aperto al percorso della cartella TestProject.

  7. Nel prompt dei comandi del terminale, digitare dotnet run per eseguire il codice, quindi premere INVIO.

    Quando il codice viene eseguito, dovrebbe essere visualizzato quanto riportato di seguito:

    Dice roll: 6 + 6 + 5 = 17
    You rolled doubles!  +2 bonus to total!
    You win!
    
    
  8. Per testare un lancio che risulta in triplicati, aggiornare le variabili di lancio hardcoded come indicato di seguito:

    roll1 = 6;
    roll2 = 6;
    roll3 = 6;
    
  9. Fare clic su Salva nel menu File di Visual Studio Code.

  10. Nel pannello ESPLORA RISORSE per aprire un terminale nel percorso della cartella TestProject, fare clic con il pulsante destro del mouse su TestProject e quindi scegliere Apri nel terminale integrato.

  11. Nel prompt dei comandi del terminale, digitare dotnet run per eseguire il codice, quindi premere INVIO.

    Quando il codice viene eseguito, dovrebbe essere visualizzato quanto riportato di seguito:

    Dice roll: 6 + 6 + 6 = 18
    You rolled triples!  +6 bonus to total!
    You win!
    
    

Usare le istruzioni if, else ed else if per assegnare un premio anziché un messaggio di vincita o perdita

Per rendere più divertente il gioco, è possibile modificarlo in modo da assegnare premi fittizi per ogni punteggio. È possibile offrire quattro premi. Il giocatore dovrebbe tuttavia vincere un solo premio:

  • Se il giocatore ottiene un punteggio maggiore o uguale a 16, avrà in premio una nuova auto.
  • Se il giocatore ottiene un punteggio maggiore o uguale a 10, avrà in premio un nuovo portatile.
  • Se il giocatore ottiene il punteggio esatto di 7, avrà in premio un viaggio.
  • In caso contrario, il giocatore avrà in premio un gattino.
  1. Modificare il codice dei passaggi precedenti in modo che corrisponda al listato di codice seguente:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        if ((roll1 == roll2) && (roll2 == roll3))
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6;
        }
        else
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    
        Console.WriteLine($"Your total including the bonus: {total}");
    }
    
    if (total >= 16)
    {
        Console.WriteLine("You win a new car!");
    }
    else if (total >= 10)
    {
        Console.WriteLine("You win a new laptop!");
    }
    else if (total == 7)
    {
        Console.WriteLine("You win a trip for two!");
    }
    else
    {
        Console.WriteLine("You win a kitten!");
    }
    
    
  2. Soffermarsi qualche istante a esaminare il costrutto if-elseif-else aggiornato.

    Le istruzioni if, else if e else consentono di creare più condizioni esclusive come espressioni booleane. In altre parole, quando si vuole che si verifichi un solo scenario, ma esistono diversi risultati e condizioni possibili, usare tutte le istruzioni else if desiderate. Se nessuna delle istruzioni if e else if è applicabile, verrà eseguito il blocco di codice else finale. L'istruzione else è facoltativa ma deve essere eseguita per ultima, se si sceglie di includerla.

  3. Usare la tecnica di impostazione temporanea delle variabili roll come hardcoded per testare ogni messaggio.

Riepilogo

  • La combinazione di istruzioni if e else consente di testare una condizione e quindi di eseguire uno dei due risultati. Il blocco di codice per if verrà eseguito quando l'espressione booleana è truee il blocco di codice per else verrà eseguito quando l'espressione booleana è false.
  • È possibile annidare le istruzioni if per limitare una condizione possibile. Tuttavia, è consigliabile preferire l'uso delle istruzioni if, else if e else.
  • Usare istruzioni else if per creare più condizioni esclusive.
  • Un'istruzione else è facoltativa, ma deve essere sempre eseguita per ultima, se inclusa.