(* * Konzepte höherer Programmiersprachen (SS 2006) * * Übungsblatt 10 / Aufgabe 2 *) type date = {day:int; month:int; year:int};; (* Aufgabe 1a *) let leap_year y = (y mod 4 = 0) && ((y mod 100) <> 0 || (y mod 400 = 0));; let days_per_month m y = if m mod 2 = 0 then (if leap_year y then 28 else 29) else (if List.mem m [2;4;6;9;11] then 30 else 31);; let next_day d = if d.day < (days_per_month d.month d.year) then {day = d.day + 1; month = d.month; year = d.year} else (if d.month < 12 then {day = 1; month = d.month + 1; year = d.year} else {day = 1; month = 1; year = d.year + 1});; (* Aufgabe 1b *) let before d1 d2 = (d1.year < d2.year) || (d1.year = d2.year && (d1.month < d2.month || (d1.month = d2.month && d1.day < d2.day)));; (* Aufgabe 1c *) let rec difference_from_to d1 d2 = if before d1 d2 then 1 + difference_from_to (next_day d1) d2 else 0;; let difference d1 d2 = if before d1 d2 then difference_from_to d1 d2 else 0 - (difference_from_to d2 d1);; (* Aufgabe 1d *) let day_of_the_week_text i = List.nth ["so"; "mo"; "di"; "mi"; "do"; "fr"; "sa"] i;; let day_of_the_week d = let sunday = {day = 21; month = 5; year = 2006} in day_of_the_week_text ((difference sunday d) mod 7);;