istruzioni di ciclo - università di romabloisi/didattica/comunicazionielettronica1011/... · cicli...
TRANSCRIPT
Corso di Fondamenti di InformaticaIngegneria delle Comunicazioni BCORIngegneria Elettronica BELR
Istruzioni di Ciclo
Parte 4
Domenico Daniele Bloisi
Docenti
Parte I – prof. Silvio Salza
[email protected]@dis.uniroma1.it
http://www.dis.uniroma1.it/~salza/fondamenti.htm
Parte II – ing. Domenico Daniele Bloisi
2010/2011Istruzioni di CicloParte 4
Pagina 2
http://www.dis.uniroma1.it/~bloisi/didattica/fondin f1011.html
Nota: %7E corrisponde alla tilde ~
Informazioni Generali
ing. Domenico Daniele Bloisi, PhD
Dipartimento di Informatica e SistemisticaDipartimento di Informatica e SistemisticaVia Ariosto 25(adiacente Piazza Dante,
A fermate Manzoni, Vittorio Emanuele,Tram 3 fermata via Labicana)
mailto:[email protected]
Pagina 3
mailto:[email protected]
http://www.dis.uniroma1.it/~bloisi
2010/2011Istruzioni di CicloParte 4
Ricevimento
Martedì 15.00 – 17.00DIS, via Ariosto 25DIS, via Ariosto 25
Aula docenti adiacente aula A4
Si consiglia di inviare una email per conferma edi controllare la bacheca degli avvisi
Pagina 4
http://www.dis.uniroma1.it/~bloisi/didattica/fondin f1011.html#Avvisi
2010/2011Istruzioni di CicloParte 4
Sommario – Parte 4
• Ripetizione di istruzioni• Istruzione while• Ciclo di lettura• Ciclo di lettura• Schemi di ciclo• Istruzione for• Istruzione do• Cicli annidati• Istruzioni di controllo del flusso
Pagina 52010/2011Istruzioni di CicloParte 4
• Istruzioni di controllo del flusso
Istruzioni di controllo del flusso
Finora abbiamo visto diversi tipi di istruzioni(senza contare le dichiarazioni):
• istruzioni semplici :• istruzioni semplici :– invocazione di funzioni– istruzioni semplici, ovvero assegnazione o uso di un
operatore di incremento/decremento seguito da " ;"– istruzioni di uscita ( break e return)
• istruzioni composte (o strutturate)
Pagina 62010/2011Istruzioni di CicloParte 4
• istruzioni composte (o strutturate)– blocco di istruzioni ( {})– istruzioni condizionali ( if-else, if, switch)
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 72010/2011Istruzioni di CicloParte 4
Cicli definiti ed indefiniti
si distinguono due tipi di ciclo, che si differenzia no in base a come viene determinato il numero di iterazioni(ripetizioni del corpo del ciclo):(ripetizioni del corpo del ciclo):
� Nei cicli definiti il numero di iterazioni è notoprima 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
Pagina 82010/2011Istruzioni di CicloParte 4
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) .
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
Pagina 92010/2011Istruzioni di CicloParte 4
In C, entrambi i tipi di ciclo possono essere realizzati attraverso l’istruzione while.
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
Pagina 102010/2011Istruzioni di CicloParte 4
• istruzione (detta anche il corpo del ciclo) è una singola istruzione (anche composta come un blocco di istruzioni)
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 condizio ne si
Pagina 112010/2011Istruzioni di CicloParte 4
il corpo del ciclo viene eseguito finché la condizio ne si mantiene vera. Non appena questa diventa falsa, si esce dal ciclo e si continua l’esecuzione con l’istruzione successiva al while.
Esempio
stampa di 100 asterischi (ciclo definito)
int i = 0;int i = 0;while (i < 100) {
printf("*");i++;
}
Pagina 122010/2011Istruzioni di CicloParte 4
Controllo del flusso
≠ 0while (condizione) {
istruzione-1
condizione
≠ 0vero
0falsoistruzione-1
…
istruzione-1…istruzione-n
}istruzione-n+1
Pagina 132010/2011Istruzioni di CicloParte 4
istruzione-n+1
…istruzione-n
Ciclo while per la lettura
lettura e stampa su video di un insieme di caratteri in input.
ciclo#include <stdio.h>
int main () {int c;c = getchar();while (c != EOF) {
putchar (c);
cicloindefinito
le iterazioni continuano fino a quando non vengono premuti
contemporaneamente i
Pagina 142010/2011Istruzioni di CicloParte 4
putchar (c);c = getchar();
}return 0;
}
contemporaneamente i tasti CTRL e Z (EOF)
Funzione getchar
Legge il prossimo carattere dallo standard input e lo restituisce come valore interoe lo restituisce come valore intero
int getchar ( void );
Il carattere letto è restituito come int.Se si raggiunge End Of File o viene riscontrato un errore in lettura, la funzione ritorna il valore
Pagina 152010/2011Istruzioni di CicloParte 4
un errore in lettura, la funzione ritorna il valore della costante simbolica di tipo int EOF (che generalmente vale -1) definita in stdio.h.
Funzione putchar
Visualizza sullo standard output il carattere immagazzinato in cc
int putchar ( int c );
Se non ci sono errori, lo stesso carattere letto viene restituito.Se si verifica un errore, viene restituito EOF.
Pagina 162010/2011Istruzioni di CicloParte 4
Se si verifica un errore, viene restituito EOF.
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
Pagina 172010/2011Istruzioni di CicloParte 4
return 0;}
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);
ciclo indefinito
Pagina 192010/2011Istruzioni di CicloParte 4
printf("%d\n", dato);c = scanf("%d", &dato);
}return 0;
}
Struttura generale del ciclo di lettura
lettura del primo elemento;while (elemento è valido) {while (elemento è valido) {
elaborazione elemento;lettura elemento successivo;
}
Pagina 202010/2011Istruzioni di CicloParte 4
Esempio di ciclo while: divisione con le sottrazioniint dividendo, divisore, quoziente, resto;dividendo = ...;divisore = ...;divisore = ...;quoziente = 0;resto = dividendo;while (resto >= divisore) {
quoziente++;resto -= divisore;
}
ciclo definito
Pagina 212010/2011Istruzioni di CicloParte 4
}printf("quoziente = %d\n", quoziente);printf("resto = %d\n", resto);
Esempio di ciclo while: potenza
int base, esponente, potenza;base = ...;esponente = ...;esponente = ...;potenza = 1;while (esponente > 0) {
potenza *= base;esponente--;
}
ciclo definito
Pagina 222010/2011Istruzioni di CicloParte 4
Esempio di ciclo while: prodotto con le sommeint moltiplicando, moltiplicatore, prodotto;moltiplicando = ...;moltiplicatore = ...;moltiplicatore = ...;prodotto = 0;while (moltiplicatore > 0) {
prodotto += moltiplicando;moltiplicatore--;
}
ciclo definito
Pagina 232010/2011Istruzioni di CicloParte 4
Elementi caratteristici nellaprogettazione di un ciclo
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
iniziliazzazionewhile (condizione) {
operazionepasso successivo
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)
Istruzioni di CicloParte 4
18 Marzo 2011 Pagina 24
}
operazione di incremento/decremento della variabile che controlla le ripetizioni del ciclo (nel corpo del ciclo)
Terminazione
Una volta progettato il ciclo occorre verificarne l a terminazione .Occorre, cioè, verificare che l’esecuzione delle 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
Pagina 252010/2011Istruzioni di CicloParte 4
l'istruzione moltiplicatore--; consente di rendere la condizione (moltiplicatore > 0)falsa, se moltiplicatore è un numero intero positivo.
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
Pagina 262010/2011Istruzioni di CicloParte 4
• finitezza : l’esecuzione dell’algoritmo deve terminare in tempo finito per ogni insieme di dati in ingresso
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 272010/2011Istruzioni di CicloParte 4
printf("prossimo intero\n");}
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",
Pagina 282010/2011Istruzioni di CicloParte 4
printf("quadrato di %d = %d\n",dato, dato*dato);
}
Errori comuni nella scrittura di cicli while (3/3)
Numero di iterazioni errato di 1
Esempio: stampa di 10 asterischiEsempio: stampa di 10 asterischi
int i = 0;while (i <= 10) { // corretto: (i < 10)
printf("*");i++;
Pagina 292010/2011Istruzioni di CicloParte 4
i++;}
Schemi di ciclo
� contatore : conta il numero di valori in uninsieme
� accumulatore : accumula i valori di un insieme
� valori caratteristici di un insieme : determina unvalore caratteristico tra i valori in un insieme(ad esempio, il massimo, quando sui valoridell'insieme e definito un ordinamento)
Pagina 302010/2011Istruzioni di CicloParte 4
dell'insieme e definito un ordinamento)
Schema di ciclo contatore : numero di interi immessi in inputint d, i;int contatore = 0;printf("inserisci intero:\n");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);
Pagina 312010/2011Istruzioni di CicloParte 4
i = scanf("%d", &d);}printf("\nFine lettura, ho letto %d "
" interi\n", contatore);
Schema di ciclo contatore : numero di interi positivi immessi in inputint d, i;int contatore = 0;printf("inserisci intero:\n");printf("inserisci intero:\n");i = scanf("%d", &d);while (i != EOF) {
if(i > 0) contatore++;printf("ho letto: %d\n", d);printf("inserisci intero:\n");i = scanf("%d", &d);
Pagina 322010/2011Istruzioni di CicloParte 4
i = scanf("%d", &d);}printf("\nFine lettura, ho letto %d "
" interi positivi\n", contatore);
Schema di ciclo accumulatore : somma valori interiint d; //intero correnteint i;int somma; //variabile usata come accumulatoreint 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);
Pagina 332010/2011Istruzioni di CicloParte 4
i = scanf("%d", &d);}printf("\nSomma totale = %d\n", somma);
Schema di ciclo accumulatore :prodotto valori interiint n; //intero correnteint i;int prodotto; //variabile usata come accumulatoreint 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);
Pagina 342010/2011Istruzioni di CicloParte 4
i = scanf("%d", &n);}printf("\nProdotto totale = %d\n", prodotto);
Schema di ciclo valori caratteristici di un insieme : massimo di un intervallo noto
int max; // massimo correntemax = 0;int d, i;
Problematrovare il massimo di un insieme di numeri interi dati in input.
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");
Assunzioniintervallo di interi noto, è possibile denotare valori estremi (es. tutti i valori sono > 0)
l’insieme di interi può
dati in input.
Pagina 352010/2011Istruzioni di CicloParte 4
printf("\n");if (max == 0)
printf("Insieme di valori vuoto\n");else
printf("Massimo intero letto = %d\n", max);
l’insieme di interi può essere vuoto
Schema di ciclo valori caratteristici di un insieme : massimo di un insieme non vuoto
double f; // reale correntedouble max; // massimo correnteint i;
Problematrovare il massimo di un insieme di numeri reali dati in input.
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);
}
Assunzioninell’insieme vi è almeno un reale
l’intervallo di reali non è noto, non si possono
dati in input.
Pagina 362010/2011Istruzioni di CicloParte 4
}printf("\nMassimo = %f\n", max);
noto, non si possonodenotare i valori estremi.
Schema di ciclo valori caratteristici di un insieme : massimo nel caso generale
double f; // reale correntedouble max = 0; // massimo correnteint i;
Problematrovare il massimo di un insieme di numeri reali
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;
Assunzionil’insieme di reali potrebbe essere vuoto
insieme di numeri reali dati in input.
Pagina 372010/2011Istruzioni di CicloParte 4
if (f > max) max = f;printf("inserisci dato:\n");i = scanf("%lf", &f);
}printf("\nMassimo = %f\n", max);
}
vuoto
l’intervallo di reali non è noto