TD n 4. Rappel. Filtrage. 1/ Remplace une alternative : if expression = valeur then expression1 else expression2;;

Documents pareils
Recherche dans un tableau

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Les chaînes de caractères

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Présentation du langage et premières fonctions

Classes et Objets en Ocaml.

Algorithmique et Programmation, IMA

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Initiation à la programmation en Python

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

STAGE IREM 0- Premiers pas en Python

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours de Programmation 2

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

modules & compilation

Utilisation d objets : String et ArrayList

TP 1. Prise en main du langage Python

TP3 : Manipulation et implantation de systèmes de fichiers 1

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Chapitre 10. Les interfaces Comparable et Comparator 1

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

1 Année LMD-STSM Algorithmique et Programmation. Série de TD 2

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

TD3: tableaux avancées, première classe et chaînes

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Java Licence Professionnelle CISII,

Pour l épreuve d algèbre, les calculatrices sont interdites.

TP : Gestion d une image au format PGM

2 Comment fonctionne un ordinateur, dans les grandes lignes

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

INF 321 : mémento de la syntaxe de Java

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Plan du cours. Historique du langage Nouveautés de Java 7

Algorithmique et programmation : les bases (VBA) Corrigé

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Notions fondamentales du langage C# Version 1.0

Java 1.5 : principales nouveautés

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

MIS 102 Initiation à l Informatique

I. Introduction aux fonctions : les fonctions standards

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Rappels Entrées -Sorties

ACTIVITÉ DE PROGRAMMATION

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Principes des langages de programmation INF 321. Eric Goubault

FORMULES DE CALCUL. Prix = PV TTC = PV HT x (1 + taux de TVA) TVA = PV HT x taux de TVA PV HT = PV TTC 1 + taux de TVA

Introduction à l algorithmique et à la programmation M1102 CM n 3

INF 232: Langages et Automates. Travaux Dirigés. Université Joseph Fourier, Université Grenoble 1 Licence Sciences et Technologies

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

EXCEL TUTORIEL 2012/2013

ALGORITHMIQUE ET PROGRAMMATION En C

Claude Delannoy. 3 e édition C++

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

OCL - Object Constraint Language

Algorithmique & programmation

Langage Java. Classe de première SI

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Exprimer ce coefficient de proportionnalité sous forme de pourcentage : 3,5 %

Découverte de Python

Programmation en Java IUT GEII (MC-II1) 1

Représentation d un entier en base b

Programmer en JAVA. par Tama

Cours d initiation à la programmation en C++ Johann Cuenin

Probabilité. Table des matières. 1 Loi de probabilité Conditions préalables Définitions Loi équirépartie...

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Le prototype de la fonction main()

Cours d Algorithmique et de Langage C v 3.0

DOCM Solutions officielles = n 2 10.

LES TYPES DE DONNÉES DU LANGAGE PASCAL

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Table des matières. Introduction

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Initiation à la Programmation en Logique avec SISCtus Prolog

TP, première séquence d exercices.

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Programme Compte bancaire (code)


Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

Chapitre 2 Devine mon nombre!

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Examen Médian - 1 heure 30

Corrigé des exercices sur les références

Conventions d écriture et outils de mise au point

Limites finies en un point

Transcription:

TD n 4 Rappel Filtrage 1/ Remplace une alternative : if expression = valeur then expression1 else expression2;; match expression = valeur with true -> expression1 false -> expression2;; ici le filtre est booléen if x mod 2 = 0 then "pair" else "impair";; match x mod 2 = 0 with true -> "pair" false -> "impair";; x mod 2 = 0 et true sont de type bool match expression with valeur1 -> expression1 valeur2 -> expression2;; match expression with valeur -> expression1 -> expression2;; l'expression et la valeur doivent être de même type la notation signifie dans tous les autres cas match x mod 2 with 0 -> "pair" 1 -> "impair";; Warning 8: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: 2 le filtrage n'est pas défini pour tous les entiers match x mod 2 with 0 -> "pair" -> "impair";; x mod 2 et 0 sont de type int 2/ Remplace un test en cascade : if expression = valeur1 then expression1 else if expression = valeur2 then expression2 else if expression = valeur3 then expression3 else expression4;; if choix= a then action1 else if choix='b' then action2 else if choix='c' then action3 else action4;; match expression with valeur1 -> expression1 valeur2 -> expression2 valeur3 -> expression3 -> expression4;; match choix with 'a' -> action1 'b' -> action2 'c' -> action3 -> action4;;

