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