Počítače Okna Internet

Kolik dní v měsíci květnu. Určení počtu dní v měsíci v aplikaci Microsoft Excel. Výpočet počtu dnů mezi daty

Nedávno jsem po dlouhé době strávené bez spánku přemýšlel o tom, jak můžete zjistit počet dní v měsíci, když znáte jeho počet. Na toto téma existují dětské říkanky, existuje způsob počítání podle kloubů, ale tyto metody mi nevyhovují - vrhl jsem se do hledání matematického vzorce, který jsem po chvíli odvodil.

Takže úkol

Formálně Jinými slovy, musíme získat funkci f (x), která by poskytla následující seznam hodnot (které jsem mimochodem našel někde na internetu a nededukoval pomocí mnemotechnických pravidel):

Je třeba poznamenat, že jako argument dostáváme pouze číslo měsíce, tj. nepočítáme přestupné roky, a f (2) = 28.

Pokud chcete znát výsledek, který jsem dostal, přejděte na konec této stránky. Níže bude popsáno odvození požadovaného vzorce.

Co budeme používat

Kromě sčítání, odčítání a násobení použiji dvě operace: celočíselné dělení a zbytek. Dovolte mi, abych vám připomněl, co to je:

  • Celočíselné dělení, nebo „rozdělení a zaokrouhlení dolů“. Budu to reprezentovat jako obvyklé rozdělení: a / b - což znamená ⌊a / b⌋. Například 5/3 = 1.
  • Vezmeme zbytek modulo... Tradiční rozdělení budu označovat zbytkem: a% b = a - (a / b) * b. Například 5% 3 = 2.

Mají stejnou prioritu a zůstávají asociativní.

Základy nebo pravidlo s mnoha výjimkami

Zkusme najít takový vzorec, který by uspokojil co nejvíce hodnot argumentu. Obvykle se počet dní v měsíci pohybuje mezi 30 a 31. Současně si můžete všimnout závislosti tohoto čísla na paritě měsíce - použijeme tedy operaci odebrání zbývajícího modulu 2. To vypadá to, že by to mělo být něco jako:

f₁ (x) = 30 + x% 2


Pěkný začátek! Bez ohledu na únor, který evidentně bude muset jít na nějaké triky, buďme rádi, že jsme mohli upravit funkci pro první polovinu roku. A poté, počínaje srpnem, musí být parita změněna na opačnou. To lze provést výměnou x% 2 v první verzi vzorce na (x + 1)% 2:

f₂ (x) = 30 + (x + 1)% 2


Jak se dalo očekávat, první polovina roku je již mimo rozsah správných hodnot, ale měsíce od srpna do prosince poskytly to, co potřebujeme. Pojďme najít způsob, jak tyto dvě části spojit.

Maska

K aktivaci dividendy potřebujeme +1, jen když argument dosáhne hodnot větších než 8, tj. musíme použít nějakou masku. V tomto případě hodnoty argumentu nesmí překročit 12. Proto je pro nás ideální celočíselné dělení argumentu 8:


Přesně tak, jak to potřebujeme. Použijme tento závěr:

f₃ (x) = 30 + (x + x / 8)% 2


Páni! Všechno je v pořádku, kromě února. Jak nečekané.

Únor

Všechny měsíce mají 30 nebo 31 dní, v únoru - 28 (pamatujte, neuvažujeme přestupné roky).

Historický odkaz: V římském kalendáři byl únor posledním měsícem v roce - musíte uznat, že přidání jednoho dne v přestupných letech na konec kalendáře je intuitivnější. Používáme však gregoriánský kalendář, ve kterém se nejkratší měsíc vůlí jednoho z moudrých vládců posune blíže k začátku.

Ve většině Nejnovější verze náš vzorec dostal 30 dní v únoru. Proto od něj musíme odříznout pár dní. Přirozeně tím bude trpět několik dalších měsíců: buď vlevo od února, nebo vpravo od toho v našem seznamu - vpravo je však mnohem méně měsíců, takže budeme muset obětovat leden a poté upravit vzorec pro to. Pomocí výrazu můžete odříznout dny pro první a druhý měsíc 2% x.

Poznámka: tento příspěvek je překladem článku cmcenroe.me/2014/12/05/days-in-month-formula.html ( Část I), jakož i autorův dodatek ( Část II). Neměli byste brát materiál vážně, ale spíše jako rozcvičku pro mysl, která nevyžaduje nic jiného než školní znalosti o aritmetice a nemá žádné praktické uplatnění. Šťastné čtení všem!

