NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jak získat při zadání roku jeho 256 den ?

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Tereza Rezková:24.9.2022 8:15

Ahoj, potřebovala bych poradit s jedním úkolem.

Zkusil jsem: Zkoušela jsesm použít nějaké funkce viz. obrázek, ale pořád nevím kde dělám chybu.

Chci docílit: Potřebujem: V bežný rok se tento den oslavuje 13.9., zatímco v přestupný rok je to 12.9.
Přestupný rok: Nastává v roku, který je dělitelný 4, okrem rokov dělitelných 100. Pokiaľ je však rok dělitelný 400, tak je přestupný tiež. Prestupné roky sú napr. 1996, 2000, ale 2100 nie je.
Úloha 1: vytvor funkciu programmerDay($y­ear) , ktorá vráti dátum (dd.mm.yyyy), kedy sa v zadanom roku oslavuje deň programátorov. Napr. programmerDay(1985) vráti "13.09.1985", keďže 1985 nebol prestupný rok.

Napadá někoho nějaké řešní? Už jsem z toho docela zoufalá.

Budu ráda z každou radu.

 
Odpovědět
24.9.2022 8:15
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tereza Rezková
DarkCoder:24.9.2022 12:29

Řešení by mohlo být zhruba následující:

Prvky datumu tvoří celistvou jednotku, vytvoř si tedy pro to šablonu.

class MyDate
{
    public $d;
    public $m;
    public $y;
}

Funkci pro zjištění přestupného roku leapYear() si odděl od ostatního.

Funkce pro vrácení programátorského dne by pak mohla vypadat zhruba takto:

function getProgDate($year)
{
    $progdate = new MyDate();

    $progdate->d = leapYear($year) ? 12 : 13;
    $progdate->m = 9;
    $progdate->y = $year;

    return $progdate;
}

Datum bude třeba někam uložit:

$pdate = getProgDate(1985);

Získání jednotlivých částí data:

$day = $pdate->d;
$month = $pdate->m;
$year = $pdate->y;
Nahoru Odpovědět
24.9.2022 12:29
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Tereza Rezková
Peter Mlich:24.9.2022 17:12

DarkCoder: Obavam se, ze problem je spis v tom, ze je to ukol do skoly a nejde pouzivat php funkce pro zjisteji prestupneho roku :)

Tereza Rezková: A v cem je problem? Co jsi zkousela? Treba googlem najit reseni? Nebo mas nejaky php kod, ktery neni obrazek a da se zkopirovat z forka do meho php?
Asi by to mohlo fungovat. Takze treba uvest nejake priklady, kdy to nefungovalo spravne?
Html kod, predelany z tveho php... Sikovne pro testovani online :)
https://jsfiddle.net/dwujLv4b/1/

<pre id=x></pre>
<script>
function aaa (y)
{
if (y%4==0 && y%100!=0 || y%400==0)
  return '12.9.'+y
return '13.9.'+y
}

var str='';
str += aaa(1996) + "\n" // je
str += aaa(2000) + "\n" // je
str += aaa(2100) + "\n" // neni, ma vratit 13
str += aaa(1985) + "\n" // neni, ma vratit 13
document.getElementById('x').innerHTML = str;
</script>
<!--
12.9.1996
12.9.2000
13.9.2100
13.9.1985
-->
 
Nahoru Odpovědět
24.9.2022 17:12
Avatar
Odpovídá na Peter Mlich
Tereza Rezková:26.9.2022 7:59

Ahoj, zkoušela jsem třeba tohle, ale pořád to nevede úplně k mojí spokojenosti.

<?php
//echo date("z", mktime(0,0,0,8,8,2008))+1;
// function cal_days_in_year($year){
//    $days=256;
//    for($month=1;$month<=12;$month++){
//        $days =$days + cal_days_in_month(CAL_GREGORIAN,$month,1998);
//     }
// return $days;
//}
//echo cal_days_in_year($year);
//echo date("z, $days")
//
//
// function cal_days_in_year($year){
//    $days=256;
//    for($month=1;$month<=12;$month++){
//        $days = $days + cal_days_in_month(CAL_GREGORIAN,$month,$year);
//     }
// return $days;
//}
//echo cal_days_in_year(1992);
// function cal_days_in_year($year){
//    $days=256;
//    for($month=1;$month<=12;$month++){
//        $days = $days + cal_days_in_month(CAL_GREGORIAN,$month,$year);
//     }
// return $date;
//}
//echo cal_days_in_year(1992);
//echo date("z, 256");
$date = "2020";
//$date("Y, 1992");
echo date("j, m, D, Y");
?>

Pořád mi to ale nevrací, úplně to co potřebuji. Moc nevím, kde najít chybu.

 
Nahoru Odpovědět
26.9.2022 7:59
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tereza Rezková
DarkCoder:26.9.2022 12:22

Stačí Ti dvě funkce - pro určení, zda rok je přestupný isLeapYear() a pro vrácení celého data getProgDay().

function isLeapYear($year){
    return ((($year % 4) == 0) && ((($year % 100) != 0) || (($year % 400) == 0)));
}

function getProgDay($year){
        return (isLeapYear($year)) ? ("12.9." . $year) : ("13.9." . $year);
}

A použití funkce:

$day = getProgDay(1985);
echo $day;
Nahoru Odpovědět
26.9.2022 12:22
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.9.2022 13:15

Viz DarkCoder. Uplne nechapu, proc tam carujes s tim mktime. Potrebujes to?
Vsimni si, ze ja v tom javascriptu zadny prevod nepouzivam.

$time_stamp = mktime(0, 0, 0, 7, 1, 2000) // prevod na casove razitko (integer cislo v milisekundach) pocitane od roku 1970
$date_string = date('j.n.Y', $time_stamp ) // prevod zpet na string

https://www.php.net/manual/en/function.date.php
$today = date("j, n, Y");                       // 10, 3, 2001

// proc to nevracis primo jako string?
return "12.9." . $year

Jako, nerikam, ze je to spatne, obcas se to pouziva pro overeni existence datumu.
A v tom kodu mas vsechno zakomentovane. Takze nevim, co si vybrat ke zkouseni. To vypada spis jako vykopirovane nejake priklady.

Editováno 26.9.2022 13:17
 
Nahoru Odpovědět
26.9.2022 13:15
Avatar
Tereza Rezková:29.9.2022 11:33

Ahoj, a co kdybych potrebovala upravit funkciu takto: aby brala do úvahy fakt, že pred rokom 1918 sa za prestupné roky počítali všetky roky deliteľné 4. Napr. programmerDay2(1900) vráti "12.09.1900", lebo ide o prestupný rok.

 
Nahoru Odpovědět
29.9.2022 11:33
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tereza Rezková
DarkCoder:29.9.2022 12:15

Tak se funkce getProgDay() vůbec nezmění. Bude se měnit funkce pro určení přestupného roku isLeapYear().

Přidáš jednu podmínku navíc:

function isLeapYear($year) {
        if ($year < 1918) return (($year % 4) == 0);
        return ((($year % 4) == 0) && ((($year % 100) != 0) || (($year % 400) == 0)));
}

Zde vidíš, jak je užitečné rozdělit celý problém do menších kousků. Nehledej v tom nic složitého.

Nahoru Odpovědět
29.9.2022 12:15
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Tereza Rezková:29.9.2022 12:20

díky moc! Trochu se toho PHPka bojím

 
Nahoru Odpovědět
29.9.2022 12:20
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 9 zpráv z 9.