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: [email protected]
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
Top Related