Računalniki Windows Internet

Koliko dni v mesecu maju. Določanje števila dni v mesecu v programu Microsoft Excel. Izračun števila dni med datumi

Pred kratkim sem po dolgem času brez spanca razmišljal o tem, kako lahko ugotovite število dni v mesecu, če poznate njegovo število. Na to temo obstajajo otroške pesmi, obstaja način štetja po členkih, vendar mi te metode ne ustrezajo - potopil sem se v iskanje matematične formule, ki sem jo čez nekaj časa izpeljal.

Torej naloga

Formalno Z drugimi besedami, moramo dobiti funkcijo f (x), ki bi dala naslednji seznam vrednosti (ki sem jih, mimogrede, našel nekje na internetu in nisem izvedel z uporabo mnemotehničnih pravil):

Treba je opozoriti, da kot argument prejmemo le številko meseca, t.j. ne štejemo prestopnih let in f (2) = 28.

Če želite izvedeti moj rezultat, se pomaknite na dno te strani. Spodaj bo opisano izvajanje želene formule.

Kaj bomo uporabili

Poleg seštevanja, odštevanja in množenja bom uporabil še dve operaciji: celoštevilčno deljenje in ostanek. Naj vas spomnim, kaj je to:

  • Celobrojna delitev ali "deljenje in zaokroževanje navzdol". Predstavil ga bom kot običajno razdelitev: a / b - kar pomeni ⌊a / b⌋. Na primer, 5/3 = 1.
  • Preostanek vzamemo po modulu... Označil bom tradicionalno delitev z ostankom: a% b = a - (a / b) * b. Na primer 5% 3 = 2.

Imajo enako prednost in so asociativni.

Osnove ali pravilo z mnogimi izjemami

Poskusimo najti tak vzorec, ki bi zadovoljil čim več vrednosti argumenta. Običajno število dni v mesecu niha med 30 in 31. Hkrati lahko opazite odvisnost tega števila od parnosti meseca - kar pomeni, da bomo uporabili operacijo jemanja ostanka po modulu 2. Zdi se, da bi moralo biti nekaj takega:

f₁ (x) = 30 + x% 2


Lep začetek! Ne glede na februar, ki bo očitno moral priti do nekaj trikov, bodimo veseli, da smo lahko funkcijo prilagodili za prvo polovico leta. In potem, od avgusta dalje, je treba pariteto spremeniti v nasprotno. To lahko storite z zamenjavo x% 2 v prvi različici formule na (x + 1)% 2:

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


Po pričakovanjih je zdaj prva polovica leta že izven območja pravilnih vrednosti, vendar so meseci od avgusta do decembra dali tisto, kar potrebujemo. Poiščimo način, kako združiti ta dva dela.

Maska

V dividendi potrebujemo +1, da se »aktivira« le, ko argument doseže vrednosti večje od 8, tj. nanesti moramo nekaj maske. V tem primeru vrednosti argumenta ne smejo presegati 12. Torej je celo število deljenja argumenta z 8 idealno za nas:


Točno tako, kot ga potrebujemo. Uporabimo ta zaključek:

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


Vau! Vse je v redu, razen februarja. Kako nepričakovano.

Februar

V vseh mesecih je 30 ali 31 dni, februarja - 28 (ne pozabite, da ne upoštevamo prestopnih let).

Zgodovinska referenca: V rimskem koledarju je bil februar zadnji mesec v letu - priznati morate, da je dodajanje enega dneva v prestopnih letih do konca koledarja bolj intuitivno. Uporabljamo pa gregorijanski koledar, v katerem se najkrajši mesec z voljo enega izmed modrih vladarjev premakne bližje začetku.

V najbolj Najnovejša različica naša formula je februarja dobila 30 dni. Zato mu moramo nekaj dni odrezati. Seveda bo zaradi tega trpelo še nekaj mesecev: levo od februarja ali desno od njega na našem seznamu - vendar je na desni strani veliko manj mesecev, zato bomo morali žrtvovati januar, nato pa prilagoditi formulo za to. Z izrazom lahko skrajšate dneve za prvi in ​​drugi mesec 2% x.

