Testo d`esame - Dipartimento di Scienze Ambientali, Informatica e

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