ESERCIZI DI PROGRAMMAZIONE. - condizionali e cicli -

Documenti analoghi
PROGRAMMAZIONE: ESERCITAZIONE N. 6

RISOLVERE I TEMI D ESAME

ESERCIZI DI PROGRAMMAZIONE DA SVOLGERE INDIVIDUALMENTE - parte 1 -

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

ESERCIZI DI PROGRAMMAZIONE DA TEMI D ESAME - vettori -

PROGRAMMAZIONE: ESERCITAZIONE N. 9

PROGRAMMAZIONE: ESERCITAZIONE N. 3

Linguaggio C. Condizioni composte (operatori logici)

Strutture di Controllo Iterative: Istruzioni While e Do

Strutture di Controllo Iterative: Istruzione FOR

Strutture di Controllo Iterative: Istruzione FOR

Informatica B, AA 2018/2019

Manualistica 3 Le strutture di controllo

3 Costrutti while, for e switch

Progettazione di Algoritmi

3 Costrutti while, for e switch

Esercitazione 6. Array

Manualistica 3 Le strutture di controllo

Laboratorio di informatica Ingegneria meccanica

Esempi comparati while, do...while

I cicli. Iterazioni Calcolo della media Istruzioni break e continue

Linguaggio C. tipi di dati definiti dall utente. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Strutture di Controllo Condizionali e Operatori Logici e Relazionali

# include<stdio.h> int main() { // Dichiarazioni int n; int i;

del Linguaggio C Istruzioni di iterazione

For e do. Parte 4. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Corso di Informatica 1 Esercitazione n. 2

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Strutture di Controllo Condizionali e Operatori Logici e Relazionali

For e do. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Università degli Studi di Brescia. Vettori di variabili. ! Sono variabili aggregate in grado di memorizzare una collezione (organizzata) di oggetti

Esercizi di programmazione in linguaggio C - Costrutto iterazione

INFORMATICA Prof. Cassano

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Esercitazione 3. Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf

Esercitazione 3. Espressioni booleane I comandi if-else e while

Esercizio 1: media di numeri reali (uso funzioni e struct)

Laboratorio. Due. 1) Switch 2) Costrutti Iterazione (For, While, do while)

Sistemi di sviluppo integrati

Esercizio 1 - Soluzione (array)

Schemi ricorrenti nei cicli. Contatori Accumulatori Flag Esistenza e universalità

Istruzioni iterative (o cicliche)

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Laboratorio di informatica Ingegneria meccanica

Esercizio 1: calcolo del massimo di una sequenza (versione 1)

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Corso di Informatica B - Sezione D. Esercitazioni Linguaggio C

Laboratorio di Informatica

Lab 04 Istruzioni, cicli e array"

ISTRUZIONI DI ITERAZIONE

Alcuni esercizi. 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli

A lezione sono stati presentati i seguenti passi per risolvere un problema:

Informatica 2 modulo C Massimo Callisto De Donato

Ricorsione. DD cap. 5 pp KP cap. 5 pp

20/10/2014 M. Nappi/FIL 1

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Fondamenti di Programmazione

Schemi ricorrenti nei cicli. Cicli ed iterazioni. Contatori. Schemi ricorrenti nei cicli. Contatori. Esempio

Fondamenti di Informatica T1. Lab 03 Istruzioni. Lab03 1

Programmi su più moduli - Esempio

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

Corso di Informatica B - Sezione D. Esercitazioni Linguaggio C

Esercizio 1" input tre numeri interi e stampi a video la loro somma e la media. n Realizzare un programma che legga da. Lab03 2

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

Esercizio 1 Soluzione

acquisizione numero elementi del primo insieme e del secondo insieme, finché elprimoinsieme oppure elsecondoinsieme > EL_INS

ESERCIZI CICLI. Σ Σ j

Programmazione C Massimo Callisto De Donato

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

Cicli annidati ed Array multidimensionali

Università degli Studi di Verona. Esercizi. Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie

RICORSIONE. Informatica B - A.A. 2013/2014

Elementi di Informatica e Programmazione

TUTORAGGIO INFORMATICA Settimana 1

