Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вычисление дня недели


Автор: NiJazz 16.11.2003, 13:14
Нужно решить задачу, не используя стандартных типов вроде TDateTime...

Задача выглядит так: "Для заданной даты вычислить день недели".

Автор: Vit 16.11.2003, 14:59
Надо читать правила построения Григорианского календаря, когда там эти високосные годы и т.п., а затем чистая арифметика.

Автор: NiJazz 16.11.2003, 18:57
Vit, а где это взятьconfused.gif

Автор: Kurt 16.11.2003, 21:11
Во!
Рекомендую! Подходит для любого ЯП!
Рассказываю алгоритм..
Пусть n - день недели (n=0 - воскресение, n=1 - понедельник и т.д n=6 - суббота)
d - число месяца(дата);
m - номер месяца, если начинать счет с марта: 1 - март, 2 - апрель,.. 12 - февраль.(такая нумерация - для устранения проблем с февралем - то 28 то 29 дней..).
y - номер года в столетии;
c - количество столетий с учетом того, что январь считается 11-м, а февраль - 12-м месяцем предыдущего года).
Т.е для, допустим, 2000г., то для даты на январь-февраль, считаем y=99, c=19, для других месяцев y=0, c=20.
Далее вычисляем число W:
W = d+[(13*m-1)/5]+y+[y/4]+[c/4]-2*c
[] - целая часть от числа (например, [3.14]=3, [-3.14]=-4)
Теперь n = остаток от деления на 7 числа W.
Все. Как интерпретировать n я описал.
Если W отрицательно, то остаток от деления на 7 все равно должен быть >= 0.
Например, W=-25=7*(-4)+3. Пеэтому n=3 - среда.
Алгоритм точно работает для ЛЮБОЙ даты н.э. (проверено!).
Как ДО Н. Э. - честно говоря, не знаю, не пробовал.

Enjoy it! smile.gif


Автор: NiJazz 17.11.2003, 00:27
Kurt, спасибо. Пока не смотрел, но выложу готовый свой вариант...

Код

uses crt;
var day, month, year: integer;
   dayw: integer;
   s,s1: string;
   i,j: integer;
   date: array[1..3] of string;

Function DayOfWeek (day, month, year: integer) : integer;
var century, yr, dw: integer;
begin
if month < 3 then begin
 Inc(month, 10);
 Dec(year);
end
else Dec(month, 2);
century := year div 100;
yr := year mod 100;
dw := (((26*month - 2) div 10)+day+yr+(yr div 4)+
          +(century div 4) - (2*century)) mod 7;
if dw < 0 then DayOfWeek := dw + 7
else DayOfWeek := dw;
end;

begin
clrscr;
write('‚ўҐ¤ЁвҐ ¤ вг (¤¤.¬¬.ЈЈ): ');
read(s);
s1:='';
j:=0;
for i:=1 to length(s)+1 do begin
 if (s[i]='.') or (i = length(s)+1)  then begin
  j:=j+1;
  date[j]:=s1;
  s1:='';
 end
 else s1:=s1+s[i];
end;
val(date[1],day,day);
val(date[2],month,month);
val(date[3],year,year);
if ((day<1) or (day>31)) or ((month<1) or (month>12)) then begin
 writeln('?ҐЇа ўЁ«м­л© д®а¬ в ¤ вл');
 readln;
 readln;
 exit;
end;
dayw:=DayOfWeek(day,month,year);
writeln;
write('„Ґ­м ­Ґ¤Ґ«Ё зЁб«  ',s,' - ');
case dayw of
 0: writeln('‚®бЄаҐбҐ­мҐ');
 1: writeln('?®­Ґ¤Ґ«м­ЁЄ');
 2: writeln('‚в®а­ЁЄ');
 3: writeln('‘। ');
 4: writeln('—ҐвўҐаЈ');
 5: writeln('?пв­Ёж ');
 6: writeln('‘гЎЎ®в ');
end;
readln;
readln;
end.

Автор: NiJazz 17.11.2003, 00:28
С русским не продумал... Но ничего, и так ясно... smile.gif

Автор: December 17.11.2003, 01:27
В "Алгоритмы" обсуждалось недавно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)