Школоло / Говнокод #3267 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 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 я не знаю.

Запостил: rat rat, (Updated )

Комментарии (21) RSS

  • фу-у-у
    вот это труЪ-Говно - крайне кривая реализация кривой идеи
    причем в данном случае крайне замудренная и сложная, а потому сто пудов тут еще и ошибки в логике есть. мне просто лень вникать в это Г
    ((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
      Ответить
      • Кстати, у Фаронова хорошая книга по Паскалю, на неё гнать не надо.
        Но почему не написать (26*m-2) div 10, действительно непонятно.
        Ответить
        • неясно почему в хорошей книге приведен такой говнокод.
          если бы я писал алгоритм, а тем более книгу, которая обучает хорошему стилю кодинга
          1. то создал бы Enum месяцев или на крайняк массив и задал бы количество дней в каждом из них (февраль - 28 )
          и константу YEAR_DAYS=365
          2. написал функции вычисляющие количество дней в конкретном году, и конкретном месяце конкретного года (пара if) используя константу и тот массив месяцев, что заготовили раньше
          3. сначала посчитал количество целых лет от какого-нить известного дня (желательно 1 января - воскресенье) и нашел количество дней за эти годы
          4. аналогично для месяцев
          5. потом посчитал бы отсавшиеся дни и сложил с днями по месяцам и годам
          6. сложил и mod 7. Все

          код читаем, краток, понятен и самое главное его можно быстро изменить для других нужд.
          зачем же лепить кучу непонятного говна да еще и писать это в учебник остается неясным
          Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8