Část I

Úvod

Nedávno jsem po další bezesné noci přemýšlel o metodách, jak si zapamatovat počet dní v každém měsíci v roce. K tomu existuje počítací stroj a způsob, jak počítat s klouby prstů, ale ani jedno, ani druhé mi nevyhovovalo. Zajímalo mě, jestli existuje nějaký matematický vzorec pro řešení takového problému, a - nenašel jsem ho s letmým studiem - vyzval jsem sám sebe, abych jej vytvořil.

Formalizace Jinými slovy, je nutné najít funkci F taková, že hodnota f (x) za každý měsíc X, reprezentovaný číslem od 1 do 12, se rovná počtu dnů v daném měsíci. Tabulka hodnot argumentů a funkcí:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 28 31 30 31 30 31 31 30 31 30 31

Pokud máte touhu vyzkoušet si to sami, než si přečtete moje řešení, pak je nejvyšší čas. Pokud dáváte přednost okamžité odpovědi, podívejte se pod spoiler.

Odpovědět


Níže jsou uvedeny mé kroky k nalezení řešení.

Matematický aparát

Nejprve si rychle obnovme paměť u dvou životně důležitých operátorů při řešení tohoto problému: celočíselné dělení a zbytek dělení.

Celočíselné dělení je to operátor používaný v mnoha programovacích jazycích při dělení dvou celých čísel a vyřazení zlomkové části z kvocientu. Vylíčím ho jako. Například:

Zbytek divize je to operátor, který najde zbytek divize. Mnoho programovacích jazyků používá symbol % , ale použiji například konstrukce formuláře:

Zbývající část divize má stejnou prioritu jako divize.

Základy

Aplikujme tedy náš matematický aparát, abychom získali základní vzorec. V typickém měsíci je 30 nebo 31 dní, takže můžeme použít 1 nebo 0 k získání střídavě a pak k tomuto číslu stačí přidat konstantu:

Získáme tabulku, správné hodnoty jsou zvýrazněny tučně:
X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 30 31 30 31 30 31 30 31 30 31 30

Pěkný začátek! Pro leden a měsíce březen až červenec včetně již existují správné hodnoty. Únor je speciální případ a my se jím budeme zabývat o něco později. Po červenci musí být pro zbývající měsíce obráceno pořadí získávání 0 a 1.
Za tímto účelem můžeme k dividendě přidat 1:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 30 31 30 31 30 31 30 31 30 31 30 31

Nyní jsou správné hodnoty od srpna do prosince, ale podle očekávání jsou hodnoty pro ostatní měsíce nesprávné. Podívejme se, jak můžeme tyto vzorce kombinovat.

Překrytí masky

To vyžaduje po částech definovanou funkci, ale - protože se mi to zdálo nudné - přemýšlel jsem o jiném řešení, přičemž jednu část funkce používám v jednom intervalu, druhou v jiném.
Myslím, že je nejjednodušší najít výraz, který se rovná 1 v jedné aplikaci a 0 ve zbytku. Metodu, ve které vynásobením argumentu výrazem jej vyloučíme ze vzorce mimo rozsah jeho aplikace, jsem nazval „maskování“, protože toto chování je podobné nějakému druhu bitové masky.
Chcete -li tuto metodu použít v poslední části naší funkce, musíte najít výraz rovný 1 pro a - protože hodnoty argumentů jsou vždy menší než 16 - celočíselné dělení číslem 8 je v pořádku.
X 1 2 3 4 5 6 7 8 9 10 11 12
X ⁄ 8 ⌋ 0 0 0 0 0 0 0 1 1 1 1 1

Nyní pomocí této masky a pomocí výrazu místo 1 v dividendě můžeme nahradit pořadí získávání 0 a 1 vzorce opačným:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 30 31 30 31 30 31 31 30 31 30 31

Heuréka! Všechno je v pořádku, kromě února. Překvapivé překvapení.

Únor

Každý měsíc má 30 nebo 31 dní, kromě února s jeho 28. (přestupný rok je mimo rozsah tohoto problému). V tuto chvíli má podle našeho vzorce 30 dní, takže by bylo hezké odečíst výraz rovný 2 at.
Nejlepší, co jsem mohl vymyslet, je toto, které maskuje všechny měsíce po únoru:
X 1 2 3 4 5 6 7 8 9 10 11 12
2 mod X 0 0 2 2 2 2 2 2 2 2 2 2

