Description
Pr´actica 2
Nota Importante:
Cuando se solicite la entrega de esta pra´ctica, cada alumno debera´ subir a su repositorio de pra´cticas (del cual se indicara´ su ubicaci´on ma´s adelante) un directorio p2 cuyo contenido debe ser u´nicamente los ficheros pi.ml, e.ml y fact.ml.
Sea muy cuidadoso a la hora de crear el directorio y los ficheros, y respete los nombres indicados. En particular, f´ıjese que todos estos nombres so´lo contienen letras en minu´sculas, nu´meros y puntos.
Adema´s, todos los ficheros deben compilar sin errores con las siguientes o´rdenes:
ocamlc -o pi pi.ml ocamlc -o e e.ml ocamlc -o fact fact.ml
Ejercicios:
1. Escriba en OCaml un programa ejecutable pi que calcule una buena aproximacio´n del nu´mero pi y muestre el resultado por la salida esta´ndar seguido de un salto de l´ınea. Guarde el c´odigo fuente en un archivo con nombre pi.ml (puede compilarlo con la orden ocamlc -o pi pi.ml). En este ejercicio intente que el co´digo fuente no contenga el doble punto y coma (;;) que se utiliza para terminar las frases en el compilador interactivo.
Ejemplo de ejecuci´on:
$ ./pi
3.14159265359
$
2. Escriba en OCaml un programa ejecutable e que calcule una buena aproximaci´on del nu´mero e y muestre el resultado por la salida esta´ndar seguido de un salto de l´ınea. Guarde el co´digo fuente en un archivo con nombre e.ml (puede compilarlo con la orden ocamlc -o e e.ml). En este ejercicio intente que el co´digo fuente no contenga el doble punto y coma (;;) que se utiliza para terminar las frases en el compilador interactivo.
Ejemplo de ejecuci´on:
$ ./e
2.71828182846
$
3. Estudie la siguiente definici´on escrita en OCaml:
let rec fact = function
0 -> 1
| n -> n * fact (n – 1)
1
La palabra reservada rec despu´es de let permite (en una definici´on de funcio´n) hacer referencia en la expresi´on a la derecha del signo = a la funci´on que se esta´ definiendo (es decir, permite definiciones recursivas de funciones).
El nombre (n) que aparece en la parte izquierda de la segunda regla del “pattern-matching” de la expresio´n lambda (es decir, de la frase function …) es un patro´n que encaja con cualquier posible valor del argumento de la funci´on y sirve para hacer referencia a este valor en la parte derecha de la regla.
Compile esta definicio´n en el toplevel (compilador interactivo) ocaml y compruebe su funcionamiento.
Utilizando esta funcio´n construya un programa ejecutable fact que muestre por la salida esta´ndar (seguido de un salto de l´ınea) el valor del factorial del nu´mero que se pase como argumento al invocar el programa. De modo que su ejecuci´on podr´ıa verse como a continuaci´on:
$ ./fact 10 3628800
$ ./fact 20
2432902008176640000 $ ./fact fact: n´umero de argumentos inv´alido
$
Para acceder desde el programa OCaml al argumento de la l´ınea de comandos, puede utilizar el array de strings Sys.argv (que contiene las palabras usadas en la l´ınea de comandos al invocar el programa). El elemento 0 de ese vector (Sys.argv.(0)) debe contener el nombre del programa invocado (en este caso, fact) y el elemento 1 (Sys.argv.(1)) debe contener el primer argumento (10 en el primer ejemplo y 20 en el segundo). Para comprobar que el nu´mero de argumentos empleado al invocar el programa es correcto, puede aplicar la funcio´n Array.length al vector Sys.argv (en este caso deber´ıa devolver el valor 2, pues la l´ınea de comando deber´ıa contener exactamente 2 palabras).
Guarde el c´odigo fuente del programa en un archivo con nombre fact.ml. Puede compilarlo con la orden ocamlc -o fact fact.ml.
2
Reviews
There are no reviews yet.