PROGRAMMAZIONE:,...

22
PROGRAMMAZIONE: ESERCITAZIONE N. 6 Esercizi su stru+ure condizionali e itera1ve Conoscenze richieste: LC1+LC2+LC3+LC4+LC5+LC6

Transcript of PROGRAMMAZIONE:,...

Page 1: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

PROGRAMMAZIONE:  ESERCITAZIONE  N.  6  Esercizi  su  stru+ure  condizionali  e  itera1ve Conoscenze richieste: LC1+LC2+LC3+LC4+LC5+LC6  

Page 2: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 2 Prof. M. Giacomin

Acquisire un numero positivo N e calcolarne la radice quadrata intera (ovvero il massimo intero x tale che x2 ≤ N).

NB: in caso di difficoltà rivedere i lucidi di teoria dove si descrive un algoritmo mediante diagrammi di flusso.

Esercizio 1

Scrivere un programma che riceva in ingresso un numero positivo N e determini il massimo intero K tale che la somma dei primi K interi sia minore o uguale a N. Ad esempio, se N=20 allora K risulta 5, infatti 1 + 2 + 3 + 4 + 5 = 15 mentre 1 + 2 + 3 + 4 + 5 + 6 = 21

Esercizio 2

Page 3: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 3 Prof. M. Giacomin

Acquisire una serie di numeri da tastiera finché viene inserito lo zero e stampare la somma degli ultimi tre numeri inseriti (0 escluso).

Esercizio 3

NB: in caso di difficoltà rivedere nei lucidi l’esempio sulla serie di Fibonacci.

Scrivere un programma C che, ricevendo in ingresso una sequenza di lunghezza arbitraria di numeri interi terminata da uno zero, produca in uscita la sequenza di tre elementi contigui la cui somma è massima (se sono presenti più sequenze con somma massima, è sufficiente stampare la prima). Per semplicità, si assuma che la sequenza inserita comprenda almeno tre numeri interi oltre lo zero. Ad esempio, se l'utente inserisce la sequenza 7, 2, 19, 4, 45, 3, 7, 9, 3, 0 il programma termina e stampa 19, 4, 45.

Esercizio 4

Page 4: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 4 Prof. M. Giacomin

Acquisire un intero N>0, ripetendo l’acquisizione se l’utente non inserisce un valore strettamente positivo. Stampare quindi il numero di cifre che costituiscono il numero. Ad esempio, se l’utente inserisce 123 il programma stampa 3, se l’utente inserisce 10500 il programma stampa 5.

Esercizio 5

Acquisire un intero N>0, ripetendo l’acquisizione se l’utente non inserisce un valore strettamente positivo. Stampare quindi la cifra di valore minimo e la cifra di valore massimo tra quelle che costituiscono il numero. Ad esempio, se l’utente inserisce 123 il programma stampa 1 e 3, se l’utente inserisce 10500 il programma stampa 0 e 5.

Esercizio 6

Page 5: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 5 Prof. M. Giacomin

NOTA: gli esercizi seguenti richiedono la conoscenza degli operatori logici &&, || ecc.

Page 6: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 6 Prof. M. Giacomin

Esercizio 7: dal tema d’esame ING-INF del 28 gennaio 2009

Si sviluppi un programma in linguaggio C che, come nel caso di una macchina distributrice di caffè, riceve in ingresso un numero intero positivo N (corrispondente ad un importo da pagare in centesimi) e, successivamente, una sequenza di numeri interi corrispondenti alle monete inserite, che possono essere da 1, 5, 10, 20 e 50 centesimi. Il programma deve ripetere l’acquisizione di ciascun numero se non corrisponde ad una moneta tra quelle indicate. Appena l’importo richiesto N viene raggiunto o superato, il programma interrompe l’acquisizione della sequenza e restituisce una serie di numeri interi corrispondenti al resto in monete da 1 e 5 centesimi.

Ad esempio, se il programma riceve N=101 e la sequenza 50, 20, 20, 20, produce in uscita 5, 1, 1, 1, 1

Page 7: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 7 Prof. M. Giacomin

Esercizio 8

Calcolare il massimo comun divisore e il minimo comune multiplo di due numeri interi forniti dall’utente.

NB: in caso di difficoltà rivedere nei lucidi l’esempio sulla verifica di numero primo.

Esercizio 9

