Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015...

37
Corso di Laboratorio di Informatica Ingegneria Clinica BCLR Unità 4 Controllo del flusso di esecuzione Domenico Daniele Bloisi

Transcript of Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015...

Page 1: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Corso di Laboratorio di Informatica

Ingegneria Clinica – BCLR

Unità 4

Controllo del flusso di

esecuzione

Domenico Daniele Bloisi

Page 2: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Docente

Ing. Domenico Daniele Bloisi, PhD

Ricercatore

Dipartimento di Ingegneria Informatica, Automatica

e Gestionale “Antonio Ruberti”

Via Ariosto 25

(adiacente Piazza Dante,

Manzoni

Tram 3 fermata via Labicana)

email: [email protected]

home page:

Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Pagina 2

http://www.dis.uniroma1.it/~bloisi

Page 3: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Ricevimento

In aula, subito dopo le lezioni

Su appuntamento (tramite invio di una email)

presso:

Dipartimento di Ingegneria Informatica,

Automatica e Gestionale “Antonio Ruberti”,

via Ariosto 25 - II piano, stanza A209

Si invitano gli studenti a controllare regolarmente la

bacheca degli avvisi

http://www.dis.uniroma1.it/~bloisi/didattica/labinf1415.html#Avvisi

Pagina 3Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 4: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Orari

Lunedì 12.00 – 13.30

Aula 4, via del Castro Laurenziano 7A

Martedì 14.00 – 17.15

Aula 15, Laboratorio Didattico via Tiburtina 205

Mercoledì 12.00 – 13.30

Aula 4, via via del Castro Laurenziano 7A

Pagina 4Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 5: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Sommario – Unità 4

• Ripetizione di istruzioni• Istruzione while

• Ciclo di lettura

• Schemi di ciclo• Istruzione for

• Istruzione do

• Cicli annidati

• Istruzioni di controllo del flusso

Pagina 5Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 6: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Cicli annidati

Il corpo di un ciclo può contenere a sua volta un ciclo, chiamato

ciclo annidato.

E’ possibile annidare un qualunque numero di cicli.

int main () {

const int NMAX = 10;

int riga, colonna;

for(riga = 1; riga <= NMAX; riga++) {

for(colonna = 1; colonna <= NMAX; colonna++)

if(riga * colonna < 10)

printf(" %d ", riga * colonna);

else

printf("%d ", riga * colonna);

printf("\n");

}

return EXIT_SUCCESS;

}

Stampa della tavola

pitagorica

Pagina 6Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 7: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Output Tavola Pitagorica

Pagina 7Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 8: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

EXIT_SUCCESS e EXIT_FAILURE

Pagina 8Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

EXIT_SUCCESS

Può essere usato per indicare la corretta terminazione

dell’esecuzione del programma.

EXIT_FAILURE

Può essere usato per indicare la non corretta terminazione

dell’esecuzione del programma.

Sono due macro definite in <stdlib.h>

#define EXIT_SUCCESS /*implementation defined*/

#define EXIT_FAILURE /*implementation defined*/

Page 9: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

EXIT_SUCCESS e EXIT_FAILURE

Pagina 9Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

C99 Standard: 7.20.4.3

The exit function Paragraph 5

Finally, control is returned to the host environment. If the value of status

is zero or EXIT_SUCCESS, an implementation-defined form of the status

successful termination is returned. If the value of status is EXIT_FAILURE,

an implementation-defined form of the status unsuccessful termination is

returned. Otherwise the status returned is implementation-defined.

Generalmente:#define EXIT_SUCCESS 0

#define EXIT_FAILURE 1

Page 10: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esempio di doppio ciclo:

stampa di una piramide di asterischi

Il numero di iterazioni di un ciclo più interno può dipendere

dall’iterazione del ciclo più esterno

Esempio

Programma per la stampa di una piramide di asterischi

Per la stampa della generica riga r:

stampa (altezza − r) blank e (2r − 1) asterischi.

Pagina 10Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 11: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Codice piramide di asterischi

int main() {

int altezza, riga, i;

printf("Altezza = ");

scanf("%d", &altezza);

printf("\n");

for (riga = 1; riga <= altezza; riga++) {

//1 iterazione per ogni riga della piramide

for (i = 1; i <= altezza - riga; i++)

printf(" "); //stampa gli spazi bianchi iniziali

for (i = 1; i <= riga * 2 - 1; i++)

printf("*");//stampa la sequenza di asterischi

printf("\n"); // va a capo: la riga e’ finita

}

return EXIT_SUCCESS;

}

Pagina 11Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 12: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esecuzione piramide di asterischi

Pagina 12Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 13: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esempio potenza con un doppio ciclo