7. Strutture di controllo

Linguaggio C: Variabili e assegnamento e semplici comandi di I/O

Programmazione di base

SECONDA ESPERIENZA DI LABORATORIO. Programmazione con controllo di flusso IF e WHILE

Istruzioni di Ciclo. Unità 4. Domenico Daniele Bloisi

IEIM Esercitazione 1 Primi passi con la programmazione" Alessandro A. Nacci -

Laboratorio di Informatica I

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Strutture di controllo iterative

Informatica A (per gestionali) A.A. 2004/2005. Esercizi C e diagrammi a blocchi. Preparazione prima prova intermedia

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Esercitazione 7. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Esercitazione 6. Corso di Fondamenti di Informatica

Fondamenti di Informatica Laurea in Ingegneria Civile e Ingegneria per l ambiente e il territorio

prof. P. Mancarella Dip.to Informatica INFORMATICA 1 a.a. 07/08 pag. 170

Fondamenti di Informatica

Lab 04 Programmazione Strutturata"

Strutture di controllo in C. Strutture di controllo in C -- Flow Chart --

Transcript:

ESERCIZI DI PROGRAMMAZIONE - condizionali e cicli - Elementi di Informatica e Programmazione Università di Brescia 1

Esercizio 1: 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 2

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 3

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 4

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 5

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 6

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 7

//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); Elementi di Informatica e Programmazione Università di Brescia 8

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 9

Esercizio 2: dal tema d esame ING-INF del 13 gennaio 2009 Si sviluppi un programma in linguaggio C che, ricevendo in ingresso una sequenza di lunghezza arbitraria di almeno due numeri interi diversi da zero, terminata da uno zero, produca in uscita i due valori minimi letti in ingresso (escluso l ultimo zero). Ad esempio, ricevendo in ingresso la sequenza 7 2 19 4 45 3 7 9 3 0 produce in uscita 2 3 Altro esempio: ricevendo in ingresso la sequenza 7 2 19 4 2 3 7 9 3 0 produce in uscita 2 2 [10] Elementi di Informatica e Programmazione Università di Brescia 10

Primo passo: provare a risolvere a mano qualche istanza del problema 7 2 19 4 45 3 7 9 3 0 - All inizio (7, 2) sono i valori minimi - Considero 19: i minimi rimangono (7, 2) - Considero 4: i minimi diventano (4, 2) - Considero 45: i minimi rimangono (4, 2) - Considero 3: i minimi diventano (3, 2) Già si intravede un metodo risolutivo (passo2): usare un ciclo per acquisire i numeri (termina con 0) mantenere due variabili min1 e min2 con i minimi ad ogni iterazione, acquisire un nuovo numero e aggiornare di conseguenza min1 e min2 Elementi di Informatica e Programmazione Università di Brescia 11

Nota: come faccio ad aggiornare min1 e min2? min1 min2 num E più facile se mantengo min1 e min2 ordinati (min1<=min2) Elementi di Informatica e Programmazione Università di Brescia 12