Po změně základní konstanty na 28 a přidání 2 ke zbytku měsíců dostaneme vzorec:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 29 28 31 30 31 30 31 31 30 31 30 31

Leden je bohužel nyní o 2 dny kratší. Naštěstí je snadné získat výraz, který platí pouze pro první měsíc: je to převrácená hodnota zaokrouhleného dolů. Vynásobením 2 získáme konečný vzorec:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 28 31 30 31 30 31 31 30 31 30 31

Doslov

Tady to je - vzorec pro získání počtu dní v kterémkoli měsíci v roce pomocí jednoduché aritmetiky. Až si příště budete pamatovat, kolik dní je v září, udělejte to jednoduše pomocí této jednořádkové funkce JavaScriptu:

Funkce f (x) (návratnost 28 + (x + mat. Podlaha (x / 8))% 2 + 2% x + 2 * mat. Podlaha (1 / x);)

Část II

Úvod

V první části byl získán krátký a dokonce mírně elegantní vzorec, jehož hlavními výhodami jsou jednoduchost matematického aparátu, absence větví a podmíněných výrazů a stručnost. Mezi nevýhody - kromě toho, že jej ve svém projektu nepoužijete - patří nedostatečné ověření viscoco a nepřestupných let.
Proto jsem si dal za úkol vytvořit funkci F taková, že hodnota f (x, y) za každý měsíc X reprezentován číslem od 1 do 12 a rok y větší než 0 se rovná počtu dní v měsíci X v roce y.
Pro netrpělivé je pod spoilerem připravená odpověď, zatímco ostatní jsou požádáni, aby mě následovali.

Odpovědět

Zbytek divize: mod a ⌊⌋

Pro vizuální srozumitelnost se shodneme na tom, že v některých vzorcích je operátor dělení se zbytkem nahrazen nižšími závorkami, kde mi to přišlo nutné:

Přestupný rok

V přestupném roce je zaveden další kalendářní den: 29. února. Jak víte, přestupný rok je násobkem 4 a nikoli násobkem 100 nebo násobkem 400. Zapíšeme výraz shodný s tímto tvrzením:

Chcete -li tento výraz převést na algebraický, je nutné na výsledek výrazu použít injekci formuláře:

Což vám umožní získat 1 při dělení beze zbytku a 0 při dělení zbytkem, abyste jej mohli použít ve vzorci pro určení počtu dní v měsíci.

Jako funkci g " 1 mínus zbytek můžete použít na:

X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
g "(x) Nekonečno 1 0 0 0 0 0 0 0 0 0 0 0 0 0

Je snadné vidět, že zvýšením dividendy a dělitele o 1 získáme správný vzorec pro:
X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
g "(x) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Výraz bude tedy zapsán jako:


A výraz zapíšeme jako:

Aplikováním tohoto přístupu získáme následující funkci g (y), jehož hodnota bude 1, pokud je rok přestupným rokem, nebo 0 jinak:

y 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
g (y) 0 0 1 0 0 0 1 0 0 0 1
y 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000
g (y) 1 0 0 0 1 0 0 0 1 0 0

Skokové roky jsou vyznačeny tučně.

Připomínám, že v rámci přijaté dohody může být operátor pro získání zbývající části divize zobrazen jako mod a ⌊⌋.

Překrytí masky

Ve vzorci je součástí dodatek, který přidává 2 dny do ledna. Pokud odstraníme faktor 2 a v čitateli nahradíme 1 číslem 2, pak tento vzorec přidá 2 dny do ledna a 1 den do února, což nám dává klíč k přidání dne v přestupném roce. Pro přehlednost používáme ve vzorci mezilehlou hodnotu g (y) a jako y používáme 2000 (přestupný) a 2001 (nepřestupný) rok:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
f (x, 2001) 30 28 31 30 31 30 31 31 30 31 30 30

Hodnoty pro všechny měsíce kromě ledna nepřestupného roku jsou správné.

Chcete -li toto nepříjemné nedorozumění napravit, přidejte 1 den do ledna podle vzorce, který již známe:


Nebo:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
f (x, 2001) 31 28 31 30 31 30 31 31 30 31 30 30

Závěr

