NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Výpočet data velikonoc - pomoc s řešením

Aktivity
Avatar
Filip Nguyen
Člen
Avatar
Filip Nguyen:5.12.2017 20:53

ZADÁNÍ:
a = zbytek po dělení roku číslem 19
b =
zbytek po dělení roku číslem 4
c =zbytek po dělení roku číslem 7
Pro 20. a 21. století platí konstanty:
m = 24
n = 5
d = Zbytek po dělení (19a + m) číslem 30
e = Zbytek po dělení (n + 2b + 4c + 6d) číslem 7
Den u a měsíc v Velikonoční neděle se určí následovně:

u = d + e − 9
Je-li u = 25, d = 28, e = 6 a a > 10, pak u = 18, v = 4 a Velikonoční neděle připadá na 18. duben.
Jinak, je-li u ≥ 1 a u ≤ 25, pak v = 4 a Velikonoční neděle připadá na u-tý duben.
Jinak, je-li u > 25, pak u = u - 7, v = 4 a Velikonoční neděle připadá na u-tý duben.
Jinak u = 22 + d + e, v = 3 a Velikonoční neděle připadá na u-tý březen.

ŘEŠENÍ:
def datumvelikono­ce(rok):
a = rok % 19
b = rok % 4
c = rok % 7
d = ((a * 19) + 24) % 30
e = (5 + (b*2) + (c * 4) + (d * 6)) % 7
u = d + e - 9

if(u==25, d==28, e==6, a > 10):
return datumvelikono­ce(rok, 18,4)

if(u > 1, u <=25):
return datumvelikono­ce(rok, u, 4)

if(u > 25):
return datumvelikono­ce(rok, u - 7,4)

if(u == 22 + d + e):
return datumvelikono­ce(rok, u + 31,3)

píše mi to chybu u return a já nevím jak bych to měl udělat.

 
Odpovědět
5.12.2017 20:53
Avatar
zitekv
Člen
Avatar
Odpovídá na Filip Nguyen
zitekv:5.12.2017 22:38

Ahoj,

  1. jakou chybu to píše?
  2. odhaduji, že se mu nelíbí případ, kdy by žádná podmínka nebyla splněna - neměl by co vrátit (programu je jedno, že to nastat nemůže), takže zkus nakonec přidat něco jako
return datumvelikonoce(rok,1,4)

Ps: pro kód používej tlačítko </> lépe se to čte.

 
Nahoru Odpovědět
5.12.2017 22:38
Avatar
Honza Skřivánek:5.12.2017 23:11

Ta poslední podmínka není if, ale else podle té tvé definice.

Jinak u = 22 + d + e, v = 3 a Velikonoční neděle připadá na u-tý březen.

To znamená, že výsledek je u = 22 + d + e a v = 3, pokud nebyla splněna žádná z předchozích podmínek.

Dál máš tunu chyb v syntaxi a v logice kódu. Nemůžeš rekurzivně vracet datumvelikonoc(x, y, z). Nejen že máš tu funkci definovanou pouze s jedním parametrem, ale ani to nedává žádný smysl.

Tady je na rychlo vytvořená verze (snad bez chyb, spustit to jde). Doporučuju si zopakovat základy Pythonu.

def datumvelikonoce(rok):
    a = rok % 19
    b = rok % 4
    c = rok % 7
    d = ((a * 19) + 24) % 30
    e = (5 + (b*2) + (c * 4) + (d * 6)) % 7
    u = d + e - 9

    if (u==25 and d==28 and e==6 and a > 10):
        return (rok, 18,4)

    elif (u >= 1 and u <=25):
        return (rok, u, 4)

    elif(u > 25):
        return (rok, u - 7,4)

    else:
        return (rok, 22 + d + e, 3)
 
Nahoru Odpovědět
5.12.2017 23:11
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.