Presentazione di PowerPoint - Home | Dipartimento di Ingegneria informatica...

Post on 09-Aug-2020

4 views 0 download

Transcript of Presentazione di PowerPoint - Home | Dipartimento di Ingegneria informatica...

Corso di Laboratorio di InformaticaIngegneria Clinica – BCLR

Unità 4

Istruzioni di Ciclo

Domenico Daniele Bloisi

Docente

Ing. Domenico Daniele Bloisi, PhDRicercatore

Dipartimento di Ingegneria Informatica, Automaticae Gestionale “Antonio Ruberti”Via Ariosto 25(adiacente Piazza Dante,

fermate Manzoni, Vittorio Emanuele,

Tram 3 fermata via Labicana)

Email: bloisi@dis.uniroma1.it

Home page: http://www.dis.uniroma1.it/~bloisi2013/2014Istruzioni di Ciclo

Unità 4Pagina 2

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 avvisihttp://www.dis.uniroma1.it/~bloisi/didattica/labinf1314.html#Avvisi

2013/2014Istruzioni di CicloUnità 4

Pagina 3

Orari

Lunedì 12.00 – 13.30 Aula 15, via Scarpa 14

Lunedì 14.00 – 17.15Aula 15, Laboratorio Didattico via Tiburtina 205

Martedì 14.00 – 15.30 Aula 16, via Scarpa 14

Mercoledì 12.00 – 13.30 Aula 15, via Scarpa 14

2013/2014Istruzioni di CicloUnità 4

Pagina 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

2013/2014Istruzioni di CicloUnità 4

Pagina 5

Istruzioni di controllo del flusso

Finora abbiamo visto:

• istruzioni semplici:– invocazione di funzioni– istruzioni semplici, come assegnazione o uso di un operatore di incremento/decremento seguito da ";"– istruzioni di uscita (break e return)

• istruzioni composte (o strutturate)– blocco di istruzioni ({})– istruzioni condizionali (if-else, if, switch)

2013/2014Istruzioni di CicloUnità 4

Pagina 6

Ripetizione di istruzioni

Nei linguaggi di programmazione esistono due modi per ottenere la ripetizione di istruzioni:

L'utilizzo di istruzioni di ciclo (o iterative), che sono una forma di istruzione composta

L'utilizzo di funzioni ricorsive

2013/2014Istruzioni di CicloUnità 4

Pagina 7

Cicli definiti ed indefiniti

Si distinguono due tipi di ciclo, che si differenziano in base a come viene determinato il numero di iterazioni(ripetizioni del corpo del ciclo):

Nei cicli definiti il numero di iterazioni è noto prima di iniziare l'esecuzione del ciclo.

Nei cicli indefiniti il numero di iterazioni non è noto prima di iniziare l'esecuzione del ciclo, ma è legato al verificarsi di una condizione (questo dipende a sua volta dalle operazioni eseguite nel corpo del ciclo).

2013/2014Istruzioni di CicloUnità 4

Pagina 8

Esempi

Ciclo definito:per 10 volte ripeti la stampa di un *

Ciclo indefinito:finché l’utente non sceglie di smettere, stampa un * e chiedi all’utente se smettere

In C, entrambi i tipi di ciclo possono essere realizzati attraverso l’istruzione while.

Numero di iterazioni noto a tempo di compilazione

Numero di iterazioni noto a tempo di esecuzione

2013/2014Istruzioni di CicloUnità 4

Pagina 9

Ciclo while

L’istruzione while consente la ripetizione di una istruzione.

Sintassi

while (condizione)istruzione

• condizione è un’espressione• istruzione (detta anche il corpo del ciclo) è una singola istruzione (anche composta come un blocco di istruzioni)

2013/2014Istruzioni di CicloUnità 4

Pagina 10

Semantica

• viene valutata prima la condizione

• se è vera, viene eseguita istruzione e si torna a valutare la condizione, procedendo così fino a quando condizione diventa falsa

• a questo punto si passa ad eseguire l’istruzione che segue il ciclo while

il corpo del ciclo viene eseguito finché la condizione si mantiene vera. Non appena questa diventa falsa, si esce dal ciclo e si continua l’esecuzione con l’istruzione successiva al while.

2013/2014Istruzioni di CicloUnità 4

Pagina 11

Esempio

stampa di 100 asterischi (ciclo definito)

int i = 0;while (i < 100) {

printf("*");i++;

}

2013/2014Istruzioni di CicloUnità 4

Pagina 12

Controllo del flusso

condizione

≠ 0vero

0falso

istruzione-n+1

istruzione-1…

istruzione-n

while (condizione) {istruzione-1…istruzione-n

}istruzione-n+1

2013/2014Istruzioni di CicloUnità 4

Pagina 13

Ciclo while per la lettura

lettura e stampa su video di un insieme di caratteri in input.

#include <stdio.h>

int main () {int c;c = getchar();while (c != EOF) {

putchar(c);c = getchar();

}return 0;

}

cicloindefinito

Le iterazioni continuano fino a quando non vengono premuti

contemporaneamente i tasti CTRL e Z (Windows)