V důsledku toho se získá mnohem těžkopádnější, ale univerzálnější vzorec, který lze také použít k získání počtu dnů v měsíci určitého roku:

Funkce f (x, y) (návratnost 28 + ((x + mat. Podlaha (x / 8))% 2) + 2% x + mat. Podlaha ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x) + Mat. Podlaha (1 / x) - Mat. Podlaha (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
Příklad v C # ideone.com/fANutz.

1 ... Nevím, jak takové mnemotechnické pomůcky používat, proto jsem špehoval nápis na internetu.
2 ... „Základy“ nebo „Pravidlo s mnoha výjimkami“, jako většina pravidel.
3 ... Zpočátku byl únor posledním měsícem v římském kalendáři, takže existuje logika, že je kratší než všechny ostatní. Logika je také v přidávání nebo odebírání dne na konci roku, takže jeho délka je proměnlivá.

Aktualizace 1:
Alternativní překlad prvního dílu v

Chcete -li vyřešit některé problémy při vytváření tabulky, musíte zadat počet dní v měsíci v samostatné buňce nebo uvnitř vzorce, aby program provedl potřebné výpočty. Excel má nástroje pro provedení této operace. uvažujme různé způsoby uplatnění této příležitosti.

Počet dní v měsíci v aplikaci Excel můžete vypočítat pomocí operátorů zvláštní kategorie "Datum a čas"... Chcete -li zjistit, kterou možnost je nejlepší použít, musíte nejprve stanovit cíle operace. V závislosti na tom lze výsledek výpočtu zobrazit v samostatném prvku na listu nebo jej lze použít uvnitř jiného vzorce.

Metoda 1: kombinace operátorů DEN a EONMONTH

Většina jednoduchým způsobem k vyřešení tohoto problému je kombinace operátorů DEN a EONTHS.

Funkce DEN patří do skupiny operátorů "Datum a čas"... Ukazuje na konkrétní číslo od 1 před 31 ... V našem případě bude úkolem tohoto operátora indikovat poslední den měsíce pomocí vestavěné funkce jako argumentu EONTHS.

Syntaxe operátora DEN další:

DAY (date_num_format)

To znamená, že jediným argumentem této funkce je „Datum v číselném formátu“... Nastaví to operátor EONTHS... Je třeba říci, že datum v číselném formátu se liší od obvyklého formátu. Například datum 04.05.2017 číselně to bude vypadat 42859 ... Proto Excel používá tento formát pouze pro interní operace. Zřídka se používá k zobrazení v buňkách.

Operátor EONTHS je určen k označení pořadového čísla posledního dne v měsíci, což je zadaný počet měsíců dopředu nebo dozadu od zadaného data. Syntaxe funkce je následující:

EON MONTHS (počáteční_datum, počet_měsíců)

Operátor "Datum začátku" obsahuje datum, od kterého je odpočítávání provedeno, nebo odkaz na buňku, kde se nachází.

Operátor „Počet měsíců“ udává počet měsíců, které se mají počítat od daného data.

Nyní se podívejme, jak to funguje na konkrétním příkladu. K tomu si vezmeme list aplikace Excel, do jedné z buněk, ve které je zapsáno určité číslo kalendáře. Pomocí výše uvedené sady operátorů je nutné určit, kolik dní je v měsíčním období, na které se toto číslo vztahuje.


Náš obecný vzorec měl následující formu:

DEN (EONTHS (B3,0))

V tomto vzorci je hodnotou proměnné pouze adresa buňky ( B3). Pokud tedy nechcete provést proceduru pomocí Průvodci funkcí, můžete tento vzorec vložit do libovolného prvku listu prostým nahrazením adresy buňky obsahující číslo číslem, které je relevantní ve vašem konkrétním případě. Výsledek bude podobný.

Metoda 2: automatické určení počtu dnů

Nyní se podívejme na další problém. Je vyžadováno, aby se počet dní nezobrazoval podle daného kalendářního data, ale podle aktuálního. Změna období by navíc byla prováděna automaticky bez zásahu uživatele. Může to vypadat divně, ale tento úkol je jednodušší než ten předchozí. Chcete -li to vyřešit, dokonce otevřete Průvodce funkcí zbytečné, protože vzorec provádějící tuto operaci neobsahuje hodnoty proměnných ani odkazy na buňky. Následující vzorec můžete jednoduše vnést do buňky listu, kde chcete, aby se výsledek zobrazoval beze změn:

DEN (E-MONTHS (TODAY (); 0))

Vestavěná funkce DNES, kterou jsme v tomto případě použili, zobrazuje dnešní číslo a nemá žádné argumenty. Vaše buňka tedy bude neustále zobrazovat počet dní v aktuálním měsíci.

Metoda 3: Výpočet počtu dnů, které se mají použít ve složitých vzorcích

Ve výše uvedených příkladech jsme ukázali, jak vypočítat počet dní v měsíci pro zadané kalendářní datum nebo automaticky pro aktuální měsíc s výstupem výsledku v samostatné buňce. Zjištění této hodnoty však může být nutné i pro výpočet dalších ukazatelů. V tomto případě bude výpočet počtu dní proveden v rámci komplexního vzorce a nebude zobrazen v samostatné buňce. Podívejme se, jak to udělat na příkladu.

V buňce musíme nastavit počet dní, které zbývají do konce aktuálního měsíce. Stejně jako v předchozím způsobu tato možnost nevyžaduje otevření Průvodci funkcí... Do buňky stačí zadat následující výraz:

DEN (E -MONTHS (TODAY (); 0)) - DAY (TODAY ())

Poté se v zadané buňce zobrazí počet dní do konce měsíce. Každý den bude výsledek automaticky aktualizován a od začátku nového období začne odpočítávání znovu. Ukázalo se, že jde o druh odpočítávacího časovače.

Jak vidíte, tento vzorec se skládá ze dvou částí. První z nich je již známý výraz pro výpočet počtu dní v měsíci:

DEN (E-MONTHS (TODAY (); 0))

Ale ve druhé části je dnešní číslo odečteno od tohoto ukazatele:

ZE DNE NA DEN ())

