Università Ca’ Foscari Dipartimento di informatica Programmazione part-time Esame Ocaml Nome: Matricola: Samuel Rota Bulò , a.a. 2010/2011 Programmazione part-time a.a. 2010/2011 Esame Ocaml Nome: Samuel Rota Bulò Teoria. (10 punti) Rispondere ai seguenti quesiti utilizzando eventualmente gli appositi spazi bianchi. Tempo totale a disposizione: 20 min. (2pts ) 1. Dato il seguente codice: let f x y = x y ; 2 pts quale delle sequenti affermazioni è corretta? (Barrare la risposta esatta) (a) f 2 4 = 8 (b) f è di tipo (int -> int) -> int -> int (c) x è una funzione (d) l’espressione è errata (e) f 1 è una funzione (3pts ) 2. Scrivere una funzione teste che date due liste ritorni una coppia i cui elementi sono le rispettive teste. Se una delle due liste è vuota lanciare un’eccezione con failwith "Le liste non devono essere vuote". Per esempio: 3 pts • teste [1;2;3] [’a’;’b’] deve restituire (1,’a’) • teste [] [1;2;3] deve lanciare l’eccezione. • teste [1;2;3] [] deve lanciare l’eccezione. • teste [] [] deve lanciare l’eccezione. (2pts ) 3. Qual è il tipo della funzione test definita nell’esercizio precedente? val test : (3pts ) 2 pts 4. Date le seguenti variabili: let rec f = function 0 -> 1 | n -> n * f ( n +1) ;; let rec h x = x <=0 || h (x -1) ;; let f x y = x .+ y ;; dire quale di queste affermazioni è vera (V) o falsa (F). (0.5 punti per risposta corretta). La funzione f n calcola il fattoriale di n (a) (b) f (-2) restituisce 2 (c) h è una funzione che restituisce true per qualsiasi input intero (d) h ha tipo bool (e) f 1 2 restituisce 3 (f) f 1. è una funzione 3 pts Programmazione part-time/Esame Ocaml – Pag. 3 / 3 – Nome: Pratica. (27 punti) Nello svolgimento del seguente esame, il candidato crei una cartella con il proprio cognome, numero di matricola e la lettera L (e.g. Rossi887766L) inserendo all’interno i file corrispondenti agli esercizi che si intendono consegnare (e.g. Esercizio1.ml). Le prime righe del file devono essere dei commenti che specifichino il vostro nome e cognome e l’esercizio a cui si riferiscono. Tempo a disposizione: 1h e 45 min. (5pts ) (18pts ) 1. Scrivere una funzione rev per invertire una lista. Esempi di esecuzione: rev [1;2;3] = [3;2;1] e rev []=[]. 5 pts 2. Si vuole scrivere un programma Ocaml per fare semplici operazioni artimetiche con numeri codificati con liste di cifre 0-9. Come esempio, il numero intero 1200 è codificato con la lista di interi [1;2;0;0]. La lista vuota [] codifica lo zero (nota che anche [0] codifica lo zero). Nota bene: potete usare la funzione List.rev. (a) (4 pts) Scrivere una funzione num2list per codificare un numero intero in una lista di cifre. Per esempio: num2list 1200 ritornerà [1;2;0;0]. (b) (4 pts) Scrivere una funzione list2num per decodificare un numero intero espresso come lista di cifre. Per esempio: list2num [1;2;0;0] ritornerà 1200. (c) (4 pts) Scrivere una funzione verifica_pari che dato un numero intero codificato come lista, verifica se il numero codificato è pari o dispari. Per esempio: verifica_pari [1;2;3] restituirà false, mentre verifica_pari [6;9;0] restituirà true. (d) (6 pts) Scrivere una funzione sum per calcolare la somma di due numeri codificati con liste di cifre. La funzione ritornerà la somma sottoforma di lista di cifre. Per esempio: sum [1;2;3] [4;0;9] ritornerà [5;3;2]. (Note bene: non è possibile convertire le liste di cifre nei numeri che queste rappresentano per poi farne la somma, ma biogna simulare un’operazione di somma cifra per cifra con eventuali riporti). 18 pts