oppure CTRL e D (Unix)

2013/2014Istruzioni di CicloUnità 4

Pagina 14

Funzione getchar

Legge il prossimo carattere dallo standard input e lo restituisce come valore intero

int getchar( void );

Il carattere letto è restituito come int.Se si raggiunge End Of File (EOF) o viene riscontrato un errore in lettura, la funzione restituisce il valore della costante simbolica di tipo int EOF (che generalmente vale -1) definita in stdio.h

2013/2014Istruzioni di CicloUnità 4

Pagina 15

Funzione putchar

Visualizza sullo standard output il carattere immagazzinato in c

int putchar( int c );

Se non ci sono errori, lo stesso carattere letto viene restituito.Se si verifica un errore, viene restituito EOF.

2013/2014Istruzioni di CicloUnità 4

Pagina 16

Ciclo while per la lettura versione alternativaLettura e stampa su video di un insieme di caratteri in input.

#include <stdio.h>

int main () {int c;while ((c = getchar()) != EOF)

putchar(c);return 0;

}

ciclo indefinito

2013/2014Istruzioni di CicloUnità 4

Pagina 17

Esempio di esecuzione

2013/2014Istruzioni di CicloUnità 4

Pagina 18

Esempio

Stampa del doppio degli interi letti in input.

#include <stdio.h>

int main () {int c, dato;c = scanf("%d", &dato);while (c != EOF) {

dato *= 2;printf("%d\n", dato);c = scanf("%d", &dato);

}return 0;

}

ciclo indefinito

2013/2014Istruzioni di CicloUnità 4

Pagina 19

Struttura generale del ciclo di lettura

lettura del primo elemento;while (elemento è valido) {

elaborazione elemento;lettura elemento successivo;

}

2013/2014Istruzioni di CicloUnità 4

Pagina 20

Esempio di ciclo while: divisione con le sottrazioniint dividendo, divisore, quoziente, resto;dividendo = ...;divisore = ...;quoziente = 0;resto = dividendo;while (resto >= divisore) {

quoziente++;resto -= divisore;

}printf("quoziente = %d\n", quoziente);printf("resto = %d\n", resto);

ciclo definito

2013/2014Istruzioni di CicloUnità 4

Pagina 21

Esempio di ciclo while: potenza

int base, esponente, potenza;base = ...;esponente = ...;potenza = 1;while (esponente > 0) {

potenza *= base;esponente--;

}

ciclo definito

2013/2014Istruzioni di CicloUnità 4

Pagina 22

Esempio di ciclo while: prodotto con le sommeint moltiplicando, moltiplicatore, prodotto;moltiplicando = ...;moltiplicatore = ...;prodotto = 0;while (moltiplicatore > 0) {

prodotto += moltiplicando;moltiplicatore--;

}

ciclo definito

2013/2014Istruzioni di CicloUnità 4

Pagina 23

Pagina 242013/2014Istruzioni di CicloUnità 4

Elementi caratteristici nellaprogettazione di un ciclo

iniziliazzazionewhile (condizione) {

operazionepasso successivo

}

definizione del valore delle variabili utilizzate nel ciclo prima dell’inizio dell’esecuzione del ciclo espressione valutata all’inizio di

ogni iterazione, il cui valore di verità determina l’esecuzione del corpo del ciclo o la fine del ciclo

calcolo del risultato parziale ad ogni iterazione del ciclo (nel corpo del ciclo)

operazione di incremento/decremento della variabile che controlla le ripetizioni del ciclo (nel corpo del ciclo)

Terminazione

Una volta progettato il ciclo occorre verificarne la terminazione.Occorre, cioè, verificare che l’esecuzione delle istruzioni del ciclo possa modificare il valore della condizione in modo da renderla falsa.

Esempiol'istruzione moltiplicatore--; consente di rendere la condizione (moltiplicatore > 0) falsa, se moltiplicatore è un numero intero positivo.

2013/2014Istruzioni di CicloUnità 4

Pagina 25

Algoritmo: proprietà

Un algoritmo è caratterizzato da:

• non ambiguità: le istruzioni devono essere univocamente interpretabili dall’esecutore

• eseguibilità: ogni istruzione deve poter essere eseguita (in tempo finito) con le risorse a disposizione

• finitezza: l’esecuzione dell’algoritmo deve terminare in tempo finito per ogni insieme di dati in ingresso

2013/2014Istruzioni di CicloUnità 4

Pagina 26

Errori comuni nella scrittura di cicli while (1/3)

Mancata inizializzazione di una variabile che viene utilizzata nella condizione del ciclo.

int i;while (i != 0) {

printf("%d\n", i);printf("%d\n", i*i);printf("prossimo intero\n");

}

2013/2014Istruzioni di CicloUnità 4

Pagina 27

Errori comuni nella scrittura di cicli while (2/3)

Mancato aggiornamento delle variabili che compaiono nella condizione del ciclo.

int i, dato;printf("inserisci intero:\n");i = scanf("%d", &dato);while (i != EOF) {

printf("quadrato di %d = %d\n",dato, dato*dato);

}

