COMANDI CONDIZIONALI
COMANDO CONDIZIONALE SEMPLICE
if (<espressione>)
<comando>
diagramma di flusso
a pag. 54 del libro di testo
semantica
(operazionale):
valuto
l'espressione
se il valore è
diverso da zero (TRUE) eseguo il comando
passo
all'istruzione successiva
COMANDO CONDIZIONALE A DUE RAMI
if (<espressione>)
<comando1>
else <comando2>
diagramma di flusso
a pag. 56 del libro di testo
gli
else si legano sempre all'if precedente
es.
int
y=0;
int
x=1;
if
(y!=0)
if
(x==1)
....
else
(questo non si riferisce al primo if ma al secondo: l'indentazione
può ingannare)
....
printf....
utile in casi che
richiedono scelte multiple: es. programma che deve scrivere il giorno
successivo rispetto a quello inserito dall’utente (numero da 1
a 7 -> 7 possibilitàSWITCH
switch
(<espressione>)
{
Listacasi1
ListaComandi1
Listacasi2
ListaComandi2
....
default:
ListaComandi
}
espressione
deve essere di tipo int o compatibile con int
un “ListaCasi”
consiste in una sequenza di: case ValoreCostante :
ogni
“ListaComandi” può terminare con break
o return
es.
int
mese;
int
giorni;
switch(mese){
case
2: giorni = 28; break;
case
4:case 6:case 9:case 11: giorni = 30; break;
default:
giorni = 31; break;
}
se
non scrivo il break esegue anche i comandi degli altri casi
(se avessi scritto return sarei uscito dal programma)
es.
int
giorno;
scanf
(“%d”, &giorno);
switch
(giorno){
case
1: printf (“martedì”); break;
...
}
es.
switch
(giorno){
case
1: case 2: case 3:
printf
(“diesel”); break;
...
}
BREAK
mi permette di uscire
da un comando strutturato
RETURN
restituisce il ritorno
al chiamante = mi permette di uscire dalla funzione nella quale sto
lavorando, ritornando eventualmente un valore
COMANDI DI INCREMENTO E DECREMENTO
y
= x + 1;
x
= x + 1;
corrisponde a:
y
= ++x;
x prima è
incrementata, poi utilizzata
y
= x;
x
= x + 1;
corrisponde a:
y
= x++;
a prima è
utilizzata, poi incrementata
y
= x - 1;
x
= x - 1;
corrisponde a:
y
= --x;
x prima è
decrementata, poi utilizzata
y
= x;
x
= x - 1;
corrisponde a:
y
= x--;
x prima è
utilizzata, poi decrementata
es.
int
z = 7;
int
w;
w
= (z++) * 2;
al termine:
w vale 14
z vale 8
non
devo fare ad esempio “w = ((--z)*2)+((++z)-3)” perché
l'ANSI non è rigorosa in questo (non so come reagiscano i vari
compilatori)
COMANDI DI ITERAZIONE
for
(<espressione inizializzazione>; <condizione>;
<espressione di incremento>)
corpo del for
importante: non più
di tre espressioni all’interno della parentesi del for separate
da “;”, per aggiungerne altre devo utilizzare la “,”
diagramma di flusso
a pag. 97 del libro di testo
while
(<condizione>)
corpo del while
diagramma di flusso
a pag. 60 del libro di testo
do{
corpo del do-while
} while(<condizione>)
diagramma di flusso
a pag. 110 del libro di testo
COMANDI DI RIPETIZIONE INDEFINITA
es.
for
(i = 0; i < z; i++; x *=2)
printf
(“ %d %d”, i, x);
posso inserire più
espressioni di incremento
for
(;;)
<comando>
è legittimo (un
espressione vuota ha valore logico = TRUE)
es.
int
main(){
for(;;);
return
1;
}
non fa niente
indefinitamente
ITERAZIONE (O RIPETIZIONE) INDEFINITA
quando
non sappiamo in anticipo il numero di volte per cui l'azione va
ripetuta
meglio utilizzare il
while (while indefinito = abbreviazione del for indefinito)
for(;;){
...
if (B) break;
}
corrisponde al
do...while
programma che vuole
input tra 3 e 7 fallo con i vari cicli
vedi
nozione di “invariante del ciclo” e rappresentazione
algoritmi ({S} stato iniziale ecc.)
il for accetta come
variabile contatore anche double ma è un rischio
for (j = 0.0; j; j +=
1){...} non entra nel ciclo
la variabile utilizzata
come contatore può essere modificata anche nel corpo del for
l’indice deve
essere un int o compatibile, poichè se ad esempio dichiariamo
l’indice come double, l’indice può variare per
infinitesimi, quindi rischiamo di cadere in un numero imprevisto di
iterazioni, se non poniamo attenzione nel valore del limite
CONTINUE
salta alla prossima
valutazione della condizione del ciclo
es.
int
a = 15;
while
(a > 5) {
if
(a % 2 != 0)
continue;
a--;
printf
(“%d”,a);
}
/* va in loop */
int
a = 16;
while
(a > 5) {
if
(a % 2 != 0)
continue;
a--;
a--;
printf
(“%d”,a);
}
/* stampa i pari */
int
a = 16;
while
(a > 5) {
if
(a % 2 != 0){
a--;
continue;}
a--;
printf
(“%d”,a);
}
stampa i dispari
|