====== Esercitazione 2 ====== Dove si sviluppano semplici programmi C che utilizzano i costrutti di controllo. ===== Esercizio 0: Asterischi ===== * Leggere un numero N da standard input e stampare su standard output N caratteri asterisco (''*'') seguiti da newline (''\n''). ===== Esercizio 1: Max, min e somma ===== * Leggere tre reali da standard input e stampare su standard output il massimo il minimo e la somma dei tre. * Leggere da standard input una serie di reali terminata dal valore 0.0. Calcolare massimo, minimo e somma totale dei reali nella serie e stamparlo su standard output. ===== Esercizio 2: Verifica ordinamento ===== Leggere da standard input una serie di reali terminata dal valore 0.0. Stampare sullo standard output la parola ''Ordinata'' se la sequenza e' ordinata in modo crescente e ''Non ordinata'' se la sequenza non e' ordinata. Estendere il programma in modo da riconoscere se la sequenza e' ordinata in modo crescente o descrescente e stamparle ''Ordinata crescente'' o ''Ordinata decrescente'' sullo standard output. ===== Esercizio 3: La successione di Fibonacci ===== La successione di Fibonacci, in sintesi risolve il seguente problema: Immaginiamo di chiudere una coppia di conigli in un recinto. Sappiamo che ogni coppia di conigli: - inizia a generare dal secondo mese di età; - genera una nuova coppia ogni mese; - non muore mai. Quanti conigli ci saranno nel recinto dopo un anno? La successione di Fibonacci fornisce il numero di conigli al tempo ''n'' in funzione del numero di conigli nei due mesi precedenti ''n-1'' ed ''n-2'', Fib(0) = 1 Fib(1) = 1 Fib (n) = Fib(n-1) + Fib(n-2) se n > 1 Visivamente {{:fisica:informatica:201415:esercitazioni:image008.jpg?200}}. Scrivere un programma C che legge in ingresso un numero intero positivo X e calcola i numeri di Fibonacci da 1 ad X stampandoli sullo standard output. Elaborazione (solo per chi ha la macchina virtuale o lavora con linux): Provate ad utilizzare la funzione //sleep(1)// per attendere un secondo fra la generazione di un numero e del successivo. Per ottenere informazioni sulla funzione utilizzate man 3 sleep visto che la sezione 3 dei manuali in linea contiene informazioni su tutte le funzioni di libreria standard C. ===== Esercizio 4: Massimo Comun Divisore con divisioni successive ====== Scrivere un programma C che * legge da standard input //x// ed //y// * calcola MCD(x,y) utilizzando il metodo delle divisioni successive (pag 80 lucidi sui costrutti di controllo) * stampa il risultato sullo standard output ===== Esercizio 5: Massimo Comun Divisore con il metodo di Euclide con i resti ====== Scrivere un programma C che * legge da standard input //x// ed //y// * calcola MCD(x,y) utilizzando il metodo delle divisioni successive (pag 94 e seguenti lucidi sui costrutti di controllo) * stampa il risultato sullo standard output Utilizzare il comando ''time'' per valutare il tempo impiegato per calcolare ''MCD(m,n)'' con ''m=10000000,n=9457831'' con l'algoritmo di Euclide e con l'algoritmo implementato nell'Esercizio 4. Per evitare di misurare i tempi di attesa dell'input dallo schermo assegnare direttamente i valori alle variabili all'inizio del main e compilare. Supponendo il nome degli eseguibili sia ''euclide1'' ed ''euclide2'' basta invocare shell$ time ./euclide1 e shell$ time ./euclide2 per ottenere il tempo impiegato effettuando operazioni dentro il sistema operativo e fuori. Confrontare i tempi ottenuti con le due implementazioni ed analizzare i risultati. ===== Esercizio 6: Stampa della data ====== Si scriva un programma C che legge dallo standard output tre interi positivi che rappresentano ''giorno'', ''mese'' ed ''anno'' di una data e la stampa sullo standard output * sostituendo al mese la stringa corrispondente (es. ''gennaio'', ''febbraio'' etc) * specificando se l'anno e' bisestile (un anno e' //bisestile// se è identificato da un intero maggiore di 1584 che sia divisibile per 4 ma non per 100 oppure che sia divisibile per 400). Ad esempio: 12 12 2003 provoca la stampa di 12 Dicembre 2003 (Non bisestile)