Кресты / Говнокод #11282 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 idec, (Updated )

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

  • Забыл добавить - Пирамидальная сортировка
    Ответить
  • Код с вики - сорт говна, который тут еще не фигурировал.
    Респект
    Ответить
  • какой-то птичий дождь
    мешанина символов, равномерно и с низкой плотностью заполняющая экран
    Ответить
    • ага похоже кстати на омскую наркоманью птицу )
      Ответить
  • достаточно хотя бы (i * 2 + 1 + sh) засунуть в отдельную переменную, дать ей осмысленное название (типа offs - я не знаю, какой смысл тут на самом деле), и использовать везде offs и offs + 1, и уже будет лучше
    затем, собственную iswap было не западло реализовать, а std::swap, значит, полная хрень?
    Ответить
    • > iswap было не западло реализовать, а std::swap, значит, полная хрень?
      iSwap очень рекламировался Стивом Джобсом
      Видно же, что это лаба. А на лабах std::sort_heap, std::swap и прочие стандартные алгоритмы могут быть запрещены.
      Ответить
      • да своп был ограничен условиями не лабы, а подходом к собственной реализации, там как видите я даже вектор не использовал, чтобы был понятен алгоритм и не было сложностей с перетранляцией на другие языки. это я его таким на вики сунул. лабу я сдавал с оригинальным свопом и векторами )
        Ответить
  • А волшебство с введением константы n, содержащей максимальную длину массива действительно только усложняет поиск путей оптимизации препроцессором, и лучше бы это задефайнить, или я ошибаюсь?
    Ответить
    • А чем отличается объявление константы от дефайна?
      Ответить
      • дефайн обрабатывает препроцессором, т.е. в compiletime, кладет МПХ на неймспейсы, область видимости и типы => дефайн в роли констант особо и не нужен
        Ответить
    • на счет n - посмотри там же массив заполняется для наглядности. эту n можно инициализировать через тот же sizeof или ->SIze().
      Ответить
  • Просто из любопытства, а какой редактор так интерсно фигурные скобки расставляет? Мне такой стиль впервые в жизни попался. Ну, в смысле, когда фигурная скобка под else if стоит под if.
    Ответить
      • Про 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 - не используют в с++, такая жопа только на пхп есть (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 как здесь, или как в коде который приведен в начале треда. Книгу, ссылку, опенсурс проект, да что угодно...
                                      Ответить
                      • Тред "кто как пишет"?
                        Я уже как-то писал про свои отступы, обругали. Одни ценители кругом. ^^
                        Ответить
                        • Надо плагин к git, который перед коммитом приводит whitespace к некой стандартной форме, а при просмотре диффов или чекауте приводит все к виду, который больше всего нравится автору. И волки сыты и овцы целы 😉
                          Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8