Linguaggio C strutture di controllo: strutture iterative Università degli Studi di Brescia Prof. Massimiliano Giacomin Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 1 Istruzioni iterative • Sono chiamate anche “cicli” • Permettono di eseguire più volte un’istruzione (eventualmente un blocco) che costituisce il corpo del ciclo • Prevedono di specificare una condizione di permanenza del ciclo: fintantoché la condizione è vera viene eseguita una nuova iterazione del ciclo (ovvero, le istruzioni nel corpo del ciclo vengono eseguite) • Tipologie di cicli: - cicli a condizione iniziale: while e for - cicli a condizione finale: do-while Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 2 Istruzione while Sintassi Semantica while (<condiz>) <istruzione> <condiz> … • <condiz> è costruita tipicamente con operatori relazionali p.es. (i<5) • <istruzione> può essere: - istruzione non composta - blocco Prof. M. Giacomin F V <istruzione> … - se <condiz> è vera viene eseguita <istruzione>, poi si ritorna al controllo di condiz - quando <condiz> diventa falsa si passa alle istruzioni successive Elementi di Informatica e Programmazione – Università di Brescia 3 Esempio Acquisizione dall’utente di un intero, continuando a ripetere l’input se l’utente inserisce un numero strettamente negativo Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 4 Esempio Acquisizione dall’utente di un intero, continuando a ripetere l’input se l’utente inserisce un numero strettamente negativo printf(“Inserire un numero maggiore o uguale a 0\n”); scanf(“%d”,&n); while(n<0) scanf(“%d”,&n); … Nota Poiché la condizione è valutata all’inizio del ciclo, il corpo del ciclo potrebbe non essere mai eseguito (nell’esempio, se l’utente inserisce subito un valore positivo) Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 5 Istruzione do-while: ciclo a condizione finale Sintassi Semantica do <istruzione> while (<condiz>); … • <condiz> è costruita tipicamente con operatori relazionali p.es. (i<5) • <istruzione> può essere: - istruzione non composta - blocco Prof. M. Giacomin <istruzione> V <condiz> F ... - Viene eseguita <istruzione> - Se <condiz> è vera viene eseguita <istruzione> e si prosegue; quando <condiz> diventa falsa si passa alle istruzioni successive Elementi di Informatica e Programmazione – Università di Brescia 6 Uso di do-while (1) • A differenza di while (e for), la struttura do-while è un ciclo a condizione finale: garantisce che venga eseguita sempre almeno una iterazione del ciclo • Dal punto di vista teorico tutto ciò che si può fare con do-while si può fare anche con while (o for); può essere però conveniente usare do-while nei casi in cui il corpo del ciclo debba in ogni caso essere eseguito almeno una volta • Vediamo un esempio… Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 7 Uso di do-while (2) • Esempio già visto: acquisire un intero da tastiera, ripetendo l’operazione di input se l’utente inserisce un numero negativo Versione con while printf(“Inserire un numero maggiore o uguale a 0\n”); scanf(“%d”,&n); while(n<0) scanf(“%d”,&n); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 8 Uso di do-while (2) • Esempio già visto: acquisire un intero da tastiera, ripetendo l’operazione di input se l’utente inserisce un numero negativo Versione con while printf(“Inserire un numero maggiore o uguale a 0\n”); scanf(“%d”,&n); while(n<0) scanf(“%d”,&n); Versione con do-while printf(“Inserire un numero maggiore o uguale a 0\n”); do scanf(“%d”,&n); while(n<0); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 9 Esempio: while o do-while, questo è il dilemma Scrivere un programma che continua ad acquisire un intero fino a quando l’utente non inserisce un numero strettamente maggiore di 100, dopodiché lo stampa a video. Esempio: L’utente inserisce -100 34 49 200 Prof. M. Giacomin A questo punto il calcolatore stampa 200. Elementi di Informatica e Programmazione – Università di Brescia 10 Un primo modo… Ovviamente, mi serve un ciclo che continui ad acquisire numeri fino a quando il numero inserito non sia “corretto” (strettamente maggiore di 100). Dato che devo acquisire almeno un numero, posso pensare di usare un ciclo do-while (a condizione finale)… do{ printf(“Inserisci un numero strettamente maggiore di 100\n”); scanf(“%d”, &n); } while (n<=100); printf(“Numero inserito = %d\n”, n); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 11 Il programma completo #include <stdio.h> #include <stdlib.h> int main(int argc, char*argv[]) { int n; do{ printf("Inserisci un numero strettamente maggiore di 100\n"); scanf("%d", &n); } while (n<=100); printf("Numero inserito = %d\n", n); return 0; } Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 12 Un’altra versione (cambiamo leggermente la richiesta) Supponiamo che: • La prima volta che acquisisco un numero voglio stampare il messaggio "Inserisci un numero strettamente maggiore di 100" • Ogni volta che l’utente sbaglia, voglio inserire un messaggio diverso, per evidenziare che ha sbagliato acquisisci numero n (con messaggio iniziale) while(n scorretto){ stampa messaggio di errore; acquisisci n; } stampa n; //corretto! Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 13 Il programma completo #include <stdio.h> #include <stdlib.h> int main(int argc, char*argv[]){ int n; printf("Inserisci un numero strettamente maggiore di 100\n"); scanf("%d", &n); while (n<=100){ printf(“Forse non mi sono spiegato bene: "); printf(“il numero deve essere strettamente maggiore di 100\n”); printf(“Riprova per favore\n”); scanf("%d", &n); } printf("Numero inserito = %d\n", n); return 0; } Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 14 CASI PARADIGMATICI • Alcuni esempi fondamentali che è necessario comprendere • Nella pratica questi schemi vanno “combinati” in vario modo, a seconda del problema da affrontare: non sono “ricette pronte” da consultare e applicare pedissequamente, quindi non bisogna “impararli” ma “assimilarli” come un gesto tecnico sportivo (come? P.es. ricostruendoli da soli) • Saranno proposti esercizi individuali che costituiscono “varianti” degli esempi successivi Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 15 P1: Iterazione controllata da un contatore • Quando il numero delle iterazioni è noto a priori (“iterazione definita”) • Una variabile, detta contatore, tiene traccia del numero di iterazioni effettuate/da effettuare • Idea di base: o Il contatore viene inizializzato prima del ciclo o Ad ogni iterazione il contatore viene aggiornato o Condizione di permanenza: si rimane nel ciclo se il contatore indica che ci sono ancora iterazioni da effettuare Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 16 ESEMPIO Stampa 10 asterischi utilizzando un ciclo Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 17 ESEMPIO Stampa 10 asterischi utilizzando un ciclo n=1; while(n<=10){ printf(“*”); n=n+1; } Problemi (collegati tra loro): - come inizializzare la variabile? - come scrivere correttamente la condizione di permanenza? Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 18 CONSIGLIO • Abituatevi subito a “dare un significato preciso alle variabili”: stabilire cosa rappresentano esattamente ad ogni iterazione (quando viene controllata la condizione) • Anche se adesso sembra inutile, è meglio imparare su esempi facili • Se imparate adesso, gli esercizi d’esame non saranno tanto più difficili di questi; altrimenti, sembreranno più complicati di quello che in realtà sono Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 19 Esempio: stampare i numeri da 1 a 5 Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 20 Esempio: stampare i numeri da 1 a 5 int num=1; while(num<=5){ printf(“Numero %d\n”, num); num=num+1; } Prof. M. Giacomin // prossimo numero da stampare // esci quando num > 5 Elementi di Informatica e Programmazione – Università di Brescia 21 Esempio: stampare i numeri da 1 a 5 int num=1; while(num<=5){ printf(“Numero %d\n”, num); num=num+1; } // prossimo numero da stampare // esci quando num > 5 (!!!) Variante Esempio: stampare i numeri da 1 a 5 int num=0; while(num<5){ num=num+1; printf(“Numero %d\n”, num); } Prof. M. Giacomin // ultimo numero già stampato // esci quando num = 5 (!!!) Elementi di Informatica e Programmazione – Università di Brescia 22 Esempio Vogliamo stampare i numeri da 10 a 1 Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 23 Esempio Vogliamo stampare i numeri da 10 a 1 int n; n=10; // prossimo numero da stampare while(n>=1){ printf(“%d\n”,n); n=n-1; } … Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 24 Esempio Scrivere un programma che acquisisce un intero positivo n e stampa tutti i numeri pari da 2 a n. Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 25 Esempio (continua) Scrivere un programma che acquisisce un intero positivo n e stampa tutti i numeri pari da 2 a n. Soluzione Uso un ciclo while con i che va da 2 a “n” (max pari<=n) e che scandisce i numeri pari: deve essere incrementata di 2 [es: se n = 11 deve stampare 2, 4, 6, 8, 10] Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 26 Esempio (continua) Scrivere un programma che acquisisce un intero positivo n e stampa tutti i numeri pari da 2 a n. Soluzione Uso un ciclo while con i che va da 2 a “n” (max pari<=n) e che scandisce i numeri pari: deve essere incrementata di 2 [es: se n = 11 deve stampare 2, 4, 6, 8, 10] i=2; // numero da stampare while(i<=n){ printf(“%d\n”,i); i=i+2; } Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 27 Il programma completo #include <stdio.h> #include <stdlib.h> int main(int argc, char*argv[]){ int n, i; printf("Inserisci un numero positivo\n"); scanf("%d", &n); while(i<=n){ printf(“%d\n”,i); i=i+2; } return 0; } Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 28 P2: Iterazione controllata da sentinella • Per elaborare una sequenza di elementi (es: valori in input) di lunghezza non nota a priori • Una proprietà particolare degli elementi (sentinella) indica la fine della sequenza (es: il valore 0 indica fine valori in input) • Idea di base: o ad ogni iterazione si acquisisce e gestisce un nuovo elemento o la condizione di permanenza controlla l’elemento corrente, uscendo dal ciclo quando la sentinella lo segnala • NB: in questo caso il numero di iterazioni è indefinito Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 29 Esempio Scrivere un programma che acquisisce una serie di numeri interi dall’utente fino a quando l’utente inserisce il numero 0. Per ogni numero acquisito (0 escluso), il programma stampa a video il numero successivo. ESEMPIO DI ESECUZIONE: 2 Successivo = 3 5 Successivo = 6 0 Premi un tasto per continuare Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 30 Variante 1 int num; //numero acquisito da processare printf(“Inserisci la serie di numeri, 0 per terminare\n”); scanf(“%d”, &num); while(num!=0){ // esce quando num = 0 (!!!) printf(“Successivo = %d\n”, num+1); scanf(“%d”, &num); } Variante 2 int num; //numero acquisito già processato printf(“Inserisci la serie di numeri, 0 per terminare\n”); do{ scanf(“%d”, &num); if(num!=0) printf(“Successivo = %d\n”, num+1); } while(num!=0); Prof. M. Giacomin // esce quando num = 0 Elementi di Informatica e Programmazione – Università di Brescia (!!!) 31 P3: Calcolo di aggregati • Per calcolare una proprietà da una sequenza di elementi tale che: ... aggregatoprec NUOVO ELEMENTO ✪ aggregato • Esempi: somma/prodotto/minimo/massimo di sequenze di valori • Idea di base: o Una variabile memorizza l’“aggregato” o Si scandiscono gli elementi: per ogni nuovo elemento la variabile viene aggiornata o La variabile deve essere inizializzata a un valore opportuno (tipicamente: elemento neutro di una operazione o sulla base del primo elemento delle sequenza) Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 32 Esempio Scrivere un programma che acquisisce una serie di numeri interi dall’utente fino a quando l’utente inserisce il numero 0 e stampa la somma degli elementi inseriti (se l’utente inserisce subito 0, il programma stampa 0). Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 33 int num, somma; somma=0; //all’inizio del ciclo, indica somma numeri precedenti printf(“Inserire la sequenza di numeri, 0 per terminare\n”); do{ scanf(“%d”, &num); somma=somma+num; } while(num!=0); printf(“La somma dei numeri inseriti è %d\n", somma); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 34 Esempio Scrivere un programma che continua ad acquisire un intero fino a quando l’utente inserisce il numero 0, quindi stampa il minimo tra i valori inseriti (zero escluso). Ad esempio, se l’utente inserisce 10 3 4 7 2 9 9 2 0 il programma stampa 2. Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 35 Primo passo: capire il testo e soprattutto il problema (se “non si sa da che parte prendere”, provare a risolvere qualche istanza a mano) 10 3 4 7 2 9 9 2 0 Se avessimo una lista lunga, non potremmo usare il “colpo d’occhio”: partiamo dal primo elemento e proseguiamo a destra individuando il minimo: 10 3 3 3 2 2 2 2 0 Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 36 Secondo passo: individuare un metodo risolutivo Uso una variabile min che tiene traccia del minimo corrente e scandisco gli elementi della sequenza aggiornando min ad ogni elemento, fino alla fine 10 3 4 7 2 9 9 2 0 min = 10 3: 3<min, quindi min diventa 3 4: 4>min, quindi min rimane uguale (3) 7: 7>min, quindi min rimane uguale (3) 2: 2<min, quindi min diventa 2 …. Si userà un ciclo per scandire la sequenza! Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 37 Terzo passo: sviluppare un algoritmo Prima “bozza”: Acquisisci primo numero e assegnalo a min Acquisisci nuovo numero while(numero!=0){ aggiorna eventualmente min acquisisci nuovo numero } stampa min Cosa succede se l’utente inserisce direttamente 0? Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 38 Seconda “bozza”: Acquisisci primo numero e assegnalo a min if(min==0) stampa messaggio di errore else{ Acquisisci nuovo numero while(numero!=0){ aggiorna eventualmente min acquisisci nuovo numero } stampa min } Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 39 NB: Conviene usare un do-while? All’inizio devo comunque acquisire un numero e assegnarlo a min… Acquisisci primo numero e assegnalo a min if(min==0) stampa messaggio di errore else{ do{ acquisisci nuovo numero; if(numero!=0) aggiorna eventualmente min; } while(numero!=0); stampa min} Ad ogni iterazione controllo della condizione… Entrambe le soluzioni accettabili, nel seguito while Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 40 int num, min; printf(“Inserire un numero\n”); scanf(“%d”,&num); min=num; if(min==0) printf(“Nessun numero valido inserito\n”); else{ printf(“Inserire un numero\n”); scanf(“%d”,&num); while(num!=0){ if(num<min) min=num; printf(“Inserire un numero\n”); scanf(“%d”,&num); } printf(“Il minimo è %d\n", min); } Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 41 P4: Verifica esistenziale • Per verificare se in una sequenza di elementi (es: valori in input) esiste almeno un elemento che soddisfa una certa proprietà • Idea di base: o Una variabile “trovato” viene inizializzata al valore 0 che indica “NO” (elemento non ancora trovato) o ad ogni iterazione: - si considera un nuovo elemento - se l’elemento soddisfa la proprietà si pone “trovato” a 1 o All’uscita dal ciclo, “trovato” risulta 0 se non esiste alcun elemento che soddisfa la proprietà , 1 altrimenti Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 42 Esempio Scrivere un programma che acquisisce una serie di numeri interi dall’utente fino a quando l’utente inserisce il numero 0 e verifica se esiste almeno un numero inserito (0 escluso) pari, stampando un opportuno messaggio. Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 43 int trovato, num; trovato=0; //elemento pari non trovato all’inizio printf(“Inserire la sequenza di numeri, 0 per terminare\n”); scanf(“%d”, &num); while(num!=0){ //num nuovo numero da processare if(num%2==0) trovato=1; scanf(“%d”, &num); } if(trovato==1) printf(“Esiste un numero pari\n”); else printf(“Non esiste alcun numero pari\n”); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 44 P5: Verifica universale • Per verificare se in una sequenza di elementi (es: valori in input) tutti gli elementi soddisfano una certa proprietà • Idea di base: o Una variabile “soddisfano” viene inizializzata al valore 1 che indica “SI” (tutti gli elementi finora processati soddisfano) o ad ogni iterazione: - si considera un nuovo elemento - se elemento NON soddisfa la proprietà si pone “soddisfano” a 0 o All’uscita dal ciclo, “soddisfano” risulta 0 se non è vero che tutti gli elementi soddisfano la proprietà (= esiste un elemento che non soddisfa la proprietà!), 1 altrimenti Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 45 Esempio Scrivere un programma che acquisisce una serie di numeri interi dall’utente fino a quando l’utente inserisce il numero 0 e verifica se tutti i numeri inseriti (0 escluso) sono pari, stampando un opportuno messaggio. Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 46 int tuttipari, num; tuttipari=1; //all’inizio tutti i numeri pari printf(“Inserire la sequenza di numeri, 0 per terminare\n”); scanf(“%d”, &num); while(num!=0){ //num nuovo numero da processare if(num%2!=0) tuttipari=0; scanf(“%d”, &num); } if(tuttipari==1) printf(“Tutti i numeri inseriti sono pari\n”); else printf(“Esiste un numero dispari nella sequenza\n”); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 47 P6: Cicli con filtro • Quando in una sequenza di elementi (es: valori in input) si vogliono elaborare solo quelli che soddisfano una certa proprietà • Idea di base: si usa un if all’interno del ciclo per testare la proprietà sull’elemento corrente, considerandolo solo se la proprietà è vera Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 48 Esempio Scrivere un programma che acquisisce una serie di numeri interi dall’utente fino a quando l’utente inserisce il numero 0 e stampa la somma dei numeri dispari (0 se non ce ne sono). Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 49 int num, somma; somma=0; printf(“Inserire la sequenza di numeri, 0 per terminare\n”); scanf(“%d”, &num); while(num!=0){ //num nuovo numero da processare if(num%2!=0) somma=somma+num; scanf(“%d”, &num); } printf(“Somma numeri dispari = %d\n”, somma); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 50 L’istruzione iterativa for: un’alternativa al while Esempio: Stampa dei numeri da 1 a 10 con while con for n=1; for(n=1; n<=10; n=n+1) while(n<=10){ printf(“%d\n”,n); printf(“%d\n”,n); n=n+1; } • E’ una sorta di while che incorpora: - l’assegnamento di una variabile contatore con un valore iniziale - la condizione di permanenza - l’aggiornamento della variabile contatore Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 51 The way back n=1; while(n<=10){ for(n=1; n<=10; n=n+1) printf(“%d\n”,n); printf(“%d\n”,n); n=n+1; } Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 52 ASTRAENDO Sintassi Semantica for(<ass>;<condiz>;<agg>) <istruz> <ass> … • <ass>: assegnamento di una variabile (contatore) con un “valore iniziale” (ad esempio i=1) • <condiz> è la condizione di permanenza, tipicamente confronta il contatore con un valore finale (ad esempio i<=5) <condiz> F V <istruz> • <agg> aggiornamento del contatore (es. i=i+1) <agg> … • <istruz> può essere anche un blocco istruzioni Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 53 ESEMPIO A Stampa numeri da 10 a 1 int n; for(n=10; n>=1; n=n-1) printf(“%d\n”,n); ESEMPIO B Acquisizione di n e stampa numeri pari da 2 a n int i, n; scanf(“%d”, &n); for(i=2; i<=n; i=i+2) printf(“%d\n”,i); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 54 Uso di for vs. while • In generale, il for offre una sintassi che risulta più compatta rispetto al while • Sicuramente, conviene usare il for ogni volta che viene usato una variabile “contatore” per scandire il numero di iterazioni del ciclo, tipicamente quando si conosce quante volte le istruzioni del corpo del ciclo devono essere ripetute • Esempi: - acquisire 100 numeri da tastiera - acquisire n numeri da tastiera - stampare gli elementi di un vettore (vedi lezioni successive) - ecc. ecc. • Non è comunque raro l’uso del for per qualsiasi tipologia di ciclo, al posto del while (dipende anche dal gusto personale) Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 55 ISTRUZIONI break e continue • Istruzione break: causa l’uscita immediata da un ciclo while, do…while, for • Istruzione continue: causa la terminazione anticipata della corrente iterazione di un ciclo while, do…while, for o nel caso di ciclo for, viene compiuto aggiornamento <agg> for(n=1;n<=10;n=n+1){ for(n=1;n<=10;n=n+1){ if(n==5) break; if(n==5) continue; printf(“%d\n”,n); printf(“%d\n”,n); } } Stampa 1, 2, 3, 4 Prof. M. Giacomin Stampa 1, 2, 3, 4, 6, 7, 8, 9, 10 Elementi di Informatica e Programmazione – Università di Brescia 56 Esempio Scrivere un programma che acquisisce 10 numeri interi dall’utente e, per ogni numero acquisito, il programma stampa a video il numero successivo. Inoltre il programma interrompe l’acquisizione (senza la stampa del successivo) se l’utente inserisce il numero 0. Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 57 L’IDEA: gestiamo il “caso tipico” normalmente, il “caso particolare” (uscita anticipata dall’acquisizione dei 10 numeri) con l’istruzione break int i, num; printf(“Inserisci 10 numeri interi, 0 per terminare anticipatamente\n”); for(i=1; i<=10; i=i+1){ // i: indice numero da acquisire scanf(“%d”, &num); if(num==0) break; printf(“Successivo = %d\n”, num+1); } Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 58 ERRORI TIPICI Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 59 Errori tipici nell’uso di while (1) • Inserire una condizione di terminazione, non di permanenza Es: per stampare i numeri da 1 a 5 int num=0; while(num==5){ //non è “finché” ma “mentre”…! num=num+1; printf(“Numero %d\n”, num); } • Dimenticare di modificare le variabili che determinano la condizione int num=0; while(num<5){ printf(“Numero %d\n”, num); } Prof. M. Giacomin Ciclo infinito: manca n=n+1 Elementi di Informatica e Programmazione – Università di Brescia 60 Errori tipici nell’uso di while (2) • Mettere il punto e virgola dopo while(cond): il corpo del ciclo diventa l’istruzione vuota! int num=0; while(num<5); NB: In {num=num+1; printf(“Numero %d\n”, num); } questo caso il ciclo è infinito • Dimenticare le parentesi graffe nel caso di blocco con più istruzioni int num=0; while(num<5) num=num+1; printf(“Numero %d\n”, num); Prof. M. Giacomin // Ripete solo questa! // e stampa (solo) 5 Elementi di Informatica e Programmazione – Università di Brescia 61 Errori tipici nell’uso di do-while (1) • Inserire una condizione di terminazione al posto di quella di permanenza • Mettere il punto e virgola dopo do do; scanf(“%d”, &n); while(n<0); Il compilatore segnala un errore (ci sono due istruzioni dopo do, non trova while) • Dimenticarsi il punto e virgola dopo while do Il compilatore segnala un errore scanf(“%d”, &n); (dopo scanf c’è un costrutto while!) while(n<0) printf(“Numero inserito=%d”,n); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 62 Errori tipici nell’uso di do-while (2) • Dimenticare le parentesi graffe nel caso di blocco con più istruzioni do Il compilatore segnala un errore scanf(“%d”, &n); (al posto di i=i+1; dovrebbe esserci while(…) ) i=i+1; while(n<0); printf(“Numero inserito=%d”,n); • Inserire un punto e virgola dopo un blocco di istruzioni do{ Il compilatore segnala un errore scanf(“%d”, &n); (dopo il blocco si aspetta while(…) ) i=i+1; }; while(n<0); printf(“Numero inserito=%d”,n); Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 63 Errori tipici nell’uso di for • Inserire una condizione di terminazione al posto di quella di permanenza • Mettere il punto e virgola dopo for(…;…;…): in questo caso il corpo del ciclo diventa l’istruzione vuota Es. for(i=1; i<=10;i=i+1); printf(“numero %d\n”, i); In questo caso il ciclo viene ripetuto 10 volte, ma senza eseguire alcuna istruzione! Al termine del ciclo viene eseguita l’istruzione di stampa con i=11 ! Prof. M. Giacomin Elementi di Informatica e Programmazione – Università di Brescia 64