Esercitazione 4 - dsi.unive.itprog1/Esercizi_in_aula/Esercizi4.pdf · Esercizio (continua)...

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

Transcript of Esercitazione 4 - dsi.unive.itprog1/Esercizi_in_aula/Esercizi4.pdf · Esercizio (continua)...

Esercitazione 4

Comandi iterativifor, while, do-while

Comando for

for (istr1; cond; istr2)istr3;

Le istruzioni vengono eseguite nel seguente ordine:

1) esegui istr12) se cond è vera vai al passo 3 altrimenti termina3) esegui istr34) esegui istr2 e ritorna al passo 2

Nota: se cond è falsa il ciclo non viene percorsoistr2

istr1

istr3

condF

T

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 inquesto caso non servono le parentesi. Inoltre le istruzioni sonoseparate da virgole.

Per esempio, possiamo scrivere

for (i=1, j=5; i<10 && j<100; i++, j=i*j)

istr1 cond istr2

EsercizioScrivere 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 lettoInvariante 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à chiamatoa introdurre cinque numeri interi:

Inserisci un intero: 32Inserisci un intero: 111Inserisci un intero: 2Inserisci un intero: 77Inserisci un intero: 13Somma: 235

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; } /* 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 vieneinserito il numero 0.

Inserisci un intero: 32Inserisci un intero: 111Inserisci un intero: 2Inserisci un intero: 77Inserisci un intero: 13Inserisci un intero: 0Somma: 235

Esercizio

Modifica il programma precedente in modo tale da non doverinizializzare 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);}

stampa0102030405060708090100

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

stampa567891011121314…

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 termina2) esegui istruzione e ritorna al passo 1

Nota: se cond è falsa il ciclo non viene mai eseguito.Anche qui, istruzione può essere un blocco.

istruzione

condF

T

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 whileall’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 ogniiterazione. 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 unasequenza di numeri immessi dall’utente corrispondenti alle spesemensili 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 ei++; } //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 istruzione2) 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

condFT

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 colonnecostituite 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: 5Inserisci 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 edivisibili 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` lungasottosequenza 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 temporaneomaxlung = 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

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

}