Opomba: ta objava je prevod članka cmcenroe.me/2014/12/05/days-in-month-formula.html ( I. del), pa tudi avtorjev dodatek ( Del II). Gradiva ne smete jemati resno, temveč ogrevanje uma, ki ne zahteva nič drugega kot šolsko znanje aritmetike in nima praktične uporabe. Veselo branje vsem!

I. del

Uvod

Pred kratkim, po drugi neprespani noči, sem razmišljal o načinih zapomnitve števila dni v vsakem mesecu v letu. Za to obstaja štetje, pa tudi način, kako računati na členke, vendar mi niti eno niti drugo nista ustrezala. Spraševal sem se, ali obstaja kakšna matematična formula za reševanje takega problema, in - ker ga nisem našel z bežno študijo - sem se izzval, da bi ga ustvaril.

Formalizacija Z drugimi besedami, treba je najti funkcijo f tako, da je vrednost f (x) za vsak mesec x, predstavljeno s številom od 1 do 12, je enako številu dni v tem mesecu. Tabela vrednosti argumentov in funkcij:

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

Če imate željo, da bi sami prebrali mojo rešitev, je zdaj pravi čas. Če raje takoj vidite pripravljen odgovor, poglejte pod spojler.

Odgovor


Spodaj so moji koraki za iskanje rešitve.

Matematični aparat

Najprej si na kratko osvežimo spomin na dva ključna operaterja pri reševanju tega problema: celoštevilčno deljenje in preostanek delitve.

Celobrojna delitev je operater, ki se uporablja v mnogih programskih jezikih pri deljenju dveh celih števil in zavrže delni del iz količnika. Prikazal ga bom kot. Na primer:

Preostanek delitve je operator, ki najde preostanek delitve. Številni programski jeziki uporabljajo simbol % , vendar bom uporabil konstrukcije oblike, na primer:

Upoštevajte, da ima preostanek delitve enako prednost kot delitev.

Osnove

Torej, uporabimo naš matematični aparat, da dobimo osnovno formulo. V običajnem mesecu je 30 ali 31 dni, zato lahko izmenično dobimo 1 ali 0, nato pa temu številu dodamo samo konstanto:

Dobimo tabelo, pravilne vrednosti so označene krepko:
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

Lep začetek! Obstajajo že pravilne vrednosti za januar in za mesece od vključno marca do julija. Februar je poseben primer, s katerim se bomo ukvarjali nekoliko kasneje. Po juliju je treba za preostale mesece spremeniti vrstni red pridobitve 0 in 1.
Če želite to narediti, lahko dividendi dodamo 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

Zdaj so pravilne vrednosti od avgusta do decembra, po pričakovanjih pa so vrednosti za ostale mesece napačne. Poglejmo, kako lahko združimo te formule.

Prekrivanje maske

To zahteva delno definirano funkcijo, a - ker se mi je zdelo dolgočasno - sem razmišljal o drugi rešitvi, pri čemer sem en del funkcije uporabil v enem intervalu, drugega v drugem.
Mislim, da je najlažje najti izraz, ki je enak 1 v eni aplikaciji in 0 v preostalih. Metodo, pri kateri z množenjem argumenta z izrazom izključimo iz formule izven področja njegove uporabe, sem poimenoval "maskiranje", ker je to vedenje podobno nekakšni bitni maski.
Če želite uporabiti to metodo v zadnjem delu naše funkcije, morate najti izraz, ki je enak 1 za, in ker so vrednosti argumenta vedno manjše od 16, je celo število, deljeno z 8, v redu za to.
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

Zdaj lahko z uporabo te maske, z uporabo izraza namesto 1 v dividendi zamenjamo vrstni red pridobivanja 0 in 1 formule z nasprotnim:

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

Eureka! Vse je v redu, razen februarja. Presenečenje presenečenje.

Februar