3/ Remplace un test avec énumération de cas multiple if expression = valeur1 expression = valeur2 expression = valeur3 then expression1 else expression2;; if choix='a' choix='e' choix='i' choix='o' choix='u' choix='y' then "voyelle" else "";; match expression with valeur1 valeur2 valeur3 -> expression1 -> expression2;; match choix with 'a' 'e' 'i' 'o' 'u' 'y' -> "voyelle" -> "";; 4/ ET association de deux conditions if expression1 = valeur1 && expression2 = valeur2 then action1 else action2;; match (expression1,expresion2) with (valeur1,valeur2) -> action1 -> action2;; if yeux="marron" && cheveux="noir" then "oui" else "non";; match (yeux,cheveux) with ("marron","noir") -> "oui" -> "non";; 5/ OU association de deux conditions if expression1 = valeur1 expression2 = valeur2 then action1 else action2;; match (expression1,expresion2) with (valeur1,_) (_,valeur2) -> action1 -> action2;; if yeux="marron" cheveux="noir" then "oui" else "non";; match (yeux,cheveux) with ("marron",_) (_,"noir")-> "oui" -> "non";; 6/ Filtrage de n-uplet a. Extraire le premier élément d'un couple : let premier_element_du_couple couple = val premier_element_du_couple : 'a * 'b -> 'a = <fun> premier_element_du_couple energie1;; - : string = "bois" match couple with (a,b) -> a;; b. Extraire le second élément d'un triplet : let second_element_du_triplet triplet = match triplet with (a,b,c) ->b;; val second_element_du_triplet : 'a * 'b * 'c -> 'b = <fun> c. Création d'un couple constitué des deux premiers éléments d'un couple de triplet : let deux_premiers (triplet1,triplet2) = match (triplet1,triplet2) with ((a1,b1,c1),(a2,b2,c2)) -> (a1,a2);; val deux_premiers : ('a * 'b * 'c) * ('d * 'e * 'f) -> a * 'd = <fun>

Exercice 1 Ecrire une fonction qui associe à un entier positif, 3 fois sa valeur si l entier est multiple de 3 (il s écrit 3n), 7 fois sa valeur si l entier est multiple de 3 plus 1 (il s écrit 3n+1), 21 fois sa valeur si l entier est un multiple par 3 plus 2 (il s écrit 3n+2). Ecrire une solution qui utilise un filtre. Autrement dit Ecrire une fonction solution qui associe à un entier positif x, 3 fois sa valeur si x est divisible par 3, 7 fois sa valeur si x-1 est divisible de 3, 21 fois sa valeur si x-2 est divisible par 3. Dans cet exercice le filtrage s applique à x mod 3 let f x = match x mod 3 with 0 -> 3*x 1 -> 7*x 2 -> 21*x;; Warning P: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: 3 val solution : int -> int = <fun> L interpréteur considère que le filtre x mod 3 est un entier. Il vérifie que tous les entiers sont prévus dans le filtrage et indique une anomalie potentielle car 3 n est pas prévu. Le programmeur ( à la différence de l interpréteur ) sait que le reste de la division par 3 a pour seules valeurs possibles 0 1 ou 2, néanmoins il convient ici pour éviter le warning d indiquer que le troisième cas couvre tous les autres cas avec la notation symbolique. let f x = match x mod 3 with 0 -> 3*x 1 -> 7*x -> 21*x;; val solution : int -> int = <fun> f 6;; - : int = 18 f 7;; - : int = 49 f 8;; - : int = 168

Exercice 2 Dans un filtrage un ensemble de valeurs consécutives dans un ensemble ordinal peut être remplacé par un intervalle d extrémités a et b dont la syntaxe est a.. b 1 / Ecrire une fonction booléenne qui vérifie qu un argument caractère est une des 26 lettres de l alphabet. 2 / Ecrire une fonction dont le résultat est une chaîne indiquant si un argument caractère est une voyelle, une consonne, un chiffre ou autre. 1 / let lettre c = match c with a.. z A.. Z -> true -> false;; val lettre : char -> bool = <fun> 2 / let caractere c = match c with a e i o i y -> "voyelle" A E I O U Y -> "voyelle" a.. z A.. Z -> "consonne" 0.. 9 -> "chiffre" -> "autre";; val caractere : char -> string = <fun> Les cas prévus sont analysés séquentiellement. Si un cas est rencontré, les cas suivants ne sont pas analysés. Dans cette exemple si c est une voyelle le 3ème cas n est pas analysé, il en résulte que si le 3ème cas est rencontré nous sommes en présence d une lettre qui n est pas une voyelle donc nous sommes en présence d une consonne.

Exercice 3 1 / Ecrire une fonction ttc qui calcule un prix TTC en fonction de deux arguments, le prix HT de l objet et sa catégorie 1, 2 ou 3. Les pourcentages de TVA s'appliquent en fonction de la catégorie et ont respectivement pour valeur 5%, 7% et 20%. 2 / Ecrire l appel à la fonction ttc pour un objet appartenant à la catégorie 3 dont le prix HT est égal à cinquante euros. 1 / let ttc prix categorie = match categorie with 1 -> prix *. 1.05 2 -> prix *. 1.07 -> prix *. 1.2;; val ttc : float -> int -> float = <fun> 2 / ttc 50. 3;; -: float = 60. Exercice 4 Ecrire une fonction qui à deux couples formés d une chaîne et d un entier associe la chaîne et la somme des entiers si les deux chaînes en argument sont identiques et la chaine différents et l entier nul si les chaînes ne sont pas identiques. let f c1 c2 = match (c1,c2) with (s1,x1),(s2,x2) -> if s1=s2 then (s1,x1+x2) else ("différents",0);; val f : string*int -> string*int -> string*int = <fun> let f (s1,x1) (s2,x2) = if s1=s2 then (s1,x1+x2) else ("différents",0);; val f : string*int -> string*int -> string*int = <fun> Exemples : let (a,b) = ("bois",300.);; val a : string = "bois" val b : int = 300 Utilisation du couple (a,b) pour définir les valeurs de a et de b Cette instruction ne définit pas de couple mais réalise une affectation multiple. ("bois",300);; - : string * int = ("bois",300) Evaluation interne d'un couple constitué d'une chaine de caractère et d'un entier. let energie1 = ("bois",300);; val energie1 : string * int = ("bois", 300) Définition du couple energie1 constitué de la chaine de caractère "bois" et de l entier 300 let energie2 = ("bois",500);; val energie2 : string * int = ("bois", 500) Définition du couple energie2 constitué de la chaine de caractère "bois" et de l entier 500 let energie3 = ("fuel",300);; val energie3 : string * int = ("fuel", 300) Définition du couple energie3 constitué de la chaine de caractère "fuel" et de l entier 300 f energie1 energie2;; -: string * int = ("bois", 800) f energie1 energie3;; -: string * int = ("différent", 0)

Exercice 5 1 / Ecrire une fonction qui calcule le nombre de racines réelles d'une équation du second degré. La fonction aura 3 arguments réels (les 3 coefficients de l'équation et on supposera non nul le coefficient du terme du second degré. On pourra créer des fonctions intermédiaires. 2 / Résoudre l'équation du second degré. Le résultat sera un triplet dont le premier élément est un entier qui indique le nombre de solutions de l'équation, les deux suivants sont les solutions éventuelles de l'équation.. 0 / Ecrire une fonction compare qui pour un couple donné (x,y) associe 1 si x > y 0 si x = y -1 si x < y Ici l argument est imposé, il est de la forme (x,y). Il y a un seul argument qui est un couple. let compare (x,y) = if x>y then 1 else if x=y then 0 else -1;; val compare : 'a * 'a -> int = <fun> let compare (x,y) = match x>y with true -> 1 false -> match x=y with true -> 0 false -> -1;; val compare : 'a * 'a -> int = <fun>

1 / 1a/ On aura besoin de calculer la valeur de delta pour résoudre l exercice. Ecrire une fonction delta qui calcule la valeur de delta pour une équation du second degré définie par les coefficients a b et c. Les coefficients sont des réels (les opérateurs doivent être suivis d un point, ainsi que les parties entières des réels qui apparaissent sous forme de constantes). Solution avec 3 arguments réels : let delta a b c = b ** 2. -. 4. *. a *. c;; val delta : float -> float -> float -> float = <fun> delta 1. 2. 1.;; -: float = 0. Solution avec 1 argument qui est 1 triplet de réels exprimé de manière littérale : let delta (a,b,c) = b ** 2. -. 4. *. a *. c;; val delta : float * float * float -> float = <fun> delta (1., 2., 1.);; -: float = 0. Solution avec 1 argument nommé t qui est 1 triplet de réels : let delta t = match t with (a,b,c) -> b ** 2. -. 4. *. a *. c;; val delta : float * float * float -> float = <fun> delta (1., 2., 1.);; -: float = 0. 1b/ Ecrire une fonction nombre_de_racines qui permet de calculer le nombre de racines réelles d'une équation du second degré. La fonction aura 3 arguments réels (les 3 coefficients de l'équation et on supposera non nul le coefficient du terme du second degré. On pourra créer des fonctions intermédiaires. Ecrire une fonction nombre_de_racines. La fonction aura 3 arguments réels. On a donc l en-tête : let nombre_de_racines a b c = On supposera non nul le coefficient du terme du second degré.on vérifie la condition à l aide de la fonction assert (a est un réel) : assert (a<>0.) ; Ecrire une fonction nombre_de_racines qui permet de calculer le nombre de racines réelles d'une équation du second degré.on filtrera le résultat de la fonction compare qui compare la valeur de delta à 0. afin définir le nombre de solutions.l argument de la fonction compare est un couple (, ) match compare (delta(a,b,c),0.) with (-1) -> 0 0 -> 1 -> 2;; Solution : let nombre_de_racines a b c = assert (a<>0.) ; match compare (delta(a,b,c),0.) with (-1) -> 0 0 -> 1 -> 2;; val nombre_de_racines : float -> float -> float -> int = <fun>

2 / Résoudre l'équation du second degré. Le résultat sera un triplet dont le premier élément est un entier qui indique le nombre de solutions de l'équation, les deux suivants sont les solutions éventuelles de l'équation.. On suppose que la fonction compare d intérêt général est préalablement définie. Si on suppose que les fonctions delta et nombre_de_racines sont préalablement définies. let solution (a,b,c) = let racine1 (a,b,c) = (-.b +. sqrt(delta (a,b,c)))/. (2. *. a) in let racine2 (a,b,c) = (-.b -. sqrt(delta (a,b,c)))/. (2. *. a) in match nombre_de_racines a b c with 0 -> (0,0.,0.) 1 -> (1,racine1 (a,b,c),0.) -> (2,racine1 (a,b,c),racine2 (a,b,c));; val solution : float * float * float -> int * float * float = <fun> Ici les fonctions nécessaires sont définies dans la fonction solution_globale let solution_globale (a,b,c) = let delta (a,b,c) = b ** 2. -. 4. *. a *. c in let racine1 (a,b,c) = (-.b +. sqrt(delta (a,b,c)))/. (2. *. a) in let racine2 (a,b,c) = (-.b -. sqrt(delta (a,b,c)))/. (2. *. a) in let nombre_de_racines a b c = assert (a<>0.) ; match compare (delta(a,b,c),0.) with (-1) -> 0 0 -> 1 -> 2 in match nombre_de_racines a b c with 0 -> (0,0.,0.) 1 -> (1,racine1 (a,b,c),0.) -> (2,racine1 (a,b,c),racine2 (a,b,c));; val solution_globale : float * float * float -> int * float * float = <fun> Remarque : Les fonctions racine1 et racine2 ne sont exécutées que dans le cas ou le calcul a un sens en fonction du nombre de solutions réelles de l équation du second degré. solution (1.,2.,1.);; - : int * float * float = (1, -1., 0.) solution (1.,4.,3.);; - : int * float * float = (2, -1., -3.) solution (2.,1.,4.);; - : int * float * float = (0, 0., 0.)

Exercice 6 1 / On considère des triplets contenant une chaîne et deux réels. Ecrire une fonction trans3to2 admettant x pour argument, qui transforme un tel triplet en un couple qui contient la chaîne et la somme des deux réels. Ainsi ( caml, 2.4, 5.1) est transformé en ( caml, 7.5 ) 2 / Un couple contient une chaîne et un réel. Ecrire une fonction trans2to3 admettant un seul argument, qui transforme un tel couple en un triplet qui contient la chaîne, le réel et un second réel égal à la somme du premier réel et de la longueur de la chaîne. Ainsi ( caml, 2.4 ) est transformé en ( caml, 2.4, 6.4 ) 1 / Ecrire une fonction trans3to2 admettant x pour argument. On a donc l en-tête : let trans3to2 x = Dans cet exercice x est un triplet contenant une chaîne et deux réels, il est ici nécessaire de filtrer x afin de distinguer les trois éléments constitutifs du triplet. Les noms de ces trois éléments sont choisis arbitrairement : s représente la chaîne de caractères r1 représente le premier réel r2 représente le deuxième réel On a donc le filtre : match x with (s,r1,r2) -> Il reste alors à construire le couple qui définit le résultat attendu. Le deuxième élément est une somme de réels, l opérateur est donc +. (s,r1+.r2) Solution : let trans3to2 x = match x with (s,r1,r2) -> (s,r1+.r2);; val trans3to2 : a*float*float -> a*float = <fun> Vous noterez que le type du premier élément du triplet est 'a. Dans l expression (s,r1+.r2) le type de s ne peut être déduit. Le type sera défini lors de l appel de la fonction. Exemple : trans3to2 ("caml", 2.4, 5.1);; - : string*float = ( caml, 7.5 ) 2 / Ecrire une fonction trans2to3 admettant un seul argument qui transforme un couple. On a donc l en-tête : let trans2to3 x = ou let trans2to3 (s,r) = Dans les deux cas la fonction n a qu un seul argument. Le nom de l argument n est pas imposé on peut choisir un identificateur x qui représente le couple ou exprimer le couple de manière littérale (s,r). Dans le premier cas x sera filtré afin de distinguer les deux éléments constitutifs du couple let trans2to3 x = match x with (s,r) -> let r2= r +. float_of_int (String.length s) in (s,r,r2);; val trans2to3 : string*float -> string*float*float = <fun> let trans2to3 (s,r) = let r2= r +. float_of_int (String.length s) in (s,r,r2);; val trans2to3 : string*float -> string*float*float = <fun> trans2to3 ("caml", 2.4);; - : string*float*float = ( caml, 2.4, 6.4 )