Главная страница
    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.053 c
1-1095244218
1008
2004-09-15 14:30
2004.10.03
Удаление символа из вставленного в M$ Word текста


1-1095699480
Klopan
2004-09-20 20:58
2004.10.03
CMD


1-1095342962
stud
2004-09-16 17:56
2004.10.03
необходимо выделить фрагмент изображения


1-1095648629
JetMan
2004-09-20 06:50
2004.10.03
Как найти последний день месяца?


8-1089106744
REA
2004-07-06 13:39
2004.10.03
Big Bitmap





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский