martedì 19 Marzo 2024
Home / Corsi / Corso C / Lezione 4 – Le istruzioni condizionali ed i loop
Corso C

Lezione 4 – Le istruzioni condizionali ed i loop

Dunque come va?

Nel forum c’è una discussione dedicata a questo corso.

Tutte le impressioni, domande, chiarimenti e, perché no, critiche… Sono bene accette.

Passiamo adesso alla quarta lezione dove useremo gli operatori logici che abbiamo visto nella lezione precedente.

Sommario

  1. Indentazione
  2. if
  3. switch
  4. for
  5. while
  6. do while
  7. Riassunto
  8. Esercizi

1 Indentazione

Si tratta di quella particolare formattazione del codice che mette in evidenza un blocco rispetto all’intero sorgente.

Questa modalità è stata utilizzata sin dall’inizio per le funzioni main che abbiamo visto fino ad ora.

Infatti l’intero corpo della funzione, rispetto alle parentesi graffe che la delimitano, è spostato a destra di 3 o 4 spazi. Anche qui si entra nel gusto personale circa il numero di spazi da inserire nella indentazione.

E’ bene precisare però che tale modo di scrivere il codice, ne aumenta solo la leggibilità ma dal punto di vista del compilatore non ha alcun effetto (a differenza per esempio di quanto avviene in Python).

Tale modalità verrà ampiamente usata nel seguito.

2 if

Si tratta delle istruzioni condizionali ossia eseguite o meno sulla base di una condizione, vera o falsa.
Vediamo esempio4_1.c in cui appare un primo caso di uso:

Osserviamo per prima cosa l’indentazione e poi l’uso o meno delle parentesi.
A questo proposito nel caso di un’istruzione sola, le parentesi possono essere opzionali.
Se invece il blocco da eseguire prevede più istruzioni, le parentesi sono obbligatorie, altrimenti è eseguita solo la prima istruzione.

Si veda esempio4_2.c

Nel primo if la condizione ha effetto solo sulla prima riga (infatti non viene stampata), nel secondo, tutto il blocco racchiuso tra graffe è eseguito.
Un caso più articolato è quello in cui se la condizione è vera si esegue un blocco di codice, se è falsa se ne esegue un altro esempio4_3.c

Quindi è stata posta una soglia che separa il caldo dal moderato.

Volendo però è possibile avere più condizioni da esplorare ed allora si ottiene:

Nell’esempio4_4.c sono anche state introdotte le direttive al preprocessore, che prima di compilare il codice sostituiscono a FREDDO il valore 0., a FREDDINO 10. etc. E’ stato anche usato l’operatore booleano and che unisce due espressioni logiche.
Questo è un caso a scelta multipla in cui ogni condizione definisce un suo percorso.

Nella lezione scorsa avevamo detto che in C non sono definite le variabili True e False come per esempio in Python.
Tramite esempio4_5.c cerchiamo di capire come mai:

Nel C solo il valore zero coincide con il falso, mentre qualsiasi valore differente da zero (positivo, negativo, intero, floating point) è vero.
In queste condizioni, risulta allora difficile definire la variabili True (vero) a causa di questa moltitudine di possibili valori che la variabile potrebbe assumere.

3 switch

Rispetto al caso precedente, questa istruzione consente di selezionare una opzione tra quelle disponibili, ma la scelta è fatta sulla base di una grandezza costante che tipicamente può essere un carattere o un intero. Vediamo un esempio

Quindi le varie possibilità di scelta sono rappresentate dai vari case e vi è anche la possibilità di inserire un default (se lo si desidera), che raccoglie tutte le altre opzioni non contemplate precedentemente. Altra peculiarità è la presenza del break che interrompe il case.
Se nell’esempio precedente si voleva solo indicare le operazioni commutative:

In altre parole i primi due case sono collassati nello stesso (ed analogamente per gli ultimi due).

4 for

Questa istruzione permette di effettuare un certo numero di iterazioni di un blocco di codice mediante un indice che si incrementa (o decrementa) nel corso dell’esecuzione.
La sintassi è la seguente:

Supponiamo di voler stampare i numeri da 1 a 10:

Si noti la possibilità di dichiarare la variabile nel loop. Quella i esiste ed ha valore solo tra le due parentesi graffe del for. Se la medesima variabile fosse stata usata al di fuori del for, il compilatore avrebbe segnalato un errore. Stiamo sfiorando il così detto scope di una variabile, ossia dove è dichiarata ed esiste e dove no.

