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

    −45

    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
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    #include <iostream>
    #include <conio.h>
     
    using namespace std;
     
    void iswap(int &n1, int &n2)
    {
        int temp = n1;
        n1 = n2;
        n2 = temp;
    }
     
    int main()
    {
        int const n = 100;
        int a[n];
        for ( int i = 0; i < n; ++i ) { a[i] = n - i; cout << a[i] << " "; }
            //заполняем массив для наглядности.
            //-----------сортировка------------// 
            //сортирует по-возрастанию. чтобы настроить по-убыванию, 
            //поменяйте знаки сравнения в строчках, помеченных /*(знак)*/
        int sh = 0; //смещение
        bool b = false;
        for(;;)
        {
            b = false;
            for ( int i = 0; i < n; i++ )
            {
                if( i * 2 + 2 + sh < n )
                {
                    if( ( a[i + sh] > /*<*/ a[i * 2 + 1 + sh] ) || ( a[i + sh] > /*<*/ a[i * 2 + 2 + sh] ) )
                    {
                        if ( a[i * 2 + 1 + sh] < /*>*/ a[i * 2 + 2 + sh] ) 
                        {
                            iswap( a[i + sh], a[i * 2 + 1 + sh] );
                            b = true;
                        }
                        else if ( a[i * 2 + 2 + sh] < /*>*/ a[ i * 2 + 1 + sh]) 
                             {
                                 iswap( a[ i + sh], a[i * 2 + 2 + sh]);
                                 b = true;
                             }
                    }
                }
                else if( i * 2 + 1 + sh < n )
                     {
                         if( a[i + sh] > /*<*/ a[ i * 2 + 1 + sh] )
                         {
                             iswap( a[i + sh], a[i * 2 + 1 + sh] );
                             b = true;
                         }
                     }
            }
            if (!b) sh++; //смещение увеличивается, когда на текущем этапе 
                          //сортировать больше нечего
            if ( sh + 2 == n ) break; 
        }  //конец сортировки
     
     
        cout << endl << endl;
        for ( int i = 0; i < n; ++i ) cout << a[i] << " "; 
     
     
        _getch();
        return 0;
    }

    Запостил как-то на вики как более короткая реализация с++, более понятная и главное - рабочая. Не признали. Сам смотрю - не понимаю че там написано )))

    Запостил: idec, 23 Июня 2012

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

    • Забыл добавить - Пирамидальная сортировка
      Ответить
    • Код с вики - сорт говна, который тут еще не фигурировал.
      Респект
      Ответить
    • какой-то птичий дождь
      мешанина символов, равномерно и с низкой плотностью заполняющая экран
      Ответить
    • Мне одному эти комментарии
      /*>*/
      напоминают лицо?
      Ответить
      • ага похоже кстати на омскую наркоманью птицу )
        Ответить
    • достаточно хотя бы (i * 2 + 1 + sh) засунуть в отдельную переменную, дать ей осмысленное название (типа offs - я не знаю, какой смысл тут на самом деле), и использовать везде offs и offs + 1, и уже будет лучше
      затем, собственную iswap было не западло реализовать, а std::swap, значит, полная хрень?
      Ответить
      • > iswap было не западло реализовать, а std::swap, значит, полная хрень?
        iSwap очень рекламировался Стивом Джобсом
        Видно же, что это лаба. А на лабах std::sort_heap, std::swap и прочие стандартные алгоритмы могут быть запрещены.
        Ответить
        • да своп был ограничен условиями не лабы, а подходом к собственной реализации, там как видите я даже вектор не использовал, чтобы был понятен алгоритм и не было сложностей с перетранляцией на другие языки. это я его таким на вики сунул. лабу я сдавал с оригинальным свопом и векторами )
          Ответить
    • >conio.h
      Жуть.
      Ответить
    • А волшебство с введением константы n, содержащей максимальную длину массива действительно только усложняет поиск путей оптимизации препроцессором, и лучше бы это задефайнить, или я ошибаюсь?
      Ответить
      • А чем отличается объявление константы от дефайна?
        Ответить
        • дефайн обрабатывает препроцессором, т.е. в compiletime, кладет МПХ на неймспейсы, область видимости и типы => дефайн в роли констант особо и не нужен
          Ответить
      • std::vector
        Ответить
      • на счет n - посмотри там же массив заполняется для наглядности. эту n можно инициализировать через тот же sizeof или ->SIze().
        Ответить
    • Просто из любопытства, а какой редактор так интерсно фигурные скобки расставляет? Мне такой стиль впервые в жизни попался. Ну, в смысле, когда фигурная скобка под else if стоит под if.
      Ответить
      • nano?
        Ответить
        • Про nano не надо, он хороший (ну как редактор кода - не знаю), но выручил меня в годы тягостных раздумий, когда драйвера к видеокарте не подходили совсем, он единственный, кто хоть как-то работал в консоли на "тупом терминале". Ну может еще ed работал, но я не умею им вообще никак - с трудом закрыл :)
          Ответить
          • > в консоли на "тупом терминале"
            Эм, так там и mc с его mcedit должны отлично работать... И vi с vim'ом...
            Ответить
            • vi героически погиб пытаясь раскрасить какой-то конфиг (что-то у него с цветами не задалось и вместо расцветки понеслись ^[[X;Y;Zm........ изза которых текст превратился в месиво, а потом просто сместился за край монитора :) Как сейчас помню. mc не был установлен, да и не пользуюсь я им практически никогда, я бы даже не знал, что в нем еще и редактор есть.
              Ответить
              • > что-то у него с цветами не задалось и вместо расцветки понеслись ^[[X;Y;Zm
                Хм. Последний раз когда я такое видел - когда заходил через последовательный порт ;) А в консолях - всегда было все цветное, ну разве что русские буквы не показываются, если не настроены.

                > mc не был установлен
                А я вот привык к mc'шке. Даже при живых иксах пользуюсь, когда надо порыться в файлах.

                А каким менеджером пользуетесь, если не секрет?
                Ответить
                • меня плющит от mc :( Только bash, только хардкор...
                  В богомерзкой винде иногда eshell выручает
                  Ответить
                  • > Только bash, только хардкор...
                    Мне лень копировать и просматривать файлы через консоль, когда в mc это можно сделать быстрее и удобнее. Видимо я хомячок ;)
                    Ответить
                    • Кстати, есть один аспект, когда mc удобнее консольки - доступ к удалённой файловой системе. Надо признать, ftp/sftp не самые удобные программы.
                      Ответить
                • Та же хрень в плане привыкания. Даже бесит, когда в каком-нибудь дистрибутиве типа центоса он по умолчанию не стоитставится и надо ставить руками.
                  Ответить
                • C-x d
                  без вариантов :), ну и обычно ECB открыт, в нем тоже можно. Единственное, что напрядает - в dired нету быстрого архивирования / разархивирования (только по одному файлу), и я каждый раз как сталкиваюсь с тем, что опций архиваторов не помню срочно берусь доделывать, но что-то меня останавливает...

                  Если эмакса нету, или чужой компутер, на котором эмакс не похож на мой... даже не знаю, наверное использовал бы графический проводник / консоль, по обстоятельствам. Но даже не знаю, давно не случалось.
                  Ответить
          • А я и не говорил, что он плохой. Сам пользуюсь. А при виде vim'а срочно набираю :quit
            Ответить
            • vim (не путать с vi!) очень даже неплох, да и запомнить пяток команд ("a" чтобы перейти в режим редактирования, <ESC> в режим команд, ":wq" выйти записать, ":q!" выйти без сохранения, "u" отмена действия) не так сложно, и вполне достаточно для минимальной работы с ним.
              Ответить
      • ужасный стиль
        стоит отметить что из-за него таб стал в этом месте 5 позиций, смещая все остальное внутри себя (ср отступ в строках 35 и 49)
        Ответить
      • Редактор Студия 2008
        элз иф писал так сам для минимизации этого говна хотя бы на 2 строчки )
        Ответить
        • А как связана минимизация говна на 2 строчки и отступ на 5 пробелов вправо?

          P.S. Если уж хочется минимизации - можно было воспользоваться стилем K&R.
          Ответить
          • если убрать пробелы и табы - получится обфускация ) этот код будет нечитаем ) это ж в стиле кнута только без goto
            Ответить
            • Эээ, зачем же их совсем убирать ;)
              Предложение было только про уменьшение отступа на 5 пробелов в строках 39-42 и 46-52...

              > это ж в стиле кнута только без goto
              Кнут смотрит на вас с грустью в глазах.
              Ответить
              • вообщето там 3 пробела всего(оригинальный таб). куда уменьшать то?
                Ответить
                • Вот это (странный отступ)
                  if (...)
                  {
                  }
                  else if (...)
                       {
                       }

                  поменять на это (как пишут все)
                  if (...)
                  {
                  }
                  else if (...)
                  {
                  }
                  Ответить
                  • как бэ скобочки идут не от илза а от ифа, т.к. после else всего лишь одна команда выполняется - это if. поэтому скобочки принадлежат ифу.
                    Ответить
                    • можно (т.е нужно) так:
                      else
                      if (...)
                      {
                      }
                      Ответить
                      • Ниразу не видел такого стиля. Можно пруфлинк на статью/книгу в которой вы впервые обнаружили такое написание?
                        Ответить
                        • конечно. бьярн страуструп язык программирования с++
                          Ответить
                          • вообще такая херня как else if - не используют в с++, такая жопа только на пхп есть (elseif) или на питоне (кажется elif). поэтому в с++ нужно использовать процедуры или функции чтобы упростить код вроде этого. с другой стороны скобки стоят правильно по синтаксису
                            Ответить
                            • > вообще такая херня как else if - не используют в с++
                              А зачем вы ее используете? Если уж быть одептом - то до конца.
                              Ответить
                          • Ок, а теперь приведите номер страницы на которой Бьерн написал код с такой индентацией как у вас, или же написал else if на разных строках.

                            Как говорится "Tits or GTFO".
                            Ответить
                            • читай коммент после страуструпа. естественно у него в книге такого говна как else if нет.
                              Ответить
                              • А теперь откройте 1.3.4. Условные операторы и циклы, и посмотрите как Бьерн не использует такое говно как else if.
                                Ответить
                                • вообще то дискуссия про то как правильно ставить скобочки а не как использовать элзиф (который я уже сказал 2 раза что в с++ не юзают)
                                  вот. обратите внимание, что отступ есть даже если скобки не ставятся.
                                  http://imageshack.us/photo/my-images/171/bscf.jpg/
                                  Ответить
                                  • это будет то же самое если написать
                                    case 1: if
                                    (таб){
                                    (2 таба)
                                    (таб)}
                                    чтобы было понятно что код в скобках принадлежит только if
                                    Ответить
                                    • Ну здесь это обосновано. Но по вашему коду - разве код в скобочках может принадлежать else?
                                      Ответить
                                  • Ну так отступ у оператора а не у скобок. А я просил именно пруф вашего способа индентации (выравнивание скобок по if, стоящему после else) или же пруф использования else и if на разных строках.
                                    Ответить
                                    • вот вам правильный ответ:
                                      else
                                      (tab) if
                                      (tab){
                                      (2tab)//code
                                      (tab)}

                                      так делают все парсеры. напишите else, нажмите enter - каретка перебросится на другую строку + табуляция.
                                      еще вариант елз иф если внутри елза не одна операция а несколько:

                                      else
                                      {
                                      (tab)if
                                      (tab){
                                      (2tab) //code
                                      (tab)}

                                      (tab)if
                                      (tab){
                                      (2tab) //code
                                      (tab)}
                                      }

                                      намереваюсь закончить дискуссию т.к изза смещения комментов вправо мой экран 1024*768 сплющивает текст до нечитабельности.
                                      Ответить
                                      • > так делают все парсеры. напишите else, нажмите enter - каретка перебросится на другую строку + табуляция
                                        Правильно делают. Но в то же время если я напишу else if, то они выровняют следующую скобку не по if а по else.

                                        Против второго варианта, где много кода в ветке else ничего не имею.

                                        А по первому - ну приведите хотя бы один пруф, где применено такое форматирование сочетания else и if как здесь, или как в коде который приведен в начале треда. Книгу, ссылку, опенсурс проект, да что угодно...
                                        Ответить
                  • if (...)
                    {
                    }else if (...)
                    {

                    }
                    Ответить
                    • if (condition1) {
                          stmt1;
                          stmt11;
                      } 
                      else if (condition2) {
                          stmt3;
                          stmt4;
                      } 
                      else {
                          stmt5;
                          stmt6;
                      }
                      Ответить
                      • if (condition1) {
                            stmt1;
                        } else if (condition2) {
                            stmt2;
                        } else {
                            stmt5;
                        }

                        K&R ;)
                        Ответить
                        • а мне не нравится, когда на одной строке и } и {
                          Ответить
                        • Тред "кто как пишет"?
                          Я уже как-то писал про свои отступы, обругали. Одни ценители кругом. ^^
                          Ответить
                          • Надо плагин к git, который перед коммитом приводит whitespace к некой стандартной форме, а при просмотре диффов или чекауте приводит все к виду, который больше всего нравится автору. И волки сыты и овцы целы ;)
                            Ответить

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