ESERCIZI DI PROGRAMMAZIONE. - condizionali e cicli -
|
|
|
- Fabrizio Bondi
- 9 anni fa
- Visualizzazioni
Transcript
1 ESERCIZI DI PROGRAMMAZIONE - condizionali e cicli - Elementi di Informatica e Programmazione Università di Brescia 1
2 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
3 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
4 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 =140 >= 96 continua Poi devo restituire un resto di = 44 in monete da 5 e 1 conto fino ad arrivare a 40 poi conto fino ad arrivare a 44 Si è già individuato un metodo risolutivo! Elementi di Informatica e Programmazione Università di Brescia 4
5 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
6 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 >= N Elementi di Informatica e Programmazione Università di Brescia 6
7 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
8 //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
9 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
10 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 produce in uscita 2 3 Altro esempio: ricevendo in ingresso la sequenza produce in uscita 2 2 [10] Elementi di Informatica e Programmazione Università di Brescia 10
11 Primo passo: provare a risolvere a mano qualche istanza del problema 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
12 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
13 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
14 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
15 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
16 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
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 Elementi di Informatica e Programmazione Università di Brescia 17
18 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
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 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
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) Elementi di Informatica e Programmazione Università di Brescia 20
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 i++; Elementi di Informatica e Programmazione Università di Brescia 21
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) Aggiorna FIBU Aggiorna FIBP FIBU = FIBP + FIBU; FIBP =? FIBU? i++; Elementi di Informatica e Programmazione Università di Brescia 22
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 Elementi di Informatica e Programmazione Università di Brescia 23
24 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
25 #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
26 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
27 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
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) Elementi di Informatica e Programmazione Università di Brescia 28
29 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
30 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
PROGRAMMAZIONE: ESERCITAZIONE N. 6
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
RISOLVERE I TEMI D ESAME
RISOLVERE I TEMI D ESAME Elementi di Informatica e Programmazione Università di Brescia 1 Petter Northug Dario Cologna Federico Pellegrino SPIEGAZIONE LUCIDO PRECEDENTE Purtroppo o per fortuna, non esistono
ESERCIZI DI PROGRAMMAZIONE DA SVOLGERE INDIVIDUALMENTE - parte 1 -
ESERCIZI DI PROGRAMMAZIONE DA SVOLGERE INDIVIDUALMENTE - parte 1 - Elementi di Informatica e Programmazione Università di Brescia 1 1: ESERCIZI DI BASE - di livello di difficoltà inferiore rispetto all
Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin
Linguaggio C strutture di controllo: strutture iterative Università degli Studi di Brescia Docente: Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 Strutture iterative
ESERCIZI DI PROGRAMMAZIONE DA TEMI D ESAME - vettori -
ESERCIZI DI PROGRAMMAZIONE DA TEMI D ESAME - vettori - Elementi di Informatica e Programmazione Università di Brescia 1 Esercizio 1 Sviluppare un programma che acquisisce dall utente al massimo 50 numeri
PROGRAMMAZIONE: ESERCITAZIONE N. 3
PROGRAMMAZIONE: ESERCITAZIONE N. 3 Nota: esercizi di bassa/media difficoltà, per imparare a usare le istruzioni itera8ve (while, do- while, for) e muovere i primi passi con il ragionamento algoritmico
3 Costrutti while, for e switch
Questa dispensa propone esercizi sulla scrittura di algoritmi, in linguaggio C, utili alla comprensione dei costrutti while, for e switch. I costrutti per costruire cicli in C sono il while, la variante
Esercitazione 6. Array
Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione
I cicli. Iterazioni Calcolo della media Istruzioni break e continue
I cicli Iterazioni Calcolo della media Istruzioni break e continue Ciclo while p Vero A while() ; Falso Esegue una istruzione mentre una condizione è verificata Programmazione
# include<stdio.h> int main() { // Dichiarazioni int n; int i;
/* CALCOLIAMO I DIVISORI DI UN NUMERO. INSERIAMO UN CONTROLLO CHE IL NUMERO SIA EFFETTIVAMENTE POSITIVO UTILIZZIAMO IL DO...WHILE PER SEMPLIFICARE IL CODICE # include int main() // Dichiarazioni
Esercizi di programmazione in linguaggio C - Costrutto iterazione
Esercizi di programmazione in linguaggio C - Costrutto iterazione prof. Roberto uligni 1. [potenze1] Scrivere un programma che visualizzi il valore di tutte le prime n potenze di 2 con n richiesto all'utente
Esercitazione 3. Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf
Riassunto Esercitazione 3 Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf Sono state introdotte anche le seguenti relazioni: uguaglianza:
Esercitazione 3. Espressioni booleane I comandi if-else e while
Esercitazione 3 Espressioni booleane I comandi if-else e while Esercizio Si consideri la seguente istruzione: if (C1) if (C2) S1; else S2; A quali delle seguenti interpretazioni corrisponde? if (C1) if
Schemi ricorrenti nei cicli. Contatori Accumulatori Flag Esistenza e universalità
Cicli ed iterazioni Schemi ricorrenti nei cicli Contatori Accumulatori Flag Esistenza e universalità 2 Schemi ricorrenti nei cicli Contatori Spesso in un ciclo è utile sapere Quante iterazioni sono state
Istruzioni iterative (o cicliche)
Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Istruzioni iterative (o cicliche) Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria
Laboratorio di informatica Ingegneria meccanica
Laboratorio di informatica Ingegneria meccanica Esercitazione 6 7 novembre 2007 Correzione di un programma Un programma può contenere errori sintattici e/o errori logici. Gli errori sintattici vengono
Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.
Cicli e array Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7 Lez. 8 - Introduzione all ambiente
Lab 04 Istruzioni, cicli e array"
Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni e Ingegneria dell Automazione a.a. 2009/2010 Lab 04 Istruzioni, cicli e array" Lab04 1 Esercizio 1" Si scriva un
Alcuni esercizi. 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli
Alcuni esercizi 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli Stampa di voti Esempio 1 (switch) Realizzare un programma che legge da input un voto (carattere tra A ed E ) e ne
A lezione sono stati presentati i seguenti passi per risolvere un problema:
Calcolo delle radici di un polinomio Problema: Dati i coefficienti a,b,c di un polinomio di 2 grado della forma: ax^2 + bx + c = 0, calcolare le radici. A lezione sono stati presentati i seguenti passi
Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione
Fondamenti di Programmazione
Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni Alessandro Saetti Marco Sechi e Andrea Bonisoli (email: {alessandro.saetti,marco.sechi,[email protected])
Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.
Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione prof. Lorenzo Porcelli e mail: [email protected] sito: users.iol.it/genna18 Risoluzione di un problema Dato
Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.
Esercizio 1 Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media. #include Esercizio 1 - Soluzione int main() int num1, num2, num3, somma; float
acquisizione numero elementi del primo insieme e del secondo insieme, finché elprimoinsieme oppure elsecondoinsieme > EL_INS
Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 3 Esercitazione: 20 ottobre 2004 Esercizi su array e applicazione delle regole di conversione di tipo Esercizi presenti:
Esercitazione 4. Comandi iterativi for, while, do-while
Esercitazione 4 Comandi iterativi for, while, do-while Comando for for (istr1; cond; istr2) istr3; Le istruzioni vengono eseguite nel seguente ordine: 1) esegui istr1 2) se cond è vera vai al passo 3 altrimenti
Cicli annidati ed Array multidimensionali
Linguaggio C Cicli annidati ed Array multidimensionali Cicli Annidati In C abbiamo 3 tipi di cicli: while(exp) { do { while(exp); for(exp;exp;exp3) { Cicli annidati: un ciclo all interno del corpo di un
Università degli Studi di Verona. Esercizi. Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie
Università degli Studi di Verona Dipartimento di Biotecnologie Laurea in Biotecnologie Corso di Informatica 2014/2015 Esercizi Gennaio 2015 - Sergio Marin Vargas Scrivere un programma Una volta che avete
Elementi di Informatica e Programmazione
Università degli Studi di Brescia Elementi di Informatica e Programmazione ESERCITAZIONE Docente: A. Saetti Esercitatori: M. Sechi, A. Bonisoli Vers. 04/10/2017 Docente: Alessandro Saetti Elementi di informatica
Fondamenti di Informatica
Vettori e matrici #1 Le variabili definite come coppie sono dette variabili scalari Fondamenti di Informatica 5. Algoritmi e pseudocodifica Una coppia è una variabile
Lab 04 Programmazione Strutturata"
Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni Lab 04 Programmazione Strutturata" Lab04 1 Valutazione in cortocircuito (1)" In C, le espressioni booleane sono valutate
