PROGRAMMAZIONE: ESERCITAZIONE N. 6 Esercizi su stru+ure condizionali e itera1ve Conoscenze richieste: LC1+LC2+LC3+LC4+LC5+LC6
Esercizio 1 Acquisire un numero positivo N e calcolarne la radice quadrata intera (ovvero il massimo intero x tale che x 2 N). NB: in caso di difficoltà rivedere i lucidi di teoria dove si descrive Esercizio 2 un algoritmo mediante diagrammi di flusso. 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 Elementi di Informatica e Programmazione Università di Brescia 2
Esercizio 3 Acquisire una serie di numeri da tastiera finché viene inserito lo zero e stampare la somma degli ultimi tre numeri inseriti (0 escluso). NB: in caso di difficoltà rivedere nei lucidi l esempio sulla serie di Fibonacci. Esercizio 4 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. Elementi di Informatica e Programmazione Università di Brescia 3
Esercizio 5 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 6 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. Elementi di Informatica e Programmazione Università di Brescia 4
NOTA: gli esercizi seguenti richiedono la conoscenza degli operatori logici &&, ecc. Elementi di Informatica e Programmazione Università di Brescia 5
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 Elementi di Informatica e Programmazione Università di Brescia 6
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!). Elementi di Informatica e Programmazione Università di Brescia 7
Esercizio 10 Tema d esame 17 febbraio 2011, esercizio 2 (scaricabile dal sito) Elementi di Informatica e Programmazione Università di Brescia 8
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. Elementi di Informatica e Programmazione Università di Brescia 9
SOLUZIONE ESERCIZIO 2 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 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 Elementi di Informatica e Programmazione Università di Brescia 10
Secondo passo: individuare un metodo risolutivo Dato N - una variabile i scandisce i numeri 1, 2, 3, (userò un ciclo) - una variabile somma tiene conto della somma parziale SOMMA = SOMMA + i FERMATI QUANDO 1 + 2 + 3 + 4 + 5 +... + (i 1) + i > N RISULTATO Elementi di Informatica e Programmazione Università di Brescia 11
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; Elementi di Informatica e Programmazione Università di Brescia 12
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 Elementi di Informatica e Programmazione Università di Brescia 13
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) Elementi di Informatica e Programmazione Università di Brescia 14
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 SI FERMA: la somma 50+20+20+50=140 >= 96 continua 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! Elementi di Informatica e Programmazione Università di Brescia 15
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) Elementi di Informatica e Programmazione Università di Brescia 16
Terzo passo: individuare un metodo risolutivo per il primo punto 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 pagato = pagato + moneta FERMATI QUANDO 5 + 1 + 5 + 10 + 20 +... + 50 >= N Elementi di Informatica e Programmazione Università di Brescia 17
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; } Elementi di Informatica e Programmazione Università di Brescia 18
//resto contiene ancora la somma da restituire while(resto>0){ printf( 1 ); resto=resto-1; } //continua se c è ancora qualcosa da restituire 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); Elementi di Informatica e Programmazione Università di Brescia 19
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; } 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; } resto=pagato-n; //somma da restituire! Elementi di Informatica e Programmazione Università di Brescia 20
SOLUZIONE (PARZIALE) 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. Sul problema c è poco da capire: la difficoltà sta nell algoritmo acquisisci N; numbisestili=0; ultbisestile=n; // numero di anni trovati (e stampati) // 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 Elementi di Informatica e Programmazione Università di Brescia 21
numbisestili=0; ultbisestile=n; // numero di anni trovati e stampati // (serve trovare il successivo bisestile) while(numbisestili<5){ Trova bisestile successivo } ultbisestile++; while(!( ((ultbisestile % 100!= 0) && (ultbisestile % 4 ==0)) (ultbisestile % 400 ==0)) ) ultbisestile++; numbisestili++; printf("anno bisestile successivo numero %d = %d\n", numbisestili, ultbisestile); Elementi di Informatica e Programmazione Università di Brescia 22