Při provádění tohoto výpočtu je tedy vzorec pro výpočet počtu dnů součástí složitějšího vzorce.

Metoda 4: alternativní vzorec

Verze programu starší než Excel 2007 ale bohužel nemají tohoto operátora EONTHS... A co ti uživatelé, kteří používají staré verze aplikace? Pro ně tato příležitost existuje prostřednictvím jiného vzorce, který je masivnější než ten popsaný výše. Podívejme se, jak pomocí této možnosti vypočítat počet dní v měsíci pro dané kalendářní datum.

  1. Vyberte buňku pro zobrazení výsledku a přejděte do okna argumentů operátora DEN způsobem, který je nám již známý. Umístěte kurzor do jediného pole tohoto okna a klikněte na převrácený trojúhelník nalevo od řádku vzorců. Přejděte do sekce "Další funkce ...".
  2. V okně Průvodci funkcí ve skupině "Datum a čas" zvýrazněte jméno "DATUM" a klikněte na tlačítko "OK".
  3. Spustí se okno operátora DATUM. Tato funkce převede datum z obvyklého formátu na číselnou hodnotu, kterou pak bude muset operátor zpracovat DEN.

    Otevřené okno má tři pole. V poli "Den" můžete okamžitě zadat číslo "1"... Bude to stejná akce pro každou situaci. Ale další dvě pole bude nutné důkladně řešit.

    Umístěte kurzor do pole "Rok"... Dále se zaměříme na výběr operátorů prostřednictvím známého trojúhelníku.

  4. Všichni ve stejné kategorii Průvodci funkcí zvýrazněte jméno "ROK" a klikněte na tlačítko "OK".
  5. Spustí se okno s argumenty operátora ROK... Určuje rok k uvedenému datu. V jednom okně „Datum v číselném formátu“ určujeme odkaz na buňku obsahující původní datum, pro které chcete určit počet dní. Poté nespěchejte na kliknutí na tlačítko "OK" a klikněte na jméno "DATUM" na řádku vzorců.
  6. Poté se opět vrátíme do okna argumentů. DATUM... Umístěte kurzor do pole "Měsíc" a přejděte k výběru funkcí.
  7. PROTI Průvodce funkcí klikněte na jméno "MĚSÍC" a klikněte na tlačítko "OK".
  8. Spustí se okno s argumenty funkcí MĚSÍC... Jeho úkoly jsou podobné předchozímu operátorovi, pouze zobrazuje hodnotu čísla měsíce. V jediném poli tohoto okna nastavte stejný odkaz na původní číslo. Poté na řádku vzorců klikněte na název "DEN".
  9. Návrat do okna argumentů DEN... Zde musíme udělat jen jeden malý úder. V jediném poli okna, které již obsahuje data, přidejte výraz na konec vzorce "-1" bez uvozovek a také za operátor vložte „+1“ MĚSÍC... Poté klikněte na tlačítko "OK".
  10. Jak vidíte, předem vybraná buňka zobrazuje počet dní v měsíci, ke kterému zadané číslo patří. Obecný vzorec vypadá takto:

    DEN (DATUM (ROK (D3); MĚSÍC (D3) +1; 1) -1)

