DEUG MIAS 24
 
 

Types et Structures de données
 
 

TD 1


1.Utiliser la documentation ocaml

Voici deux extraits de la documentation à étudier en TD...
 
 

1.1.Syntaxe des valeurs de type float

Floating-point literals


float-literal ::= [-] { 0...9 }+ [. { 0...9 }] [(e| E) [+| -] { 0...9 }+]



Floating-point decimals consist in an integer part, a decimal part and an exponent part. The integer part is a sequence of one or more digits, optionally preceded by a minus sign. The decimal part is a decimal point followed by zero, one or more digits. The exponent part is the character e or E followed by an optional + or - sign, followed by one or more digits. The decimal part or the exponent part can be omitted, but not both to avoid ambiguity with integer literals. The interpretation of floating-point literals that fall outside the range of representable floating-point values is undefined.
 
 

1.2.L'interpréteur ocaml

Chapitre 9 The toplevel system (ocaml)
 
 

This chapter describes the toplevel system for Objective Caml, that permits interactive use of the Objective Caml system through a read-eval-print loop. In this mode, the system repeatedly

reads Caml phrases from the input, then typechecks, compile and evaluate them, then prints the inferred type and result value, if any. The system prints a # (sharp) prompt before reading

each phrase.
 
 

Input to the toplevel can span several lines. It is terminated by ;; (a double-semicolon). The toplevel input consists in one or several toplevel phrases, with the following syntax:
 
 

toplevel-input ::= { toplevel-phrase } ;;

toplevel-phrase ::= definition

| expr

| # ident directive-argument

definition := let [rec] let-binding { and let-binding }

| external value-name : typexpr = external-declaration

| type-definition

| exception-definition

| module module-name [ : module-type ] = module-expr

| module type modtype-name = module-type

| open module-path

directive-argument ::= nothing

| string-literal

| integer-literal

| value-path
 
 

A phrase can consist of a definition, similar to those found in implementations of compilation units or in struct ... end module expressions. The definition can bind value names, type names,

an exception, a module name, or a module type name. The toplevel system performs the bindings, then prints the types and values (if any) for the names thus defined.
 
 

A phrase may also consist in a open directive (see section 6.11), or a value expression (section 6.7). Expressions are simply evaluated, without performing any bindings, and the value of the

expression is printed.
 
 

Finally, a phrase can also consist in a toplevel directive, starting with # (the sharp sign). These directives control the behavior of the toplevel; they are listed below in section 9.2.
 
 

2.Moyenne de trois nombres

Définir une fonction moyenne3 telle que (moyenne3 a b c) retourne la moyenne arithmétique des trois réels a, b et c.

Donnez deux exemples d'application de cette fonction à des valeurs.
 
 

3.Évaluation d'un polynôme

 3.1.

Définir une fonction poly telle que (poly x) retourne la valeur réelle du polynôme 2x3 - 3x2 + 4x + 1.

Vous prendrez soin de minimiser le nombre de multiplications (schéma de Horner).

 3.2.

Définir une fonction poly2 telle que (poly2 x) retorune la valeur rélle du polynôme 4x4 + 3 x2 + 1.

Utilisez une liaison locale

let nom = expression1 in expression2

pour minimiser le nombre de multiplications.

 3.3.

Définir une fonction trinome telle que (trinome a b c x) retourne la valeur rélle en x du trinôme du second degré ax2 + bx + c.

Utiliser une application partielle de cette fonction trinome pour définir une fonction val telle que (val x) retourne la valeur du trinôme 3x2 - 5x + 3.
 
 

4.Moyenne pondérée de trois nombres

 4.1.

Définir une fonction moy3p : telle que (moy3p p1 p2 p3 n1 n2 n3) retourne la moyenne pondérée des trois nombres n1 n2 et n3 avec les poids respectifs p1, p2 et p3.

 4.2.

Utiliser une application partielle de la fonction moy3p pour définir une fonction moyp_235 telle que (moyp_235 a b c) retourne la moyenne pondérée des trois nombres a de poids 2, b de poids 3 et c de poids 5.
 
 

5.Prédicats

 5.1.

Définir une fonction pair : int -> bool telle que (pair n) retourne true si et seulement si l'entier n est pair.

 5.2.

Définir, de deux façons différentes, en utilisant la fonction précédente pair, le prédicat impair : int -> bool tel que (impair n) retourne true si et seulement si l'entier n est impair.

Indications :

6.Nombre de racines d'une équation du second degré

 6.1.

Définir une fonction nb_rac_s : float -> float -> float -> string telle que (nb_rac_s a b c) retourne une chaîne de caractères précisant le nombre de solutions réelles de l'équation ax2 + bx + c = 0.

 6.2.

Définir une fonction nb_rac : float -> float -> float -> int telle que (nb_rac a b c) retourne le nombre de solutions réelles de l'équation ax2 + bx + c = 0. Comment traiter correctement le cas où le coefficient a est nul (l'équation n'est pas du second degré !) ?
 
 

7.Fonctionnelles

On appelle fonctionnelle une fonction dont la valeur de retour est une fonction. Ocaml permet d'écrire des fonctionnelles de la même manière que les fonctions usuelles.

 7.1.

Définir une fonction plus_x telle que (plus_x x) retourne une fonction qui appliquée à un entier y retourne x + y.

 7.2.

Définir une fonction plus telle que (plus x y) retourne la valeur de x + y.

La comparer à la fonction plus_x et à la fonction ( + ) associée à l'opérateur infixe +.

 7.3.

Définir unhe fonction itere2 telle que (itere2 f x) retorune la valeur de f (f (x)).

 7.4.

Définir une fonction double, à l'aide de itere2 et plus_x, telle que (double x) retourne le double de l'entier x.
 
 

8.Jour d'une date

On représente une date par la donnée de 3 entiers, dans l'ordre :

 8.1.

Définir un prédicat valide : int -> int -> int -> bool tel que (valide j m a) retourne true si et seulement si les données j, m et a correspondent à une date valide comprise entre le 1er Janvier 1901 et le 31 Décembre 2099 inclus.

 8.2.

Le 1er Janvier 1901 tombait un mardi.

On veut définir une fonction jour : int -> int -> int -> string telle que (jour j m a)

Pour vérification de votre programmation, vous pouvez utiliser la commande unix "cal" (man cal).
 
 

9.Représentation d'un entier en chiffres romains

On veut obtenir la représentation d'un en entier de l'intervalle 1..3999 en chiffres romains.

Le tableau ci-dessous rappelle la valeur des lettres :

I V X L C D M

1 5 10 5O 100 500 1000

Définir une fonction romain : int -> string telle que (romain n)