From 35f617bbcc7c5dccd32e7067557b95c1c4d7f614 Mon Sep 17 00:00:00 2001 From: Yan Wittmann <2121578@stud.hs-mannheim.de> Date: Mon, 12 Dec 2022 16:03:41 +0100 Subject: [PATCH] 02 Signed-off-by: Skyball2000 --- aufgaben/src/02/Date.elm | 203 ++++++++++++++++++ aufgaben/tests/Pflichtuebung_01/DateTests.elm | 79 ------- 2 files changed, 203 insertions(+), 79 deletions(-) create mode 100644 aufgaben/src/02/Date.elm diff --git a/aufgaben/src/02/Date.elm b/aufgaben/src/02/Date.elm new file mode 100644 index 0000000..59da7a3 --- /dev/null +++ b/aufgaben/src/02/Date.elm @@ -0,0 +1,203 @@ +module Date exposing (..) + +import String exposing (fromInt) + +type Weekday + = Mon + | Tue + | Wed + | Thu + | Fri + | Sat + | Sun + + +type alias Day = + Int + + +type alias Month = + Int + + +type alias Year = + Int + + +type alias Date = + ( Day, Month, Year ) + + +year : Date -> Year +year ( _, _, y ) = + y + + +month : Date -> Month +month ( _, m, _ ) = + m + + +day : Date -> Day +day ( d, _, _ ) = + d + + +lt : Date -> Date -> Bool +lt ( d1, m1, y1 ) ( d2, m2, y2 ) = + (y1 < y2) || (y1 == y2 && m1 < m2) || (y1 == y2 && m1 == m2 && d1 < d2) + + +eq : Date -> Date -> Bool +eq ( d1, m1, y1 ) ( d2, m2, y2 ) = + y1 == y2 && m1 == m2 && d1 == d2 + + +gt : Date -> Date -> Bool +gt ( d1, m1, y1 ) ( d2, m2, y2 ) = + (y1 > y2) || (y1 == y2 && m1 > m2) || (y1 == y2 && m1 == m2 && d1 > d2) + + +toString : Date -> String +toString ( d, m, y ) = + let + d0 = + if (d // 10) == 0 then + "0" + + else + "" + + m0 = + if (m // 10) == 0 then + "0" + + else + "" + in + d0 ++ fromInt d ++ "." ++ m0 ++ fromInt m ++ "." ++ fromInt y + + +next : Date -> Date +next ( d, m, y ) = + case ( d, m, y ) of + ( 31, 12, _ ) -> + ( 1, 1, y + 1 ) + + ( 30, 11, _ ) -> + ( 1, 12, y ) + + ( 31, 10, _ ) -> + ( 1, 11, y ) + + ( 30, 9, _ ) -> + ( 1, 10, y ) + + ( 31, 8, _ ) -> + ( 1, 9, y ) + + ( 31, 7, _ ) -> + ( 1, 8, y ) + + ( 30, 6, _ ) -> + ( 1, 7, y ) + + ( 31, 5, _ ) -> + ( 1, 6, y ) + + ( 30, 4, _ ) -> + ( 1, 5, y ) + + ( 31, 3, _ ) -> + ( 1, 4, y ) + + ( 29, 2, _ ) -> + ( 1, 3, y ) + + ( 28, 2, _ ) -> + if leapyear y then + ( 29, 2, y ) + + else + ( 1, 3, y ) + + ( 31, 1, _ ) -> + ( 1, 2, y ) + + _ -> + ( d + 1, m, y ) + + +prev : Date -> Date +prev ( d, m, y ) = + case ( d, m, y ) of + ( 1, 12, _ ) -> + ( 30, 11, y ) + + ( 1, 11, _ ) -> + ( 31, 10, y ) + + ( 1, 10, _ ) -> + ( 30, 9, y ) + + ( 1, 9, _ ) -> + ( 31, 8, y ) + + ( 1, 8, _ ) -> + ( 31, 7, y ) + + ( 1, 7, _ ) -> + ( 30, 6, y ) + + ( 1, 6, _ ) -> + ( 31, 5, y ) + + ( 1, 5, _ ) -> + ( 30, 4, y ) + + ( 1, 4, _ ) -> + ( 31, 3, y ) + + ( 1, 3, _ ) -> + if leapyear y then + ( 29, 2, y ) + + else + ( 28, 2, y ) + + ( 1, 2, _ ) -> + ( 31, 1, y ) + + ( 1, 1, _ ) -> + ( 31, 12, y - 1 ) + + _ -> + ( d - 1, m, y ) + + +leapyear : Year -> Bool +leapyear y = + (modBy 4 y == 0) && ((modBy 100 y /= 0) || (modBy 400 y == 0)) + + +sub : Date -> Date -> Int +sub d1 d2 = + subHelp 0 d1 d2 + + + +{- um optimierbare End-Rekursion zu erreichen: Akkumulator als Argument -} + + +subHelp : Int -> Date -> Date -> Int +subHelp diff d1 d2 = + if gt d1 d2 then + subHelp (diff + 1) d1 (next d2) + + else if lt d1 d2 then + subHelp (diff - 1) d1 (prev d2) + + else + diff + + diff --git a/aufgaben/tests/Pflichtuebung_01/DateTests.elm b/aufgaben/tests/Pflichtuebung_01/DateTests.elm index 23a24c6..79e060f 100644 --- a/aufgaben/tests/Pflichtuebung_01/DateTests.elm +++ b/aufgaben/tests/Pflichtuebung_01/DateTests.elm @@ -88,55 +88,6 @@ testToString = Expect.equal "02.06.2024" (toString (2, 6, 2024)) ] -testNext : Test -testNext = - describe "next method test" - [test "next of 01.01.1970" <| - \() -> - Expect.equal (2, 1, 1970) (next (1, 1, 1970)) - , test "next of 02.06.2024 " <| - \() -> - Expect.equal (3, 6, 2024) (next (2, 6, 2024)) - , test "next of 31.12.2020" <| - \() -> - Expect.equal (1, 1, 2021) (next (31, 12, 2020)) - -- leap year test - , test "next of 28.02.2020" <| - \() -> - Expect.equal (29, 2, 2020) (next (28, 2, 2020)) - , test "next of 29.02.2020" <| - \() -> - Expect.equal (1, 3, 2020) (next (29, 2, 2020)) - -- non-leap year test - , test "next of 28.02.2021" <| - \() -> - Expect.equal (1, 3, 2021) (next (28, 2, 2021)) - ] - -testPrev : Test -testPrev = - describe "prev method test" - [test "prev of 01.01.2000" <| - \() -> - Expect.equal (31, 12, 1999) (prev (1, 1, 2000)) - , test "prev of 02.06.2024 " <| - \() -> - Expect.equal (1, 6, 2024) (prev (2, 6, 2024)) - , test "prev of 1.12.2020" <| - \() -> - Expect.equal (30, 11, 2020) (prev (1, 12, 2020)) - -- leap year test - , test "prev of 28.02.2020" <| - \() -> - Expect.equal (27, 2, 2020) (prev (28, 2, 2020)) - , test "prev of 1.03.2020" <| - \() -> - Expect.equal (29, 2, 2020) (prev (1, 3, 2020)) - -- non-leap year test - , test "prev of 1.03.2021" <| - \() -> - Expect.equal (28, 2, 2021) (prev (1, 3, 2021)) - ] leapYearTest : Test leapYearTest = @@ -155,36 +106,6 @@ leapYearTest = Expect.equal False (leapyear 2022) ] -subTest : Test -subTest = - describe "sub test" - [test "sub 01.01.1970 01.01.1970" <| - \() -> - Expect.equal 0 (sub (1, 1, 1970) (1, 1, 1970)) - , test "sub 01.01.1970 02.01.1970" <| - \() -> - Expect.equal -1 (sub (1, 1, 1970) (2, 1, 1970)) - , test "sub 01.01.1970 01.02.1970" <| - \() -> - Expect.equal -31 (sub (1, 1, 1970) (1, 2, 1970)) - , test "sub 01.01.1970 01.01.1971" <| - \() -> - Expect.equal -365 (sub (1, 1, 1970) (1, 1, 1971)) - , test "sub 01.01.1970 01.01.1972" <| - \() -> - Expect.equal -730 (sub (1, 1, 1970) (1, 1, 1972)) - , test "sub 01.01.1970 01.01.1974" <| - \() -> - Expect.equal -1461 (sub (1, 1, 1970) (1, 1, 1974)) - -- explicit leap year 2020 test - , test "sub 27.02.2020 01.03.2020" <| - \() -> - Expect.equal -3 (sub (27, 2, 2020) (1, 3, 2020)) - -- positive test - , test "sub 01.01.1970 01.01.1969" <| - \() -> - Expect.equal 365 (sub (1, 1, 1970) (1, 1, 1969)) - ] ltTest : Test