From aafb72c1dc3c1674e4b3c55586384bfdb7ff2be7 Mon Sep 17 00:00:00 2001
From: Hong-Phuc Bui <hong-phuc.bui@htwsaar.de>
Date: Mon, 11 May 2026 12:39:06 +0200
Subject: [PATCH] Musterlösung UB 2

---
 uebungsblatt-2/valid-credits.txt   |   16 +++++
 uebungsblatt-2/printSeven.py       |   24 ++++++++
 uebungsblatt-2/dec2bin.py          |   16 +++++
 uebungsblatt-2/luhn-algorithmus.py |   19 ++++++
 uebungsblatt-2/pycalendar.py       |   67 ++++++++++++++++++++++
 5 files changed, 142 insertions(+), 0 deletions(-)

diff --git a/uebungsblatt-2/dec2bin.py b/uebungsblatt-2/dec2bin.py
new file mode 100644
index 0000000..961a5c1
--- /dev/null
+++ b/uebungsblatt-2/dec2bin.py
@@ -0,0 +1,16 @@
+# Dezimal-Zahl in Binäre Zahl konvertieren
+
+n = input("Geben Sie eine natürliche Zahl ein! ")
+n = int(n)
+
+d,r = divmod(n,2)
+binary = f"{r}"
+
+while d > 0:
+    d,r = divmod(d,2)
+    binary = f"{r}{binary}" # hängt den Rest vor dem String-Representation
+
+print(binary)
+
+
+
diff --git a/uebungsblatt-2/luhn-algorithmus.py b/uebungsblatt-2/luhn-algorithmus.py
new file mode 100644
index 0000000..1a7341d
--- /dev/null
+++ b/uebungsblatt-2/luhn-algorithmus.py
@@ -0,0 +1,19 @@
+def luhn(n:int):
+    d = n
+    luhn_checksum = 0
+    while d != 0:
+        # Verarbeitung der Stelle 10^0, 10^2, 10^4,...
+        d,ungerade = divmod(d, 10)
+        luhn_checksum += ungerade
+        # Verarbeitung der Stelle 10^1, 10^2, 10^3,...
+        d,gerade = divmod(d, 10)
+        gerade *= 2
+        if gerade > 9: gerade -= 9
+        luhn_checksum += gerade
+    return luhn_checksum, luhn_checksum%10 == 0
+        
+
+
+n = int("371-4496-3539-8431".replace('-',''))
+checksum, valid = luhn(n)
+print(f"Luhn-checksum: {checksum}, gültig = {valid}")
\ No newline at end of file
diff --git a/uebungsblatt-2/printSeven.py b/uebungsblatt-2/printSeven.py
new file mode 100644
index 0000000..7dfbe5a
--- /dev/null
+++ b/uebungsblatt-2/printSeven.py
@@ -0,0 +1,24 @@
+def print_seven(a, b):
+    n = a
+    # suche die erste Vielfach von 7
+    # Maximum 6 Iterationen
+    #while n % 7 != 0:
+    #    n += 1
+
+    # eine elegantere Berechnung von n:
+    n = a + (7 - a%7) if a % 7 != 0 else a
+
+    # Gibt die Vielfach von 7 aus, schrittweit 7
+    # Maximum (b-a)/7 iterationen
+    while n <= b:
+        print(n)
+        n += 7
+
+
+
+a = input("Geben Sie eine natürliche Zahl ein! ")
+a = int(a)
+b = input(f"Geben Sie eine andere natürliche Zahl ein, die größer als {a} ist! ")
+b = int(b)
+
+print_seven(a, b)
diff --git a/uebungsblatt-2/pycalendar.py b/uebungsblatt-2/pycalendar.py
new file mode 100644
index 0000000..f2c11d2
--- /dev/null
+++ b/uebungsblatt-2/pycalendar.py
@@ -0,0 +1,67 @@
+import sys
+
+def wochentag(d:int, m:int, y:int) -> int:
+    y0 = y - (14 - m) // 12
+    x = y0 + y0//4 - y0//100 + y0//400
+    m0 = m + 12*( (14-m)//12 ) - 2
+    return (d + x + (31*m0)//12) % 7
+
+
+def berechne_ueberhang_tage(wochentag:int) -> int:
+    """Nach Gepflogenheit in deutches Kalender-System fängt eine Woche mit Montag an.
+
+    Mo -> Keinen Überhang; 
+    Di -> 1 Überhang; 
+    Mi -> 2 Überhange; 
+    Do -> 3 Überhange; 
+    Fr -> 4 Überhange; 
+    Sa -> 5 Überhange; 
+    So -> 6 Überhange
+    """
+    return (wochentag - 1) % 7
+
+
+def ist_schaltjahr(y:int) -> bool:
+    return (y % 4 == 0) and ( (y%100 != 0) or (y%400 == 0) )
+
+
+def letzter_tag(m: int, y:int) -> int:
+    tage = [None, 31, 28, 31, 30, 
+    31, 30, 31, 31, 
+    30, 31, 30, 31]
+    if m != 2: return tage[m]
+    return 29 if ist_schaltjahr(y) else 28
+
+
+def print_kalender(m: int, y: int):    
+    monaten = [None, 
+            "Januar",    "Februar", "März",     "April",
+            "Mai",       "Juni",    "July",     "August",
+            "September", "Oktober", "November", "Dezember"]
+    # Ausgabe des Monat und Jahr
+    print(f"{monaten[m]} {y}")
+    wochentage = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
+    print(" ".join(wochentage))
+    
+    # Ausgabe der Überhang von letzen Monat
+    erster_wochentag = wochentag(1, m, y)
+    ueberhang = berechne_ueberhang_tage(erster_wochentag)
+    spalten_breite = len(wochentage[0]) + 1 
+    ueberhang_zeichen = " "*(spalten_breite * ueberhang)
+    print(ueberhang_zeichen, end="")
+    
+    # Ausgabe des Kalenders
+    spalten_idx = ueberhang
+    tag = 1
+    letzter_tag_im_monat = letzter_tag(m, y)
+    while tag <= letzter_tag_im_monat:
+        print(f"{tag:2d}", end=" ")
+        tag += 1
+        spalten_idx += 1
+        if spalten_idx % 7 == 0: print()
+
+
+m, y = int(sys.argv[1]), int(sys.argv[2])
+print_kalender(m, y)
+
+print()
\ No newline at end of file
diff --git a/uebungsblatt-2/valid-credits.txt b/uebungsblatt-2/valid-credits.txt
new file mode 100644
index 0000000..cef2a89
--- /dev/null
+++ b/uebungsblatt-2/valid-credits.txt
@@ -0,0 +1,16 @@
+American Express	378282246310005
+American Express	371449635398431
+American Express Corporate	378734493671000
+Diners Club	30569309025904
+Discover	6011111111111117
+Discover	6011000990139424
+JCB	3530111333300000
+JCB	3566002020360505
+MasterCard	2221000000000009
+MasterCard	2223000048400011
+MasterCard	2223016768739313
+MasterCard	5555555555554444
+MasterCard	5105105105105100
+Visa	4111111111111111
+Visa	4012888888881881
+Visa	4222222222222

--
Gitblit v1.10.0