Tajemství tohoto vzorce je jednoduché. Používáme ho k určení data prvního dne dalšího období a poté od něj odečteme jeden den, čímž získáme počet dní v zadaném měsíci. Proměnnou v tomto vzorci je odkaz na buňku D3 na dvou místech. Pokud jej nahradíte adresou buňky, ve které se ve vašem konkrétním případě nachází datum, můžete tento výraz jednoduše vložit do libovolného prvku listu bez pomoci Průvodci funkcí.

Jak vidíte, existuje několik možností, jak zjistit počet dní v měsíci v aplikaci Excel. Který z nich použít, závisí na konečném cíli uživatele a také na tom, jakou verzi programu používá.

Poznámka: tento příspěvek je překladem článku cmcenroe.me/2014/12/05/days-in-month-formula.html ( Část I), jakož i autorův dodatek ( Část II). Neměli byste brát materiál vážně, ale spíše jako rozcvičku pro mysl, která nevyžaduje nic jiného než školní znalosti o aritmetice a nemá žádné praktické uplatnění. Šťastné čtení všem!

Část I

Úvod

Nedávno jsem po další bezesné noci přemýšlel o metodách, jak si zapamatovat počet dní v každém měsíci v roce. K tomu existuje počítací stroj a způsob, jak počítat s klouby prstů, ale ani jedno, ani druhé mi nevyhovovalo. Zajímalo mě, jestli existuje nějaký matematický vzorec pro řešení takového problému, a - nenašel jsem ho s letmým studiem - vyzval jsem sám sebe, abych jej vytvořil.

Formalizace Jinými slovy, je nutné najít funkci F taková, že hodnota f (x) za každý měsíc X, reprezentovaný číslem od 1 do 12, se rovná počtu dnů v daném měsíci. Tabulka hodnot argumentů a funkcí:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 28 31 30 31 30 31 31 30 31 30 31

Pokud máte touhu vyzkoušet si to sami, než si přečtete moje řešení, pak je nejvyšší čas. Pokud dáváte přednost okamžité odpovědi, podívejte se pod spoiler.

Odpovědět


Níže jsou uvedeny mé kroky k nalezení řešení.

Matematický aparát

Nejprve si rychle obnovme paměť u dvou životně důležitých operátorů při řešení tohoto problému: celočíselné dělení a zbytek dělení.

Celočíselné dělení je to operátor používaný v mnoha programovacích jazycích při dělení dvou celých čísel a vyřazení zlomkové části z kvocientu. Vylíčím ho jako. Například:

Zbytek divize je to operátor, který najde zbytek divize. Mnoho programovacích jazyků používá symbol % , ale použiji například konstrukce formuláře:

Zbývající část divize má stejnou prioritu jako divize.

Základy

Aplikujme tedy náš matematický aparát, abychom získali základní vzorec. V typickém měsíci je 30 nebo 31 dní, takže můžeme použít 1 nebo 0 k získání střídavě a pak k tomuto číslu stačí přidat konstantu:

Získáme tabulku, správné hodnoty jsou zvýrazněny tučně:
X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 30 31 30 31 30 31 30 31 30 31 30

Pěkný začátek! Pro leden a měsíce březen až červenec včetně již existují správné hodnoty. Únor je speciální případ a my se jím budeme zabývat o něco později. Po červenci musí být pro zbývající měsíce obráceno pořadí získávání 0 a 1.
Za tímto účelem můžeme k dividendě přidat 1:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 30 31 30 31 30 31 30 31 30 31 30 31

Nyní jsou správné hodnoty od srpna do prosince, ale podle očekávání jsou hodnoty pro ostatní měsíce nesprávné. Podívejme se, jak můžeme tyto vzorce kombinovat.

Překrytí masky

