1. C# / Говнокод #4156

    +145

    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
    public double FindMax(double num1, double num2, double num3)
        {
            double max = num1;
            if (num2 > max)
            {
                max = num2;
            }
            if (num3 > max)
            {
                max = num3;
            }
            return max;
        }

    Запостил: KamaZz, 02 Сентября 2010

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

    • зато все понятно, епт
      Ответить
      • но некошерно!
        Ответить
        • А вообще можно так: return Math.Max(num1, Math.Max(num2, num3)); но зачем хардкодить на 3 аргумента? сделали бы через params + linq Max()
          Ответить
    • KamaZz, а как надо?
      Ответить
      • Надо так:
        public double FindMax(double num1, double num2, double num3)
        {
        return new[] {num1, num2, num3}.Max();
        }
        :D

        Тока using System.Linq не забудь добавить ))
        Ответить
      • varargs + sort имхо
        Ответить
        • ох любите Вы varargs )
          Ответить
          • ох Вы любите линк)
            а чем плох вараргс?
            Только не говорите что он тормозит: ни за что не поверю, что он у в ас боттлнек
            Ответить
            • я ж не сказал, что varargs плох, я говорил про любовь к нему)
              Ответить
    • Я бы убрал временную переменную:
      if (num2 > num1) num1 = num2;
      if (num3 > num1) num1 = num3;
      return num1;
      Ответить
      • Не лучший вариант фактические аргументы модифицировать.
        Да и с "max" документированность лучше.
        Хотя в данном случае и так всё ясно.
        Ответить
        • >>Не лучший вариант фактические аргументы модифицировать.
          Всё относительно. В мелких функциях, почему бы и нет.
          Ответить
        • это же стракт!
          Ответить
    • А как ещё это можно написать?
      Ответить
      • можно скачать компонент, который находит макса сам :-D
        Ответить
        • Откуда Вы знаете что Ваш собеседник -- дельфист?
          Ответить
        • Боян и переход на личности. К тому же этот наезд ко мне не относится.
          Ладно, пошутили и хватит. Принципиально по другому максимум 3 чисел не напишется, значит не говнокод.
          Ответить
          • Парой постов выше были примеры человеческого решения с линком и с массивом
            Ответить
            • > return new[] {num1, num2, num3}.Max();

              Я надеюсь, ты не это назвал человеческим решением?
              Ответить
              • нет, я имел ввиду вариант с вараргом
                Ответить
                • И с сортом?
                  Сортировать массив, чтобы узнать его максимум?!
                  Ответить
                  • Можно с сортом, можно просто найти большее число прямым перебором.
                    И работать будет на любое кол-во аргументов, ага)
                    Ответить
                    • > Можно с сортом

                      Индус, уходи.
                      Ответить
                      • лол, специально для байтойобов типа тебя я написал "можно перебором".

                        а вообще когда ты узнаешь что кроме учебных бывают еще и бизнес-приложения, то тебе откроется страшная истина: не нужно оптимизировать то, что занимает менее 20% выполнения. Сортировка массива из десяти элементов на современном железе это ничто.
                        Ответить
                        • наверное потому тем кто пишет эти бизнес приложения в нью-йорке платят $250 тыс. а в требованиях есть обязательное поле жирным
                          * strong optimisation skills
                          а ты все говнокод пишешь, и наверное еще ругаешься почему даже индусы с китайцами зарабатывают больше...
                          а вообще, нельзя так плохо относиться к своей работе...
                          Ответить
                          • да, под "strong optimisation skills" конечно подразумевается выпиливание из кода одной ненужной сортировки массива из десяти элементов:)))

                            начался учебный год, студенты вернулись с каникул и прямиком на говнокод.
                            Ответить
                            • да-да, сынок.. расскажи как прошли каникулы...
                              Ответить
                              • ну раз тебе по существу ответить нечего -- можно и писькаме померица.)
                                Ответить
                                • почему же нечего...
                                  для поиска большего числа можно все закинуть в базу и сделать select с сортировкой... а ченам? оно же меньше 20% времени займет...
                                  Ответить
                                  • ты реально думаешь что сортировка массива занимает по времени столько же, сколько запрос в базу и сортировка там?)))

                                    еще раз: оптимизировать надо то, что занимает минимум 20% времени. Я не верю что есть в мире приложение на C# в котором 20% времени занимает сортировка массива.
                                    Ты веришь?

                                    Читабельный код лучше нечитабельного. Гибкий код лучше не гибкого.
                                    Потому код "someArray.sort().max()" лучше приведенного в этом примере кода в тысячу раз, хотя и требует лишней сортировки.

                                    Еще раз напоминаю что речь идет о не драйвере сетевой карты и не о ядре крупной реляционной бд, а о приложении на C#, которое скорее всего энтерпрайз, и в нем наверняка есть linq2sql, который кушает намного больше ресурсов, чем этот сраный сорт.

                                    ЗЫ: Самое смешное что я изначально предложил прямой перебор, который товарищ внизу преподнес как откровение)
                                    Ответить
                                    • >Я не верю что есть в мире приложение на C# в котором 20% времени занимает сортировка массива.
                                      Программа сортировки массива. Занимает ~100%. Хе-хе :))
                                      Ответить
                        • Ну, у нас в Северной Азии такая функция сходится как O(n), а предложенный qsort - O(n log n)
                          Так что костыль красив, но когда понадобится им воспользоваться - всё равно придется переписать нормально :-)
                          Ответить
                          • как только он начнет занимать хотя бы 1% времени работы системы
                            Ответить
                            • начнет, закон Мёрфи неумолим, и годная универсальная функция попадет куда-нибудь в O(n²) =)
                              Ответить
                        • Знаешь, какое самое больше зло программирования? Предварительная оптимизация? Нет. Самое большое зло - предварительная пессимизация. А ты сейчас просираешь не только константу, что уже какого-то хрена считается нормой, но и порядок (добавляется логарифм), что даже сейчас считается недопустимым.
                          И почему элементов не более десяти? А если программист Вася захочет применить твою функцию для массива из 100500 элементов?
                          Ответить
                          • дело даже не в Васе Пупкине, а том, что после обобщения функции для переменного кол-ва аргументов, функция будет перемещена в к.-л. файл с прочим утилём для повторного использования. т.е. обобщение автоматически касается и качества кода.
                            Ответить
          • вообще, шутка не задумывалась как наезд :-P

            а насчет CLR - не знаю насколько там принято создавать депенденси из-за элементарных операций, в ЯВУ обычно стараются избегать этого
            Ответить
            • Да просто я немного дёрганный стал на шутки про дельфи после одного уродца.
              В дельфах можно так делать:
              function Max(n: array of extended): extended;
              var
                i: integer;
              begin
                result := 0;
                for i := 0 to Length(n) - 1 do if (i=0) or (n[i]<result) then result := n[i];
              end;

              Вызывается так: x := max([1,2,3]);
              Можно любое число параметров через запятую передавать. Параметры пихаются в стек, количество, уменьшенное на единицу, пихается в edx, всё достаточно оптимально.
              Ответить
              • *n[i]>result
                Ответить
              • тут сократить чутка,
                Result := X[0];
                for I := 1 to Length(X) - 1 do

                но мне не очень нравится использование динамического массива где можно было бы обойтись открытым

                > ...на шутки про дельфи после одного...
                общий уровень дельфистов в среднем по больнице мягко говоря оставляет желать лучшего
                Ответить
                • Что подразумевается под открытым массивом? А динамического массива (в общем случае) тут вроде как нет. Оператор x := max([1,2,3]); собирает массив налету прямо в стеке, без использования DynArraySetLength()/DynArrayClear().

                  Result := X[0]; может вылететь на пустом массиве, хотя молчаливое result := 0 мне тоже не нравится...
                  Ответить
                  • > Что подразумевается под открытым массивом?
                    Хм, динамический массив мне здесь приглючился, да. На пустом динамическом свалилось бы (что правильно), а на открытом не свалится, но вернет мусор из стека, так что надо if Length(X) = 0 then raise EInvalidOperation.Cre... или что-то типа
                    В оригинале проверка на нулевой индекс в каждой итерации - говно
                    Ответить
                    • Таки да, я понял, что мне не нравится. Перебор 0..Length(X)-1 вместо Low(X)..High(X)

                      а вообще, мы только что изобрели библиотечную процедуру Math.MaxValue, если принять последние поправки - они будут идентичны :-D
                      Ответить
                      • > изобрели библиотечную процедуру
                        Блин, есть такое :) Кстати, Low() не спасает (да и не должна) от Access vioaltion на пустом динамическом массиве, а на открытом MaxValue([]) возвращает 0.
                        Ответить
                        • наоборот, A/V нужно, поскольку максимальное значение из 0 элементов не определено (или, например, кошерно было бы возвращать -∞ или NaN) так что по-любому исключительная ситуация

                          > открытом MaxValue([]) возвращает 0
                          Это - мусор из стека, они не обрабатывают эту ситуацию
                          Result := Data[Low(Data)]; // вот так инициализируется

                          Low и High я предложил использовать исключительно ради улучшения читаемости, они будут всегда соответствовать 0 и Length-1
                          Ответить
                • > тут сократить чутка,

                  Тогда надо отдельно разобрать случай нулевого массива.

                  > но мне не очень нравится использование динамического массива где можно было бы обойтись открытым

                  Читай полностью:
                  > Параметры пихаются в стек, количество, уменьшенное на единицу, пихается в edx, всё достаточно оптимально.

                  > общий уровень дельфистов в среднем по больнице мягко говоря оставляет желать лучшего

                  Я с программистами вообще мало общался, сказать ничего ни про чей уровень (включая свой) не могу. Было бы интересно посмотреть.
                  Ответить
                  • > разобрать случай нулевого массива
                    вот перфекционизированный вариант
                    function Max(X: array of Real): Real;
                    var
                      I: Integer;
                    begin
                      if Length(X) = 0 then
                        raise EInvalidArgument.Create('надо класс исключения выбрать');
                    
                      Result := X[Low(X)];
                      for I := Low(X) + 1 to High(X) do
                        if X[i] > Result then
                          Result := X[i];
                    end;

                    динамический массив мне приглючился, говорю. в любом случае здесь это будет субоптимально и по универсальности и по скорости

                    я к себе в кабинку кладу собранное по всяким сообществам, но смешные - редкость, обычно унылая копипаста
                    Ответить
                    • Я за то, чтобы для нулевого давать -inf.
                      Правда, если разрешить такие числа и НАНы, то функция нахождения минимума усложнится.
                      function nMax;
                      var
                        i: integer;
                      begin
                        Result := -Inf;
                        for i := 0 to Count - 1 do begin
                          if isNan(N[i]) then Result := NAN
                          else if isInf(N[i]) then begin
                            Result := Inf;
                            Exit;
                          end else if N[i] > Result then Result := N[i];
                        end;
                      end;

                      Это я для калькулятора такое мутил: http://tarasber.narod.ru/MiniCalc.rar
                      Он на max() даёт -inf
                      Ответить
                      • тут сильно зависит от окружающего матана, там где допустима ситуация когда в функцию попадет 0 аргументов - правильней будет возврат NaN. пока я колеблюсь, я бы сделал обертки :)

                        PS: у тебя код допускает сравнение с NaN результат которого всегда false
                        Ответить
                        • Кстати да, почему-то калькулятор на
                          1<=nan даёт 1.0 (то есть тру). Надо поправить.
                          Ответить
    • глядя на эту функцию сразу вспомнил школьный курс информатики где мы на лабораторных работах писали функции БИ2 (большее из двух) или БИД и БИ3 или БИТ (большее из трех)...
      на пятерку нужно было в функции БИ3 использовать функцию БИ2...
      Ответить
      • public double Max1d(double num1) {
          return num1;
        }
        
        public double Max2d(double num1, double num2) {
          return (Max1d(num1) > Max1d(num2) ? Max1d(num1) : Max1d(num2));
        }
        
        public double Max3d(double num1, double num2, double num3) {
          return Max2d(Max2d(num1, num2), num3);
        }
        Ответить
    • Задание: найти максимальное из 3х действительных чисел. Без массивов, изь*бонов и использования стд либ :-) Предмет "Алгоритмы и структуры данных" хД
      Начинается все вот с этого, а заканчивается Рунге-Куттами и симоляторами молеколы кислорода в емкости фалообразной формы.
      Ответить
    • public boolean check(double max)
      {
      int count = 0;
      if(max == num1 )
      count++;
      if(max == num2 )
      count++;
      if(max == num3 )
      count++;
      return(count == 1);
      }
      public double findMax()
      {
      double max = num1;
      if( num2 > max )
      max = num2;
      if( num3 > max )
      max = num3;
      return max;
      }

      сначала был массив и сортировка, препод сказал убрать нах..мне надо быо найти максимум и сделать рповерку не являеться ли таковым несколько чисел, если да на екран вывести ошибку, и я пыталься сделать эту проверку кучами ифов и т.д, то был тру говнокод, а вот собстно 2 простейших метода всё просто)вот и все что мне нужно было сделать)
      Ответить
    • я твой дерева абасал
      Ответить
    • Вот лучший вариант:
      public static double Max(double a, double b, double c)
      {
      if (a > b)
      return a > c ? a : c;
      else
      return b > c ? b : c;
      }

      public static double Min(double a, double b, double c)
      {
      if (a < b)
      return a < c ? a : c;
      else
      return b < c ? b : c;
      }
      Ответить
      • не лучший но пойдет
        лучший - LINQ
        LINQ ругает только тот, кто не знает LINQ
        Ответить
        • >LINQ ругает только тот, кто не знает LINQ
          ути-пути, какая величайшая сложность. LINQ ругает еще тот, кто на настоящих монадах гоняет.
          Ответить

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