GNU/Linux >> Linux Esercitazione >  >> Linux

Procedura:Introduzione alla programmazione – Controllo del flusso

Serie di istruzioni

Questa è la parte 4 di una serie di 5 parti per Introduzione alla programmazione

  1. Introduzione alla programmazione:per iniziare
  2. Introduzione alla programmazione:il tuo primo programma
  3. Introduzione alla programmazione:variabili, tipi e manipolazione dei dati
  4. Introduzione alla programmazione:controllo del flusso
  5. Introduzione alla programmazione:programmazione orientata agli oggetti

Bentornati, aspiranti programmatori!

In questo articolo esploreremo il flusso di controllo e come puoi utilizzare condizioni, rami, loop e altri meccanismi per determinare cosa succede nel tuo programma.

Se non hai letto i precedenti articoli di questa serie, ti consiglio vivamente di farlo. Ci stiamo basando sulle conoscenze precedenti in tutti questi articoli, quindi è importante per la tua comprensione che tu sappia ciò che abbiamo già trattato.

Abbiamo molto da trattare in questo articolo, quindi, senza ulteriori cerimonie, mettiamoci al lavoro.
.

Gestione delle eccezioni

L'ultima volta che abbiamo lasciato il nostro programma, avevamo tre righe di codice e un problema. Il codice è simile a questo:

Console.WriteLine("Guess a number between 1 and 10:");
string text = Console.ReadLine();
int input = int.Parse(text);

Tuttavia, se eseguiamo questo programma e inseriamo qualsiasi cosa tranne un numero quando richiesto, il programma si arresta in modo anomalo perché il compilatore non sa come trasformare un testo non numerico in un numero intero.

Se ricordi dall'ultima volta, otteniamo quella che viene chiamata un'eccezione ed è uno dei modi in cui possiamo controllare il flusso di un programma in una situazione molto specifica, vale a dire quando si verifica una situazione eccezionale.

Volevo iniziare con la gestione delle eccezioni perché è l'argomento più complesso e forse confuso nel controllo del flusso, quindi se riesci a capire cosa facciamo qui, probabilmente troverai i concetti rimanenti molto più facili da capire.

Per la gestione delle eccezioni nella programmazione, abbiamo due idee importanti che devi capire. La prima idea è che puoi chiedere al tuo programma di provare qualcosa. La seconda idea è che se il computer fallisce in quello che sta provando, puoi cogliere il problema e gestirlo.