int main() {

int base = 2;

int esponente= 3;

int risultato = 1;

while (esponente > 0) {

esponente--;

// risultato = risultato * base

int moltiplicando = risultato;

int moltiplicatore = base;

int prodotto = 0;

while (moltiplicatore > 0) {

moltiplicatore--;

prodotto = prodotto + moltiplicando;

}

risultato = prodotto;

}

printf("%d\n", risultato);

}Pagina 13Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 14: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Istruzioni di controllo del flusso

Le istruzioni di controllo del flusso determinano la successiva

istruzione da eseguire.

Le istruzioni if-else, if, switch, while, for, do sono

istruzioni di controllo del flusso di esecuzione.

Esse non permettono, però, di stabilire in modo arbitrario la

prossima istruzione da eseguire, ma forniscono una

strutturazione del programma che determina il flusso di

esecuzione.

Pagina 14Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 15: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Istruzioni di salto

break (salto all'istruzione successiva al ciclo o

allo switch corrente)

continue (salto alla condizione del ciclo)

goto (salto all'istruzione etichettata)

Anche l'istruzione return può essere usata per

modificare il flusso di esecuzione, nelle funzioni

definite.

Pagina 15Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 16: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Istruzione break per uscire da un ciclo

break permette di uscire prematuramente da un’istruzione

switch, while, for o do.

double a;

int i;

for (i = 0; i < 10; i++) {

printf("Immetti un reale non negativo: ");

scanf("%lf", &a);

if (a >= 0)

printf("%f\n", sqrt(a));

else {

printf("Errore\n");

break;

}

}

Pagina 16

Quante iterazioni compie

questo ciclo?

Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 17: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Nota: nel caso di cicli annidati o di switch annidati

dentro un ciclo, l’esecuzione di un break permette di

uscire da un solo livello.

Istruzione break per uscire da un ciclo

Pagina 17Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 18: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esempio

int main() {

int a;

int i, j;

printf("Immetti un intero non negativo: ");

scanf("%d", &a);

for (i = 0; i < 10; i++) {

printf("*");

for (j = 0; j < 10; j++) {

if(a == 2) break;

printf("*");

}

if (a >= 0) printf("%d\n", a);

else {

printf("Errore\n");

break;

}

}

}Pagina 18Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 19: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esecuzione

Pagina 19Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 20: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Eliminazione del break

L’esecuzione di un’istruzione break altera il flusso di

controllo.

Quando viene usata nei cicli:

• Si perde la strutturazione del programma

• Si guadagna in efficienza rispetto ad

implementare lo stesso comportamento senzafare uso del break.

In generale, è sempre possibile eliminare un’istruzione break.

Pagina 20Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 21: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Eliminazione del break

while (condizione) {

istruzioni-1

if (condizione-break)

break;

istruzioni-2

}

equivale aint finito = 0; //condizione finito = false

while (condizione && !finito) {

istruzioni-1

if (condizione-break)

finito = 1; //condizione finito = true

else {

istruzioni-2

}

}

Pagina 21Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 22: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esempio eliminazione del break

double a;

int errore = 0;

int i;

for (i = 0; (i < 10) && !errore; i++) {

printf("Immetti un reale non negativo: ");

scanf("%lf", &a);

if (a > 0)

printf("%f\n", sqrt(a));

else {

printf("Errore\n");

errore = 1;

}

}

Pagina 22Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 23: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Istruzione continue

L’istruzione continue si applica solo ai cicli e comporta il

passaggio alla successiva iterazione del ciclo, saltando le

eventuali istruzioni che seguono nel corpo del ciclo.

int i;

for (i = 0; i < n; i++) {

if (i % 2 == 0)

continue;

printf("%d\n", i);

}

Pagina 23Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 24: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Errori continue

Un possibile uso di continue è all’interno di un ciclo di lettura, nel quale

vogliamo effettuare un’elaborazione sui dati letti solo se è verificata una

determinata condizione.

Bisogna, però, assicurarsi che ad ogni iterazione del ciclo venga in ogni

caso letto il prossimo valore, altrimenti il ciclo non termina.

Esempio di uso errato dell’istruzione continue

leggi il prossimo dato;

while (condizione) {

if (condizione-sul-dato-corrente )

continue; // ERRORE! viene saltata la lettura del dato

elabora il dato;

leggi il prossimo dato;

}

Pagina 24

pseudocodice

Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 25: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

continue

Cosa stampa questo programma?

#include <stdlib.h>

#include <stdio.h>

int main() {

int i;

for (i = 0; i < 5; i++) {

if(i == 3) {

continue;

}

printf("i = %d\n", i);

}

return EXIT_SUCCESS;

}Pagina 25Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 26: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esecuzione

i = 0

i = 1

i = 2

i = 4

Pagina 26Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 27: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Istruzioni di salto goto

L’istruzione di salto deriva dal linguaggio macchina, dove ha un ruolo

fondamentale per consentire la realizzazione dei cicli.

Il teorema di Böhm e Jacopini mostra come essa non sia necessaria ai fini

della completezza del linguaggio.

L’istruzione di salto comporta una interruzione del flusso dell’esecuzione del programma, che prosegue poi con l’istruzione specificata nel goto.

Per consentire il salto, le istruzioni possono avere delle etichette:

etichetta : istruzione-ciclo;

Le etichette devono essere degli identificatori.

Pagina 27Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 28: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Sintassi e semantica goto

Sintassi

goto etichetta

etichetta è un identificatore che deve individuare una

istruzione del programma.

Semantica

L'esecuzione del programma prosegue con la

istruzione specificata dall'etichetta

Pagina 28Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 29: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esempio goto

int i = 0;

int x;

while (i < 100) {

printf("inserisci dato: ");

scanf("%d", &x);

if (x < 0) goto errore;

i++;

}

errore: printf("errore nei dati, programma interrotto\n");

Pagina 29Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

etichetta

Page 30: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esempio goto

Pagina 30Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 31: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Nota sul goto

L’uso di etichette e di istruzioni goto è

considerato come una cattiva pratica di

programmazione e va riservato a casi

particolari.

Pagina 31Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 32: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esempio break e continue

int x, i;

for(;;) {

printf("Inserisci un intero non negativo\n");

i = scanf("%d", &x);

printf("valore di ritorno scanf: %d\n", i);

if(x < 0) {

printf("ho detto non negativo\n");

continue;

}

else if(i != 1){

if(i == 0)

printf("formato non corretto. addio\n");

else if(i == EOF)

printf("ciao ciao\n");

break;

}

printf("Ho letto %d\n", x);

}Pagina 32Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 33: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Valore di ritorno scanf

int scanf ( const char * format, ... );

Read formatted data from stdinReads data from stdin and stores them according to the parameter format into

the locations pointed by the additional arguments.

The additional arguments should point to already allocated objects of the type

specified by their corresponding format tag within the format string.

Return ValueOn success, the function returns the number of items successfully read.

This count can match the expected number of readings or fewer, even zero, if a

matching failure happens.In the case of an input failure before any data could be successfully read, EOF is

returned.

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

Pagina 33Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 34: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esercizio break e continue

Si chiede di realizzare un programma in grado di leggere da tastiera dei valori int e di elaborarli in accordo con le seguenti

condizioni:

Se il valore che viene letto è negativo, si vuole stampare un

messaggio di errore e terminare il programma.

Se il valore letto è maggiore di 100, si vuole ignorarlo e

continuare con il successivo valore in input.

Se il valore è 0, si vuole terminare il ciclo con un messaggio

di avvenuta terminazione corretta.

Altrimenti, si vuole stampare il doppio dell’intero letto

Pagina 34Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 35: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Soluzione

/* Viene letto un valore intero ed elaborato purché

sia maggiore di 0 e minore di 100 */

while (scanf("%d", &value) == 1 && value !=0) {

if (value < 0) {

printf("Valore non ammesso\n");

break; /* Abbandona il loop */

}

if (value > 100) {

printf("Valore non ammesso\n");

continue; // Torna nuovamente all'inizio del loop

}

/*Elabora il valore letto*/

/*che e' sicuramente tra 0 e 100 */

printf("%d\n", 2 * value);

}

printf("programma terminato con successo");

Pagina 35Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 36: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esercizio - piramide

Scrivere un programma che legga da tastiera un intero h compreso tra 1 e 9 e stampi una piramide di

numeri di altezza h.

EsempioPer h = 4 si vuole ottenere la piramide

Pagina 36Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4

Page 37: Presentazione di PowerPointbloisi/didattica/ingegneriaClinica... · 2014-11-07 · 2014/2015 Controllo del flusso di esecuzione Unità 4 ... Eliminazione del break L’esecuzione

Esercizio - fattoriale

Scrivere un programma che legga un intero n, calcoli

e restituisca il fattoriale di n.

Prevedere la ri-stampa della richiesta nel caso in cui

n sia negativo.

La rapida crescita con n del valore di n! può

risultare stupefacente e questo ha condotto nel

1807 Christian Kramp ad adottare la notazione

con il punto esclamativo.

Pagina 37Laboratorio di Informatica

2014/2015

Controllo del flusso di esecuzione

Unità 4