Prof. Pagani Corrado LINGUAGGIO C: SELEZIONE E CICLI · Ogni linguaggio di programmazione presenta...
Transcript of Prof. Pagani Corrado LINGUAGGIO C: SELEZIONE E CICLI · Ogni linguaggio di programmazione presenta...
IF
Ogni linguaggio di programmazione presenta almeno una struttura di controllo decisionale.
La sintassi del linguaggio C è la seguente. if (<espressione>)
<istruzione/istruzioni>;
Si tratta di una selezione, all’interno della quale se e solo se espressione è vera viene eseguita l’istruzione.
OPERATORI DI CONFRONTO
Simbolo Significato Utilizzo
== uguale a a == b
!= diverso da a != b
< minore a < b
> maggiore a > b
<= minore o uguale a <= b
>= maggiore o uguale a >= b
OPERATORI LOGICI
Vero e Falso sono 2 valori Booleani che in
linguaggio C NON hanno un tipo di dato a loro
dedicato.
Per tale motivo sono codificati con valori interi,
rispettivamente 1 (Vero) e 0 (Falso)
Simbolo Significato Utilizzo
&& AND logico a && b
|| OR logico a || b
! NOT logico !a
BLOCCHI DI ISTRUZIONI
Attenzione che se scriviamo più istruzioni dopo l’IF sarà solo la prima ad essere vincolata alla condizione presente nell’IF.
Se vogliamo che più istruzioni siano eseguite quando l’espressione è vera dobbiamo ricorrere ad un blocco di istruzioni che le raccolgano (racchiuse tra Parentesi graffe)
If (x > y)
max = x;
min = y;
If (x > y)
{
max = x;
min = y;
}
In questo caso
l’istruzione
min = y
È eseguita
sempre, anche
se l’espressione
non è vera
IF … ELSE
E’ possibile specificare anche una istruzione (o
blocco di istruzioni) da eseguire solamente se
l’espressione dell’IF è falsa.
In questo caso si ricorre alla parola chiave ELSE
La clausola ELSE, come abbiamo visto dai
primi esempi, è opzionale
if (<espressione>) <istruzione/istruzioni>;
[else <istruzione/istruzioni>;]
IF ANNIDATI
All’interno di un blocco di istruzioni che fa riferimento ad un IF o ad un ELSE è possibile implementare un nuovo controllo IF ad un livello più interno (annidato).
Ciò è ammissibile a più livelli anche se, per facilità di lettura del codice, è consigliato di non abusare di tale tecnica qualora sia possibile.
Possibili alternative possono essere Operatori booleani
Switch case
….
SWITCH – CASE
Per le scelte multiple un’alternativa agli if-else in cascata è la struttura di controllo switch-case
La struttura è composta dalla parola chiave switch che ha l’effetto di valutare espressione.
Se espressione è uguale a una certa costante sono eseguite tutte le istruzioni del blocco a partire da quella posizione.
Se espressione non è uguale ad alcuna costante, sono eseguite le sole istruzioni della parte opzionale default.
Normalmente quel che si desidera è che siano eseguite le sole istruzioni relative a un case, non tutte quelle che seguono. A tale scopo è disponibile l’istruzione break che provoca l’uscita dallo switch.
SWITCH – CASE
switch (espressione)
{
case costante1:
istruzione;
….
[break]
case costante2:
istruzione;
….
[break]
[default:
istruzione;
…. ]
}
Nei diagrammi a blocchi si può
ricorrere ad una sequenza di IF,
oppure alla struttura riportata qua di
seguito
ITERAZIONE
L’iterazione è una struttura che consente di ripetere più volte l’esecuzione di un insieme di istruzioni.
Due tipi di iterazione:
iterazioni enumerative: consentono di eseguire un blocco di istruzioni un numero predefinito di volte.
iterazioni guidate da eventi: non è noto a priori quante volte saranno eseguite. Tutto dipende dal fatto che un certo evento si verifichi o meno; se una condizione è vera (o è ancora vera) il blocco viene eseguito, altrimenti si passa all’istruzione successiva al termine del blocco.
ITERAZIONE – DIAGRAMMI A BLOCCHI
La condizione può essere espressa PRIMA o
DOPO il blocco di espressioni da ripetere
LOOP
Soprattutto per quanto riguarda le iterazioni
guidate da eventi, occorre fare molta
attenzione al fatto che ad un certo punto del
programma, la condizione che gestisce il ciclo
diventi falsa.
In caso contrario il ciclo sarebbe eseguito
all’infinito e il programma, pur NON andando
in errore, non terminerebbe.
CICLO DO … WHILE
L’istruzione continua a essere eseguita fintanto che <espressione> risulta vera.
Nel caso, molto frequente, in cui il corpo del ciclo sia costituito da più istruzioni, si utilizza una coppia di parentesi graffe per racchiudere l’insieme delle istruzioni che fanno parte del ciclo.
do <istruzione>; while (<espressione>);
do { <istruzione1>; <istruzione2>; … <istruzioneN>; } while (<espressione>);
CICLO WHILE
Il linguaggio C mette a disposizione il ciclo while
L’istruzione continua a essere eseguita fino a quando
<espressione> risulta vera.
Nel caso di più istruzioni si ricorre ad un blocco
while (<espressione>)
<istruzione>;
while (<espressione>) { <istruzione1>; <istruzione2>; … <istruzioneN>; };
ITERAZIONI ENUMERATIVE
In molti casi, è noto a priori quante volte il blocco di istruzioni interne al ciclo debba essere eseguito
Le strutture iterative presentate possono essere utilizzate anche per risolvere questo tipo di problemi.
Viene utilizzata una variabile (contatore) che ha la funzione di “contare” il numero di ripetizioni;
Il contatore viene inizializzato prima del ciclo con un valore di partenza, e poi incrementato a ogni esecuzione;
La condizione di ciclo controlla il raggiungimento del numero di iterazioni voluto.
CICLO FOR
Ogni linguaggio presenta uno o più costrutti di programmazione per implementare le iterazioni enumerative Il C fornisce il ciclo for.
<istruzioneIniziale> eseguita una sola volta prima delle istruzioni interne al ciclo. Solitamente utilizzata per inizializzare la variabile indice del ciclo.
<espressione> condizione logica che deve essere soddifatta per entrare nel corpo del ciclo
<istruzioneFinale> eseguita ad ogni iterazione del ciclo, al termine delle istruzioni del ciclo stesso, solitamente utilizzata per l’incremento/decremento della variabile indice del ciclo
for(<istruzioneIniziale>;<espressione>;<istruzioneFinale>) { <istruzione1>; … <istruzioneN>; };
Corpo del ciclo
CICLO FOR ESEMPI
Visualizzare tutti i primi N numeri interi
for(int i = 1; i<=N; i++)
{
printf(“%d \n”,i);
};
Visualizzare tutti i numeri interi compresi tra 2 estremi dati (N1 e N2)
for(int i = N1; i<=N2; i++)
{
printf(“%d \n”,i);
};
CICLI ANNIDATI
Se all’interno del blocco iterativo si può inserire
qualsiasi tipo di istruzione, questo significa che
si può includere anche un’istruzione di
selezione o un altro ciclo; in questo caso si
parla di annidamento (o nidificazione) dei cicli.
Anche in questo caso, è preferibile, ove
possibile, non creare troppi livelli di cicli
annidati, per favorire la
leggibilità/comprensione del codice