Dipartimento di Elettronica ed Informazione Politecnico di Milano
Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani
A.A. 2008/2009
Linguaggio C - le strutture di controllo:
sequenza, selezione, iterazione
La presente dispensa e’ da utilizzarsi ai soli fini didattici previa autorizzazione dell’autore. E’ severamente vietata la
riproduzione anche parziale e la vendita.
15/10/2008
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 2
Blocchi di istruzioni
•! Sono una successione di istruzioni racchiuse tra parentesi graffe {
istruzione1;
istruzione2;
blocco di istruzioni
}
•! All’interno di un blocco di istruzioni è possibile inserire sia istruzioni semplici sia ulteriori blocchi che vengono detti annidati
Sequenza
•! È semplicemente un elenco di istruzioni racchiuse in un blocco
•! Le istruzioni sono eseguite una in seguito all’altra
•! Non è mai possibile eseguire due istruzioni contemporaneamente
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 3
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 4
Selezione (if)
•! Le parole chiave if e else permettono di definire due cammini di esecuzione alternativi
•! La condizione è una espressione logica che può essere vera o falsa
•! Il bloccoIF e il bloccoELSE sono eseguiti in alternativa •! istruzione viene eseguita in ogni caso
if (<condizione>) {
/* bloccoIF */
}
else {
/* bloccoELSE */
}
/* istruzione */
Condizione vera falsa
bloccoIF
istruzione
bloccoELSE
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 5
Blocco else
•! Il blocco riferito all’if è obbligatorio •! Il blocco riferito all’else è opzionale •! La seguente situazione è pertanto ammissibile
if (<condizione>) {
/* bloccoIF */
}
/* istruzione */
Condizione vera falsa
bloccoIF
istruzione
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 6
Esempio
#include <stdio.h>
int main() {
int r;
float circ;
scanf(“%d”, &r);
if (r>=0) {
circ= 2*3.14*r;
printf(“Circonferenza è %f”, circ);
} else {
printf(“Il valore del raggio deve essere positivo”);
}
return 0;
}
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 7
Classici errori
•! La condizione deve essere sempre racchiusa tra parentesi –!L’errore è sintattico e pertanto è rilevato a tempo
di compilazione
•! L’istruzione if non deve terminare con il ; –!Questo non è un errore sintattico (il compilatore
non da errore) ma è spesso semantico visto che significa “se la condizione è vera non fare nulla”
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 8
Annidamento
•! È possibile inserire all’interno di un blocco if o di un blocco elso altri blocchi di selezione if-then-else
•! Questa struttura del codice può essere adottata per tutti i costrutti (selezione ed iterazione) e viene detta annidamentp
•! In caso di annidamento una struttura deve contenere interamente l’altra
if (condizione1) {
/* blocco if */
if (condizione 2) {
/* blocco if annidato
*/
} else {
/* blocco else annidato
*/
}
} else {
/* blocco else */
}
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 9
Altri esempi di annidamento con if-then-else
if (condizione1) {
/* blocco if */
} else {
/* blocco else */
if (condizione 2) {
/*blocco if annidato */
} else {
/*blocco else
annidato*/
}
}
Questo annidamento è corretto poiché l’if annidato è completamente inserito all’interno del ramo else
if (condizione1) {
/* blocco if */
if (condizione 2) {
/*blocco if annidato */
}
} else {
/* blocco else */
} else {
/*blocco else
annidato*/
}
}
Questo annidamento è errato poiché l’if annidato è in parte incluso nel ramo if e in parte incluso nel ramo else
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 10
Esempio 1/2
#include <stdio.h>
int main() {
int r;
float circ;
scanf(“%d”, &r);
if (r>=0) {
if (r<=32767) {
circ= 2*3.14*r;
printf(“Circonferenza è %f”, circ);
}
} else {
printf(“Il valore del raggio deve essere positivo”);
}
return 0;
}
Corso di Informatica e CAD (c.i.) – ICA LC - prof. Plebani 11
Esempio 2/2
#include <stdio.h>
int main() {
int r;
float circ;
scanf(“%d”, &r);
if ((r>=0) && (r<=32767)) {
circ= 2*3.14*r;
printf(“Circonferenza è %f”, circ);
}
} else {
printf(“Il valore del raggio deve essere positivo”);
}
return 0;
}
Due if direttamente annidati possono essere sostituiti con un unico if in cui la condizione è l’AND logico delle due condizioni
Corso di Informatica A - GES [E-OZ] - prof. Plebani 12
Iterazione
•! Permette di definire un blocco di istruzioni che deve essere eseguito diverse volte
•! Elementi di un costrutto ciclico: –! Inizializzazione: le variabili interessate, e soprattutto quelle usate
nella condizione del ciclo, devono essere inizializzate prima della valutazione della condizione
–! Test: Deve essere prevista una valutazione della condizione di permanenza nel ciclo, che determini la ripetizione o la terminazione del ciclo
–! Modifica: almeno una delle variabili della condizione deve essere modificata all’interno del ciclo, in modo che prima o poi la condizione di ripetizione diventi falsa, causando la terminazione del ciclo
Corso di Informatica A - GES [E-OZ] - prof. Plebani 13
Costruttto while
•! La parola chiave while permette di definire un ciclo •! Il blocco viene eseguito finchè la condizione permane
vera •! Il ciclo è pre-condizionato
while (<condizione>) {
/* blocco */
}
/* istruzione */
Condizione vera falsa
blocco
istruzione
Corso di Informatica A - GES [E-OZ] - prof. Plebani 14
Loop
•! L’introduzione dei cicli in un programma potrebbe violare la proprietà di terminazione di un algoritmo
•! Il programmatore deve essere certo che esista almeno un caso in cui la condizione di permanenza diventi falsa per fare in modo che l’algoritmo termini
•! Altrimenti il programma potrebbe entrare in stato di loop
#include <stdio.h>
int main() {
a = 1;
while (a>0) {
printf(“%d”, a);
a++;
}
return 0;
}
Questo programma non termina mai!!! Una volta entrato nel ciclo rimane in stato di loop
Corso di Informatica A - GES [E-OZ] - prof. Plebani 15
Esempio
#include <stdio.h>
int main() {
int r;
float circ;
r=-1; /*inizializzazione che
permette di entrare nel ciclo la
prima volta */
while ((r<0) || (r>32767)) {
scanf(“%d”, &r);
if ((r<0) || (r>32767)) {
printf(“Il valore del raggio
deve essere positivo
minore di 32767”);
} /* fine dell’if */
} /* fine del while */
circ= 2*3.14*r;
printf(“Circonferenza è %f”, circ);
return 0;
}
•! Dal ciclo while esco solo quando l’utente inserisce un valore valido
•! Questo è anche un esempio di if annidato all’interno del while
•! Il calcolo della circonferenza sarà eseguito solo per valori di raggio validi
•! Questo è un tipico esempio di validazione dell’input dell’utente
Corso di Informatica A - GES [E-OZ] - prof. Plebani 16
Costrutto do-while
•! Il costrutto while permette di definire un ciclo pre-condizionato
•! Il linguaggio C fornisce anche il costrutto do-while per definire il ciclo post-condizionato
do {
/* blocco */
} while (<condizione>);
/* istruzione */
Condizione vera
falsa
blocco
istruzione
Corso di Informatica A - GES [E-OZ] - prof. Plebani 17
Esempio
#include <stdio.h>
int main() {
int r;
float circ;
do {
scanf(“%d”, &r);
if ((r<0) || (r>32767)) {
printf(“Il valore del raggio
deve essere positivo
minore di 32767”);
} /* fine dell’if */
} while ((r<0) || (r>32767));
circ= 2*3.14*r;
printf(“Circonferenza è %f”, circ);
return 0;
}
•! Come specificato nelle lezioni sugli algoritmi si può sempre passare da un ciclo pre-condizionato ad uno post-condizionato
•! In questo caso il ciclo post-condizionato è utile in quanto deve eseguire almeno una volta l’operazione di scanf ed evito l’inizializzazione fittizia (r=-1)
Corso di Informatica A - GES [E-OZ] - prof. Plebani 18
Costrutto for
•! Utilizzato ogni volta che è noto a priori il numero di cicli da eseguire –!Nel while la condizione di uscita era dettata da una
condizione generica –!Nel ciclo for la condizione di uscita predica su un
contatore
•! Il contatore è una variabile intera che memorizza il numero di volte che il ciclo è stato eseguito
•! Anche il ciclo for è un costrutto ciclico
Corso di Informatica A - GES [E-OZ] - prof. Plebani 19
Elementi del ciclo for
•! Gli elementi del ciclo for sono identici agli elementi di un costrutto ciclico ma sono applicati al contatore –! Inizializzazione: il contatore viene inizializzato –! Test: il contatore viene confrontato con il limite superiore
(inferiore) –! Modifica: il contatore viene incrementato (decrementato)
•! Il costrutto for racchiude tutti e tre gli elementi for (inizializzazione; test; modifica) {
/*blocco di istruzioni*/
}
Corso di Informatica A - GES [E-OZ] - prof. Plebani 20
Esempio di ciclo for
for (i=0; i<10; i=i+1) {
printf(“%d”, i);
}
•! Il blocco di istruzioni viene eseguito finché la
condizione di test permane vera
inizializzazione test modifica
Blocco di istruzioni
da eseguire ciclicamente
Corso di Informatica A - GES [E-OZ] - prof. Plebani 21
Ordine di esecuzione
test
vera
inizializzazione
blocco
modifica
falsa
istruzione
for (inizializzazione; test; modifica) {
/* blocco di istruzioni */
}
/* istruzione */
Corso di Informatica A - GES [E-OZ] - prof. Plebani 22
Equivalenza for - while
int i;
i = 0;
while (i < 10)
{
printf(“%d”, i);
i=i+1;
}
int i;
for (i=0; i<10; i=i+1) {
printf(“%d”, i);
}
Corso di Informatica A - GES [E-OZ] - prof. Plebani 23
Autoincremento 1/2
•! L’istruzione i=i+1 può essere sostituita da i++; (autoincremento)
•! L’autoincremento vale solo per variabili intere e può essere espresso in due forme –!variabile++ (prima accedo alla variabile e
poi incremento) –!++variabile (prima incremento e poi
accedo alla variabile) •! Sostituendo l’operatore ++ con -- si ottiene
l’autodecremento
Corso di Informatica A - GES [E-OZ] - prof. Plebani 24
Autoincremento 2/2
•! La differenza tra le due forme è evidente solo quando l’autoincremento (autodecremento) è inserito in una espressione
Esempio 1 a=5
b=a++; /*b vale 5*/
Esempio 2: a=5;
b=++a; /*b vale 6*/