To vyžaduje po částech definovanou funkci, ale - protože se mi to zdálo nudné - přemýšlel jsem o jiném řešení, přičemž jednu část funkce používám v jednom intervalu, druhou v jiném.
Myslím, že je nejjednodušší najít výraz, který se rovná 1 v jedné aplikaci a 0 ve zbytku. Metodu, ve které vynásobením argumentu výrazem jej vyloučíme ze vzorce mimo rozsah jeho aplikace, jsem nazval „maskování“, protože toto chování je podobné nějakému druhu bitové masky.
Chcete -li tuto metodu použít v poslední části naší funkce, musíte najít výraz rovný 1 pro a - protože hodnoty argumentů jsou vždy menší než 16 - celočíselné dělení číslem 8 je v pořádku.
X 1 2 3 4 5 6 7 8 9 10 11 12
X ⁄ 8 ⌋ 0 0 0 0 0 0 0 1 1 1 1 1

Nyní pomocí této masky a pomocí výrazu místo 1 v dividendě můžeme nahradit pořadí získávání 0 a 1 vzorce opačným:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 30 31 30 31 30 31 31 30 31 30 31

Heuréka! Všechno je v pořádku, kromě února. Překvapivé překvapení.

Únor

Každý měsíc má 30 nebo 31 dní, kromě února s jeho 28. (přestupný rok je mimo rozsah tohoto problému). V tuto chvíli má podle našeho vzorce 30 dní, takže by bylo hezké odečíst výraz rovný 2 at.
Nejlepší, co jsem mohl vymyslet, je toto, které maskuje všechny měsíce po únoru:
X 1 2 3 4 5 6 7 8 9 10 11 12
2 mod X 0 0 2 2 2 2 2 2 2 2 2 2

Po změně základní konstanty na 28 a přidání 2 ke zbytku měsíců dostaneme vzorec:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 29 28 31 30 31 30 31 31 30 31 30 31

Leden je bohužel nyní o 2 dny kratší. Naštěstí je snadné získat výraz, který platí pouze pro první měsíc: je to převrácená hodnota zaokrouhleného dolů. Vynásobením 2 získáme konečný vzorec:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x) 31 28 31 30 31 30 31 31 30 31 30 31

Doslov

Tady to je - vzorec pro získání počtu dní v kterémkoli měsíci v roce pomocí jednoduché aritmetiky. Až si příště budete pamatovat, kolik dní je v září, udělejte to jednoduše pomocí této jednořádkové funkce JavaScriptu:

Funkce f (x) (návratnost 28 + (x + mat. Podlaha (x / 8))% 2 + 2% x + 2 * mat. Podlaha (1 / x);)

Část II

Úvod

V první části byl získán krátký a dokonce mírně elegantní vzorec, jehož hlavními výhodami jsou jednoduchost matematického aparátu, absence větví a podmíněných výrazů a stručnost. Mezi nevýhody - kromě toho, že jej ve svém projektu nepoužijete - patří nedostatečné ověření viscoco a nepřestupných let.
Proto jsem si dal za úkol vytvořit funkci F taková, že hodnota f (x, y) za každý měsíc X reprezentován číslem od 1 do 12 a rok y větší než 0 se rovná počtu dní v měsíci X v roce y.
Pro netrpělivé je pod spoilerem připravená odpověď, zatímco ostatní jsou požádáni, aby mě následovali.

Odpovědět

Zbytek divize: mod a ⌊⌋

Pro vizuální srozumitelnost se shodneme na tom, že v některých vzorcích je operátor dělení se zbytkem nahrazen nižšími závorkami, kde mi to přišlo nutné:

Přestupný rok

V přestupném roce je zaveden další kalendářní den: 29. února. Jak víte, přestupný rok je násobkem 4 a nikoli násobkem 100 nebo násobkem 400. Zapíšeme výraz shodný s tímto tvrzením:

Chcete -li tento výraz převést na algebraický, je nutné na výsledek výrazu použít injekci formuláře:

Což vám umožní získat 1 při dělení beze zbytku a 0 při dělení zbytkem, abyste jej mohli použít ve vzorci pro určení počtu dní v měsíci.

Jako funkci g " 1 mínus zbytek můžete použít na:

X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
g "(x) Nekonečno 1 0 0 0 0 0 0 0 0 0 0 0 0 0

Je snadné vidět, že zvýšením dividendy a dělitele o 1 získáme správný vzorec pro:
X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
g "(x) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Výraz bude tedy zapsán jako:


A výraz zapíšeme jako:

Aplikováním tohoto přístupu získáme následující funkci g (y), jehož hodnota bude 1, pokud je rok přestupným rokem, nebo 0 jinak:

y 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
g (y) 0 0 1 0 0 0 1 0 0 0 1
y 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000
g (y) 1 0 0 0 1 0 0 0 1 0 0

Skokové roky jsou vyznačeny tučně.

Připomínám, že v rámci přijaté dohody může být operátor pro získání zbývající části divize zobrazen jako mod a ⌊⌋.

Překrytí masky

Ve vzorci je součástí dodatek, který přidává 2 dny do ledna. Pokud odstraníme faktor 2 a v čitateli nahradíme 1 číslem 2, pak tento vzorec přidá 2 dny do ledna a 1 den do února, což nám dává klíč k přidání dne v přestupném roce. Pro přehlednost používáme ve vzorci mezilehlou hodnotu g (y) a jako y používáme 2000 (přestupný) a 2001 (nepřestupný) rok:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
f (x, 2001) 30 28 31 30 31 30 31 31 30 31 30 30

Hodnoty pro všechny měsíce kromě ledna nepřestupného roku jsou správné.

Chcete -li toto nepříjemné nedorozumění napravit, přidejte 1 den do ledna podle vzorce, který již známe:


Nebo:

X 1 2 3 4 5 6 7 8 9 10 11 12
f (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
f (x, 2001) 31 28 31 30 31 30 31 31 30 31 30 30

Závěr

V důsledku toho se získá mnohem těžkopádnější, ale univerzálnější vzorec, který lze také použít k získání počtu dnů v měsíci určitého roku:

Funkce f (x, y) (návratnost 28 + ((x + mat. Podlaha (x / 8))% 2) + 2% x + mat. Podlaha ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x) + Mat. Podlaha (1 / x) - Mat. Podlaha (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
Příklad v C # ideone.com/fANutz.

1 ... Nevím, jak takové mnemotechnické pomůcky používat, proto jsem špehoval nápis na internetu.
2 ... „Základy“ nebo „Pravidlo s mnoha výjimkami“, jako většina pravidel.
3 ... Zpočátku byl únor posledním měsícem v římském kalendáři, takže existuje logika, že je kratší než všechny ostatní. Logika je také v přidávání nebo odebírání dne na konci roku, takže jeho délka je proměnlivá.

Aktualizace 1:
Alternativní překlad prvního dílu v

Kalkulačka data je určena k výpočtu počtu dnů mezi daty a k vyhledání data přidáním nebo odečtením konkrétního počtu dnů od známého data.

Přidejte dny k dnešnímu dni

Chcete -li zjistit, jaké datum bude za určitý počet dní, použijte tuto možnost. Zadejte počáteční datum a počet dní, které chcete přidat. K odečtení použijte minusovou hodnotu. Kalkulačka má také možnost přidat pouze pracovní dny.

Výpočet počtu dnů mezi daty

Tato metoda výpočtu odpoví na otázku „kolik dní uplynulo od data“. Zadejte počáteční a koncové datum a klikněte na tlačítko „vypočítat“. Kalkulačka ukáže, kolik dní je mezi zadanými daty. Kalkulačka samostatně zobrazí počet pracovních dnů.

Pomocí této možnosti můžete vypočítat, kolik dní zbývá do určité události, jako jsou narozeniny nebo svátek. Chcete -li to provést, zadejte do pole datum zahájení dnešní datum a do pole datum ukončení datum události.

Dovolená

Kalkulačka dokáže vypočítat, sčítat a odečítat kalendářní dny i pracovní dny. Oficiální svátky pracovního klidu jsou:

  • 1,2,3,4,5,6,8 ledna - novoroční prázdniny
  • 7. ledna - pravoslavné Vánoce
  • 23. února - Den obránce vlasti
  • 8. března - Mezinárodní den žen
  • 1. května - jaro a svátek práce
  • 9. května - Den vítězství
  • 12. června - Den Ruska
  • 4. listopadu - Den národní jednoty

Pokud svátek připadl na sobotu nebo neděli, odkládá se na další pracovní den. Někdy se ale víkend přenese na úplně jiné místo v kalendáři. Například sobotu a neděli, která připadala na novoroční svátky, lze přesunout na květen, aby se prodloužily květnové prázdniny.

Při výpočtu dnů kalkulačka zohledňuje jak oficiální svátky, tak všechny převody.