Nadesłany przez N, 04 lutego 2013 12:29
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
dzien_tygodnia.rb:
#======================================================
#**Implementacja algorytmu sprawdzania dnia tygodnia na
#**podstawie roku,miesiąca i dnia
#**Gotowy program obliczający
#**Narzew
#**04.02.2013
#**www.algorytm.org
#======================================================
#======================================================
#**Metoda pomocnicza
#======================================================
def jest_rokiem_przestepnym(x)
return true if x%4==0 and !(x%100==0)
return true if x%400==0
return false
end
#======================================================
#**Metoda właściwa
#======================================================
$week_table = [0,31,59,90,120,151,181,212,243,273,304,334] # Tablica dni roku
$mday = [31,29,31,30,31,30,31,31,30,31,30,31] # Tablica ilości dni w miesiącu (dla roku przestępnego)
def dzien_tygodnia(x,y,z)
m = y
m = 12 if m > 12
r = z
d = x
d = 1 if d <= 0
d = $mday[m-1] if d > $mday[m-1]
d = 28 if m == 2 and d == 29 and !(jest_rokiem_przestepnym(z))
yy = (r-1)%100
c = (r-1)-yy
g = yy + yy/4
firstday = (((((c/100)%4)*5)+g)%7)
yearday = $week_table[m-1] + d
if m >= 3 and jest_rokiem_przestepnym(r)
yearday += 1
end
weekday = (firstday+yearday-1)%7
return (weekday+1)
end
#======================================================
#**Metody pomocnicze (opcjonalne)
#======================================================
def dayname(x)
case x.to_i
when 1 then return "Poniedzialek"
when 2 then return "Wtorek"
when 3 then return "Sroda"
when 4 then return "Czwartek"
when 5 then return "Piatek"
when 6 then return "Sobota"
when 7 then return "Niedziela"
else
return ""
end
end
def plday(x)
case x.to_i
when 1 then return "poniedzialek"
when 2 then return "wtorek"
when 3 then return "srode"
when 4 then return "czwartek"
when 5 then return "piatek"
when 6 then return "sobote"
when 7 then return "niedziele"
else
return ""
end
end
def monthname(x)
case x.to_i
when 1 then return "Styczen"
when 2 then return "Luty"
when 3 then return "Marzec"
when 4 then return "Kwiecien"
when 5 then return "Maj"
when 6 then return "Czerwiec"
when 7 then return "Lipiec"
when 8 then return "Sierpien"
when 9 then return "Wrzesien"
when 10 then return "Pazdziernik"
when 11 then return "Listopad"
when 12 then return "Grudzien"
else
return ""
end
end
def plmonth(x)
case x.to_i
when 1 then return "stycznia"
when 2 then return "lutego"
when 3 then return "marca"
when 4 then return "kwietnia"
when 5 then return "maja"
when 6 then return "czerwca"
when 7 then return "lipca"
when 8 then return "sierpnia"
when 9 then return "wrzesnia"
when 10 then return "pazdziernika"
when 11 then return "listopada"
when 12 then return "grudnia"
else
return ""
end
end
#======================================================
#**Gotowy program
#======================================================
begin
s = "======================================================\n"
print s
print "**Program do obliczania dnia tygodnia.\n"
print "**04.02.2013\n"
print "**Nikodem Solarz alias Narzew\n"
print s
print s
print "Podaj dzien.\n"
print s
x = gets.chomp!
print s
print "Podaj miesiac.\n"
print s
y = gets.chomp!
print s
print "Podaj rok.\n"
print s
z = gets.chomp!
x = x.to_i
y = y.to_i
z = z.to_i
x = 1 if x <= 0
y = 1 if y <= 0
y = 12 if y > 12
x = $mday[y-1] if x > $mday[y-1]
x = 28 if y == 2 and x == 29 and !(jest_rokiem_przestepnym(z))
res = dzien_tygodnia(x.to_f,y.to_f,z.to_f)
yday = $week_table[y-1] + x
if y >= 3 and jest_rokiem_przestepnym(z)
yday += 1
end
print s
print "#{x} #{plmonth(y)} #{z} roku wypada w #{plday(res)}\nJest to #{yday} dzien roku.\n"
print s
$stdin.gets
end

