Istruzioni di Selezione e Cicli

      Nessun commento su Istruzioni di Selezione e Cicli
Sebbene il linguaggio C abbia moltissimi operatori, in compenso ha relativamente poche istruzioni. La maggior parte di essere possono essere raggruppate in tre grandi “famiglie”:
  • Istruzioni di selezione: le istruzioni IF e SWITCH permettono al programma di selezionare un percorso di esecuzione fra un insieme di alternative.
  • Istruzioni di iterazione: Le istruzioni WHILE, DO, e FOR permettono le iterazioni (i cosiddetti loop).
  • Istruzioni di salto: Le istruzioni di BREAK, CONTINUE e GOTO provocano un salto incondizionato in un altro punto del programma (l’istruzione RETURN (che restituisce un valore alla fine di una funzione o del programma stesso) e l’istruzione EXIT, appartiengono a questa categoria).
L’ISTRUZIONE IF
L’istruzione IF permette al programma di scegliere tra due alternative sulla base del valore di un espressione. In pseudo-linguaggio potremmo descrivere l’if come:
if (espressione)
{
istruzione1…
istruzione2…
}
Quando il programma incontra un IF, l’espressione fra parentesi viene valutata, se è vera (valore dell’espressione diverso da zero) allora il corpo delle istruzioni all’interno dell’if viene eseguito, altrimenti no, e si passa all’istruzione successiva. Ricordiamo che, quando c’è una singola istruzione nel corpo dell’if (dove con corpo dell’if s’intente l’insieme di istruzioni racchiuse fra parentesi graffe) è possibile omettere le parentesi graffe. Come per esempio:
if (espressione)
istruzione1
L’ISTRUZIONE ELSE
L’istruzione IF può avere una clausola ELSE:
if (espressione)
{
istruzione
}
else
{
istruzione2
}
Il corpo dell’else verrà eseguito soltanto se il valore dell’espressione nel predicato nell’if è diverso da zero, cioè è vero. Se volessimo controllare il verificarsi di altre condizioni, potremmo inserire fra if ed else un’altra istruzione che ha il nome di: ELSE IF:
If (espressione1)
{
istruzione1
}
else if (espressione2)
{
istruzione2
}
Ovviamente nessuno ci vieta di inserire la clausola else.
L’ISTRUZIONE SWITCH
L’istruzione switch è un’ottima alternativa allo scrivere tanti if. E’ più elegante e più semplice da leggere. Questo costrutto si presente sotto la forma:
switch (espressione)
{
case espressione: istruzioni
break;
case espressione: istruzioni
break;
….
}
Come possiamo vedere, l’istruzione switch deve essere seguita da una espressione racchiusa fra parentesi che viene valutata. In base al risultato della valutazione, si entra nel relativo “case”. “Case” è una semplice etichetta per individuare il blocco di istruzioni che deve essere eseguito. Quando le istruzioni sono poche e corte è possibile mettere i case su una stessa riga per non allungare troppo il codice, ma per una maggiore leggibilità è consigliabile incolonnarli.
Fondamentale è l’istruzione BREAK, che serve per uscire dal ciclo e continuare l’esecuzione del codice. Se l’istruzione break fosse assente, verrebbe calcolata l’espressione dello switch, si entra nel relativo case, e una volta eseguito, si continuerebbero ad eseguire tutti i case presenti senza uscire finche non vengono eseguiti tutti i case presenti.
L’ISTRUZIONE WHILE
L’istruzione while è un modo per creare dei cicli in C. E’ la più semplice e fondamentale e ha la seguente sintassi:
while (espressione)
{
istruzioni
….
}
All’interno delle parentesi c’è l’espressione di controllo, mentre l’istruzione dopo le parentesi è il corpo del ciclo. Quando un programma deve eseguire un ciclo while, per prima cosa valuta l’espressione nelle parentesi tonde, se è vera, esegue il blocco di istruzioni presente fra parentesi graffe, rivaluta l’espressione, riesegue il blocco di istruzioni, e questo finché l’espressione presente fra parentesi tonde non diventa falsa. A quel punto, il programma esce dal ciclo while.
ATTENZIONE: Inserire un’espressione come predicato di un while, che non avrà mai valore zero, porterà alla creazione di un ciclo infinito, il cosiddetto loop, che non terminerà ovviamente mai, a meno che non siano presenti istruzioni del tipo BREAK, GOTO o RETURN.
L’ISTRUZIONE DO
L’Istruzione do è collegata all’istruzione while. Essa ha la forma seguente:
do
{
istruzioni
….
}
while (espressione)
Quando un programma esegue queste istruzioni, eseguirà il corpo di istruzioni della funzione do, finché il valore dell’espressione del predicato del while, non diventerà falso. Anche se non è sempre necessario, consiglio vivamente l’uso delle parentesi graffe per evitare errori.
L’ISTRUZIONE FOR
L’istruzione for è il modo migliore per scrivere moltissimi cicli. E’ ideale per quei cicli che hanno una variabile contatore che si incrementa o si decrementa ad ogni ciclo. Essa ha la forma:
for (espressione1; espressione2; espressione3)
{
istruzioni…
}
ad esempio:
for (i=0: i<10; i++)
{
istruzioni…
}
Descriviamo questo ciclo: la variabile i viene inizializzata a zero, (dunque il ciclo parte da zero), fino ad i<10, la variabile i viene incrementata. Dunque, questo ciclo, mi incrementa la variabile i fino a che è minore di 10, quindi ha raggiunto il valore 9.
Questa istruzione (FOR) è strettamente legata al while. Infatti in moltissimi casi un’istruzione for è rimpiazzabile da un’istruzione while.
L’ISTRUZIONE CONTINUE
L’Istruzione continue (al contrario di break), non fuoriesce da un ciclo. Infatti l’istruzione break, passa il controllo all’istruzione immediatamente successiva, l’istruzione continue invece passa il controllo all’istruzione immediatamente precedente. Inoltre altra importante differenza, è che BREAK può essere usata sia nei costrutti switch, sia nei cicli (while, do e for), invece CONTINUE, può essere usata soltanto nei cicli e non nei costrutti di selezione.
Esempio:
n=0; somma=0;
while (n<10) {
scanf(“%d”,&i);
if (i==0)
continue;
somma+=i;
n++;
/*continue salta qui */
}
Questo programmino, legge dei numeri da tastiera e calcola la loro somma. Il ciclo termina quando sono stati letti 10 numeri diversi da zero. Ogni volta che viene letto un numero uguale a zero l’istruzione continue salta la parte di codice restante.
L’ISTRUZIONE GOTO
Al contrario delle istruzioni break e continue, che passano il controllo ad un punto immediatamente successivo e precedente del programma, l’istruzione GOTO può saltare in qualsiasi punto del programma che sia identificata da una label (etichetta). Del tipo:
identificatore: istruzioni…
goto identificatore;
L’istruzione GOTO che una volta era un’istruzione fondamentale nei vecchi linguaggi di programmazione, oggi è raramente usata. Ciò perchè aumenta la difficoltà di lettura e comprensione di un programma molto lungo. Infatti a livello didattico è letteralmente “proibita”.