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
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 Corso di Informatica e CAD (c.i.) ICA LC - prof. Plebani 2
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
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 */ vera bloccoif Condizione falsa bloccoelse istruzione Corso di Informatica e CAD (c.i.) ICA LC - prof. Plebani 4
Blocco else! Il blocco riferito all if è obbligatorio! Il blocco riferito all else è opzionale! La seguente situazione è pertanto ammissibile if (<condizione>) { /* bloccoif */ /* istruzione */ vera bloccoif Condizione falsa istruzione Corso di Informatica e CAD (c.i.) ICA LC - prof. Plebani 5
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 6
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 7
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 { else { /* blocco else annidato */ /* blocco else */ Corso di Informatica e CAD (c.i.) ICA LC - prof. Plebani 8
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 9
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 10
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 e CAD (c.i.) ICA LC - prof. Plebani 11
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 12
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 */ vera blocco Condizione falsa istruzione Corso di Informatica A - GES [E-OZ] - prof. Plebani 13
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 14
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 15
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 postcondizionato do { /* blocco */ blocco while (<condizione>); /* istruzione */ vera Condizione falsa istruzione Corso di Informatica A - GES [E-OZ] - prof. Plebani 16
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 precondizionato 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 17
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 18
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 19
Esempio di ciclo for inizializzazione test modifica for (i=0; i<10; i=i+1) { printf( %d, i); Blocco di istruzioni da eseguire ciclicamente! Il blocco di istruzioni viene eseguito finché la condizione di test permane vera Corso di Informatica A - GES [E-OZ] - prof. Plebani 20
Ordine di esecuzione for (inizializzazione; test; modifica) { /* blocco di istruzioni */ /* istruzione */ inizializzazione test falsa vera blocco modifica istruzione Corso di Informatica A - GES [E-OZ] - prof. Plebani 21
Equivalenza for - while int i; int i; i = 0; while (i < 10) { printf( %d, i); i=i+1; for (i=0; i<10; i=i+1) { printf( %d, i); Corso di Informatica A - GES [E-OZ] - prof. Plebani 22
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 23
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*/ Corso di Informatica A - GES [E-OZ] - prof. Plebani 24