Vsak mesec ima 30 ali 31 dni, razen februarja z 28. (prestopno leto je zunaj obsega tega problema). Trenutno ima po naši formuli 30 dni, zato bi bilo lepo odšteti izraz, ki je enak 2 at.
Najboljše, kar sem dobil, je to, ki se maskira vse mesece po februarju:
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

Če osnovno konstanto spremenimo na 28, preostalim mesecem dodamo 2, dobimo formulo:

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

Na žalost je januar zdaj 2 dni krajši. Na srečo je enostavno dobiti izraz, ki velja le za prvi mesec: obratno je število zaokroženo navzdol. Če pomnožimo z 2, dobimo končno formulo:

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

Pogovor

Tukaj je - formula za izračun števila dni v katerem koli mesecu v letu s preprosto aritmetiko. Ko boste naslednjič pomislili, koliko dni je v septembru, preprosto naredite to s to enovrstično funkcijo JavaScript:

Funkcija f (x) (vrnitev 28 + (x + matematično nadstropje (x / 8))% 2 + 2% x + 2 * matematično nadstropje (1 / x);)

Del II

Uvod

V prvem delu je bila pridobljena kratka in celo nekoliko elegantna formula, katere glavne prednosti so preprostost matematičnega aparata, odsotnost vej in pogojnih izrazov ter lakonizem. Slabosti - razen dejstva, da ga ne boste uporabili v svojem projektu - vključujejo pomanjkanje preverjanja za viscoco in nepredstopna leta.
Zato sem si zadal nalogo, da ustvarim funkcijo f tako, da je vrednost f (x, y) za vsak mesec x zastopano s številko od 1 do 12 in letom y več kot 0 je število dni v mesecu x v letu y.
Za nestrpne je pod spojlerjem že pripravljen odgovor, ostale pa prosim, naj mi sledijo.

Odgovor

Preostanek delitve: mod in ⌊⌋

Zaradi vizualne jasnosti se strinjamo, da se v nekaterih formulah operator deljenja z ostankom nadomesti z nižjimi oklepaji, kjer se mi je zdelo potrebno:

Prestopno leto

V prestopnem letu se uvede dodaten koledarski dan: 29. februar. Kot veste, je prestopno leto večkratnik 4 in ne večkratnik 100 ali večkratnik 400. Zapišemo izraz, enak tej izjavi:

Če želite ta izraz pretvoriti v algebrski, je treba za rezultat izraza uporabiti injekcijo oblike:

Kar vam bo omogočilo, da dobite 1 pri deljenju brez ostanka in 0 pri deljenju z ostankom, da ga uporabite v formuli za določanje števila dni v mesecu.

Kot funkcija g " 1 minus ostanek lahko uporabite za:

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

Zlahka je videti, da s povečanjem dividende in delitelja za 1 dobimo pravilno formulo za:
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

Tako izraz zapišemo tako:


In izraz zapišemo tako:

S tem pristopom dobimo naslednjo funkcijo g (y), katerega vrednost bo 1, če je leto prestopno, ali 0 drugače:

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

Prestopna leta so označena s krepko pisavo.

Spomnim vas, da je v okviru sprejetega sporazuma operaterja za pridobitev preostale delitve mogoče prikazati kot mod in ⌊⌋.

Prekrivanje maske

Del v formuli je sprememba, ki januarju doda 2 dni. Če odstranimo faktor 2 in 1 v števcu nadomestimo 1, potem bo ta formula januarju dodala 2 dni, februarju pa 1 dan, kar nam daje ključ za dodajanje dneva v prestopnem letu. Zaradi jasnosti uporabljamo vmesno vrednost v formuli g (y) in kot y uporabljamo 2000 (prestopna) in 2001 (neprestopna) leta:

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

Vrednosti za vse mesece razen prestopnega leta, razen januarja, so pravilne.

Če želite odpraviti ta nadležni nesporazum, dodajte januar 1 dan s formulo, ki jo že poznamo:


Ali:

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

Zaključek

Posledično dobimo veliko bolj okorno, a bolj univerzalno formulo, s katero lahko dobimo tudi število dni v mesecu določenega leta:

Funkcija f (x, y) (vrnitev 28 + ((x + matematično nadstropje (x / 8))% 2) + 2% x + matematično nadstropje ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1)) / x) + Math.floor (1 / x) - Math.floor (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
Primer v C # ideone.com/fANutz.

1 ... Ne vem, kako uporabljati takšno mnemotehniko, zato sem vohunil za znakom na internetu.
2 ... "Osnove" ali "Pravilo z mnogimi izjemami", tako kot večina pravil.
3 ... Na začetku je bil februar zadnji mesec v letu po rimskem koledarju, zato obstaja logika, da je krajši od vseh ostalih. Logično je tudi dodajanje ali odstranjevanje dneva ob koncu leta, zato je njegova dolžina spremenljiva.

Upd. 1:
Alternativni prevod prvega dela v

Če želite rešiti nekatere težave pri ustvarjanju tabele, morate v ločeni celici ali v formuli določiti število dni v mesecu, da bo program izvedel potrebne izračune. Excel ima orodja za izvajanje te operacije. razmislimo različne poti uporabo te priložnosti.

Število dni v mesecu v Excelu lahko izračunate s pomočjo operatorjev posebnih kategorij "Datum in čas"... Če želite ugotoviti, katero možnost je najbolje uporabiti, morate najprej določiti cilje operacije. Odvisno od tega je lahko rezultat izračuna prikazan v ločenem elementu na listu ali pa ga je mogoče uporabiti znotraj druge formule.

1. metoda: kombinacija operatorjev DAY in EONMONTH

Večina na preprost način za rešitev tega problema je kombinacija operaterjev DAN in OD EONTH.

Funkcija DAN spada v skupino operaterjev "Datum in čas"... Kaže na določeno številko od 1 prej 31 ... V našem primeru bo naloga tega operaterja navesti zadnjič mesecev z uporabo vgrajene funkcije kot argumenta OD EONTH.

Sintaksa operaterja DAN Naslednji:

DAY (datum_številka_formata)

To je edini argument te funkcije "Datum v številski obliki"... Določil ga bo operater OD EONTH... Povedati je treba, da se datum v numerični obliki razlikuje od običajne oblike. Na primer datum 04.05.2017 številčno bo izgledal tako 42859 ... Zato Excel to obliko uporablja samo za notranje operacije. Redko se uporablja za prikaz v celicah.

Operater OD EONTH označuje redno številko zadnjega dne v mesecu, ki je določeno število mesecev naprej ali nazaj od navedenega datuma. Sintaksa funkcije je naslednja:

EONTS (datum začetka, število_mesecev)

Operater "Začetni datum" vsebuje datum, od katerega se odšteva, ali sklic na celico, v kateri se nahaja.

Operater "Število mesecev" označuje število mesecev, ki se štejejo od določenega datuma.

Zdaj pa poglejmo, kako to deluje s posebnim primerom. Če želite to narediti, vzemimo Excelov list, v katerega od celic je vpisana določena številka koledarja. Z zgornjim nizom operaterjev je treba določiti, koliko dni je v mesečnem obdobju, na katero se ta številka nanaša.


Naša splošna formula je dobila naslednjo obliko:

DAN (EONTHS (B3,0))

V tej formuli je vrednost spremenljivke samo naslov celice ( B3). Če torej ne želite izvesti postopka z Čarovniki za funkcije, lahko to formulo vstavite v kateri koli element lista, tako da naslov celice, ki vsebuje številko, preprosto zamenjate s tistim, ki je pomemben za vaš poseben primer. Rezultat bo podoben.

Metoda 2: samodejna določitev števila dni

Zdaj pa poglejmo še en problem. Število dni mora biti prikazano ne glede na določen koledarski datum, ampak glede na trenutnega. Poleg tega bi se obdobja samodejno spremenila brez posredovanja uporabnika. Morda se zdi čudno, vendar je ta naloga lažja od prejšnje. Če ga želite rešiti, ga celo odprite Čarovnik za funkcije nepotrebno, ker formula, ki izvaja to operacijo, ne vsebuje spremenljivih vrednosti ali sklicev na celice. Naslednjo formulo lahko preprosto vnesete v celico lista, kjer želite, da se rezultat prikaže brez sprememb:

DAN (E-MESECI (DANES (); 0))

Vgrajena funkcija TODAY, ki smo jo uporabili v tem primeru, prikazuje današnjo številko in nima argumentov. Tako bo vaša celica nenehno prikazovala število dni v tekočem mesecu.

3. metoda: izračun števila dni za uporabo v kompleksnih formulah

V zgornjih primerih smo pokazali, kako izračunati število dni v mesecu za določen koledarski datum ali samodejno za tekoči mesec z izpisom rezultata v ločeni celici. Toda ugotovitev te vrednosti bo morda potrebna tudi za izračun drugih kazalnikov. V tem primeru bo izračun števila dni izveden v kompleksni formuli in ne bo prikazan v ločeni celici. Poglejmo, kako to storiti s primerom.

V celici moramo prikazati število dni, ki ostanejo do konca tekočega meseca. Tako kot pri prejšnji metodi tudi ta možnost ne zahteva odpiranja Čarovniki za funkcije... V celico lahko vnesete le naslednji izraz:

DAN (E -MESECI (DANES (); 0)) - DAN (DANES ())

Po tem bo v navedeni celici prikazano število dni do konca meseca. Vsak dan se bo rezultat samodejno posodabljal in od začetka novega obdobja se bo odštevanje začelo znova. Izkazalo se je za nekakšen odštevalnik časa.

Kot lahko vidite, je ta formula sestavljena iz dveh delov. Prvi med njimi je že znan izraz za izračun števila dni v mesecu:

DAN (E-MESECI (DANES (); 0))

Toda v drugem delu se od tega kazalnika odšteje današnja številka:

DAN (DANES ())

Tako je pri izvajanju tega izračuna formula za izračun števila dni del bolj zapletene formule.

Metoda 4: alternativna formula

Na žalost različice programa, starejše od Excela 2007, nimajo operaterja OD EONTH... Kaj pa tisti uporabniki, ki uporabljajo stare različice aplikacije? Zanje ta priložnost obstaja z drugo formulo, ki je bolj množična od zgoraj opisane. Poglejmo, kako s to možnostjo izračunati število dni v mesecu za določen datum koledarja.

  1. Izberite celico za prikaz rezultata in pojdite v okno argumentov operaterja DAN na način, ki nam je že znan. Kazalec postavite v edino polje tega okna in kliknite na obrnjeni trikotnik levo od vrstice s formulami. Pojdite na razdelek "Druge funkcije ...".
  2. V oknu Čarovniki za funkcije v skupini "Datum in čas" označite ime "DATE" in kliknite na gumb "V REDU".
  3. Zažene se okno operaterja DATE. Ta funkcija pretvori datum iz običajne oblike v številsko vrednost, ki jo bo operater nato moral obdelati DAN.

    Odpre se okno s tremi polji. Na terenu "Dan" lahko takoj vnesete številko "1"... To bo enak ukrep za vsako situacijo. Druga dva področja pa bo treba temeljito obravnavati.

    Kazalec postavite v polje "Leto"... Nato se obrnemo na izbiro operaterjev skozi znani trikotnik.

  4. Vse v isti kategoriji Čarovniki za funkcije označite ime "LETO" in kliknite na gumb "V REDU".
  5. Začne se okno argumentov operaterja LETO... Leto določi do določenega datuma. V enem okenskem polju "Datum v številski obliki" določimo povezavo do celice, ki vsebuje prvotni datum, za katerega želite določiti število dni. Po tem ne hitite s klikom na gumb "V REDU" in kliknite na ime "DATE" na vrstici formule.
  6. Nato se spet vrnemo k oknu argumentov. DATE... Kazalec postavite v polje "Mesec" in pojdite na izbiro funkcij.
  7. V Čarovnik za funkcije kliknite na ime "MESEC" in kliknite na gumb "V REDU".
  8. Začne se okno argumentov funkcij MESEC... Njegove naloge so podobne prejšnjemu operaterju, le da prikaže vrednost številke meseca. V edinem polju tega okna nastavite isti sklic na prvotno številko. Nato v vrstici s formulami kliknite ime "DAN".
  9. Vrnitev v okno argumentov DAN... Tu moramo narediti le eno majhno potezo. V edino polje okna, ki že vsebuje podatke, dodajte izraz na konec formule "-1" brez narekovajev in za operaterjem postavite tudi "+1" MESEC... Po tem kliknite gumb "V REDU".
  10. Kot lahko vidite, vnaprej izbrana celica prikazuje število dni v mesecu, ki mu pripada določeno število. Splošna formula izgleda takole:

    DAN (DATUM (LETO (D3); MESEC (D3) +1; 1) -1)

Skrivnost te formule je preprosta. Z njim določimo datum prvega dne naslednjega obdobja in nato od njega odštejemo en dan, pri čemer dobimo število dni v določenem mesecu. Spremenljivka v tej formuli je referenca celice D3 na dveh mestih. Če ga v svojem primeru zamenjate z naslovom celice, v kateri je datum, potem lahko ta izraz preprosto vnesete v kateri koli element lista brez pomoči Čarovniki za funkcije.

Kot lahko vidite, obstaja več možnosti za iskanje števila dni v mesecu v Excelu. Katerega bo uporabil, je odvisno od končnega cilja uporabnika in od tega, katero različico programa uporablja.

Opomba: ta objava je prevod članka cmcenroe.me/2014/12/05/days-in-month-formula.html ( I. del), pa tudi avtorjev dodatek ( Del II). Gradiva ne smete jemati resno, temveč ogrevanje uma, ki ne zahteva nič drugega kot šolsko znanje aritmetike in nima praktične uporabe. Veselo branje vsem!

I. del

Uvod

Pred kratkim, po drugi neprespani noči, sem razmišljal o načinih zapomnitve števila dni v vsakem mesecu v letu. Za to obstaja štetje, pa tudi način, kako računati na členke, vendar mi niti eno niti drugo nista ustrezala. Spraševal sem se, ali obstaja kakšna matematična formula za reševanje takega problema, in - ker ga nisem našel z bežno študijo - sem se izzval, da bi ga ustvaril.

Formalizacija Z drugimi besedami, treba je najti funkcijo f tako, da je vrednost f (x) za vsak mesec x, predstavljeno s številom od 1 do 12, je enako številu dni v tem mesecu. Tabela vrednosti argumentov in funkcij:

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

Če imate željo, da bi sami prebrali mojo rešitev, je zdaj pravi čas. Če raje takoj vidite pripravljen odgovor, poglejte pod spojler.

Odgovor


Spodaj so moji koraki za iskanje rešitve.

Matematični aparat

Najprej si na kratko osvežimo spomin na dva ključna operaterja pri reševanju tega problema: celoštevilčno deljenje in preostanek delitve.

Celobrojna delitev je operater, ki se uporablja v mnogih programskih jezikih pri deljenju dveh celih števil in zavrže delni del iz količnika. Prikazal ga bom kot. Na primer:

Preostanek delitve je operator, ki najde preostanek delitve. Številni programski jeziki uporabljajo simbol % , vendar bom uporabil konstrukcije oblike, na primer:

Upoštevajte, da ima preostanek delitve enako prednost kot delitev.

Osnove

Torej, uporabimo naš matematični aparat, da dobimo osnovno formulo. V običajnem mesecu je 30 ali 31 dni, zato lahko izmenično dobimo 1 ali 0, nato pa temu številu dodamo samo konstanto:

Dobimo tabelo, pravilne vrednosti so označene krepko:
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

Lep začetek! Obstajajo že pravilne vrednosti za januar in za mesece od vključno marca do julija. Februar je poseben primer, s katerim se bomo ukvarjali nekoliko kasneje. Po juliju je treba za preostale mesece spremeniti vrstni red pridobitve 0 in 1.
Če želite to narediti, lahko dividendi dodamo 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

Zdaj so pravilne vrednosti od avgusta do decembra, po pričakovanjih pa so vrednosti za ostale mesece napačne. Poglejmo, kako lahko združimo te formule.

Prekrivanje maske

To zahteva delno definirano funkcijo, a - ker se mi je zdelo dolgočasno - sem razmišljal o drugi rešitvi, pri čemer sem en del funkcije uporabil v enem intervalu, drugega v drugem.
Mislim, da je najlažje najti izraz, ki je enak 1 v eni aplikaciji in 0 v preostalih. Metodo, pri kateri z množenjem argumenta z izrazom izključimo iz formule izven področja njegove uporabe, sem poimenoval "maskiranje", ker je to vedenje podobno nekakšni bitni maski.
Če želite uporabiti to metodo v zadnjem delu naše funkcije, morate najti izraz, ki je enak 1 za, in ker so vrednosti argumenta vedno manjše od 16, je celo število, deljeno z 8, v redu za to.
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

Zdaj lahko z uporabo te maske, z uporabo izraza namesto 1 v dividendi zamenjamo vrstni red pridobivanja 0 in 1 formule z nasprotnim:

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

Eureka! Vse je v redu, razen februarja. Presenečenje presenečenje.

Februar

Vsak mesec ima 30 ali 31 dni, razen februarja z 28. (prestopno leto je zunaj obsega tega problema). Trenutno ima po naši formuli 30 dni, zato bi bilo lepo odšteti izraz, ki je enak 2 at.
Najboljše, kar sem dobil, je to, ki se maskira vse mesece po februarju:
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

Če osnovno konstanto spremenimo na 28, preostalim mesecem dodamo 2, dobimo formulo:

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

Na žalost je januar zdaj 2 dni krajši. Na srečo je enostavno dobiti izraz, ki velja le za prvi mesec: obratno je število zaokroženo navzdol. Če pomnožimo z 2, dobimo končno formulo:

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

Pogovor

Tukaj je - formula za izračun števila dni v katerem koli mesecu v letu s preprosto aritmetiko. Ko boste naslednjič pomislili, koliko dni je v septembru, preprosto naredite to s to enovrstično funkcijo JavaScript:

Funkcija f (x) (vrnitev 28 + (x + matematično nadstropje (x / 8))% 2 + 2% x + 2 * matematično nadstropje (1 / x);)

Del II

Uvod

V prvem delu je bila pridobljena kratka in celo nekoliko elegantna formula, katere glavne prednosti so preprostost matematičnega aparata, odsotnost vej in pogojnih izrazov ter lakonizem. Slabosti - razen dejstva, da ga ne boste uporabili v svojem projektu - vključujejo pomanjkanje preverjanja za viscoco in nepredstopna leta.
Zato sem si zadal nalogo, da ustvarim funkcijo f tako, da je vrednost f (x, y) za vsak mesec x zastopano s številko od 1 do 12 in letom y več kot 0 je število dni v mesecu x v letu y.
Za nestrpne je pod spojlerjem že pripravljen odgovor, ostale pa prosim, naj mi sledijo.

Odgovor

Preostanek delitve: mod in ⌊⌋

Zaradi vizualne jasnosti se strinjamo, da se v nekaterih formulah operator deljenja z ostankom nadomesti z nižjimi oklepaji, kjer se mi je zdelo potrebno:

Prestopno leto

V prestopnem letu se uvede dodaten koledarski dan: 29. februar. Kot veste, je prestopno leto večkratnik 4 in ne večkratnik 100 ali večkratnik 400. Zapišemo izraz, enak tej izjavi:

Če želite ta izraz pretvoriti v algebrski, je treba za rezultat izraza uporabiti injekcijo oblike:

Kar vam bo omogočilo, da dobite 1 pri deljenju brez ostanka in 0 pri deljenju z ostankom, da ga uporabite v formuli za določanje števila dni v mesecu.

Kot funkcija g " 1 minus ostanek lahko uporabite za:

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

Zlahka je videti, da s povečanjem dividende in delitelja za 1 dobimo pravilno formulo za:
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

Tako izraz zapišemo tako:


In izraz zapišemo tako:

S tem pristopom dobimo naslednjo funkcijo g (y), katerega vrednost bo 1, če je leto prestopno, ali 0 drugače:

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

Prestopna leta so označena s krepko pisavo.

Spomnim vas, da je v okviru sprejetega sporazuma operaterja za pridobitev preostale delitve mogoče prikazati kot mod in ⌊⌋.

Prekrivanje maske

Del v formuli je sprememba, ki januarju doda 2 dni. Če odstranimo faktor 2 in 1 v števcu nadomestimo 1, potem bo ta formula januarju dodala 2 dni, februarju pa 1 dan, kar nam daje ključ za dodajanje dneva v prestopnem letu. Zaradi jasnosti uporabljamo vmesno vrednost v formuli g (y) in kot y uporabljamo 2000 (prestopna) in 2001 (neprestopna) leta:

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

Vrednosti za vse mesece razen prestopnega leta, razen januarja, so pravilne.

Če želite odpraviti ta nadležni nesporazum, dodajte januar 1 dan s formulo, ki jo že poznamo:


Ali:

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

Zaključek

Posledično dobimo veliko bolj okorno, a bolj univerzalno formulo, s katero lahko dobimo tudi število dni v mesecu določenega leta:

Funkcija f (x, y) (vrnitev 28 + ((x + matematično nadstropje (x / 8))% 2) + 2% x + matematično nadstropje ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1)) / x) + Math.floor (1 / x) - Math.floor (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
Primer v C # ideone.com/fANutz.

1 ... Ne vem, kako uporabljati takšno mnemotehniko, zato sem vohunil za znakom na internetu.
2 ... "Osnove" ali "Pravilo z mnogimi izjemami", tako kot večina pravil.
3 ... Na začetku je bil februar zadnji mesec v letu po rimskem koledarju, zato obstaja logika, da je krajši od vseh ostalih. Logično je tudi dodajanje ali odstranjevanje dneva ob koncu leta, zato je njegova dolžina spremenljiva.

Upd. 1:
Alternativni prevod prvega dela v

Kalkulator datumov je zasnovan za izračun števila dni med datumi in za iskanje datuma z dodajanjem ali odštevanjem določenega števila dni od znanega datuma.

Dodajte dneve datumu

Če želite izvedeti, kateri datum bo čez določeno število dni, uporabite to možnost. Vnesite začetni datum in število dni, ki jih želite dodati. Za odštevanje uporabite minus vrednost. Kalkulator ima tudi možnost dodajanja samo delovnih dni.

Izračun števila dni med datumi

Ta metoda izračuna bo odgovorila na vprašanje "koliko dni je minilo od datuma". Vnesite začetni in končni datum in kliknite gumb "izračunaj". Kalkulator bo pokazal, koliko dni je med vnesenimi datumi. Ločeno bo kalkulator prikazal število delovnih dni.

S to možnostjo lahko izračunate, koliko dni je še ostalo do določenega dogodka, na primer rojstnega dne ali praznika. To naredite tako, da vnesete današnji datum v polje začetni datum, datum dogodka pa v polje končni datum.

Prazniki

Kalkulator lahko izračuna, sešteje in odšteje koledarske in delovne dni. Uradni prazniki so:

  • Januar 1,2,3,4,5,6,8 - novoletni prazniki
  • 7. januar - pravoslavni božič
  • 23. februar - dan zagovornika domovine
  • 8. marec - mednarodni dan žena
  • 1. maj - pomlad in praznik dela
  • 9. maj - dan zmage
  • 12. junij - dan Rusije
  • 4. november - dan narodne enotnosti

Če praznik pade na soboto ali nedeljo, se prestavi na naslednji delovni dan. Včasih pa se vikend prestavi na povsem drugo mesto v koledarju. Na primer, soboto in nedeljo, ki sta padli na novoletne praznike, lahko prestavimo na maj, da bi podaljšali majske praznike.

Pri izračunu dni kalkulator upošteva tako uradne praznike kot vse prenose.