Guest User

Untitled

a guest
Feb 18th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.08 KB | None | 0 0
  1. (* Ecrire la fonction rang qui prend en argument un jour de semaine et retourne son rang dans la semaine (lundi est le jour de rang 1 et dimanche est de rang 7 dans la semaine). On remarque que la fonction est partielle et qu’on peut la compléter en associant l’entier 0 à un jour inconnu.
  2. rang ′′jeudi′′ => 4
  3. rang ′′monday′′ => -1 (le -1 a été choisi pour des raisons pratiques à cause des fonctions suivantes
  4. *)
  5. let rang = function | "lundi" -> 1
  6. | "mardi" -> 2
  7. | "mercredi" -> 3
  8. | "jeudi" -> 4
  9. | "vendredi" -> 5
  10. | "samedi" -> 6
  11. | "dimanche" -> 7
  12. | _ -> -1 ;;
  13.  
  14. (* Ecrire la fonction inf prenant en arguments 2 jours et retournant true ssi le premier jour précède le deuxième. *)
  15. let inf = fun (x,y) -> rang(x) < rang (y) ;;
  16.  
  17. (* Ecrire la fonction jsem qui prend en argument un entier de l’intervalle [1,7] et retourne la chaîne de caractères représentant le jour de la semaine correspondant. Si l’entier est incorrect la fonction retourne la chaîne ′′jour inconnu′′
  18. jsem 4 => ′′jeudi′′
  19. jsem 0 => ′′jour inconnu′′
  20. *)
  21. let jsem = function | 1 -> "lundi"
  22. | 2 -> "mardi"
  23. | 3 -> "mercredi"
  24. | 4 -> "jeudi"
  25. | 5 -> "vendredi"
  26. | 6 -> "samedi"
  27. | 7 -> "dimanche"
  28. | _ -> "jour inconnu" ;;
  29.  
  30. (* On veut écrire plusieurs versions de la fonction csucc qui prend en argument un jour de semaine et retourne son successeur dans la semaine : le successeur de lundi est mardi, celui de dimanche est lundi :
  31. 1ère version en utilisant uniquement le filtrage ;
  32. *)
  33. let csucc = function | "lundi" -> "mardi"
  34. | "mardi" -> "mercredi"
  35. | "mercredi" -> "jeudi"
  36. | "jeudi" -> "vendredi"
  37. | "vendredi" -> "samedi"
  38. | "samedi" -> "dimanche"
  39. | "dimanche" -> "lundi"
  40. | _ -> "successeur inconnu" ;;
  41.  
  42.  
  43. (* 2ème version en utilisant les fonctions jsem, et rang et sans filtrage. On donnera une version qui évite de calculer 2 fois la même expression ; *)
  44. let csucc2 = fun x -> if (rang(x) == 7) then jsem(1) else jsem ((rang x) + 1);;
  45.  
  46. (*3ème version en utilisant les fonctions jsem, et rang et l’opérateur
  47. prédéfini mod.
  48. *)
  49. let csucc3 = fun x -> jsem (((rang x) + 1)mod 7);;
  50.  
  51. (* Ecrire les 3 mêmes versions pour la fonction cpred retournant le jour
  52. précédent. On notera que (-1) mod 7 = -1
  53. *)
  54. let cpred = function | "lundi" -> "dimanche"
  55. | "mardi" -> "lundi"
  56. | "mercredi" -> "mardi"
  57. | "jeudi" -> "mercredi"
  58. | "vendredi" -> "jeudi"
  59. | "samedi" -> "vendredi"
  60. | "dimanche" -> "samedi"
  61. | _ -> "precedent inconnu" ;;
  62.  
  63. let cpred2 = fun x -> if (rang(x) == 1) then jsem(7) else jsem ((rang x) - 1);;
  64.  
  65. let cpred3 = fun x -> jsem (((rang x) - 1)mod 7);;
  66.  
  67.  
  68. (* Définir le type date décrit par 3 entiers (numéro du jour dans le mois, numéro du mois,
  69. année)
  70. *)
  71. type date = int * int * int ;;
  72.  
  73. (* Ecrire la fonction bissextile prenant en argument une année et retournant un booléen indiquant si l’année est bissextile ou non. Une année est bissextile si elle est divisible par 4 et si elle n’est pas divisible par 100 à moins qu’elle soit divisible par 400.
  74. *)
  75. let bissextile = fun (x) -> ( (x mod 4 == 0) && (x mod 100 != 0) )||(x mod 400 == 0 ) ;;
  76.  
  77. (*Ecrire la fonction nbjour prenant en argument un numéro de mois et une année et retournant le nombre de jour de ce mois dans cette année. Ecrire une version prenant en argument un couple d’entiers et une version prenant en arguments 2 entiers. Remarquez les types de ces 2 fonctions.
  78. *)
  79. let nbjour = function (mois,an) -> match (mois,an) with
  80. | (1,_) -> 31
  81. | (2,_) -> if (bissextile (an)) then 29 else 28
  82. | (3,_) -> 31
  83. | (4,_) -> 30
  84. | (5,_) -> 31
  85. | (6,_) -> 30
  86. | (7,_) -> 31
  87. | (8,_) -> 31
  88. | (9,_) -> 30
  89. | (10,_) -> 31
  90. | (11,_) -> 30
  91. | (12,_) -> 31
  92. | (_,_) -> -1 ;;
  93.  
  94. let nbjour2 = fun mois an -> match (mois,an) with
  95. | (1,_) -> 31
  96. | (2,_) -> if (bissextile (an)) then 29 else 28
  97. | (3,_) -> 31
  98. | (4,_) -> 30
  99. | (5,_) -> 31
  100. | (6,_) -> 30
  101. | (7,_) -> 31
  102. | (8,_) -> 31
  103. | (9,_) -> 30
  104. | (10,_) -> 31
  105. | (11,_) -> 30
  106. | (12,_) -> 31
  107. | (_,_) -> -1 ;;
  108.  
  109.  
  110. (*Ecrire une fonction valide prenant en argument une date et retourne true ssi la date est valide. *)
  111. let valide = fun (jour,mois,an) -> (jour<=nbjour(mois,an)) && (mois <13) && (jour>0) && (mois>0) ;;
  112.  
  113.  
  114. (*Ecrire la fonction lendemain prenant en argument une date et retournant celle du lendemain.
  115. Cette fonction ne teste pas si la date entrée en paramètre est valide
  116. *)
  117. let lendemain = fun (jour,mois,an) -> if valide (jour+1,mois,an) then jour+1,mois,an
  118. else if valide (1,mois+1,an) then 1,mois+1,an
  119. else 1,1,an+1 ;;
  120.  
  121.  
  122. (*Ecrire la fonction veille prenant en argument une date et retournant celle du la veille.
  123. Cette fonction ne teste pas si la date entrée en paramètre est valide
  124. *)
  125. let veille = fun (jour,mois,an) -> if valide (jour-1,mois,an) then jour-1,mois,an
  126. else if valide (nbjour(mois-1,an),mois-1,an) then nbjour(mois-1,an),mois-1,an
  127. else 31,12,an-1 ;;
Add Comment
Please, Sign In to add comment