- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
function fnGetWeekDay:integer;
//функция fnGetWeekDay возвращает день недели
var
CurDate: date;
dd,mm,yy: word;
cent, month, iRes : integer;
Begin
CurDate = CurrentDate;
DecodeDate(CurDate,yy,mm,dd);
month = mm;
if mm < 3 then mm = mm + 10
else mm = mm - 2;
if mm > 10 then yy = yy - 1;
cent = yy div 100;
yy = yy mod 100;
iRes = ((2.6*mm-0.2) div 1) + dd + yy + (yy div 4) + (cent div 4) - 2*cent;
iRes = ((iRes+777) mod 7);
if (month == 5) or (month == 7) or (month == 10) or (month == 12) then iRes = iRes - 1;
if iRes == -1 then result = 6
else if iRes == 0 then result = 7
else result = iRes;
End; // fnGetWeekDay
Это не совсем Delphi. Это нечто с крайне похожим синтаксисом.
Почему нельзя было использовать (CurrentDate - <какое-нибудь воскресенье>) mod 7 я не знаю.
вот это труЪ-Говно - крайне кривая реализация кривой идеи
причем в данном случае крайне замудренная и сложная, а потому сто пудов тут еще и ошибки в логике есть. мне просто лень вникать в это Г
((2.6*mm-0.2) div 1) - говорит само за себя
типа каждую неделю чтобы можно было давать какому-то особенно вонючему или уникальному говну +2
в данном клиническом случае я бы воспользовался этой фичей.
Не понял. Это ж не компилится.
Код написан до 2000 года и с 29 февраля 2000 года ошибается на 1.
Oxygene?
Слишком редко используемый язык - не хочу палиться.
фуу, ламер
Проблема в том, что очень легко облажаться, написав = вместо ==, хорошо хоть, компилятор предупреждает. В нормальном синтаксисе возможностей лажануться не должно быть.
Есть сотни способов облажаться; только на си, чтобы выстрелить себе в ногу, никаких особых навыков не надо.
Это не просто говнокод. Это говнокопипаста говнокода.
Коллега вспомнил, что видел этот пример в учебнике для вузов по Турбо Паскалю за авторством Фаронова. И даже пруфлинк на несколько переделанную версию накопал: http://miit.bsu.edu.ru/resources/tp_faronov/gl2/gl2_7_1.html
И это уже больше десятка лет работает в довольно распространенной системе.
но там хотя бы trunc(2.6*m-0.2) а не деление по модулю 1
Но почему не написать (26*m-2) div 10, действительно непонятно.
если бы я писал алгоритм, а тем более книгу, которая обучает хорошему стилю кодинга
1. то создал бы Enum месяцев или на крайняк массив и задал бы количество дней в каждом из них (февраль - 28 )
и константу YEAR_DAYS=365
2. написал функции вычисляющие количество дней в конкретном году, и конкретном месяце конкретного года (пара if) используя константу и тот массив месяцев, что заготовили раньше
3. сначала посчитал количество целых лет от какого-нить известного дня (желательно 1 января - воскресенье) и нашел количество дней за эти годы
4. аналогично для месяцев
5. потом посчитал бы отсавшиеся дни и сложил с днями по месяцам и годам
6. сложил и mod 7. Все
код читаем, краток, понятен и самое главное его можно быстро изменить для других нужд.
зачем же лепить кучу непонятного говна да еще и писать это в учебник остается неясным
когда то давно баловался такими штучками
http://ru.wikipedia.org/wiki/Вечный_календарь
по крайней мере эта формула логична и легко догадатся что к чему