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 :
-
un entier n est impair si
et seulement si il n'est pas pair.
-
un entier n est impair si
et seulement si son successuer est pair.
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 :
-
j représentant le quantième
du mois (1, 2, 3 ...),
-
m représentant le numéro
du mois (1 pour janvier, 2 pour février ...),
-
a représentant une année
comprise entre 1901 et 2099 inclus (dans ce domaine, toutes les années
divisibles par 4 sont bissextiles y compris 2000).
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)
-
retourne, lorque la date représentée
par ces trois paramètres est valide, le jour de la semaine correspondant
à cette date sous forme de string : "lundi", "mardi" ...
-
ou sinon lève l'exception
(Invalid_argument "date invalide").
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)
-
retourne l'écriture en chiffres
romains de n lorsque n appartient à l'intervalle 1..3999,
-
lève l'exception (Invalid_argument
"romain") sinon.