Queste due idee insieme funzionano un po' come un funambolo con una rete di sicurezza. Un funambolo (il tuo programma) può esibirsi normalmente lungo il filo del rasoio, nella maggior parte dei casi. Ma se si verifica qualcosa di fuori dall'ordinario, come un passo falso sulla corda tesa (un'eccezione), ci dovrebbe essere una rete di sicurezza per evitare che l'esecutore precipiti a terra (un fermo per gestire l'eccezione).

Con una comprensione della gestione delle eccezioni, ora possiamo iniziare a vedere una soluzione al nostro problema. Possiamo chiedere al computer di provare ad analizzare il testo in un numero intero e, se non riesce, invece di causare il crash del programma, possiamo cogliere l'errore, dirlo all'utente e chiedere loro di riprovare.

Vediamo come potrebbe apparire nel nostro codice.

Console.WriteLine("Guess a number between 1 and 10:");
string text = Console.ReadLine();
int input = 0;
try
{
    input = int.Parse(text);
}
catch
{
    Console.WriteLine("Whoops, you didn't enter a number");
}

La nostra prima modifica è che inizialmente stiamo impostando int input su zero prima di provare a impostarlo sul risultato dell'analisi del testo immesso dall'utente. C'è un motivo specifico per cui ho prima impostato il valore su zero e poi lo ho impostato su qualcos'altro in seguito.

Nota che dopo il try riga, il codice che vogliamo provare è racchiuso tra parentesi graffe come queste:

{
}

In C# e in molti linguaggi simili, utilizziamo le parentesi graffe per racchiudere o limitare l'ambito di determinate azioni, operazioni o anche cicli di vita variabili. In genere, le variabili sopravvivono solo all'interno di queste parentesi. Quando l'esecuzione del nostro codice esce da un insieme di queste parentesi, tutte le variabili al suo interno scompaiono (a volte chiamato uscire dall'ambito).

Vedi le stesse parentesi graffe dopo il catch line, anche, che è un'istruzione che qualsiasi cosa sia all'interno delle parentesi graffe dovrebbe essere eseguita solo se si rileva un errore o un'eccezione. Il codice racchiuso tra parentesi graffe è spesso chiamato blocco di codice .

Ciò significa che se avessimo creato il int input all'interno del try blocco di codice, quindi la variabile scomparirebbe una volta superato il try blocco di codice e non abbiamo più potuto accedervi per verificare se corrisponde al nostro valore segreto. Elaborerò un esempio dal nostro codice per mostrarti cosa intendo. Nota nella Figura 1 di seguito come non definisco int input finché non siamo tra le parentesi graffe del nostro try dichiarazione.

Figura 1:ambito variabile

Oh, e nota che ho una riga che inizia con // . In C#, le doppie barre indicano che tutto ciò che viene dopo e fino alla fine della riga è un commento che non fa parte del programma. Il compilatore ignorerà semplicemente tali righe.

.
Per provare il nostro programma, possiamo inserire un punto di interruzione all'interno del catch parentesi su Console.WriteLine riga, quindi eseguire il nostro programma. Inserisci un input non numerico per verificare che, anziché andare in crash, il programma ora passi al catch blocco di codice, quindi visualizza eventualmente il messaggio di errore all'utente, come puoi vedere nella Figura 2.

Figura 2:Eccezione rilevata!

.

Condizioni

Ora, questo codice è piuttosto inutile come è attualmente scritto perché stiamo leggendo un valore, ma, tranne per dire all'utente se commette un errore, non stiamo usando il valore per nulla. Puoi provare questo e vedere che se inserisci un numero, diciamo 7, il punto di interruzione non viene raggiunto.

Per rendere il nostro codice utile come gioco di indovinelli, dobbiamo verificare se abbiamo indovinato il numero corretto. Qui, dobbiamo introdurre un nuovo concetto di controllo del flusso chiamato condizione .

Una condizione è un blocco di codice che viene eseguito solo se una determinata regola o un insieme di regole sono soddisfatte. Iniziamo tali condizioni con la parola if e seguilo con la regola o l'insieme di regole che stiamo controllando tra parentesi, che è quindi seguito dal blocco di codice che vogliamo eseguire.

if (condition is met) 
{
    // execute this code block
}

Ci sono, ovviamente, regole di sintassi molto rigide su come formattare queste condizioni e non sono necessariamente così intuitive come potrebbero essere. Ad esempio, per confrontare i valori, è necessario utilizzare due segni di uguale in C# e talvolta tre in JavaScript. (Ricorda che usare un segno di uguale è il modo in cui assegna un valore.)

if (value == other_value) // example value comparison

Puoi utilizzare un'ampia gamma di operatori di confronto e il resto è un po' più intuitivo. Ad esempio, come nella matematica normale, puoi utilizzare maggiore di (>) e minore di (<) e combinarli con segni di uguale per creare condizioni maggiore o uguale (>=) o minore o uguale (<=).

Puoi anche creare condizioni negative. In molti linguaggi di programmazione si indica un operatore negativo con il punto esclamativo (!), spesso chiamato anche “bang”. Ad esempio, se vuoi creare una condizione che venga eseguita se due valori non sono uguali, puoi scrivere:

if (value != other_value)

Puoi anche creare più condizioni separando le diverse condizioni utilizzando && (doppie e commerciali) per le condizioni "AND" o || (doppi tubi) per condizioni “OR”.

if (value1 == other_value && value2 == other_value) … 
//means both value1 and value2 must be equal to other_value

if (value1 == other_value || value2 == other_value) … 
//means either value1 or value2 must be equal to other_value

Usando una condizione, ora possiamo creare un test per vedere se il giocatore ha indovinato il numero giusto. Aggiungi le seguenti righe dopo l'ultima parentesi graffa del catch blocco di codice:

if (input == 3)
{
    Console.WriteLine("Congratulations! You guessed correctly!");
}

Questa condizione verifica se input (il valore inserito dall'utente) è uguale a 3. Se questa condizione è soddisfatta, il gioco visualizzerà una nota di congratulazioni, come mostrato nella Figura 3.

Figura 3:condizione soddisfatta, congratulazioni assegnate

Se l'utente non indovina il numero 3, il nostro programma non mostra più nulla e l'applicazione si chiude.

Ricorda che puoi inserire punti di interruzione in qualsiasi punto del codice per interrompere l'esecuzione e vedere i risultati di ciò che stai facendo. Lo faremo proprio per vedere i risultati delle modifiche che apporteremo al nostro codice d'ora in poi.

.
Sarebbe bello, tuttavia, se potessimo visualizzare un altro messaggio se l'utente non ha indovinato il numero corretto. Fortunatamente, le condizioni consentono questo comportamento anche tramite else parola chiave.

Il else la parola chiave deve venire direttamente dopo un if blocco di codice e indica cosa dovrebbe accadere se la condizione tra parentesi di un if dichiarazione non è soddisfatta. Per provarlo, aggiungi le seguenti righe dopo if blocco:

else
{
    Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
}

L'intero blocco di codice condizionale dovrebbe ora essere simile alla Figura 4 di seguito.

Figura 4:Indovinare il codice del programma di gioco con blocchi di codice condizionali

Quando esegui il tuo programma, a seconda che indovini 3, riceverai una congratulazione o un incoraggiamento a riprovare. Chiamiamo questo tipo di controllo del flusso diramazione condizionale perché il programma va in uno o nell'altro ramo a seconda delle condizioni che esponi.

Aumentiamo un po' le probabilità per chi non sa che il numero magico è sempre 3. Consentiremo più tentativi di indovinare se il giocatore non indovina correttamente.
.

Andare per un ciclo

Per realizzare questa nuova funzionalità, dobbiamo implementare qualcosa chiamato loop . Nella programmazione, un ciclo è un blocco di codice che viene eseguito ripetutamente. Due tipi di loop molto comuni sono for loop e mentre loop.

L'uso migliore per for i loop sono quando hai un numero specifico di volte in cui vuoi che qualcosa accada. Cominciamo con quello nel nostro codice e vediamo dove ci porta.

In un for loop, è necessaria la parola chiave for seguito da un blocco tra parentesi che contiene tre informazioni.

Per prima cosa, definiamo l'ambiente di partenza per il nostro ciclo, che include le variabili che vogliamo usare per tenere traccia di quante volte il nostro blocco di codice è stato eseguito. In secondo luogo, vogliamo una condizione che determini se dobbiamo continuare il ciclo. Infine, abbiamo le modifiche che vogliamo apportare alle condizioni del ciclo ogni volta che eseguiamo il ciclo. Diamo un'occhiata a un esempio.

for (int i = 0; i < 3; i++)
{
    // This code block will execute three times.
}

La parte importante qui è la prima riga. Nota i punti e virgola che separano le tre parti che ho menzionato. Ecco come si scompone ogni parte:

int i=0; // Initialization: Creates an integer variable called "i" and sets it to 0.
i<3; // Condition: Continue executing as long as "i" is less than 3.
i++ // Change happening during each loop: "i" increases by one each time the loop runs.

Il i++ la notazione è un'abbreviazione per scrivere i=i+1 , che imposta i al valore di i più uno, in altre parole, aumenta i di uno. Avresti potuto scrivere i=i+1 anche, ma questo schema particolare è molto, molto comune nella programmazione, quindi lo mostro come esempio utile.

Qualunque cosa tu metta nel blocco che segue il for la dichiarazione di ciclo avverrà fintanto che la condizione è soddisfatta, in questo caso tre volte. Ad esempio, puoi aggiungere un Console.WriteLine() all'interno del blocco di codice e si ripeterà tre volte, come nella Figura 5 di seguito.

for (int i = 0; i < 3; i++)
{
    Console.WriteLine("I am in a loop!");
}

Figura 5:"Sono in un loop!"

Vogliamo utilizzare questo tipo di ciclo per consentire all'utente di eseguire più tentativi per indovinare il numero corretto. Quindi, possiamo racchiudere l'intero programma che abbiamo già scritto all'interno di un for ciclo come descritto sopra. Il codice dovrebbe ora assomigliare alla Figura 6 di seguito.

Figura 6:Ciclo di ipotesi

Naturalmente, se indovini il numero corretto prima di raggiungere tre tentativi, non ha senso continuare a indovinare. In quanto tale, stiamo per fare una cosa molto brutta….

Ricorda che la condizione per l'esecuzione continua è che i rimane sotto 3. Quindi, se vogliamo fermare il ciclo, possiamo semplicemente aumentare i a 3 o più per interrompere il ciclo. Se aggiungi i = 3 all'interno del blocco che viene eseguito se l'utente indovina correttamente, come mostrato nella Figura 7 di seguito, il gioco si interromperà una volta che l'utente indovina 3.

Figura 7:cortocircuito del ciclo For

Potresti non capire perché questa è una cattiva idea e, in realtà, è più un argomento filosofico che tecnico. Tuttavia, è un argomento importante, quindi facciamolo.

Un for loop è progettato per essere eseguito un numero specifico di volte. Se non sai in anticipo quante volte eseguirai il ciclo, allora un for loop è una scelta sbagliata. Ci sono altri moduli di loop che sono più adatti a questo compito, quindi usando un for loop sta selezionando lo strumento sbagliato per il lavoro.

Questo argomento può sembrare insignificante e pedante. Il programma funziona bene così com'è e fa esattamente quello che ti aspetti.

Tuttavia, la mente del programmatore è quella che dovrebbe tendere alla chiarezza e questo esempio non è certamente chiaro. Guardando la prima riga del nostro codice attuale, pensi che questo sia un ciclo che viene eseguito tre volte, ma poi "imbrogliamo" il ciclo nel mezzo in modo che il ciclo possa essere eseguito da una a tre volte; non c'è modo per noi di saperlo. Abbiamo infranto la chiarezza di ciò che accadrà, ed è una brutta cosa.

Anche se non ti interessa che nessuno legga il tuo codice, ricorda che come programmatori lavoriamo con macchine incapaci di capire l'intento. Capisce esattamente solo ciò che diciamo. Se non siamo chiari, aumenta la possibilità di ottenere risultati inaspettati. Rischiamo di creare problemi a noi stessi in futuro quando i programmi diventano più complessi.

Pertanto, dobbiamo trovare un approccio migliore e quell'approccio migliore è un while loop.
.

Un ciclo While

Un while loop viene eseguito mentre una condizione è vera. Non importa quante volte sia:finché la condizione è vera, il ciclo continua.

Un while loop è più semplice nella dichiarazione di un for loop e comprende la parola chiave while seguito da una parentesi aperta, le condizioni e una parentesi chiusa.

while (condition) 
{
    // Code to execute
}

Questa esecuzione può essere molto pericolosa se non si hanno condizioni chiare. Se commetti un errore o non consideri correttamente tutte le condizioni e gli eventi, il tuo programma può impazzire e fermare la tua macchina.

Il pericolo sta nell'assicurarsi di invalidare la condizione all'interno del blocco di codice quando si desidera interrompere l'esecuzione. In caso contrario, il ciclo verrà eseguito per sempre.

Cambiamo il nostro for passa a un while loop e lasciarlo funzionare finché l'utente non ha indovinato tre volte. Possiamo creare questa condizione dichiarando un int i=0; prima dell'inizio del ciclo e quindi impostando il valore di i all'interno del ciclo. Aggiorna il tuo codice come tale:

static void Main(string[] args)
{
    int i=0;
    while(i < 3)
    {
        Console.WriteLine("Guess a number between 1 and 10:");
        string text = Console.ReadLine();
        int input = 0;
        try
        {
            input = int.Parse(text);
        }
        catch
        {
            Console.WriteLine("Whoops, you didn't enter a number");
        }
        if (input == 3)
        {
            Console.WriteLine("Congratulations! You guessed correctly!");
            i = 3;
        }
        else
        {
            Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
        }
    }
}

Nota che c'è un errore in questo codice, che mostra quanto sia facile creare loop infiniti. Non stiamo aumentando i a meno che non indoviniamo correttamente! In altre parole, il giocatore ottiene infiniti tentativi, ma non c'è modo di smettere di indovinare se non indovina correttamente!

Fortunatamente, se avvii questo programma, sai che la risposta è fissata su 3, quindi puoi indovinarlo, ma a parte questo, potresti avere un grosso problema alla mano.

Lo dico per non spaventarti dall'usare while loop ma piuttosto per instillare un senso di rispetto per il loro potere. While i loop sono molto potenti e utili, ma possono anche essere pericolosi se non ti prendi cura.

Per risolvere il tuo problema, aggiungi i++; come prima riga all'interno del blocco di codice while, immediatamente prima di Console.WriteLine("Guess a number between 1 and 10:") . Il tuo codice ora dovrebbe funzionare come previsto, essere molto chiaro e offrirti un gioco di indovinelli molto semplice ma noioso.
.

Un'anteprima dell'orientamento degli oggetti

Quindi cosa possiamo fare per rendere questo gioco anche solo lontanamente interessante? Lo so, rendiamo casuale il numero segreto!

Mi sono trattenuto a farlo perché dobbiamo introdurre alcune nuove idee per creare numeri casuali. Queste idee diventeranno chiare nel prossimo articolo che tratta dell'orientamento agli oggetti. Per ora lascia che ti dia solo il codice e ti spiegherò in dettaglio cosa fa nell'ultimo articolo di questa serie.

static void Main(string[] args)
{
    Random random = new Random(); // Object orientation stuff
    int answer = random.Next(10)+1; // Give me a random number less than 10 and add one
    int i = 0;
    while (i < 3)
    {
        i++;
        Console.WriteLine("Guess a number between 1 and 10:");
        string text = Console.ReadLine();
        int input = 0;
        try
        {
            input = int.Parse(text);
        }
        catch
        {
            Console.WriteLine("Whoops, you didn't enter a number");
        }
        if (input == answer)
        {
            Console.WriteLine("Congratulations! You guessed correctly!");
            i = 3;
        }
        else
        {
            Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
        }
    }
}

Ci sono due nuove righe ora e una cambiata. Le nuove righe creano un intero casuale answer tra 1 e 10 e nella riga modificata confrontiamo ciò che l'utente indovina con quella risposta casuale.

Non preoccuparti della generazione casuale per ora, te lo spiegherò nel prossimo articolo. Ma per ora, congratulazioni, sei ufficialmente uno sviluppatore di giochi oltre ad essere un programmatore! Sentiti libero di giocare ora e vedere come te la cavi. Dovresti battere il gioco, in media, 3 volte su 10.

Come esercizio aggiuntivo per te stesso, perché non aggiungi un messaggio al termine del gioco che dice al giocatore qual era il numero segreto? Per ora, però, concludiamo ed esaminiamo ciò che abbiamo trattato.
.

Concludi

In questo articolo, hai imparato a conoscere il flusso del programma e come puoi controllare il flusso del tuo programma. Hai imparato a conoscere le eccezioni per la gestione degli errori. Hai imparato a conoscere i blocchi di codice e la ramificazione condizionale con if e else . Hai anche imparato a conoscere i loop con for e while .

Nel prossimo articolo, dedicheremo un po' di tempo a perfezionare il gioco e analizzeremo anche l'orientamento degli oggetti in modo più dettagliato.

Serie di istruzioni

Questa è la parte 4 di una serie di 5 parti per Introduzione alla programmazione

  1. Introduzione alla programmazione:per iniziare
  2. Introduzione alla programmazione:il tuo primo programma
  3. Introduzione alla programmazione:variabili, tipi e manipolazione dei dati
  4. Introduzione alla programmazione:controllo del flusso
  5. Introduzione alla programmazione:programmazione orientata agli oggetti

Linux
  1. Linguaggio di programmazione C - Introduzione

  2. Come iniziare a imparare un linguaggio di programmazione

  3. Come installare il linguaggio di programmazione Nim su Linux

  4. Come reindirizzare l'output di un programma su un file zip?

  5. Procedura:programmazione socket in Python

Procedura:Introduzione alla programmazione – Programmazione orientata agli oggetti

Procedura:Introduzione alla programmazione:variabili, tipi e manipolazione dei dati

Modi brillanti su come eseguire un programma in Linux

Come installare il linguaggio di programmazione Go su Ubuntu 20.04

Come installare il linguaggio di programmazione Rust su AlmaLinux 8

Come scrivere ed eseguire un programma C in Linux