Scrivere un programma che acquisisca da tastiera un numero intero assicurandosi che sia positivo e, successivamente, stampi a video i 5 anni bisestili strettamente superiori al numero acquisito.

NB: la regola per riconoscere un anno bisestile è stata spiegata in aula (ovviamente si supponga di averla a disposizione!).

Page 8: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 8 Prof. M. Giacomin

Esercizio 10

Tema d’esame 17 febbraio 2011, esercizio 2 (scaricabile dal sito)

Page 9: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 9 Prof. M. Giacomin

SOLUZIONI DISPONIBILI

Gli studenti sono fortemente incoraggiati a sperimentare le proprie soluzioni al calcolatore. Nel correggere gli errori

che inevitabilmente saranno commessi, si suggerisce di non procedere per tentativi bensì di identificare precisamente

la causa del comportamento inatteso del programma sviluppato.

Page 10: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 10 Prof. M. Giacomin

Scrivere un programma che riceva in ingresso un numero positivo N e determini il massimo intero K tale che la somma dei primi K interi sia minore o uguale a N. Ad esempio, se N=20 allora K risulta 5, infatti 1 + 2 + 3 + 4 + 5 = 15 mentre 1 + 2 + 3 + 4 + 5 + 6 = 21

SOLUZIONE ESERCIZIO 2

Primo passo (se si è in difficoltà): provare a risolvere a mano qualche istanza del problema

P. es. N=6

1 + 2 + 3 = 6 ≤ 6

1 + 2 + 3 + 4 = 10 > 6

⇒ Risultato: 3

Page 11: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 11 Prof. M. Giacomin

Secondo passo: individuare un metodo risolutivo

FERMATI

QUANDO

SOMMA = SOMMA + i

1 + 2 + 3 + 4 + 5 + . . . + (i – 1) + i > N

RISULTATO

Dato N - una variabile i scandisce i numeri 1, 2, 3, … (userò un ciclo) - una variabile somma tiene conto della somma parziale

Page 12: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 12 Prof. M. Giacomin

Terzo passo: sviluppare l’algoritmo: è importante dare un significato preciso alle variabili!

int i, somma, N, K;

printf(“Inserire il numero positivo N\n”); scanf(“%d”, &N);

i=1; // ultimo indice già sommato somma=1; // somma corrente (avendo già sommato i) while(somma<=N){ // esci quando somma supera strettamente N i=i+1; somma=somma+i; }

K = i-1;

Page 13: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 13 Prof. M. Giacomin

SOLUZIONE ESERCIZIO 7

Si sviluppi un programma in linguaggio C che, come nel caso di una macchina distributrice di caffè, riceve in ingresso un numero intero positivo N (corrispondente ad un importo da pagare in centesimi) e, successivamente, una sequenza di numeri interi corrispondenti alle monete inserite, che possono essere da 1, 5, 10, 20 e 50 centesimi. Il programma deve ripetere l’acquisizione di ciascun numero se non corrisponde ad una moneta tra quelle indicate. Appena l’importo richiesto N viene raggiunto o superato, il programma interrompe l’acquisizione della sequenza e restituisce una serie di numeri interi corrispondenti al resto in monete da 1 e 5 centesimi.

Ad esempio, se il programma riceve N=101 e la sequenza 50, 20, 20, 20, produce in uscita 5, 1, 1, 1, 1

Page 14: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 14 Prof. M. Giacomin

NOTA: a scopo didattico si risolverà il problema senza utilizzare le operazioni di divisione intera e di resto, che semplificano il problema (gli studenti invece erano autorizzati ad usarle)

Page 15: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 15 Prof. M. Giacomin

Primo passo (se si è in difficoltà): provare a risolvere a mano qualche istanza del problema

ES: N=96 e inserisco 50, 20, 20, 50

continua continua

continua

SI FERMA: la somma 50+20+20+50=140 >= 96

Poi devo restituire un resto di 140-96 = 44 in monete da 5 e 1

“conto” 5-5-5-5… fino ad arrivare a 40 poi “conto” 1-1-1-1 fino ad arrivare a 44

Si è già individuato un metodo risolutivo!

Page 16: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 16 Prof. M. Giacomin

Secondo passo: una prima scomposizione (tipicamente a mente)

Acquisisci N e una successione di monete dall’utente, calcolando l’importo pagato

A questo punto resto= pagato-N

