Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi
Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm Parte II ing. Domenico Daniele Bloisi, PhD bloisi@dis.uniroma1.it http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1112.html Nota: %7E corrisponde alla tilde ~ Pagina 2
Informazioni Generali ing. Domenico Daniele Bloisi, PhD Dipartimento di Informatica e Sistemistica Via Ariosto 25 (adiacente Piazza Dante, A fermate Manzoni, Vittorio Emanuele, Tram 3 fermata via Labicana) mailto:bloisi@dis.uniroma1.it http://www.dis.uniroma1.it/~bloisi Pagina 3
Ricevimento Su appuntamento. Inviare una email per conferma. DIS, via Ariosto 25 II piano, stanza B211 Si consiglia di controllare la bacheca degli avvisi http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1112.html#avvisi Pagina 4
Sommario Ripetizione di istruzioni Istruzione while Ciclo di lettura Schemi di ciclo Istruzione for Istruzione do Cicli annidati Istruzioni di controllo del flusso Pagina 5
Istruzioni di controllo del flusso Finora abbiamo visto diversi tipi di istruzioni (senza contare le dichiarazioni): 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) blocco di istruzioni ({) istruzioni condizionali (if-else, if, switch) 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 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). 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. 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) 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. Pagina 11
Esempio stampa di 100 asterischi (ciclo definito) int i = 0; while (i < 100) { printf("*"); i++; Pagina 12
Controllo del flusso while (condizione) { istruzione-1 istruzione-n istruzione-n+1 0 vero istruzione-1 istruzione-n condizione 0 falso istruzione-n+1 Pagina 13
Ciclo while per la lettura lettura e stampa su video di un insieme di caratteri in input. ciclo #include <stdio.h> indefinito int main () { int c; c = getchar(); while (c!= EOF) { putchar(c); c = getchar(); return 0; In Windows le iterazioni continuano fino a quando non vengono premuti contemporaneamente i tasti CTRL e Z (EOF) 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 o viene riscontrato un errore in lettura, la funzione ritorna il valore della costante simbolica di tipo int EOF (che generalmente vale -1) definita in stdio.h. 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. Pagina 16
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
Esempio di esecuzione 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); return 0; c = scanf("%d", &dato); ciclo indefinito Pagina 19
Struttura generale del ciclo di lettura lettura del primo elemento; while (elemento è valido) { elaborazione elemento; lettura elemento successivo; Pagina 20
Esempio di ciclo while: divisione con le sottrazioni int dividendo, divisore, quoziente, resto; dividendo =...; divisore =...; quoziente = 0; resto = dividendo; ciclo while (resto >= divisore) { definito quoziente++; resto -= divisore; printf("quoziente = %d\n", quoziente); printf("resto = %d\n", resto); Pagina 21
Esempio di ciclo while: potenza int base, esponente, potenza; base =...; esponente =...; potenza = 1; while (esponente > 0) { potenza *= base; esponente--; ciclo definito Pagina 22
Esempio di ciclo while: prodotto con le somme int moltiplicando, moltiplicatore, prodotto; moltiplicando =...; moltiplicatore =...; prodotto = 0; while (moltiplicatore > 0) { ciclo prodotto += moltiplicando; definito moltiplicatore--; Pagina 23
Elementi caratteristici nella progettazione di un ciclo definizione del valore delle variabili utilizzate nel ciclo prima dell inizio dell esecuzione del ciclo iniziliazzazione while (condizione) { operazione passo successivo 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) 18 Marzo 2011 Pagina 24
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
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
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
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
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
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
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
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
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
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
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); Problema trovare il massimo di un insieme di numeri interi dati in input. Assunzioni intervallo di interi noto, è possibile denotare valori estremi (es. tutti i valori sono > 0) l insieme di interi può essere vuoto printf("\n"); if (max == 0) printf("insieme di valori vuoto\n"); else printf("massimo intero letto = %d\n", max); Pagina 35
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); Problema trovare il massimo di un insieme di numeri reali dati in input. Assunzioni nell insieme vi è almeno un reale l intervallo di reali non è noto, non si possono denotare i valori estremi. Pagina 36
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); Problema trovare il massimo di un insieme di numeri reali dati in input. Assunzioni l insieme di reali potrebbe essere vuoto l intervallo di reali non è noto Pagina 37