-
[perl] wieczny kalendarz
Witam Państwa,
Po poszukiwaniach na google i na tym forum, nie znalazłszy odpowiedzi, postanowiłem się zarejestrować i napisać posta z pytaniem. Jestem studentem i początkującym programistą Perl. Próbuję napisać tzw. "Wieczny kalendarz", czyli program który po otrzymaniu daty zwróci w wyniku dzień tygodnia. Próbuję przerobić skrypt dostępny na wikipedii pod adresem: http://pl.wikipedia.org/wiki/Wieczny_kalendarz Oto co udało mi się napisać dotychczas:
Kod php:
#!/usr/bin/perl
@week = (
"Niedziela",
"Poniedzialek",
"Wtorek",
"Sroda",
"Czwartek",
"Piatek",
"Sobota"
);
@mon = (0, 1, 1, 2, 5, 6, 2, 3, 4, 0, 1, 4);
print "Prosze podac date (w formacie dd.mm.rrrr): ";
$data = <STDIN>;
@data = split(/\./, $data);
$d = $data[0];
$m = $data[1];
$y = $data[2];
# gregorianski czy julianski?
$s = ($y>1582) ? 0 : 1;
# przestepny?
$leap = ($s==0 && $y%4==0 || $s!=0 && ($y%4==0 && $y%100!=0 ||
($y%400)==0)) ? 1 : 0;
$a = ($y%100)%28;
$b =
($s==0)*(4+($y%700)/100+2*($a/4)+6*((!$leap)*(1+($a%4))+($leap)*((9+$m)/12)))%7+($s!=0)*(2*(1+($y%400)/100+($a/4))+6*((!$leap)*(1+($a%4))+($leap)*((9+$m)/12)))%7;
$c = (3*$mon[$m-1]+$d)%7;
$N = ($c+6*$b)%7;
print "a = ".$a."\n".
"b = ".$b."\n".
"c = ".$c."\n".
"N = ".$N."\n";
print $week[$N]."\n";
Gdy wpisuję np. 14.10.2009 (data dodania tego posta) to w wyniku otrzymuję: Wtorek (Powinno byc Sroda), natomiast np. 1.1.2008 zwraca: Sroda (Powinien Wtorek)... Jeśli ktoś mógłby naprowadzić mnie na właściwy trop byłbym wdzięczny.
Pozdrawiam!
-
Może komuś się przyda:) poprawiłem skrypt, nie można podawać daty po . ponieważ wtedy funkcja split zle działa:), i dlatego a bylo zawsze rowne 0 i zle liczyło wszystko. oto kod działający:
Kod php:
#!/usr/bin/perl
@week = (
"Niedziela",
"Poniedzialek",
"Wtorek",
"Sroda",
"Czwartek",
"Piatek",
"Sobota"
);
@mon = (0, 1, 1, 2, 5, 6, 2, 3, 4, 0, 1, 4);
print "Prosze podac date (w formacie dd.mm.rrrr): ";
$date = <STDIN>;
@data = split(/-/, $date);
$d = $data[0];
$m = $data[1];
$y = $data[2];
# gregorianski czy julianski?
if($y>1582){
$s=1
}
else {
$s=0
}
# przestepny?
$leap = ($s==0 && $y%4==0 || $s!=0 && ($y%4==0 && $y%100!=0 ||
($y%400)==0));
$a = ($y % 100);
$b =
($s==0)*(4+($y%700)/100+2*($a/4)+6*((!$leap)*(1+($a%4))+($leap)*((9+$m)/12)))%7+($s!=0)*(2*(1+($y%400)/100+($a/4))+6*((!$leap)*(1+($a%4))+($leap)*((9+$m)/12)))%7;
$c = (3*$mon[$m-1]+$d)%7;
$N = ($c+6*$b)%7;
print "a = ".$a."\n".
"b = ".$b."\n".
"c = ".$c."\n".
"N = ".$N."\n";
print $week[$N]."\n";
-
Kod:
print "Prosze podac date (w formacie dd.mm.rrrr): ";
$date = <STDIN>;
@data = split(/-/, $date);
to nie ma prawa dzialac - zmieniajac kod zmieniaj instrukcje dla uzytkownika... a cala sztuczka aby pierwotny kod zadzialal to:
Kod:
print "Prosze podac date (w formacie dd.mm.rrrr): ";
$date = <STDIN>;
@data = split(/\./, $date);
musisz przed kropka dac \ bo sama kropka oznacza dowolny znak a zapis \. w regexach oznacza doslownie kropke