Hjälp med en övningsuppgift (Universitetsuppgift, Python)

Permalänk
Medlem

Hjälp med en övningsuppgift (Universitetsuppgift, Python)

Hej! Ta gärna bort denna om det inte ska vara här eller om den är för lång, ber om ursäkt isåfall. Har lite problem med en övningsuppgift jag fått av min universitetslärare. Uppgift:
Uppgiften går ut på att skriva ett program som läser in ett datum på formen år, månad och dag
(tre heltal) och skriver ut vilken veckodag det är.
Veckodagsberäkningen ska göras med en formel som kallas Zellers kongruens, se nedan.
Programdialogen ska se ut så här (användarens inmatning i svart text):
Year: 2018
Month: 8
Day: 21
It is a Tuesday
Användarens inmatning ska kontrolleras och varje fråga ska upprepas tills användaren har
besvarat den korrekt. Programdialogen skulle alltså kunna se ut så här:
Year: 1066
Out of allowed range 1583 to 9999
Year: 20178
Out of allowed range 1583 to 9999
Year: 2018
Month: 15
Out of allowed range 1 to 12
Month: 9
Day: 0
Out of allowed range 1 to 30
Day: 31
Out of allowed range 1 to 30
Day: 13
It is a Thursday

Följande ska kontrolleras:
att årtalet är i intervallet 1583 – 9999
att månaden är i intervallet 1-12
att dagnummer inom månaden stämmer överens med månadsnumret, dvs att om
månaden är 1, 3, 5, 7, 8, 10 eller 12 så är dagnummer i intervallet 1-31, om månaden
är 4, 6, 9, eller 11 så är dagnummer i intervallet 1-30 och om månaden är 2 så är
dagnummer i intervallet 1-28 eller 1-29 beroende på om det är skottår eller ej.
Det är skottår om årtalet är jämnt delbart med 400, eller om det är jämnt delbart med 4
men inte jämnt delbart med 100.

Zellers kongruens börjar gälla år 1583, året efter det att många länder övergick till den Gregorianska kalendern.

Den börjar med att man kodar om månaden så att januari resp. februari betraktas som
månaderna 13 resp. 14 föregående år:
if month == 1 or month == 2:
month += 12
year -= 1
Sedan kan man räkna ut veckodagen ur formeln:
weekday = ( day + 13*(month+1)//5 + year + year//4
- year//100 + year//400 ) % 7
där veckodagen är kodad som 0 = lördag, 1 = söndag, 2 = måndag, …, 6 = fredag.

Tusen tack i förhand för all hjälp

Permalänk
Medlem

Du bör skriva vad du har problem med samt kanske visa lite kodsnuttar om det är någonstans du fastnar. För specen känns ju rätt straight forward!

Permalänk
Medlem

Tack

Okej tack! Återkommer

Permalänk
Medlem

Koden

@Forsgren: Väldigt fördröjt svar men här kommer koden! Får syntax fel på; if weekday == 0:, men förstår inte riktigt varför.

#############################################################

day = ["Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]

month = ["January", "February", "March", "April", "June", "July", "August", "September", "October", "November", "December"]

maxdagar = [31,28,31,30,31,30,31,31,30,31,30,31]

year = int(input("Year: "))
while year < 1583 or year > 9999:
print("Out of allowed range 1583 to 9999")
year = int(input("Year: "))

month = int(input("Month: "))
while month < 1 or month > 12:
print("Out of allowed range 1 to 12")
month = int(input("Month: "))

day = int(input("Day: "))
if year %400 == 0 or (year % 4 == 0 and year % 100 != 0):
while month == 2 and day < 1 or day > 29:
print("Out of allowed range 1 to 29")
day = int(input("Day: "))

while month in (1, 3, 5, 7, 8, 10, 12) and day < 1 or day > 31:
print("Out of allowed range 1 to 32")
day = int(input("Day: "))

while month in (4, 6, 9, 11) and day < 1 or day > 30:
print("Out of allowed range 1 to 30")
day = int(input("Day: "))

else:
while month == 2 and day < 1 or day > 28:
print("Out of allowed range 1 to 28")
day = int(input("Day: "))

while month in (1, 3, 5 , 7, 8, 10, 12) and day < 1 or day > 31:
print("Out of allowed range 1 to 31")
day = int(input("Day: "))

if month == 1 or month == 2:
month += 12
year -= 1

weekday = (day + 13 * (month + 1 // 5 + year + year // 4 - year // 4 - year // 100 + year // 400) & 7

if weekday == 0:
print("It is a Saturday")

elif weekday == 1:
print("It is a Sunday")

elif weekday == 2:
print("It is a Monday")

elif weekday == 3:
print("It is a Tuesday")

elif weekday == 4:
print("It is a Wednesday")

elif weekday == 5:
print("It is a Thursday")

elif weekday == 6:
print("It is a Friday")

##############################
obs dom är indenterade (efter satserna) men gick inte att få in det här på forumet när jag copy pasteade.

Permalänk
Medlem

@Poppsa: Du kan använda code-taggar för att bevara indenteringen:
[code]
Kod här
[/code]
Du kan troligtvis redigera ditt inlägg och lägga dit taggar i efterhand, indentering är ju ganska viktig när det gäller just Python.

När det gäller felet du får så skulle det nog underlätta om du klistrade in felet du får från Python.

Permalänk

Felet finns raden innan.

weekday = (day + 13 * (month + 1 // 5 + year + year // 4 - year // 4 - year // 100 + year // 400) & 7

Där saknas en högerparentes.
Och du vill antagligen ha ett % istället för ett & ...

Visa signatur

// Lars Lindehaven