I cicli possono essere anche annidati. A titolo di esempio proviamo a stampare la Tavola Pitagorica con i numeri da 1 a 10:

Qui la dichiarazione degli indici è normale, l’uscita è stata formattata su 4 caratteri, in modo da avere le cifre allineate e si noti il carattere ‘\n’ di “a capo”, stampato solo alla fine di ogni riga.
Come detto quando abbiamo presentato il for, gli incrementi del’indice non devono essere necessariamente di uno, e si può anche decrementare:

Potrebbe accadere che per qualche motivo, vogliamo saltare un ciclo o che dopo un certo numero di iterazioni vogliamo fermare il ciclo, in questi compiti ci vengono in aiuto le istruzioni continue e break.
Supponiamo di voler stampare i numeri da 0 a 10 ma non far apparire il 3 ed il 5:

Qualora invece si inizializzi il codice per fare mille iterazioni, ma dopo 10 lo si voglia fermare:

In questo esempio ci sono alcune novità:

  • Il ‘\n’ sostituito con ‘\r’.
    Questo ha l’effetto di riportare il cursore a capo ma non lo fa avanzare nella riga seguente, causando l’effetto di veder girare il numero su se stesso.
  • sleep(1): necessario rallentare la stampa a video (1 secondo tra un numero e l’altro) altrimenti non si vede niente, solo il numero finale (#include <unistd.h>).
  • Svuotare la memoria video (fflush(stdout)) per evitare il buffering delle uscite e vedere tutte le uscite man mano che sono disponibili.

5 while

Anche con questa istruzione si realizza un loop. La sintassi è la seguente:

vediamo subito un esempio:

Un altro modo di usare il while e quello di usare una condizione sempre vera ed utilizzare il break per uscire dal ciclo:

Ovviamente anche nel while, se si vuol saltare qualche ciclo senza eseguire il blocco di codice, si può usare l’istruzione continue.

6 do while

Questa istruzione è molto simile al while. La sintassi è:

Rispetto alla precedente ha una caratteristica: il blocco tra parentesi è eseguito almeno una volta.

7 Riassunto

  • In questa lezione abbiamo visto le istruzioni condizionali ed i cicli.
  • L’istruzione if consente di valutare o meno un blocco di codice sulla base di un’espressione logica.
  • Può essere semplice, a due alternative (if-else), a più alternative (if-else if-else if-….-else).
  • Lo switch invece esegue un particolare blocco di codice sulla base di una grandezza intera o carattere
  • Per quanto riguarda i cicli invece, abbiamo iniziato con il for
  • Sulla basa di un indice di cui se ne definisce l’estremo inferiore, quello superiore ed il suo incremento, si esegue un blocco di codice
  • continue consente di saltare una o più iterazioni, break interrompe il ciclo
  • while e do while eseguono il blocco di codice sulla base di una espressione logica che deve risultare vera. Il secondo esegue almeno una volta tutto il blocco.

8 Esercizi

Questa settimana vogliamo fare qualcosa di diverso. In C esiste l’istruzione rand(), che lanciata ripetutamente produce dei numeri pseudo casuali. Questi sono definiti sulla base di un seme che inizializza la sequenza. L’istruzione che effettua questo è: srand(seme). E’ necessario includere stdlib.h (per ogni dettaglio consultate man 3 rand). La proposta allora di questa settimana è la seguente: Dopo aver inizializzato il generatore di numeri pseudo casuali con 100, calcolare la somma dei primi 10 numeri pari e dei primi 8 numeri dispari generati da rand(). Come aiuto, si propone lo scheletro del codice a cui aggiungere lo svolgimento:

 

La prossima settimana, prima della lezione, verrà riportato il risultato.

Anche per oggi abbiamo finito.

Per qualsiasi cosa scrivete pure sul forum e non dimenticate di seguirci sui nostri social: Facebook, Twitter, Youtube.

Se vuoi anche trovare prodotti e accessori Raspberry Pi in offerta, seguici anche su Telegram !!

A proposito di arkkimede

Vedi Anche

MagPi 138 doppia pagina

MagPi in Italiano! Nuova Generazione Retrogaming

Estratto, tradotto in italiano, di The MagPi N°138 la rivista ufficiale della Fondazione Raspberry Pi.

Powered by themekiller.com