1. C++ / Говнокод #2752

    +60.5

    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
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    //---сортировка по возрастанию методом выбора отдельно реальной и мнимой составляющих---------------
    bool F_Sorted(T_VectorComplex * VC, bool)
    {
        int i, j, m, N;
        double z;
        N = (*VC).size();
        for (j = N - 1; j > 0; j--) {
            m = j;
            z = real((*VC)[j]);
            for (i = j - 1; i >= 0; i--)
                if (z < real((*VC)[i])) {
                    z = real((*VC)[i]);
                    m = i;
                }
            if (j != m) {
                (*VC)[m] = T_Complex(real((*VC)[j]), imag((*VC)[m]));
                (*VC)[j] = T_Complex(z, imag((*VC)[j]));
            }
        }
        for (j = N - 1; j > 0; j--) {
            m = j;
            z = imag((*VC)[j]);
            for (i = j - 1; i >= 0; i--)
                if (z < imag((*VC)[i])) {
                    z = imag((*VC)[i]);
                    m = i;
                }
            if (j != m) {
                (*VC)[m] = T_Complex(real((*VC)[m]), imag((*VC)[j]));
                (*VC)[j] = T_Complex(real((*VC)[j]), z);
            }
        }
        return (true);
    }

    Запостил: crox, 11 Марта 2010

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

    • Помоему govnokod вреден. Я, насмотревшись, начинаю писать также... Х_Х
      Ответить
    • Мне больше нравится не используемые bool параметр и всегда возвращаемое true
      Ответить
      • Возможно, возращаемое true сделано с расчётом на будущую возможность возращать "false". Спросите "а зачем тогда до этого момента возращать true", дак чтобы в местах использования данной функции уже сейчас можно было использовать "if(F_Sorted(a,b))"... а передаваемый параметр тоже вполне может делаться для "forward compatibility".

        Хотя с другой стороны, возможно что это наоборот функция с "backward compatibility" на замену какой-то другой (более ранней) функции.

        А если ближе к телу функции, то вглядываться лень, но сразу режет глаз постоянное "(*VC)". Правильнее было бы определить ещё одну переменную, которой один раз присвоить "(*VC)", и после этого везде работать с новой переменной. Спросите "почему", дак для того, чтобы уменьшить глубину реальных значений (чтобы рабоатть не поинтером из поинтера, а напрямую с поинтером)... ну и так же из эстетических соображений
        Ответить
        • мне кажется, что второй параметр нужен был для того что бы производить реверс-сортировку.
          Если присвоить (*VC) переменной, то произойдёт глубокое копирование всего вектора. А вообще в С/C++ есть такой оператор как ->, а ещё лучше использовать ссылку или итераторы. А ещё лучше не городить велосипеды и использовать std::sort (которая, сортирует О(n log(n)) против О(N^2) в вышеприведённом говнокоде) и сортировка контейнера выполняется банальным определением предиката для комплексных чисел, например вот так:
          typedef std::complex<double> complex_t;
          struct less_complex : public std::binary_function<complex_t, complex_t, bool> {
              bool operator()(complex_t lhs, complex_t rhs) {
                  return std::make_pair(lhs.real(), lhs.imag()) <
                      std::make_pair(rhs.real(), rhs.imag());
              }
          };


          Ниже приведён полный текст проверочная программа, советую не полениться, а почитать ;)

          #include <complex>
          #include <utility>
          #include <vector>
          #include <algorithm>
          #include <iterator>
          #include <iostream>
          
          typedef std::complex<double> complex_t;
          struct less_complex : public std::binary_function<complex_t, complex_t, bool> {
              bool operator()(complex_t lhs, complex_t rhs) {
                  return std::make_pair(lhs.real(), lhs.imag()) <
                      std::make_pair(rhs.real(), rhs.imag());
              }
          };
          
          complex_t make_random_complex() {
              return complex_t(std::rand() % 100, std::rand() % 100);
          }
          
          template <typename Range>
          void print_vector(const Range& r) {
              std::ostream_iterator<typename Range::value_type> out(std::cout, "\n");
              std::copy(r.begin(), r.end(), out);
          }
          
          int main() {
              std::vector<complex_t> cvec(42);
              std::generate(cvec.begin(), cvec.end(), &make_random_complex);
              std::cout << "before sort:\n";
              print_vector(cvec);
              std::sort(cvec.begin(), cvec.end(), less_complex());
              std::cout << "after sort:\n";
              print_vector(cvec);
          }
          Ответить
          • Нам говнокод подавай а не STL примерчики из книжечек...
            Ответить
            • вообще-то это не из книжечки, сам вчера, будучи не трезвым написал ))
              Ответить
          • Как у тебя получаются такие нечитаемые программы? А ведь вроде хорошо написано...
            Ответить
          • Уважуха.
            Лаконичный, предельно ясный код. +
            Хорошее зеркало говнокода.
            Ответить
            • Тоесть не говнокод?
              Ответить
              • http://govnokod.ru/2752 - говнокод
                http://govnokod.ru/2752#comment18043 - не говнокод
                :-)
                Ответить
                • Это совершенно непонятный говнокод. И там. И там.
                  Ответить
                  • ololololo
                    Ответить
                  • правильно, потому что вы не говнокодер, а всего лишь студент, который ещё даже не дорос до статуса говнокодера. Но скоро вы им станенете, не бойтесь. Сидите на этом сайте побольше и всё у вас получится.
                    Ответить
                • govnokod состоит из говнокодеров чуть более, чем полностью и этот тред это отлично показывает. В основном здесь школота в глаза не видевшая С++, разве что по книжке архангельского, которую они читали в институте при сдаче лаб...
                  Ответить
          • А че такое сраное форматирование?
            Ответить
            • linux style, уж извините...
              Ответить
            • Потому что ты хуй! Это, блядь ты тупая, самый что ни на есть правильный стиль. И если ты, уебок, начитался ебыных говноучебников с примерами из вижуал студио то молчи блядища.
              Ответить
          • Написано make_RANDOM_complex, а генерит не случайные числа rand() % 100.
            Нужно rand()/RAND_MAX * maxololol использовать.
            Ответить
            • генерит радномные числа от 0 до 99. На тот случай если не поняли.
              Ответить
          • А че везде std:: ?
            using namespace std; не дано использовать?
            Ответить
            • привычка (или приницип) не использовать using директиву в области видимости ограниченной только единицей трансляции.
              Ответить
      • >и всегда возвращаемое true
        Даже в случае ошибки. :P
        Ответить
      • Давно уже пора пользоваться исключениями, а не кодировать ошибки магическими значениями. На дворе 21 век, все-таки.
        Ответить
        • да ну? программа сортировки кидающая исключения? Эх, школота...
          Ответить
          • Марш в школу
            Ответить
            • спасибо я там был, да только Вас там не видел :) Не, ну а серьезно, Вы считаете, что я не прав и мы должны кидать исключения из алгоритма сортировки?
              Ответить
          • Вообще какие в сортировке могут быть возращаемые значения или исключения?
            Сигнализирующие о том, что отсортировать элементы не удалось? :D
            Что-за бред?
            Ответить
            • ну а я обо что? Сортировка никогда не бросает исключений, если только не бросают исключений используемые ею операции: сравнения, копирования, присваивания и инкрменетирования. Обычно эти операции не кидают исключений.
              Ответить
    • Где здесь C++???
      Ответить
      • тщательно замаскирован ))

        T_VectorComplex - это std::vector<std::complex<double> >
        T_Complex - это std::complex<double>
        real, imag и прочие...

        но это конечно не умоляет заслуг автора ...))
        Ответить

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