Strutture iterative. Strutture iterative. I cicli in C. Strutture iterative. con i che assume i valori da 0 a 1000

Documenti analoghi
PROGRAMMAZIONE STRUTTURATA

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Istruzioni iterative (o cicliche)

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Le strutture di controllo in C++

Le Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Unità Didattica 2 Linguaggio C. Espressioni, Operatori e Strutture linguistiche per il controllo del flusso

print((math.floor(1345/10)%10); print (Math.floor(1345/100)%10); Le funzioni in JavaScript

Istruzioni di ripetizione in Java 1

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Problema. Vettori e matrici. Vettori. Vettori

Istruzioni di ciclo. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

PROGRAMMAZIONE: Le strutture di controllo

Istruzioni iterative. Istruzioni iterative

IL PRIMO PROGRAMMA IN C

JavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132

Corso di Fondamenti di Informatica

1 Esercizi in pseudocodice

Introduzione alla programmazione Esercizi risolti

Strutture di controllo iterative

Lezione 7: La Formalizzazione degli Algoritmi - Strutture di Controllo e Selettive La Programmazione Strutturata (3 p) Giovedì 21 Ottobre 2010

Linguaggio C: le funzioni. Introduzione e sintassi

Strutture di Controllo

Sviluppo di programmi. E ora, finalmente. Si comincia! 1. Analizzare il problema. 2. Progettare una soluzione (1) E necessario capire:

Esercizi di programmazione in linguaggio C - Costrutto iterazione

while Istruzione while Cicli ed iterazioni Istruzioni di ripetizione in C Comportamento del while

Algoritmi e soluzione di problemi

ISTRUZIONI ISTRUZIONI

Informatica! Appunti dal laboratorio 1!

Un esempio di if annidati

Fondamenti di Programmazione. Strutture di controllo

Esercitazione 4. Comandi iterativi for, while, do-while

Funzioni, Stack e Visibilità delle Variabili in C

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Costrutti condizionali e iterativi

Corso di Fondamenti di Informatica Classi di istruzioni 2

Programmazione strutturata

Esercitazione 6. Array

ESERCIZI DI PROGRAMMAZIONE DA SVOLGERE INDIVIDUALMENTE - parte 1 -

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

Le etichette nei programmi. Istruzioni di branch: beq. Istruzioni di branch: bne. Istruzioni di jump: j

Diagrammi a blocchi 1

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Algoritmi e basi del C Struttura di un programma

Iterazione determinata e indeterminata

Università di Roma Tor Vergata L6-1. iterazione: struttura di controllo per ripetere più volte uno stesso comando

Diagrammi a blocchi 1

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:

Sistemi Web per il turismo - lezione 3 -

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Introduzione alla programmazione

RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO

Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software

Indice. Prefazione. 3 Oggetti e Java 53

Matlab. Istruzioni condizionali, cicli for e cicli while.

Strutture di controllo e cicli

Linguaggio C: le funzioni. Introduzione e sintassi

Esercitazione 3. Espressioni booleane I comandi if-else e while

Caratteri e stringhe

Formalismi per la descrizione di algoritmi

unità didattica 3 Le strutture condizionali e le strutture iterative

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

ESERCIZI DI PROGRAMMAZIONE. - condizionali e cicli -

$QDOLVLGHOSURJUDPPDTXDGUDWR

Sequenze di controllo C:

Linguaggio C Struttura dei programmi

Debug di un programma

Programmare in C. Esempio: Algoritmo del Risveglio

Algoritmi e dintorni: La radice quadrata Prof. Ettore Limoli. Formule iterative

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

5 - Istruzioni condizionali

Introduzione al C. Introduzione. Linguaggio ad alto livello. Struttura di un programma C

in termini informali: un algoritmo è una sequenza ordinata di operazioni che risolve un problema specifico

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

linguaggio di programmazione e programma

Problemi, algoritmi e oggetti

Lezione 6. Visibilità degli identificatori e tempo di vita degli oggetti

Programmazione Orientata agli Oggetti in Linguaggio Java

Le basi del linguaggio Java

Input/Output di numeri

Programmare è un arte

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Sviluppare un programma in FORTRAN

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Array Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione

Il linguaggio C. Il controllo di flusso. La selezione condizionale L istruzione switch I cicli Le istruzioni break, continue, goto

Il generatore di numeri casuali

Esercizi Programmazione I

Espressioni semplici e condizionali

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Statements: blocchi di istruzioni

Sommario. Note alla traduzione... xix

Definizione di metodi in Java

VARIABILI, ASSEGNAZIONE, DECISIONI

Indovina la lettera...

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Transcript:

Strutture iterative 2 Strutture iterative Ver. 2.4 Problema: Visualizzare i numeri interi da 0 a 1000 Soluzione printf("0\n"); printf("1\n"); printf("2\n"); printf("3\n"); printf("4\n");... Non è davvero una buona idea ma con le conoscenze attuali non c è alternativa 2010 - Claudio Fornaro - Corso di programmazione in C Strutture iterative 3 I cicli in C 4 Vorremmo scrivere: Esegui l istruzione: printf("%d\n", i); con i che assume i valori da 0 a 1000 percorso chiuso, detto anello, loop o ciclo V i=0 stampa i i=i+1 i<=1000 F Per tornare indietro si potrebbe utilizzare un istruzione apposita, ma per questioni di chiarezza si utilizzano strutture sintattiche che fanno tornare indietro solo se la condizione di ripetizione è vera Le strutture iterative sono comunemente dette cicli o loop In C i cicli sono controllati da una condizione di permanenza nel ciclo: fintantoché la condizione è vera, si esegue il corpo del ciclo (il di codice da eseguire più volte)

Ciclo WHILE Fa eseguire un di codice fintantoché una certa condizione è vera Valuta la condizione prima di eseguire il condizione Se la condizione è inizialmente falsa, il non viene eseguito neppure una volta V F 5 Ciclo WHILE while (condizione) senza il ; Viene valutata la condizione: se è vera esegue il torna su a valutare nuovamente la condizione se è falsa passa ad eseguire le istruzioni successive al La condizione può essere un espressione qualsiasi (come nel costrutto if) 6 Ciclo WHILE Il seguente codice somma i valori introdotti finché non viene dato il valore 0 somma = 0; while (v!= 0) printf("somma: %d", somma); 7 Ciclo FOR Come il ciclo WHILE fa eseguire il fintantoché la condizione è vera for (espr1;condizione;espr2) senza il ; Viene calcolata espr1 (soltanto la prima volta) Viene valutata la condizione: se è vera: esegue il esegue epr2 torna su a valutare nuovamente la condizione altrimenti (se è falsa): passa ad eseguire le istruzioni successive a 8

Ciclo FOR Il flow-chart corrispondente è il seguente: epr1 condizione V epr2 F 9 Ciclo FOR La condizione può essere un espressione qualsiasi, se manca viene considerata pari a 1 epr1 e/o epr2 possono mancare (ma i separatori ; devono esserci ugualmente) Stampa i numeri interi da 0 a 1000 for (i=0; i<=1000; i++) printf("%d", i); Una variabile come i nell esempio precedente che tiene conto del numero di iterazioni viene detta variabile di conteggio o indice Notare che, nell esempio, dopo che il ciclo è stato eseguito completamente, i vale 1001 10 Ciclo FOR Il ciclo FOR è un ciclo WHILE riscritto in modo tale da raggruppare tra le parentesi tutto ciò che gestisce l indice: inizializzazione (espr1), controllo (condizione) e aggiornamento (espr2) for (espr1;condizione;espr2) Il ciclo FOR precedente equivale a: epr1; fuori dal corpo del ciclo! while (condizione) epr2; 11 Ciclo FOR Questo ciclo WHILE: i=0; while (i<=1000) printf("%d", i); i++; e questo ciclo FOR: for (i=0; i<=1000; i++) printf("%d", i); sono equivalenti, ma il secondo è più compatto 12

La variabile di conteggio Talvolta è conveniente che il nome della variabile di conteggio sia corto per questioni di leggibilità del codice for (i=0; scanf("%d",&v[i])!=eof; i++) tot += v[i]*v[i-1]*v[i+1]; totvaloriletti = i; Qui v[i] viene usata nel corpo del ciclo più volte, quindi è conveniente usare come indice i e non la variabile totvaloriletti che invece viene assegnata alla fine del ciclo La modifica della variabile di conteggio dentro il ciclo for viene considerata pratica da evitare in quanto può rendere il codice complesso 13 Scelta tra ciclo FOR e WHILE Quando il numero di iterazioni è noto a priori (e quindi il ciclo è controllato da un indice), è preferibile (per chiarezza e stilisticamente) utilizzare un ciclo FOR che raggruppa in un punto solo l inizializzazione, il controllo e l aggiornamento dell indice 14 Ciclo DO-WHILE Fa eseguire un di codice fintantoché una certa condizione è vera Valuta la condizione dopo aver eseguito il V condizione Anche se la condizione è inizialmente falsa, il viene eseguito almeno una volta F 15 Ciclo DO-WHILE Nella letteratura questo ciclo viene detto ciclo Repeat-Until (dove però se la condizione è vera si esce dal ciclo: non è di permanenza) do while (condizione); con il ; La condizione può essere un espressione qualsiasi che produce un valore Le graffe sono opzionali, ma consigliabili (proprio con la graffa di chiusura subito prima della keyword while) per distinguere facilmente il ciclo WHILE dal ciclo DO-WHILE 16

Ciclo DO-WHILE Somma i valori dati finché non viene introdotto il valore particolare 0 somma = 0; do while (v!= 0); Notare che il valore v viene comunque addizionato a somma (ma in questo esempio non causa problemi: somma uno 0) 17 Scelta tra ciclo WHILE e DO Si può sempre passare da un tipo di ciclo ad un altro modificando (poco) il programma La scelta tra ciclo WHILE e ciclo DO-WHILE è spesso ovvia e questione di preferenze personali 18 Programmazione strutturata 19 Programmazione strutturata 20 Nasce dalla necessità di regolamentare e standardizzare le metodologie di programmazione Un linguaggio strutturato deve avere almeno i seguenti 3 tipi di strutture: La sequenza: ossia la possibilità di definire un di istruzioni (le graffe in C, ma anche il semplice elenco di istruzioni) L alternativa: costrutti di selezione (if e switch) L iterazione: costrutti per ripetere uno stesso di istruzioni (for, while, do-while) Le strutture di un linguaggio strutturato devono avere le seguenti caratteristiche: ogni struttura (compresi i blocchi controllati) deve avere un unico punto di ingresso e un unico punto di uscita (così da non avere altre interazioni con l esterno e poter essere considerata come un unica macro-istruzione) ogni struttura può avere nel controllato altre strutture (di ogni tipo) Un programma è strutturato se usa solo le strutture indicate nei modi indicati sopra Il linguaggio C è strutturato, ma permette anche di scrivere codice non strutturato

Programmazione strutturata 21 Break 22 In Linguaggio C si ha programmazione non strutturata quando si usano le istruzioni: goto break continue return multipli in una funzione Quando si richiede una programmazione strutturata le istruzioni precedenti sono tutte vietate Dette istruzioni possono talvolta dare vantaggi anche non marginali per chiarezza e velocità di esecuzione, ma non se ne abusi Per uscire da un ciclo immediatamente, senza aspettare la valutazione della condizione, si può utilizzare l istruz. non strutturata break Dopo il break, l esecuzione continua dalla prima riga successiva al while (condizione) istruzioni... if (condizione_particolare) break; istruzioni... Il break può essere usato per gestire condizioni particolari e infrequenti (non deve essere il metodo normale di terminazione del ciclo) Break Somma fino a 10 valori dati in input. Per introdurre meno valori, introdurre 0 somma = 0; for (i=0; i<10; i++) if (v == 0) break; printf("somma = %d\n",somma); 23 Break La formulazione equivalente strutturata è: esci = NO; somma = 0; for (i=0; i<10 && esci==no; i++) if (v == 0) esci=si; else printf("somma = %d\n",somma); i++ 24

Continue 25 Continue 26 Per passare immediatamente all iterazione successiva, si può utilizzare l istruzione non strutturata continue Per effetto dell istruzione continue: vengono saltate tutte le istruzioni dalla continue fino alla parentesi di terminazione del corpo del ciclo se si tratta di un ciclo for, viene eseguita epr2 l esecuzione riprende dalla valutazione della condizione Schema con ciclo while while (condizione) istruzioni... if (condizione_particolare) continue; istruzioni saltate se eseguito continue Continue Schema con ciclo do-while do istruzioni... if (condizione_particolare) continue; istruzioni saltate se eseguito continue while (condizione); 27 Continue Somma i valori dati finché non viene introdotto il valore 0, ignorando i negativi. somma = 0; do if (v < 0) continue; while(v!= 0); 28

Continue 29 Lettura di valori 30 La formulazione equivalente strutturata è in questo caso più chiara: somma = 0; do if (v >= 0) while(v!= 0); Quando non si può sapere a priori il numero di valori che verranno introdotti dall utente si deve trovare un modo per stabilire la fine dell input: Si chiede all utente quanti valori verranno introdotti Si prevede un valore particolare che quando introdotto indica la fine dell input, tale valore è detto sentinella (es. lo 0 degli esempi precedenti) Si chiede all utente di segnalare la fine dell input mediante l immissione di un codice di controllo detto End Of File (EOF) che viene riconosciuto e segnalato dalle stesse funzioni di input (mentre la sentinella viene riconosciuta dopo l input) Lettura di valori 31 Lettura di valori 32 La costante EOF è un valore intero definito in stdio.h (in genere vale 1) Viene prodotto dall utente premendo: Windows Control-Z e poi INVIO Linu/Uni Control-D Le funzioni scanf e getchar restituiscono EOF quando l utente indica la fine dell input In modo analogo gets restituisce NULL N.B. Le combinazioni di tasti Control-Z e Control-D spesso vengono scritte ^Z e ^D, ma NON si ottengono con il carattere ^ : si deve invece premere il tasto Control e poi la lettera di lettura di sequenza di lunghezza ignota di valori dalla tastiera, la lettura termina con l introduzione di un EOF printf("terminare con EOF\n"); while (scanf("%d", &a)!= EOF) somma += a; printf("somma=%d\n", somma); di input: 12 22 34 ^Z Somma=68

Cicli annidati Un ciclo può essere collocato (completamente) nel corpo di un altro ciclo In genere, nel caso di cicli FOR ogni ciclo deve avere una variabile di conteggio diversa Il ciclo esterno controlla quello interno Il ciclo interno ricomincia sempre da capo (ad esempio l inizializzazione dell indice di un ciclo FOR interno ad un altro ciclo viene eseguita ogni volta) 33 Cicli annidati for (i=1; i<=7; i+=3) for (j=2; j<5; j++) printf("%d,%d ", i, j); printf("\n"); printf("%d,%d ", i, j); produce il seguente output: Ciclo esterno 1,2 1,3 1,4 Blocco ciclo 4,2 4,3 4,4 esterno 7,2 7,3 7,4 10,5 notare i valori di uscita 34 Ciclo interno Blocco ciclo interno Uscita da cicli annidati Nel caso di cicli annidati, break fa uscire solo da un livello; per uscire contemporaneamente da tutti i cicli annidati si può usare una goto for (i=0; i<10; i++) for (j=0; j<10; j++) if (v == 0) goto fuori; fuori: printf("somma = %d\n",somma); 35 Uscita da cicli annidati Per evitare di avere codice non strutturato e a scapito di un po di efficienza si può scrivere: esci = NO; for (i=0; i<10 && esci==no; i++) for (j=0; j<10 && esci==no; j++) if (v == 0) esci = SI; else printf("somma = %d\n",somma); 36

Etichette 37 Salti 38 Una label (etichetta) viene usata per dare un nome ad una riga, viene in genere posizionata all inizio della riga stessa senza indentazione ed è terminata da un carattere :, esempio: fuori: Tutte le label devono avere nomi diversi (stesse regole sintattiche degli identificatori) Una label è visibile in ogni punto della funzione dove è definita, ma non al di fuori di essa Un salto fa continuare l esecuzione di un programma da un altro punto del codice Il salto incondizionato goto ha sintassi: goto label; label senza il carattere : Quando viene eseguita, il programma salta alla riga con quella label e continua da lì Una label può essere collocata in una riga precedente o successiva quella con il goto (salto indietro o avanti), ma nell uso accettato sarà sempre avanti e in posizioni ben precise Una label può essere usata da più goto, ma nell uso accettato non si presenta mai il caso Salti 39 Salti 40 L utilizzo di goto produce sempre codice non strutturato e quindi potenzialmente più difficile da comprendere e da manutenere I vecchi linguaggi di programmazione non disponevano di costrutti strutturati e l uso del goto era indispensabile, i frequentissimi rimandi da una parte all altra del codice lo rendevano molto intricato ( spaghetti code ) Se il linguaggio dispone di adeguati costrutti strutturati si può sempre evitare di usare i goto. Il linguaggio C ha questi costrutti. In alcuni (pochi) casi il goto può essere utile per questioni di efficienza e chiarezza La liceità di utilizzo del goto è oggetto di diatribe, con ferventi e autorevoli sostenitori in entrambe le parti (Dijkstra vs. Knuth) Con il goto sono condannati anche break, continue e return multipli

Salti E utile l uso del goto per uscire da due o più cicli annidati, in questo caso l etichetta DEVE essere collocata subito sotto il corpo del ciclo più esterno (senza istruzioni intermedie) ed è preferibile che sia allineata verticalmente con la keyword del ciclo più esterno da cui uscire for ( Allineati verticalmente for ( if (condizione speciale) goto fuori; fuori: Etichetta subito sotto il corpo del ciclo più esterno 41 Salti Si eviti il goto in tutti gli altri casi Alcuni linguaggi moderni (es. Java) non hanno goto, ma dispongono di costrutti aggiuntivi (es. break con etichetta) proprio per uscire da cicli annidati 42 Esercizi 1. Scrivere un programma che calcoli la media (con parte frazionaria) di 100 valori introdotti dalla tastiera. 2. Scrivere un programma che chieda quanti siano i valori che verranno introdotti dalla tastiera, li chieda tutti e ne stampi la somma e la media. 3. Scrivere un programma che calcoli la media di tutti i valori introdotti dalla tastiera finché non ne viene introdotto uno non compreso tra 18 e 30, ad esempio 9999 (provare proprio questo valore!). La visualizzazione della media deve avvenire solo alla fine (ossia non ogni volta che un valore viene introdotto). 43 Esercizi 4. Scrivere un programma che richieda N numeri da tastiera e ne calcoli il valore massimo. 5. Scrivere un programma che richieda N numeri da tastiera e ne calcoli il valore massimo, il valore minimo, la somma e la media. 6. Si scriva un programma che calcoli il fattoriale di un numero intero N dato dalla tastiera. Si ricordi che il fattoriale di un numero n (simbolo n!) viene calcolato con la seguente formula: n! = n (n 1) (n 2)... 2 1. 44

Esercizi 7. Scrivere un programma che calcola i primi N numeri di Fibonacci, con N introdotto dalla tastiera. I numeri di Fibonacci sono una sequenza di valori interi che inizia con i due valori fissi 1 e 1 e ogni successivo valore è la somma dei due precedenti. Ad esempio i primi 10 numeri di Fibonacci sono: 1 1 2 3 5 8 13 21 34 55. 8. Scrivere un programma che calcoli i primi numeri di Fibonacci minori o uguali a N, con N introdotto dalla tastiera. Ad esempio i primi numeri di Fibonacci minori o uguali a 10 sono: 1 1 2 3 5 8. 45 Esercizi 9. Si scriva un programma per calcolare e mediante il suo sviluppo in serie: e 1 1! 2 2! 3... 3! Ogni frazione aggiunge precisione al risultato, per cui conviene usare valori di n adeguatamente elevati, ad esempio compresi tra 30 e 40. Si verifichi che i risultati calcolati in questo modo siano coerenti con quelli forniti dalla funzione intrinseca ep calcolando la differenza dei valori. 46 Esercizi 10. Si scriva un programma dove il calcolatore determini casualmente un numero intero compreso tra 0 e 99 e chieda all utente di trovare il numero stesso. Ad ogni input dell utente il calcolatore risponde con troppo alto o troppo basso, finché non viene trovato il valore corretto. Per generare valori casuali si utilizza la funzione rand. 11. Si scriva un programma per calcolare la radice quadrata mediante la formula iterativa di Newton: i1 1 2 i A i 47 Esercizi (Continuazione) Dato il valore A, se ne vuole calcolare la radice quadrata. La formula data calcola valori di sempre più precisi. Inizialmente si considera i=0 = A, ricavando un valore 1 che approssima molto grossolanamente il valore della radice quadrata. Si riinserisce 1 nella formula (al posto di i ) ottenendo un 2 che è un approssimazione migliore della precedente. Si continua in questo modo finché il risultato non varia più (cioè i = i +1 ). 48