Post on 09-Aug-2020
Corso di Laboratorio di Informatica
Ingegneria Clinica – BCLR
Unità 4
Istruzioni di ciclo
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: bloisi@dis.uniroma1.it
home page:
Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
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 3 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
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 4 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
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 5 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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)
Pagina 6 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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
Pagina 7 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Cicli definiti ed indefiniti
Si distinguono due tipi di ciclo, che si differenziano in base a
come viene determinato il numero di iterazioni (cioè le
ripetizioni delle istruzioni nel 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).
Pagina 8 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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.
Il numero di iterazioni è noto
a tempo di compilazione
Il numero di iterazioni non è
noto a tempo di compilazione
Pagina 9 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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)
Pagina 10 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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 a 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.
Pagina 11 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Esempio
Stampa di 100 asterischi (ciclo definito)
int i = 0;
while (i < 100) {
printf("*");
i++;
}
Pagina 12 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Controllo del flusso
condizione
≠ 0
vero
0
falso
istruzione-n+1
istruzione-1
…
istruzione-n
while (condizione) {
istruzione-1
…
istruzione-n
}
istruzione-n+1
Pagina 13 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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 i dati terminano o viene riscontrato un errore in lettura, la funzione restituisce il valore EOF.
EOF (End Of File) è una costante simbolica di tipo
int, definita in stdio.h, che generalmente vale -1.
Pagina 14 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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;
}
ciclo
indefinito
Le iterazioni continuano
fino a quando non
vengono premuti
contemporaneamente i
tasti CTRL e Z (in Windows)
oppure
CTRL e D (in Unix/Mac)
Pagina 15 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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.
Pagina 16 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Ciclo while per la lettura
Versione alternativa
Lettura 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
Pagina 17 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Esempio di esecuzione
Pagina 18 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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
Pagina 19 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Struttura generale del ciclo di lettura
lettura del primo elemento;
while (elemento è valido) {
elaborazione elemento;
lettura elemento successivo;
}
Pagina 20 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Esempio di ciclo while: divisione con le
sottrazioni
int 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
Pagina 21 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Esempio di ciclo while: potenza
int base, esponente, potenza;
base = ...;
esponente = ...;
potenza = 1;
while (esponente > 0) {
potenza *= base;
esponente--;
}
ciclo
definito
Pagina 22 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Esempio di ciclo while: prodotto con le
somme
int moltiplicando, moltiplicatore, prodotto;
moltiplicando = ...;
moltiplicatore = ...;
prodotto = 0;
while (moltiplicatore > 0) {
prodotto += moltiplicando;
moltiplicatore--;
}
ciclo
definito
Pagina 23 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Pagina 24
Elementi caratteristici nella
progettazione di un ciclo
iniziliazzazione
while (condizione) {
operazione
passo 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.
Esempio l'istruzione moltiplicatore--; consente di
rendere la condizione (moltiplicatore > 0)
falsa, se moltiplicatore è un numero intero positivo.
Pagina 25 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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
Pagina 26 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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");
}
Pagina 27 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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);
}
Pagina 28
Manca l’aggiornamento di i
Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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++;
}
Pagina 29 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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)
Pagina 30 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Schema di ciclo contatore: numero di
interi immessi in input
int 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);
Pagina 31 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Schema di ciclo contatore: numero di
interi positivi immessi in input
int 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);
Pagina 32 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Schema di ciclo accumulatore: somma
valori interi int d; //intero corrente
int i;
int somma; //variabile usata come accumulatore
somma = 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);
Pagina 33 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Schema di ciclo accumulatore:
prodotto valori interi
int n; //intero corrente
int i;
int prodotto; //variabile usata come accumulatore
prodotto = 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);
Pagina 34 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Schema di ciclo valori caratteristici di un
insieme: massimo di un intervallo noto
int max; // massimo corrente
max = 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);
Assunzioni
intervallo di interi noto, è
possibile denotare valori
estremi (es. tutti i valori
sono > 0)
l’insieme di interi può
essere vuoto
Problema
trovare il massimo di un
insieme di numeri interi
dati in input.
Pagina 35 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Schema di ciclo valori caratteristici di un
insieme: massimo di un insieme non vuoto
double f; // reale corrente
double max; // massimo corrente
int 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);
Assunzioni
nell’insieme vi è almeno un
reale
l’intervallo di reali non è
noto, non si possono
denotare i valori estremi.
Problema
trovare il massimo di un
insieme di numeri reali dati
in input.
Pagina 36 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
Schema di ciclo valori caratteristici di un
insieme: massimo nel caso generale
double f; // reale corrente
double max = 0; // massimo corrente
int 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);
}
Assunzioni
l’insieme di reali
potrebbe essere
vuoto
l’intervallo di reali
non è noto
Problema
trovare il massimo di un
insieme di numeri reali
dati in input.
Pagina 37 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4
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.
Esempio Immettere un carattere c e un intero n (es. e 7):
D 3
D
D
D
Pagina 38 Laboratorio di Informatica
2014/2015
Istruzioni di ciclo
Unità 4