Python Kalender

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Python123.py
User
Beiträge: 12
Registriert: Freitag 20. Dezember 2019, 12:39

Hallo,
unsere Aufgabe ist es einen Kalender zu programmieren.
Leider komme ich bei der Darstellung nicht richtig weiter.
Hier der Code:

Code: Alles auswählen

 import math

jahr = 2019  # input("Geben Sie das Jahr ein: ")
monat = 12  # input("Geben Sie den Monat als Zahl ein: ")
tag_name = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag']
tag_zahl = [1, 2, 3, 4, 5, 6, 7]
tag = 1


monat_name = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']
tage_zahl = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

if type(jahr) is not int:
	print("Ungültige Eingabe! Bitte wiederholen!")
	jahr = input("Bitte geben Sie das Jahr erneut ein: ")
	
if type(monat) is not int:
	print("Die Eingabe ist ungültig! Bitte wiederholen!")
	monat = input("Bitte geben Sie den Monat erneut ein: ")

monat = int(monat)
while monat > 12 or monat < 1:
	print("Die Eingabe des Monats ist ungültig!")
	monat = int(input("Bitte geben Sie den Monat erneut ein: "))

jahr = int(jahr)
while jahr < 1 or jahr > 9999:
	print("Das Jahr ist ungültig!")
	jahr = int(input("Bitte geben Sie das Jahr erneut ein: "))

jahr2 = jahr
if monat < 3:
	jahr -= 1
	
w = ((tag + math.floor(2.6 * ((monat + 9) % 12 + 1) - 0.2) + jahr % 100 + math.floor(jahr % 100 / 4) + math.floor(jahr / 400) - 2 * math.floor(jahr / 100) - 1) % 7 + 7) % 7 + 1
# Quelle: https://de.wikipedia.org/wiki/Wochentagsberechnung#Programmierung

print()
print("Jahr: ", jahr)
print("Monat: ", monat)
# 1 = Januar, ... , 12 = Dezember
print("Tagesanzahl: ", w)
# 1 = Montag, ... , 7 = Sonntag
print("Anzahl der Tage des Monats:",tage_zahl[monat-1])
print("Tag: ", tag)
print()
print("-----------------------------")
print()

if monat == 1:
	print("   Januar", jahr2)
if monat == 2:
	print("   Februar", jahr2)
if monat == 3:
	print("   März", jahr2)
if monat == 4:
	print("   April", jahr2)
if monat == 5:
	print("      Mai", jahr2)
if monat == 6:
	print("     Juni", jahr2)
if monat == 7:
	print("     Juli", jahr2)
if monat == 8:
	print("   August", jahr2)
if monat == 9:
	print("   September", jahr2)
if monat == 10:
	print("   Oktober", jahr2)
if monat == 11:
	print("   November", jahr2)
if monat == 12:
	print("   Dezember", jahr2)
	
x1 = 1
	
print("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So", end="")
tage = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
print("")
for x in range(1, tage_zahl[monat-1]+1):
	if x < 10:
		print("",x, end=" ")
	if x > 9:
		print(x, end=" ")
	if not x % 7:
		print(" ")

print()
Die Datumszahlen müssen noch unter die richtigen Tage.
Wir benutzen bislang nur die Standardbefehle wie if, while, for...

Vielen Dank für die Antworten und einen schönen Tag noch!
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hallo,

das löst jetzt nicht deinen Fehler/Problem, aber statt zwei Listen zu benutzen, würde ich dir ein Dictionary empfehlen, also statt:

Code: Alles auswählen

tag_name = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag']
tag_zahl = [1, 2, 3, 4, 5, 6, 7]
lieber:

Code: Alles auswählen

tage_mit_zahl = {1:'Montag', 2:'Dienstag',3:'Mittwoch',4:'Donnerstag',5:'Freitag',6:'Samstag',7:'Sonntag'}
Das gleiche bei den Monaten mit Anzahl Tage.



statt:

Code: Alles auswählen

print("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So", end="")
kannst du auch:

Code: Alles auswählen

tage = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
for tag in tage:
    print(tag, end ="")
nehmen wenn die Liste ja schon vorhanden ist.


x1 wird der Wert 1 zugewiesen, aber x1 wird gar nicht benutzt, kann also weg.



Strings fügt man mit Stringformatierung zusammen, nicht mit Kommas.
also statt:

Code: Alles auswählen

print("Jahr: ", jahr)
print("Monat: ", monat)
lieber:

Code: Alles auswählen

print(f"Jahr: {jahr}")
print(f"Monat: {monat}")



Statt zu prüfen ob der eigegebene Wert richtig ist würde ich die Eingabe so abändern, dass das Programm gar nicht fortsetzt wenn eine falsche Eingabe erfolgt, Beispiel:

Code: Alles auswählen

