Esercitazione 4 Comandi iterativi for, while, do-while
Comando for for (istr1; cond; istr2) istr3; Le istruzioni vengono eseguite nel seguente ordine: 1) esegui istr1 2) se cond è vera vai al passo 3 altrimenti termina 3) esegui istr3 4) esegui istr2 e ritorna al passo 2 Nota: se cond è falsa il ciclo non viene percorso istr1 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
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.
(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 intero: 32 Inserisci un intero: 111 Inserisci un intero: 2 Inserisci un intero: 77 Inserisci un intero: 13 Somma: 235
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; } /* somma = somma + numero */ printf ( Somma: %d\n, somma); }
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 intero: 32 Inserisci un intero: 111 Inserisci un intero: 2 Inserisci un intero: 77 Inserisci un intero: 13 Inserisci un intero: 0 Somma: 235
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.
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
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
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. T cond F istruzione
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); }
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); }
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); }
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 T istruzione cond F Nota: se cond è falsa il ciclo viene eseguito 1 volta. Anche qui, istruzione può essere un blocco.
Attenzione Il comando do-while si usa quando si vuole che il corpo del ciclo venga eseguito almeno una volta.
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++) { /* ciclo esterno: costruisce una riga printf( \n ); ripetilo n volte */ } for (j=1; j<=m; j++) /* ciclo interno: stampa un + printf( + ); ripetilo m volte */ }
Output Il programma produce il seguente output: Inserisci il numero di linee: 5 Inserisci il numero di colonne: 10 ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++
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 ); }
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); }
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++; } }
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); }
Scrivere un programma che 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); } }