Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
Время: 0.038 c
14-1095136210
Tiam
2004-09-14 08:30
2004.10.03
Что вы об этом думаете?


14-1095000039
QuasiLamo
2004-09-12 18:40
2004.10.03
Вопрос реторический. Потому в потрепаться.


1-1095673883
Iconka
2004-09-20 13:51
2004.10.03
Drag&Drop


4-1093280647
v3l0m
2004-08-23 21:04
2004.10.03
Help me please! Перевидите чайнику на C++.


3-1094204977
Koala
2004-09-03 13:49
2004.10.03
Вопрос по нумерации документов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский