Istruzioni di Ciclo - Università di Romabloisi/didattica/comunicazioniElettronica1011/... · Cicli...

37
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Istruzioni di Ciclo Parte 4 Domenico Daniele Bloisi

Transcript of Istruzioni di Ciclo - Università di Romabloisi/didattica/comunicazioniElettronica1011/... · Cicli...

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

[email protected]

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 di esecuzione

Pagina 182010/2011Istruzioni di CicloParte 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);

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