Linguaggio C - le strutture di controllo: sequenza...

24
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

Transcript of Linguaggio C - le strutture di controllo: sequenza...

Page 1: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 2: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 3: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 4: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 5: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 6: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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;

}

Page 7: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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”

Page 8: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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 */

}

Page 9: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 10: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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;

}

Page 11: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 12: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 13: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 14: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 15: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 16: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 17: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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)

Page 18: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 19: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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*/

}

Page 20: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 21: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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 */

Page 22: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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);

}

Page 23: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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

Page 24: Linguaggio C - le strutture di controllo: sequenza ...home.deib.polimi.it/plebani/download/infoICA/L5-LinguaggioC... · Dipartimento di Elettronica ed Informazione Politecnico di

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*/