Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
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 февраля, при том, что учтено, что каждые 100 лет 29 февраля нет.
Код написан до 2000 года и с 29 февраля 2000 года ошибается на 1.
А вот за "похожий синтаксис" щас буду убивать. Потому что за что я Паскаль уважаю, так это за то, что оператор сравнения действительно является оператором сравнения, а не оператором присваивания. А тут как раз именно этот синтаксический плюс убрали. Нахера?
А нажимать шифт для каждого вложенного оператора и выражения?
Проблема в том, что очень легко облажаться, написав = вместо ==, хорошо хоть, компилятор предупреждает. В нормальном синтаксисе возможностей лажануться не должно быть.
Очень легко ошибиться, сделав malloc/new, и забыв в конце сделать free/delete. Компилятор может предупредить, но делать этого не будет, потому что ему память по барабану.
Есть сотни способов облажаться; только на си, чтобы выстрелить себе в ногу, никаких особых навыков не надо.
Сводки с полей!
Это не просто говнокод. Это говнокопипаста говнокода.
Коллега вспомнил, что видел этот пример в учебнике для вузов по Турбо Паскалю за авторством Фаронова. И даже пруфлинк на несколько переделанную версию накопал: http://miit.bsu.edu.ru/resources/tp_faronov/gl2/gl2_7_1.html
И это уже больше десятка лет работает в довольно распространенной системе.
мда, в бытность студентом этот говноучебник кажись был в списке рекомедованых )), хорошо, что меня от паскаля уже тогда тошнило
но там хотя бы trunc(2.6*m-0.2) а не деление по модулю 1
неясно почему в хорошей книге приведен такой говнокод.
если бы я писал алгоритм, а тем более книгу, которая обучает хорошему стилю кодинга
1. то создал бы Enum месяцев или на крайняк массив и задал бы количество дней в каждом из них (февраль - 28 )
и константу YEAR_DAYS=365
2. написал функции вычисляющие количество дней в конкретном году, и конкретном месяце конкретного года (пара if) используя константу и тот массив месяцев, что заготовили раньше
3. сначала посчитал количество целых лет от какого-нить известного дня (желательно 1 января - воскресенье) и нашел количество дней за эти годы
4. аналогично для месяцев
5. потом посчитал бы отсавшиеся дни и сложил с днями по месяцам и годам
6. сложил и 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/Вечный_календарь
по крайней мере эта формула логична и легко догадатся что к чему