presentazione di powerpointbloisi/didattica/ingegneriaclinica... · 2014-11-07 · 2014/2015...
TRANSCRIPT
Corso di Laboratorio di Informatica
Ingegneria Clinica – BCLR
Unità 4
Controllo del flusso di
esecuzione
Domenico Daniele Bloisi
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
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
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
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
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
Output Tavola Pitagorica
Pagina 7Laboratorio di Informatica
2014/2015
Controllo del flusso di esecuzione
Unità 4
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*/
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
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
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
Esecuzione piramide di asterischi
Pagina 12Laboratorio di Informatica
2014/2015
Controllo del flusso di esecuzione
Unità 4
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
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
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
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
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
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
Esecuzione
Pagina 19Laboratorio di Informatica
2014/2015
Controllo del flusso di esecuzione
Unità 4
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
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
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
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
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
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
Esecuzione
i = 0
i = 1
i = 2
i = 4
Pagina 26Laboratorio di Informatica
2014/2015
Controllo del flusso di esecuzione
Unità 4
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
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
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
Esempio goto
Pagina 30Laboratorio di Informatica
2014/2015
Controllo del flusso di esecuzione
Unità 4
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
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
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
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
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
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
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