while True:
    try:
        zahl = int(input("Bitte Jahr eingeben: "))
        if zahl > 0 and zahl < 9999:
            break
        else:
            print("Das Jahr muss zwischen 0 und 9999 liegen")
            continue
    except ValueError:
        print("Fehler bei der Eingabe")


print(zahl)

Außerdem ist deine Einrückung an manchen Stellen zu weit, laut Konvention wird mit 4 Leerzeichen eingerückt.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jankie: Tag-Zahl wird gar nicht gebraucht, weil das einfach der Index in die Liste +1 ist.

@Python123.py: es ist unsinnig, Das Jahr fest in den Code einzuprogrammieren und dann noch eine Typabfrage zu machen und den Nutzer interaktiv nach dem Jahr zu fragen. Typabfrage ist eigentlich selten sinnvoll. Es gibt genug andere Typen außer int, mit denen das Programm genausogut läuft. Man legt einfach drauf los, und wenn der Typ nicht passt, dann wird schon an einer Stelle eine Fehlermeldung geworfen, die man, wenn es sein muß, abfangen kann, um eine sprechendere Fehlermeldung draus zu machen.

Statt ein `jahr2` zu definieren und damit überall weiterzuarbeiten, sollte die Bestimmung des Wochentags in eine Funktion wandern, wo man einfach lokal die Jahreszahl anpassen kann. ` w` ist ein schlechter Name für einen Wochentag, ` wochentag` wäre passender.
Statt der Langen if-Reihe um den Monat auszugeben, bentuze doch einfach die schon vorhandene Liste.

Es gibt Stringformatierung, um z.B. alle Zahlen auf 2-Stellen auszugeben. Statt if und if mit umgekehrter Bedingung benutzt man elif bzw. else.
`x1` wird nicht benutzt und `x` ist ein äußerst schlechter Name für einen Tag. Konstanten schreibt man KOMPLETT_GROSS, damit man sie als Konstanten erkennen kann.

Code: Alles auswählen

import math

TAG_NAME = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag']
TAG_KURZNAME = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
MONAT_NAME = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']
MONAT_TAGE = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def berechne_wochentag(tag, monat, jahr):
    # Quelle: https://de.wikipedia.org/wiki/Wochentagsberechnung#Programmierung
    if monat < 3:
        jahr -= 1
    return ((tag
             + math.floor(2.6 * ((monat + 9) % 12 + 1) - 0.2)
             + jahr % 100
             + jahr % 100 // 4
             + jahr // 400
             - 2 * (jahr // 100) - 1
             ) % 7 + 7) % 7 + 1

def kalender_ausgeben(tag, monat, jahr):
    wochentag = berechne_wochentag(tag, monat, jahr)
    print()
    print("Jahr: ", jahr)
    print("Monat: ", monat)
    # 1 = Januar, ... , 12 = Dezember
    print("Tagesanzahl: ", wochentag)
    # 1 = Montag, ... , 7 = Sonntag
    print("Anzahl der Tage des Monats:",MONAT_TAGE[monat-1])
    print("Tag: ", tag)
    print()
    print("-----------------------------")
    print()
    print(MONAT_NAME[monat - 1], jahr)
    print(" ".join(TAG_KURZNAME))
    for tag in range(1, MONAT_TAGE[monat-1]+1):
        print(f"{tag:2d}", end=" ")
        if tag % 7 == 0:
            print()
    print()

jahr = 2019  # int(input("Geben Sie das Jahr ein: "))
monat = 12  # int(input("Geben Sie den Monat als Zahl ein: "))
tag = 1
kalender_ausgeben(jahr, monat, tag)
Für die Ausgabe ist der Trick, die Tage um den Anfangswochentag zu verschieben und statt negativer Zahlen einfach Leerzeichen auszugeben.
Die Behandlung von Schaltjahren fehlt noch.
Python123.py
User
Beiträge: 12
Registriert: Freitag 20. Dezember 2019, 12:39

Hallo,
danke für die Antworten!
Befehle wie def oder Dictionary hatten wir bislang noch nicht.
Ich habe nur das Jahr und den Monat festgelegt, damit ich das nicht immer selber eingeben muss.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Wenn du gerade Python in der Schule lernst, dann empfehle ich dir die Offizielle Python Doku mal durch zu arbeiten wenn Motivation da ist. Das ist meiner Meinung nach ein sehr guter Einstieg in Python und es hält sich auch an die Konventionen.
Python123.py
User
Beiträge: 12
Registriert: Freitag 20. Dezember 2019, 12:39

Hallo,
kann mir vielleicht noch jemand einen Ansatz zur Darstellung sagen?
Die Aufgabe soll heute Abend abgegeben werden.
Die Befehle DICTIONARY, DEF oder EXCEPT hatten wir noch nicht.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

den Ansatz zur Darstellung habe ich Dir doch schon geschrieben.
Antworten