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);
}
}