Esercitazione 4 Comandi iterativi for, while, do-while Comando for for (istr1; cond; istr2) istr3; Le istruzioni vengono eseguite nel seguente ordine: istr1 1) 2) 3) 4) esegui istr1 se cond è vera vai al passo 3 altrimenti termina esegui istr3 esegui istr2 e ritorna al passo 2 Nota: se cond è falsa il ciclo non viene percorso cond T istr3 istr2 F Attenzione Ogni istr3 può essere un blocco, nel qual caso deve iniziare con una parentesi graffa aperta { e terminare con una parentesi graffa chiusa }. Per esempio, se istr3= istr3.1; istr3.2; istr3.3; si deve scrivere for (istr1; cond; istr2) { istr3.1; istr3.2; istr3.3; … } Attenzione Anche istr1 e istr2 possono contenere più di un’istruzione, ma in questo caso non servono le parentesi. Inoltre le istruzioni sono separate da virgole. Per esempio, possiamo scrivere for (i=1, j=5; i<10 && j<100; i++, j=i*j) istr1 cond istr2 Esercizio Scrivere un programma che calcola la somma di cinque numeri interi immessi dall’utente. SOLUZ 1) Usare 5 variabili distinte, una per ogni numero immesso, e poi sommare i loro valori. ….. INEFFICIENTE e POCO GENERALE…. SOLUZ 2) Scriviamo un ciclo for che ad ogni iterazione: - legge in input un numero, - lo memorizza nella variabile numero, - aggiorna il valore della variabile somma aggiungendo l’ultimo numero letto. Esercizio (continua) Variabili: somma contiene la somma dei numeri letti fino a quel punto numero contiene l’ultimo numero letto Invariante del ciclo: somma contiene la somma dei numeri letti fino a quel punto #include <stdio.h> int main ( ) { int i, somma, numero; somma = 0; for (i=1; i<=5; i++) { /* il corpo del ciclo for è un blocco */ printf (“Inserisci un intero: ”); scanf (“%d”, &numero); somma += numero; } /* somma = somma + numero */ printf (“Somma: %d\n”, somma); } Output Durante l’esecuzione del programma l’utente sarà chiamato a introdurre cinque numeri interi: Inserisci un Inserisci un Inserisci un Inserisci un Inserisci un Somma: 235 intero: intero: intero: intero: intero: 32 111 2 77 13 Esercizio Scrivere un programma che calcola la somma di una sequenza di numeri immessi dall’utente. Si assuma che la sequenza termini quando viene immesso il numero 0. #include <stdio.h> int main ( ) { int somma, numero; numero = 1; somma = 0; for ( ; numero!=0 ; ) { printf (“Inserisci un intero: ”); scanf (“%d”, &numero); somma += numero; } printf (“Somma: %d\n”, somma); } /* somma = somma + numero */ Output Durante l’esecuzione del programma l’utente sarà chiamato a introdurre una sequenza di numeri interi. L’esecuzione termina quando viene inserito il numero 0. Inserisci un Inserisci un Inserisci un Inserisci un Inserisci un Inserisci un Somma: 235 intero: intero: intero: intero: intero: intero: 32 111 2 77 13 0 Esercizio Modifica il programma precedente in modo tale da non dover inizializzare la variabile numero prima dell’esecuzione del ciclo for. Suggerimento: Usa il comando do-while in modo che la variabile numero venga inizializzata con il primo valore immesso dall’utente. Esercizio Dire cosa fa il seguente frammento di codice. #include <stdio.h> int main ( ) { int i; for ( i=0; i<=100 ; i+=10 ) printf (“%d\n”, i); } stampa 0 10 20 30 40 50 60 70 80 90 100 Esercizio Dire cosa fa il seguente frammento di codice. #include <stdio.h> int main ( ) { int i; for ( i=5; i>=5 ; i++ ) printf (“%d\n”, i); } stampa 5 6 7 8 9 10 11 12 13 14 … Esercizio Qual’è il valore di i al termine dell’esecuzione del ciclo for ? #include <stdio.h> int main ( ) { int i; for ( i=1; i<1000 ; i+=100 ) printf (“%d\n”, i); } Soluzione: i = 1001 Comando while while (cond) istruzione; Le istruzioni vengono eseguite nel seguente ordine: 1) se cond è vera vai al passo 2 altrimenti termina 2) esegui istruzione e ritorna al passo 1 Nota: se cond è falsa il ciclo non viene mai eseguito. Anche qui, istruzione può essere un blocco. cond F T istruzione Esercizio Scrivere un programma che calcola la somma di cinque numeri interi immessi dall’utente. #include <stdio.h> int main ( ) { int i, somma, numero; somma = 0; i = 1; /* inizializzazione delle variabili somma e i */ while ( i<=5 ) { /* il corpo del ciclo while è un blocco */ printf (“Inserisci un intero: ”); scanf (“%d”, &numero); somma += numero; i++; } printf (“Somma: %d\n”, somma); } Esercizio Si può inserire l’incremento della variabile di controllo i del ciclo while all’interno della condizione logica presente tra le parentesi rotonde. #include <stdio.h> int main ( ) { int i, somma, numero; somma = 0; i = 1; while ( i++<=5 ) { printf (“Inserisci un intero: ”); scanf (“%d”, &numero); somma += numero; } printf (“Somma: %d\n”, somma); } Esercizio Si può anche inizializzare i a 5 e decrementare il valore di i ad ogni iterazione. La condizione diviene falsa quando i assume valore zero. #include <stdio.h> int main ( ) { int i, somma, numero; somma = 0; i = 5; while ( i-- ) { printf (“Inserisci un intero: ”); scanf (“%d”, &numero); somma += numero; } printf (“Somma: %d\n”, somma); } Esercizio Scrivere un programma che calcola la somma e il massimo di una sequenza di numeri immessi dall’utente corrispondenti alle spese mensili di una famiglia. Si assume che ) ) ) i numeri immessi siano tutti positivi, la sequenza termini quando viene immesso il numero 0, che non si possano immettere più di 12 numeri (corrispondenti a 12 mesi). Soluzione #include <stdio.h> int main ( ) { int i, somma, spesa_mensile, max; i = 1; scanf (“%d”, &spesa_mensile); max= spesa_mensile; somma = spesa_mensile; while (spesa_mensile != 0 && i<12) { printf (“Inserisci spesa successiva: ”); scanf (“%d”, &spesa_mensile); if (spesa_mensile > max) //Invariante del ciclo: max = spesa_mensile; //max e somma contengono somma += spesa_mensile; //rispettivamente il massimo e i++; } //e la somma dei valori inseriti printf (“Spesa totale: %d\n”, somma); printf (“Spesa massima: %d\n”, max); } Comando do-while do istruzione; while (cond) Le istruzioni vengono eseguite nel seguente ordine: 1) esegui istruzione 2) se cond è vera vai al passo 1 altrimenti termina Nota: se cond è falsa il ciclo viene eseguito 1 volta. Anche qui, istruzione può essere un blocco. istruzione T cond F Attenzione Il comando do-while si usa quando si vuole che il corpo del ciclo venga eseguito almeno una volta. Esercizio Scrivere un programma che stampa su video n linee e m colonne costituite dal carattere +. #include <stdio.h> int main ( ) { int n, m, i, j; printf(“Inserisci il numero di linee e colonne: \n”); scanf (“%d %d”, &n, &m); for (i=1; i<=n; i++) { printf(“\n”); for (j=1; j<=m; j++) printf(“+”); } } /* ciclo esterno: costruisce una riga ripetilo n volte */ /* ciclo interno: stampa un ‘+’ ripetilo m volte */ Output Il programma produce il seguente output: Inserisci il numero di linee: 5 Inserisci il numero di colonne: 10 ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ Esercizio Scrivere un programma che legge un numero intero n e scrive i primi n numeri dispari. #include <stdio.h> int main ( ) { int i, n; printf(“Inserisci il numero n: \n”); scanf (“%d”, &n); for (i=0; i<n; i++) // Invariante del ciclo: printf (“%d ”, 2*i+1); // Alla fine dell’i-esima iterazione ho // stampato i primi i numeri dispari printf (“\n”); } Esercizio Scrivere un programma che stampa gli interi positivi minori di 100 e divisibili sia per 6 che per 7. #include <stdio.h> int main ( ) { int i; for (i=0; i<100; i++) if ( !(i%6) && !(i%7)) printf (“%d \n”, i); } Esercizio Scrivere un programma come prima usando il comando while. #include <stdio.h> int main ( ) { int i=0; while (i<100) { if ( !(i%6) && !(i%7)) printf (“%d \n”, i); i++; } } Esercizio Scrivere un programma che legga da tastiera una sequenza di 0 e 1, terminata da un 2, calcoli la lunghezza della piu` lunga sottosequenza di 0, e la stampi. ESEMPIO: 0 0 1 0 1 0 0 0 1 0 1 2 ---> 3 . #include <stdio.h> int main ( ) { int bit; /* l'elemento della sequenza appena letto */ int cont = 0; /* lunghezza della sequenza corrente di zeri; inizialmente non abbiamo ancora letto nulla */ int maxlung = 0; /* massima lunghezza incontrata finora; inizialmente e` 0 */ printf("Inserisci una sequenza di 0, 1 terminata da 2\n"); do { scanf("%d", &bit); if (bit == 0) { // e` stato letto un altro 0 cont++; // aggiorna la lunghezza della sequenza corrente if (cont > maxlung) // se necessario, aggiorna il massimo temporaneo maxlung = cont; } else // e` stato letto un 1 (o il 2 finale) cont = 0; // azzera la lunghezza della sequenza corrente } while (bit != 2); // quando si legge 2 il ciclo termina printf("La piu` lunga sottosequenza di soli zeri e` lunga %d\n", maxlung); } Esercizio Scrivere un programma che 4 4 legge una sequenza di caratteri (il carattere # termina la sequenza) per ciascun carattere letto stampa il relativo codice ASCII e, nel caso sia una lettera dell’alfabeto minuscola, viene operata la trasformazione in lettera maiuscola. #include <stdio.h> int main ( ) { char C, CM; printf (“Inserire un carattere - # per terminare il programma\n”); scanf (“%c”, &C); while (C != ‘#’) { printf (“Il codice ASCII del carattere %c e’ %d\n”, C, C); /* Se il carattere e’ una lettera minuscola */ if (C>=‘a’ && C<=‘z’) { /* La differenza ‘a’ - ‘A’ e’ lo scarto fra la rappresentazione ASCII delle lettere maiuscole e minuscole dell’alfabeto */ CM = C - (‘a’ - ‘A’); printf (“La lettera maiuscola per %c e’ %c e il suo codice ASCII e’ %d\n”, C, CM, CM); } printf (“Inserire un carattere - # per terminare il programma\n”); scanf (“%c”, &C); } }