Главная страница
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.022 c
11-1080899829
*pavel
2004-04-02 13:57
2004.10.03
ImageShow


3-1094500921
MaxN
2004-09-07 00:02
2004.10.03
Связь через Internet


1-1095267612
appendix
2004-09-15 21:00
2004.10.03
выравнивание текста в StringGrid


1-1095424104
Jay
2004-09-17 16:28
2004.10.03
TMainMenu


4-1093249421
Li_
2004-08-23 12:23
2004.10.03
как hook ом отловить нажатие cntrl+q ?