Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Не пойму логики кода   Найти похожие ветки 

 
Vasya.ru   (2004-09-12 23:10) [0]

Нашел тут в сети код определения дня недели по дате:
function DayOfWeek(Var Day, Mounth, Year : Integer) : String;
(*************************************************************************
День недели по дате.
Понедельник имеет номер 1,
Вторник номер 2, ...,
Воскресенье номер 7.
*************************************************************************)
var
   Counter : Integer;
begin
   if (Mounth > 2) then
   begin
       Inc (Mounth);
   end
   else
   begin
       Inc (Mounth, 13);
       Dec (Year);
   end;
   Counter := 36525 * Year div 100 + 306 * Mounth div 10 + Day - 621050;
   Counter := Counter - Counter div 7 * 7 + 1;
 
   End;
end;

Код работает правильно, не могу понять откуда Inc (Mounth, 13); Dec (Year);, Counter := 36525 * Year div 100 + 306 * Mounth div 10 + Day - 621050;
   Counter := Counter - Counter div 7 * 7 + 1;

Никто не встречал описание алгоритма?


 
Vasya.ru   (2004-09-12 23:11) [1]

Опечатался - function DayOfWeek(Var Day, Mounth, Year : Integer) : Integer;


 
QuasiLamo ©   (2004-09-12 23:51) [2]

А в стандартной функции совсем все просто :)
Если уж и пытаться понять, так этот код...

function DayOfWeek(const DateTime: TDateTime): Word;
begin
 Result := DateTimeToTimeStamp(DateTime).Date mod 7 + 1;
end;


 
QuasiLamo ©   (2004-09-12 23:56) [3]

там узнаем сколько дней прошло с нулевого года, берем остаток от деления на семь(то бишь отбрасываем целое количество недель) и получаем день недели... все просто :) А вот видел бы ты код DateTimeToTimeStamp... там асм страшный, великий и ужасный...


 
Vasya.ru   (2004-09-13 00:12) [4]

там узнаем сколько дней прошло с нулевого года, берем остаток от деления на семь
спорно - Вторник номер 2, ...,
Воскресенье номер 7
- остаток от деления на 7 7ми ровно быть не может.


 
Vasya.ru   (2004-09-13 00:14) [5]

откуда 36525, 621050?


 
jack128 ©   (2004-09-13 00:17) [6]

Vasya.ru   (13.09.04 0:14) [5]

> откуда 36525
это среднее число дней в году * 100. Сравни

> 36525 * Year div 100

только алгоритм неправильный..


 
Vasya.ru   (2004-09-13 13:29) [7]

только алгоритм неправильный..
- так ведь работает


 
jack128 ©   (2004-09-13 13:38) [8]

Vasya.ru   (13.09.04 13:29) [7]
- так ведь работает

Даже не компилируется. К тому же не видно ни одного присваивания псевдо переменной Result, так что результат неопределён.


 
Igorek ©   (2004-09-13 19:27) [9]


> Vasya.ru   (12.09.04 23:10)  

Это просто сильно заоптимизированный вариант.


 
Vasya.ru   (2004-09-13 21:00) [10]

Counter := Counter - Counter div 7 * 7 + 1;
DayOfWeek := Counter;
End;


 
jack128 ©   (2004-09-13 21:35) [11]

Vasya.ru   (13.09.04 21:00) [10]

сравни и почувствуй разницу:
procedure TForm1.Button1Click(Sender: TObject);
function DayOfWeekEx(Day, Mounth, Year : Integer) : integer;
(*************************************************************************
День недели по дате.
Понедельник имеет номер 1,
Вторник номер 2, ...,
Воскресенье номер 7.
*************************************************************************)
var
  Counter : Integer;
begin
  if (Mounth > 2) then
  begin
      Inc (Mounth);
  end
  else
  begin
      Inc (Mounth, 13);
      Dec (Year);
  end;
  Counter := 36525 * Year div 100 + 306 * Mounth div 10 + Day - 621050;
  Counter := Counter - Counter div 7 * 7 + 1;
  Result := Counter;
End;

begin
 Caption := IntToStr(DayOfWeekEx(10, 2, 502));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Caption := IntToStr(DayOfWeek(EncodeDate(502, 2, 10)));
end;



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
9-1086455781
Igoryok
2004-06-05 21:16
2004.10.03
Я возмущён скатал NVidia SDK 200 метров - не пашет вырубается


1-1095161589
X9
2004-09-14 15:33
2004.10.03
Утечка памяти при использовании TForm


14-1094763527
Palladin
2004-09-10 00:58
2004.10.03
Посоветуйте смартфон...


14-1095032103
Monster
2004-09-13 03:35
2004.10.03
Нужен исходник!


6-1090777778
oleg_SYS
2004-07-25 21:49
2004.10.03
Заполнение WEB-форм