2013/2014Istruzioni di CicloUnità 4

Pagina 28

Manca aggiornamento di i

Errori comuni nella scrittura di cicli while (3/3)

Numero di iterazioni errato di 1

Esempio: stampa di 10 asterischi

int i = 0;while (i <= 10) { // corretto: (i < 10)

printf("*");i++;

}

2013/2014Istruzioni di CicloUnità 4

Pagina 29

Schemi di ciclo

contatore: conta il numero di valori in un insieme

accumulatore: accumula i valori di un insieme

valori caratteristici di un insieme: determina un valore caratteristico tra i valori in un insieme (ad esempio, il massimo, quando sui valori dell'insieme e definito un ordinamento)

2013/2014Istruzioni di CicloUnità 4

Pagina 30

Schema di ciclo contatore: numero di interi immessi in inputint d, i;int contatore = 0;printf("inserisci intero:\n");i = scanf("%d", &d);while (i != EOF) {

contatore++;printf("ho letto: %d\n", d);printf("inserisci intero:\n");i = scanf("%d", &d);

}printf("\nFine lettura, ho letto %d "

" interi\n", contatore);

2013/2014Istruzioni di CicloUnità 4

Pagina 31

Schema di ciclo contatore: numero di interi positivi immessi in inputint d, i;int contatore = 0;printf("inserisci intero:\n");i = scanf("%d", &d);while (i != EOF) {

if(d > 0) contatore++;printf("ho letto: %d\n", d);printf("inserisci intero:\n");i = scanf("%d", &d);

}printf("\nFine lettura, ho letto %d "

" interi positivi\n", contatore);

2013/2014Istruzioni di CicloUnità 4

Pagina 32

Schema di ciclo accumulatore: somma valori interiint d; //intero correnteint i;int somma; //variabile usata come accumulatoresomma = 0;printf("inserisci intero:\n");i = scanf("%d", &d);while (i != EOF) {

somma += d;printf("inserisci intero:\n");i = scanf("%d", &d);

}printf("\nSomma totale = %d\n", somma);

2013/2014Istruzioni di CicloUnità 4

Pagina 33

Schema di ciclo accumulatore:prodotto valori interiint n; //intero correnteint i;int prodotto; //variabile usata come accumulatoreprodotto = 1;printf("inserisci intero:\n");i = scanf("%d", &n);while (i != EOF) {

prodotto *= n;printf("inserisci intero:\n");i = scanf("%d", &n);

}printf("\nProdotto totale = %d\n", prodotto);

2013/2014Istruzioni di CicloUnità 4

Pagina 34

Schema di ciclo valori caratteristici di un insieme: massimo di un intervallo noto

int max; // massimo correntemax = 0;int d, i;printf("inserisci intero:\n");i = scanf("%d", &d);while (i != EOF) {

if (d > max) max = d;printf("inserisci intero:\n");i = scanf("%d", &d);

}printf("\n");if (max == 0)

printf("Insieme di valori vuoto\n");else

printf("Massimo intero letto = %d\n", max);

Assunzioniintervallo di interi noto, è possibile denotare valori estremi (es. tutti i valori sono > 0)

l’insieme di interi può essere vuoto

Problematrovare il massimo di un insieme di numeri interi dati in input.

2013/2014Istruzioni di CicloUnità 4

Pagina 35

Schema di ciclo valori caratteristici di un insieme: massimo di un insieme non vuoto

double f; // reale correntedouble max; // massimo correnteint i;printf("inserisci dato:\n");i = scanf("%lf", &f);max = f;while (i != EOF) {

if (f > max) max = f;printf("inserisci dato:\n");i = scanf("%lf", &f);

}printf("\nMassimo = %f\n", max);

Assunzioninell’insieme vi è almeno un reale

l’intervallo di reali non è noto, non si possonodenotare i valori estremi.

Problematrovare il massimo di un insieme di numeri reali dati in input.

2013/2014Istruzioni di CicloUnità 4

Pagina 36

Schema di ciclo valori caratteristici di un insieme: massimo nel caso generale

double f; // reale correntedouble max = 0; // massimo correnteint i;printf("inserisci dato:\n");i = scanf("%lf", &f);if(i == EOF)

printf("\nInsieme di valori vuoto\n");else {

max = f;while (i != EOF) {

if (f > max) max = f;printf("inserisci dato:\n");i = scanf("%lf", &f);

}printf("\nMassimo = %f\n", max);

}

Assunzionil’insieme di reali potrebbe essere vuoto

l’intervallo di reali non è noto

Problematrovare il massimo di un insieme di numeri reali dati in input.

2013/2014Istruzioni di CicloUnità 4

Pagina 37

Esercizio

Si scriva un programma in grado di prendere in input un carattere c ed un intero n. Il programma deve stampare a video il carattere n volte su righe separate. Inoltre, si controlli che l’input n sia un numero > 0, in caso contrario il programma dovrà stampare un messaggio di errore.

EsempioImmettere un carattere c e un intero n (es. e 7):D 3DDD

2013/2014Istruzioni di CicloUnità 4

Pagina 38