Esercitazione 4 - dsi.unive.itprog1/Esercizi_in_aula/Esercizi4.pdf · Esercizio (continua)...
Transcript of Esercitazione 4 - dsi.unive.itprog1/Esercizi_in_aula/Esercizi4.pdf · Esercizio (continua)...
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); }
}