Форум: "Потрепаться";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизНе пойму логики кода Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 2.099 c