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

    +3

    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
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    #include <cstdlib>
    #include <iostream>
    #include <time.h>
    
    using namespace std;
    
    const int n=20;
    int mass[20];
    
    void massiv(int x[])
    {
    srand(time(NULL));
    for(int i=0;i<20;i++) mass[i]=rand()%100;
    return 0;
    }
    
    void vivod(int x[])
    {
    for(int i=0;i<20;i++) cout<<mas[i]<<"\n";
    return 0;
    }
    
    
    void sort (int x[])
    {
    int i,j,b;
    for(j=1;j<=n-1;j++)
    for(i=0;i<=n-1-j;i++)
    if (mass[i]>mass[i+1])
    {
    b=mass[i];
    mass[i]=mass[i+1];
    mass[i+1]=b;
    }
    }
    return 0;
    }
    
    int main(int argc, char *argv[])
    {
        zapolneniemassiva(mass[20]);
        pokaz(mass[20]);
    	sort(mass[20]);
    	variant3(mass[20]);
    	
        system("PAUSE");
        return EXIT_SUCCESS;
    }

    Одногруппник сделал лабу на C++, программа сортирует массив по возрастанию и выводит, ну, по крайней мере, должна.

    Запостил: TBoolean, 28 Марта 2013

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

    • Че это за хуйня вообще? Эту лабу на бумаге ручкой что-ли писали? Оно даже не скомпилится, треду минус.

      P.S. Очень странно, но сама пузырьковая сортировка походу написана корректно.
      Ответить
      • > P.S. Очень странно, но сама пузырьковая сортировка походу написана корректно.

        Плюс пузырьковой сортировки в том, что она сортирует быстро почти отсортированные коллекции.
        Так что не хватает теста на отсортированность и выхода из очередной итерации, если это произошло.

        Хотя конечно использовать её для почти отсортированных коллекций не имеет смысла, так как есть более хорошие алгоритмы
        Ответить
        • > Так что не хватает теста на отсортированность
          Скажи спасибо, что автор "лабы" хотя бы с индексами не пролетел, и оно с горем-попалам, хоть и медленно, и совсем не тот массив, который ей передали в аргументе, но все-таки будет сортировать... Какая уж тут эффективность...

          А вот остальной код - скучная, унылая, некомпилирующаяся хуита:
          1) return 0 в void'ах
          2) совершенно левые имена функций в main()
          3) каст из инта в указатель в sort(mass[20])
          4) mass и mas
          Ответить
          • вот вам не скучно обсуждать какую то убогую говнолабу
            докатились
            Ответить
            • Сейчас её ещё борманд перепишет с байтоёбством.
              Ответить
              • Ну а чего тут можно набайтоёбить? Разве что бабл-сорт на SSE.
                Ответить
                • Обмен без дополнительной переменной
                  Ответить
                  • xchg eax, ebx что-ли?
                    Ответить
                    • Не все люди осознают прелесть ассемблера.
                      Ответить
                      • И еще меньше осознают прелесть инлайн-ассемблера gcc:
                        asm("movl %1, %%ecx\n"
                        "1: dec %%ecx\n"
                        "   movl %%ecx, %%eax\n"
                        "   imull %%eax\n"
                        "   idivl %1\n"
                        "   cmpl %%ecx, %%edx\n"
                        "   jnz 1b\n"
                        "   movl %%ecx, %0"
                        : "=g"(b)
                        : "r"(n)
                        : "%eax", "%ecx", "%edx");
                        Ответить
                        • Выглядит отвратительно.
                          Ответить
                          • Зато это настоящий инлайн асм, который не мешает оптимизатору, и не превращает код вокруг себя в говно ;)

                            Нижние 3 строки показывают требования к входным и выходным параметрам, а также запоротые во вставке регистры.
                            Ответить
                          • Это недостаток самой сишки - многострочники выглядят отвратительно.
                            Ответить
                            • Да можно макро запилить, которое будет добавлять \n. А вот от кавычек походу не избавиться.
                              Ответить
                              • >макро запилить, которое будет добавлять \n
                                Я тоже про макросы подумал.

                                >или "+ и -" же
                                Вот такие как ты и писали в жабе усреднение для binarySearch.
                                Ответить
                                • А что там с усреднением?
                                  Ответить
                                  • Ну баг был. Довльно известный.
                                    Выбиралось для сортировки (a+b)/2. В знаковой жабе.
                                    Ответить
                                    • На гигабайтных массивах падало с ошибкой про отрицательный индекс? Ну не так уж страшно, кстати. Хотя бы не молча, да и ситуация не такая частая.

                                      В тех же крестах последствия были бы куда веселее...
                                      Ответить
                                    • Где а и b индекс начала и конца массива?
                                      Ответить
                                      • > Где а и b индекс начала и конца массива?
                                        Начала и конца исследуемого блока же. Вспоминай как работает двоичный поиск.

                                        Вот если искомый элемент лежит практически в конце, а массив содержит чуть больше миллиарда элементов, то a+b переполнятся и их сумма станет отрицательной...
                                        Ответить
                                        • >чуть больше миллиарда элементов, то a+b переполнятся и их сумма станет отрицательной...

                                          Блин, я бы пролетел... А как делать правильно?
                                          ШиндовсХовно
                                          Ответить
                                          • a + bitcast(b-a, unsigned)/2
                                            Ответить
                                            • (unsigned(a)+unsigned(b))/2
                                              Ответить
                                              • А в жабе разве можно в унсигнет кастить?
                                                Конечно же
                                                (a+b)>>1
                                                Хотя думаю можно ещё улучшить ситуацию
                                                Ответить
                                                • Зановес:
                                                  a+(abs(a-b)/2)
                                                  Ответить
                                                  • Кто минуснул? Неужто может сделать лучше? Видимо Math. не смогли мысленно подставить.
                                                    Ответить
                                                    • > a+(abs(a-b)/2)
                                                      a + (b-a) / 2

                                                      Модуль здесь не нужен, т.к. при двоичном поиске всегда понятно, где верхняя граница, а где нижняя.

                                                      > (a+b)>>1
                                                      (a+b) >>> 1
                                                      Ответить
                                                      • Я расчитывал на условие выбора верхней и нижней границы, но так оптимальнее. Ты прозорлив.

                                                        > (a+b) >>> 1
                                                        > >>>
                                                        Что это?
                                                        Ответить
                                                    • Ну я минуснул
                                                      твой вариант обломается, если a дохуя отрицательное, b дохуя положительное
                                                      Ответить
                                                      • > твой вариант обломается, если a дохуя отрицательное
                                                        Это задача о двоичном поиске в массиве. Откуда там отрицательные числа?
                                                        Ответить
                                                        • Нормальный массив, с отрицательными индексами
                                                          Ответить
                                                          • > Нормальный массив, с отрицательными индексами
                                                            Пасцализм ;)
                                                            Ответить
                                                            • Но мы то с тобой дядю Паскаля уважаем. ;)
                                                              Ответить
                                                              • > дядю Паскаля
                                                                А не дядю Вирта случаем? ;) Паскаль программированием не особо увлекался.
                                                                Ответить
                                                                • Но мы то с тобой знаем, что Блез Паскаль был Музой Вирта. ЧИТАТЬ ДАЛЬЩЕ>>>
                                                                  Ответить
                                                            • А то!
                                                              Ответить
                                              • хуита, при переполнении не то будет
                                                Ответить
                                          • > ШиндовсХовно
                                            Здрисни.
                                            Ответить
                                            • >Кто минуснул?
                                              Пиздец. Та грех такое минуснуть.
                                              >Обмен посредством "xor" или "+ и -" же.
                                              Что еще можно было ожидать от автора такого поста?
                                              Кстати ни одного вменямого варианта по треду я не увидел.
                                              Ответить
                                              • > Кстати ни одного вменямого варианта по треду я не увидел.
                                                (a+b) >>> 1 чем не вменяем?
                                                Ответить
                                                • Нормал.
                                                  За обилием absов не заметил лишнего ">".
                                                  Да и вообще я думал над "универсальным" вариантом.
                                                  Без жабизма головного мозга, чтоб уж везде.
                                                  (x & y) + ((x^y)>>1)
                                                  Должно по идее работать и на знаковых и на беззнаковых.
                                                  Ответить
                                                  • > (x & y) + ((x^y)>>1)
                                                    Вот битоебство то... частичные суммы и переносы разделены на 2 слагаемых, и сдвинуты по-отдельности...
                                                    Ответить
                                                    • Зато походу везде работает.
                                                      Будь-то отрицательные, положительные, кресты, сишка, жаба, signed, unsigned.
                                                      Железно.

                                                      Не пойму другого - зачем вообще было тратить бисер и начинать что-то объяснять гумну?
                                                      Пусть бы дальше absы делал.
                                                      Ответить
                                                      • > зачем вообще было тратить бисер и начинать что-то объяснять гумну?
                                                        Чтобы накалить обстановку и написать Ебанись. Арифметический (a) сдвиг (s) вправо (r) же.
                                                        Ответить
                                              • >Пиздец.
                                                Ну и что тебе не понравилось? Абс спугался?
                                                Ответить
                                                • a+(abs(a-b)/2)
                                                  a=6;
                                                  b=0;
                                                  6+(6/2)=9
                                                  Q.E.D
                                                  О чем можно спорить с человеком который не знает (не способен нагуглить) что означает какой сдвиг?
                                                  Ответить
                                                  • > a=6;
                                                    > b=0;
                                                    Ну все-таки в рассматриваемой задаче предполагается, что a <= b. Но тогда и abs не нужен, достаточно тупо a+(b-a)/2.
                                                    Ответить
                                                    • Да я в общем. Найти среднее двух чисел.

                                                      Но не хотелось пугать наших крестодрузей всякими >>>. Жабисты не поймут про unsigned.

                                                      (x+y)>>>1
                                                      x=-1;y=-1;
                                                      Тоже работать не будет. Ну по-крайней мере хорошо на положительных - не так как у гумна. Ну он вообще дятел - потратил 4 инструкции, а пользы - никакой.

                                                      Потому ни одного по-настоящему хорошего варианта усреднения джвух чисел в треде я не увидел.
                                                      Ответить
                                                      • Ну в общем случае есть такой вариант:

                                                        x/2 + y/2 + (x & y & 1)

                                                        Если не туплю - должно работать на всем диапазоне и в любом порядке.
                                                        Ответить
                                                        • > x/2 + y/2 + (x & y & 1)
                                                          Ан нет. Багует на -5 и 5 например.
                                                          Ответить
                                                          • Есть идеи как поломать мой вариант?
                                                            (ну помимо полного абсурда: передавать туда разные типы unsigned и signed чтоб оно неправильно сдвинуло)
                                                            Ответить
                                                            • > Есть идеи как поломать мой вариант?
                                                              Нет. Пока не находится.
                                                              Ответить
                                                              • >int x = -1895825408;
                                                                >int y = 251658240;
                                                                http://ideone.com/ovOHf3
                                                                Не ломается.
                                                                Ну кстати язык не только жаба.
                                                                Ответить
                                                              • Перебор на long long будет длительным, но осуществим.
                                                                Ответить
                                                                • > Перебор на long long будет длительным, но осуществим.
                                                                  Поделитесь секретом бессмертия?

                                                                  P.S. На сишных int16_t потестил, все сочетания нормально проходят.
                                                                  Ответить
                                                                • >Перебор на long long будет длительным,

                                                                  Лол, а толку? Это ж логика.
                                                                  Тут голова главное - найти крайний случай где не работает, а не беспощадный, бессмысленный и вечный брутфорс по диапазону 10^18.
                                                                  Ответить
                        • у вас ; зелёная
                          явка провалена
                          Ответить
                          • > у вас ; зелёная
                            Ассемблер выглядывает из этого кода ;)
                            Ответить
                    • Обмен посредством "xor" или "+ и -" же.

                      А ещё вместо переменных используй регистры.
                      Ответить
                      • Обмен с помощью xor то еще говно. Каждая его операция зависит от результатов предыдущих и из-за этого никак не параллелится. В итоге имеем 3 операции вместо одного xchg. А если обмен идет с памятью - то еще и лишнюю запись.
                        Ответить
                        • Люди упорно не хотят этого понимать.
                          Они пытаются писать "умный" код, а выходит говно.
                          Ответить
                      • при выполнении +/- может произойти переполнение
                        Ответить
                        • > может произойти переполнение
                          И?
                          Ответить
                        • Для беззнаковых чисел с этим никакой проблемы нет.

                          А для знаковых чисел на подавляющем большинстве платформ, где для представления отрицательных чисел используется дополнение до 2, сложение и вычитание отлично скомпенсируются т.к. на данных платформах для add и sub нет никаких различий между signed и unsigned.

                          P.S. Это, конечно, не отменяет того факта, что сам способ - говно. Хоть с ^ хоть c +/-.
                          Ответить
    • > system("PAUSE");

      По-моему, если известно заранее, что код пишется для винды, не грех заюзать getch() из conio.h.
      Ответить
      • Не грех поставить галочку в вижуалке "не закрывать окно после выполнения" и не страдать хуйней с "задержкой перед выходом".

        Консольную прогу предполагается юзать из консоли, а консоль никуда не пропадает после выхода программы, поэтому задержка там нафиг не сдалась.
        Ответить
        • Только про маздайную консоль ещё не каждая обезьяна знает.
          Ответить
          • А что, консольную прогу можно запустить ТЫКАЯ В НЕЕ МЫШКОЙ?!
            Ответить
            • P.S. Кстати в свойствах ярлыка есть галочка, при установке которой окно консольной проги не будет закрываться если она хоть что-то вывела...
              Ответить
              • ты меня разочаровал. ты был моим идолом, а оказалось что ты пользуешься виндусом. фу
                ХХХГовно
                Ответить
                • Ты так говоришь, как-будто пользоваться виндусом это что-то плохое.
                  Ответить
              • http://pit.dirty.ru/lepro/2/2009/09/15/24386-203726-201cc8a18a81c8c98dc47bb244cf7d09.jpg
                Пиздить изволите?
                Ответить
                • Хм, посмотрел на виртуалке. И правда нет. И почему мне казалось, что она есть...
                  Ответить
                  • Это фича VDM, применима только к 16битным консолям
                    Ответить
            • А он своими прогами так и пользуется в визуал студии, пересобирая перед каждым запуском.
              Ответить

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