Terzo passo: sviluppare l algoritmo Acquisisci i primi due numeri e inizializza min1, min2 con i due numeri stessi in modo che valga min1<=min2 scanf( %d, &n); while(n!=0){ //min1 e min2: minimi correnti ordinati aggiorna min1 e min2 tenendo conto di n; scanf( %d%, &n); Elementi di Informatica e Programmazione Università di Brescia 13

Terzo passo: sviluppare l algoritmo int num, min1, min2; printf( Inserisci la sequenza di numeri\n ); scanf( %d, &num); min1=num; scanf( %d, &num); if(min1<=num) min2=num; else{ min2=min1; min1=num; Elementi di Informatica e Programmazione Università di Brescia 14

scanf( %d, &num); while(num!=0){ if(num<min1){ min2=min1; min1=num; else if(num<min2) min2=num; scanf( %d, &num); printf( I numeri minimi sono %d e %d\n, min1, min2); Elementi di Informatica e Programmazione Università di Brescia 15

Esercizio 3 Scrivere un programma che, ricevuto in ingresso un intero N 0, calcoli l N-simo elemento della sequenza F dei numeri di Fibonacci, definita così: F(0) = 0 F(1) = 1 F(K) = F(K-1)+F(K-2) per K 2 In altre parole, la sequenza dei numeri di Fibonacci è la seguente: 0, 1, 1, 2, 3, 5, 8, 13, in cui ciascun numero, dal terzo in poi, è la somma dei due che lo precedono. Elementi di Informatica e Programmazione Università di Brescia 16

Primo passo: provare a risolvere a mano qualche istanza del problema N=2: 0, 1, 1 il programma restituisce 1 N=3: 0, 1, 1, 2 il programma restituisce 2 Elementi di Informatica e Programmazione Università di Brescia 17

Primo passo: provare a risolvere a mano qualche istanza del problema N=2: 0, 1, 1 il programma restituisce 1 N=3: 0, 1, 1, 2 il programma restituisce 2 Secondo passo: individuare un metodo risolutivo N=0, N=1: casi base (il programma deve restituire 0 o 1) N 2: uso un contatore I che arriva fino a N: ad ogni passo devo calcolare il nuovo numero di Fibonacci F(I): devo sommare gli ultimi due numeri di Fibonacci ottenuti quindi, memorizzo in due variabili FIBP e FIBU gli ultimi due numeri di Fibonacci ottenuti e, ad ogni passo: - FIBP deve diventare FIBU - FIBU deve diventare FIBP+FIBU Elementi di Informatica e Programmazione Università di Brescia 18

Terzo passo: sviluppare l algoritmo NB: per cominciare trascuriamo i casi base (quelli sono semplici e ci pensiamo dopo): risolviamo il cuore del problema Errore comune: cominciare a scrivere il codice senza avere in testa l algoritmo o, cosa ancora peggiore, un idea del metodo risolutivo TIPICAMENTE, QUESTO PORTA A SCRIVERE UN PO DI IF PER GESTIRE I PRIMI CASI SPECIFICI (se N==0, se N==1, se N==2, ) TIPICAMENTE, QUESTO INDUCE A RITENERE CHE SI E COMINCIATO A SCRIVERE IL CODICE SENZA PRIMA PENSARE ALL ALGORITMO Elementi di Informatica e Programmazione Università di Brescia 19

Terzo passo: sviluppare l algoritmo NB: per cominciare trascuriamo i casi base (quelli sono semplici e ci pensiamo dopo): risolviamo il cuore del problema FIBP = 0; FIBU = 1; // comincio con i primi due numeri della serie i = 1; // i riferito all ultimo numero di Fibonacci trovato FIBU while(i<n){ // esco quando i=n, cioè quando FIBU contiene F(i)=F(N) Elementi di Informatica e Programmazione Università di Brescia 20

Terzo passo: sviluppare l algoritmo NB: per cominciare trascuriamo i casi base (quelli sono semplici e ci pensiamo dopo): risolviamo il cuore del problema FIBP = 0; FIBU = 1; // comincio con i primi due numeri della serie i = 1; // i riferito all ultimo numero di Fibonacci trovato FIBU while(i<n){ // esco quando i=n, cioè quando FIBU contiene F(i)=F(N) Aggiorna FIBU Aggiorna FIBP i++; Elementi di Informatica e Programmazione Università di Brescia 21

Terzo passo: sviluppare l algoritmo NB: per cominciare trascuriamo i casi base (quelli sono semplici e ci pensiamo dopo): risolviamo il cuore del problema FIBP = 0; FIBU = 1; // comincio con i primi due numeri della serie i = 1; // i riferito all ultimo numero di Fibonacci trovato FIBU while(i<n){ // esco quando i=n, cioè quando FIBU contiene F(i)=F(N) Aggiorna FIBU Aggiorna FIBP FIBU = FIBP + FIBU; FIBP =? FIBU? i++; Elementi di Informatica e Programmazione Università di Brescia 22

Terzo passo: sviluppare l algoritmo NB: per cominciare trascuriamo i casi base (quelli sono semplici e ci pensiamo dopo): risolviamo il cuore del problema FIBP = 0; FIBU = 1; // comincio con i primi due numeri della serie i = 1; // i riferito all ultimo numero di Fibonacci trovato FIBU while(i<n){ // esco quando i=n, cioè quando FIBU contiene F(i)=F(N) NEWFIB= FIBP+FIBU; // il nuovo numero di Fibonacci FIBU FIBP=FIBU; // aggiorno FIBP FIBU=NEWFIB; // aggiorno FIBU i++; // aggiorno i, che si riferisce di nuovo a FIBU Elementi di Informatica e Programmazione Università di Brescia 23

Terzo passo: sviluppare l algoritmo NB: per cominciare trascuriamo i casi base (quelli sono semplici e ci pensiamo dopo): risolviamo il cuore del problema FIBP = 0; FIBU = 1; // comincio con i primi due numeri della serie i = 1; // i riferito all ultimo numero di Fibonacci trovato FIBU while(i<n){ // esco quando i=n, cioè quando FIBU contiene F(i)=F(N) NEWFIB= FIBP+FIBU; // il nuovo numero di Fibonacci FIBU FIBP=FIBU; // aggiorno FIBP FIBU=NEWFIB; // aggiorno FIBU i++; // aggiorno i, che si riferisce di nuovo a FIBU Ora posso considerare i casi base: - il caso N=0 non è gestito (il programma porta FIBU a 1) - il caso N=1 è gestito (il ciclo while non viene eseguito!) Elementi di Informatica e Programmazione Università di Brescia 24

#include <stdio.h> #include <stdlib.h> main(){ int n, i, fibu, fibp, newfib; printf("inserire il numero N:\n"); do scanf("%d",&n); while(n<0); fibp=0; fibu=1; i=1; while(i<n){ newfib=fibp+fibu; fibp=fibu; fibu=newfib; i++; if(n==0) //gestione del caso base fibu=0; //si poteva gestire all'inizio con return 0 printf("numero di Fibonacci %d = %d\n",n,fibu); system("pause"); Elementi di Informatica e Programmazione Università di Brescia 25

NB: alternativa senza l uso della variabile temporanea newfib while(i<n){ fibu=fibp+fibu; fibp=fibu-fibp; i++; Elementi di Informatica e Programmazione Università di Brescia 26

Esercizio 4 Scrivere un programma che, ricevuto in ingresso un intero strettamente maggiore di 0, determini se tale numero è primo. Elementi di Informatica e Programmazione Università di Brescia 27

Esercizio 4 Scrivere un programma che, ricevuto in ingresso un intero strettamente maggiore di 0, determini se tale numero è primo. Primo passo: provare a risolvere a mano qualche istanza del problema Es. 8 non è primo (è divisibile per 2 e per 4) 7 è primo (è divisibile solo per 1 e per 7, non per 2, 3, 4, 6) Elementi di Informatica e Programmazione Università di Brescia 28

Esercizio 4 Scrivere un programma che, ricevuto in ingresso un intero strettamente maggiore di 0, determini se tale numero è primo. Primo passo: provare a risolvere a mano qualche istanza del problema Es. 8 non è primo (è divisibile per 2 e per 4) 7 è primo (è divisibile solo per 1 e per 7, non per 2, 3, 4, 6) Secondo passo: individuare un metodo risolutivo Dato N, verifico se è divisibile per 2, 3, n-1 se non è divisibile per nessuno: il numero è primo se esiste un divisore: il numero non è primo E facile rendersi conto che basta un ciclo con un indice i che va da 2 a n/2 (divisione intera) Elementi di Informatica e Programmazione Università di Brescia 29

Terzo passo: sviluppare un algoritmo #include <stdio.h> #include <stdlib.h> main(){ int n, i, trovato; printf( Inserisci un numero positivo\n ); scanf("%d",&n); trovato=0; //verifica se si è trovato un divisore (prima del ciclo: no!) for(i=2; i<=n/2; i++) //prova con tutti i numeri da 2 a n/2 if(n%i == 0) trovato=1; if(trovato) printf( Il numero non è primo\n ); else printf( Il numero è primo\n ); system( pause ); Elementi di Informatica e Programmazione Università di Brescia 30