Ciclo per calcolare le monete da 5 (sommo 5 fino a “resto + o –” )

Ciclo per calcolare le monete da 1 (sul resto mancante)

Page 17: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 17 Prof. M. Giacomin

Terzo passo: individuare un metodo risolutivo per il primo punto

FERMATI

QUANDO

pagato = pagato + moneta

5 + 1 + 5 + 10 + 20 + . . . + 50 >= N

Dato N importo da pagare:

- devo fare un ciclo che continua ad acquisire una moneta - scopo del ciclo: calcolare la somma pagata, immagazzinata in una variabile che chiamo pagato - la variabile pagato tiene conto della somma parziale

Page 18: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 18 Prof. M. Giacomin

Ultimo passo: sviluppare l’algoritmo: è importante dare un significato preciso alle variabili!

int N, pagato, moneta, resto;

printf(“Inserisci l’importo\n”); scanf(“%d”, &N);

printf(“Inserisci sequenza monete\n”);

pagato=0; // somma corrente (già sommata ultima moneta) while(pagato<N) { // esci quando somma è maggiore o uguale a N <Acquisisci moneta controllandola>; pagato=pagato+moneta; }

resto=pagato-N; //somma da restituire!

while(resto>=5){ //esci quando somma da restituire <5 printf(“5 ”); resto=resto-5; }

Page 19: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 19 Prof. M. Giacomin

//resto contiene ancora la somma da restituire

while(resto>0){ //continua se c’è ancora qualcosa da restituire printf(“1 ”); resto=resto-1; }

A questo punto bisogna solo esplodere la pseudoistruzione

<Acquisisci moneta controllandola>;

Ecco come: do

scanf(“%d”, &moneta);

while(moneta!=1 && moneta!=5 && moneta!=10 && moneta!=20 && moneta!=50);

Page 20: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 20 Prof. M. Giacomin

Programma completo #include <stdio.h>

#include <stdlib.h>

int main()

{

int N, pagato, moneta, resto;

printf("Inserisci l'importo\n");

scanf("%d", &N);

printf("Inserisci sequenza monete\n");

pagato=0; // somma corrente (già sommata ultima moneta)

while(pagato<N){ // esci quando somma è maggiore o uguale a N

do

scanf("%d", &moneta);

while(moneta!=1 && moneta!=5 && moneta!=10 && moneta!=20 && moneta!=50);

pagato=pagato+moneta;

}

resto=pagato-N; //somma da restituire!

while(resto>=5){ //esci quando somma da restituire <5

printf("5 ");

resto=resto-5;

}

while(resto>0){ //continua se c’è ancora qualcosa da restituire

printf("1 ");

resto=resto-1;

}

printf("\n");

system("PAUSE");

return 0;

}

Page 21: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 21 Prof. M. Giacomin

Scrivere un programma che acquisisca da tastiera un numero intero assicurandosi che sia positivo e, successivamente, stampi a video i 5 anni bisestili strettamente superiori al numero acquisito.

Sul problema c’è poco da capire: la difficoltà sta nell’algoritmo…

acquisisci N;

numbisestili=0; // numero di anni trovati (e stampati)

ultbisestile=N; // ultimo anno bisestile trovato (quasi)

while(numbisestili<5){ // esci quando sono già stati trovati 5 anni

calcola e stampa il primo anno bisestile superiore a ultbisestile; aggiorna ultbisestile con l’anno trovato; numbisestili++; }

VEDIAMO LA PARTE CENTRALE DEL CODICE…

SOLUZIONE (PARZIALE) ESERCIZIO 9

Page 22: PROGRAMMAZIONE:, ESERCITAZIONE,N.,6,fimec.altervista.org/Informatica_&_Programmazione/Lucidi_Lezioni_ed... · non corrisponde ad una moneta tra quelle indicate. Appena l’importo

Elementi di Informatica e Programmazione – Università di Brescia 22 Prof. M. Giacomin

numbisestili=0; // numero di anni trovati e stampati

ultbisestile=n; // (serve trovare il successivo bisestile)

while(numbisestili<5){

ultbisestile++;

while( !( ((ultbisestile % 100 != 0) && (ultbisestile % 4 ==0)) || (ultbisestile % 400 ==0)) )

ultbisestile++;

numbisestili++;

printf("Anno bisestile successivo numero %d = %d\n", numbisestili, ultbisestile);

}

Trova bisestile successivo