1. Pascal / Говнокод #3267

    +104

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 19 Мая 2010

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

    • фу-у-у
      вот это труЪ-Говно - крайне кривая реализация кривой идеи
      причем в данном случае крайне замудренная и сложная, а потому сто пудов тут еще и ошибки в логике есть. мне просто лень вникать в это Г
      ((2.6*mm-0.2) div 1) - говорит само за себя
      Ответить
      • кстати хочу добавить на реформал в пожелания такую фичу:
        типа каждую неделю чтобы можно было давать какому-то особенно вонючему или уникальному говну +2
        в данном клиническом случае я бы воспользовался этой фичей.
        Ответить
      • (2.6*mm-0.2) div 1
        Не понял. Это ж не компилится.
        Ответить
    • Ошибка, судя по всему, есть - не учтено, что в 2000 году было 29 февраля, при том, что учтено, что каждые 100 лет 29 февраля нет.
      Код написан до 2000 года и с 29 февраля 2000 года ошибается на 1.
      Ответить
      • >>Это нечто с крайне похожим синтаксисом.

        Oxygene?
        Ответить
        • Нет.
          Слишком редко используемый язык - не хочу палиться.
          Ответить
        • А вот за "похожий синтаксис" щас буду убивать. Потому что за что я Паскаль уважаю, так это за то, что оператор сравнения действительно является оператором сравнения, а не оператором присваивания. А тут как раз именно этот синтаксический плюс убрали. Нахера?
          Ответить
          • паскалист дрочит на синтаксис
            фуу, ламер
            Ответить
          • Нажимать шифт каждый раз при присваивании? Месье извращенец?
            Ответить
            • А нажимать шифт для каждого вложенного оператора и выражения?
              Проблема в том, что очень легко облажаться, написав = вместо ==, хорошо хоть, компилятор предупреждает. В нормальном синтаксисе возможностей лажануться не должно быть.
              Ответить
              • Очень легко ошибиться, сделав malloc/new, и забыв в конце сделать free/delete. Компилятор может предупредить, но делать этого не будет, потому что ему память по барабану.

                Есть сотни способов облажаться; только на си, чтобы выстрелить себе в ногу, никаких особых навыков не надо.
                Ответить
                • Посмотрите правде в глаза - есть сотни способов облажаться в чём угодно.
                  Ответить
    • труЪ!
      else if iRes == 0 then result = 7
      Ответить
    • Сводки с полей!
      Это не просто говнокод. Это говнокопипаста говнокода.
      Коллега вспомнил, что видел этот пример в учебнике для вузов по Турбо Паскалю за авторством Фаронова. И даже пруфлинк на несколько переделанную версию накопал: 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/%D0%92%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0 %BA%D0%B0%D0%BB%D0%B5%D0%BD%D0%B4%D0%B0% D1%80%D1%8C

              result=(7000+(день+y+y div 4-y div 100+y div 400+(31*m) div 12)) mod 7


              когда то давно баловался такими штучками
              Ответить
              • линк битый, но я понял куда надо идти ))
                http://ru.wikipedia.org/wiki/Вечный_календарь
                по крайней мере эта формула логична и легко догадатся что к чему
                Ответить

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