1. Си / Говнокод #12299

    +127

    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
    #include <stdio.h>
    
    int Sravn (int a, int b)
    {
    if (a=b)
    {return 1;}
    else 
    {return 0;}
    }
    
    int main()
    {
         int A[5]={1, 4, 7, 4, 4}, rez1, rez2, rez3, rez4, rez5;
         int i=0;
         rez1=Sravn(A[i], A[i+1])+Sravn(A[i], A[i+2])+Sravn(A[i], A[i+3])+Sravn(A[i], A[i+4]);
         rez2=Sravn(A[i+1], A[i])+Sravn(A[i+1], A[i+2])+Sravn(A[i+1], A[i+3])+Sravn(A[i+1], A[i+4]);
         rez3=Sravn(A[i+2], A[i])+Sravn(A[i+2], A[i+1])+Sravn(A[i+2], A[i+3])+Sravn(A[i+2], A[i+4]);
         rez4=Sravn(A[i+3], A[i])+Sravn(A[i+3], A[i+1])+Sravn(A[i+3], A[i+2])+Sravn(A[i+3], A[i+4]);
         rez5=Sravn(A[i+4], A[i])+Sravn(A[i+4], A[i+1])+Sravn(A[i+4], A[i+3])+Sravn(A[i+4], A[i+2]);
         if (rez1>rez2 && rez1>rez3 && rez1>rez4 && rez1>rez5)
         {printf ("/d", A[i]);}
         else if (rez2>rez1 && rez2>rez3 && rez2>rez4 && rez2>rez5)
         {printf ("/d", A[i+1]);}
         else if (rez3>rez2 && rez3>rez1 && rez3>rez4 && rez3>rez5)
         {printf ("/d", A[i+2]);}
         else if (rez4>rez2 && rez4>rez3 && rez4>rez1 && rez4>rez5)
         {printf ("/d", A[i+3]);}
         else if (rez5>rez2 && rez5>rez3 && rez5>rez1 && rez5>rez4)
         {printf ("/d", A[i+4]);}
         return 0;
         }

    Ищет в массиве наиболее часто повторяющийся элемент. Написано мною. Нифига не работает, но ошибок не выдает.

    Запостил: MurMur, 16 Декабря 2012

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

    • a=b - это присваивание.
      Но тут и задумка сама по себе херовая... но это все равно ж учебное задание... а так - в любой другой ситуации использовали бы хеш таблицу, или какой-то ее аналог (блум фильтр, например).
      Ответить
      • Да даже стандартными средстами Си можно сделать изящно:
        #include <stdio.h>
        #include <stdlib.h>
        
        #define	TESTARRAYLEN	5
        
        int i_compare(void* a, void* b) {
           return *((int*) a) - *((int*) b);
        }
        
        int main() {
        	int A[TESTARRAYLEN] = {1, 4, 7, 4, 4};
        	
        	int cur_number, cur_count;
        	int max_number, max_count;
        	
        	int i;
        	
        	qsort(A, TESTARRAYLEN, sizeof(int), i_compare);
        	
        	max_number = cur_number = A[0];
        	max_count = cur_count = 1;
        	
        	for(i = 1; i < TESTARRAYLEN; ++i) {
        	    if(cur_number == A[i]) {
        			++cur_count;
        	    }
        		else {
        		    if(cur_count > max_count) {
        				max_number = cur_number;
        				max_count = cur_count;
        		    }
        			
        			cur_number = A[i];
        			cur_count = 1;
        		}
        	}
        	
        	printf("%d is most popular: has %d occurences", max_number, max_count);
        	
        	return 0;
        }


        http://ideone.com/TNRFIU
        Ответить
        • форматирование странное
          а, не, это из-за таба, в одной стороке табы, в другой пробелы, в итоге разнесло
          Ответить
          • В исходнике пробелы вперемешку с табами. У автора таб равен четырём пробелам, а здесь — восьми. Отсюда мораль: нужно использовать или только табы, или только пробелы.
            Ответить
        • Экономное форматирование с питонозакосом:
          http://ideone.com/xiQYgC
          сука бля у идеона в окне редактирования и окне просмотра разные табы!!!
          http://ideone.com/U5blkU
          Ответить
          • > с питонозакосом
            На linux.org.ru кто-то уже высказывался за такой стиль форматирования (только там это назвали лисп-стилем: все закрывающиеся скобки оканчиваются на одной строке), но ссылку я найти не смог. По мне так в сишке оно 1) смотрится ужасно 2) совершенно непрактично.
            Ответить
            • А я только ЗА такое. А то сейчас модно код в пустыню превращать
              if (lalala)
              {
               
                ololo();
              
              }
              else
              {
              
                kokoko();
              
              }

              Я конечно понимаю, что за строчки деньги платят, но это же пиздец лютый.
              Ответить
              • у тебя просто маленький монитор
                и вообще, прекращай писать код на нетбуке с атомом на 2003 студии
                Ответить
                • > у тебя просто маленький монитор
                  На самом деле у компактного кода есть преимущества даже при наличии широких мониторов и мощного процессора. Если раньше широкий код просто не помещался на экран, то сегодня это влияет на кол-во одновременно открытых файлов на одном экране.
                  Мне, например, удобнее работать с несколькими окнами и буферами (в терминологии vim/emacs), чем с несколькими вкладками, просматривая по 4-6 файлов на одном экране, без переключения вкладок. Компактность кода в такой конфигурации - вещь довольно важная.
                  Ответить
                  • > просматривая по 4-6 файлов на одном экране
                    Guy Júlio César нервно покуривает в сторонке

                    компактность - это про скалу, хаскел, что угодно, но не про с++03
                    Ответить
                    • > Guy Júlio César нервно покуривает в сторонке
                      Ты просто не пробовал, это очень удобно :)
                      Справа хедер, слева реализация + хедер зависимого файла и консоль, а в где-то в невидимых буферах ещё болтается открытый мэйкфайл и ещё десяток файлов проекта
                      Ответить
                      • а что, ваш емакс не умеет в "create implementation"?
                        тыкаешь правой кнопкой по объявленному, но не реализованному методу в .hpp, он заботливо создает в верном .cpp в нужном неймспейсе с закоментированными умолчательными значенями этот метод
                        зачем держать на виду .hpp файл вообще не пойму
                        может быть при обращении к объекту этого класса? так мне выпадающего списка всех методов этого объекта достаточно
                        про мейкфайл вообще молчу, я его смотрю раз в год (вы все еще кипятите редактируете мейкфайл руками?)
                        Ответить
                        • > емакс не умеет в "create implementation"
                          из коробки не нашёл, но в принципе, реализовать это на базе cedet вроде не особо сложно. Возможно, займусь на досуге. Есть ещё вот такая вещь (http://www.lazycplusplus.com/), но я ей не пользуюсь.

                          > зачем держать на виду .hpp файл вообще не пойму
                          Возможно, у тебя с твоим опытом получается писать идеальные хедеры с первого раза, мне приходится постоянно добавлять в хедер всякие вспомогательные приватные методы, дописывать доки.

                          > вы все еще кипятите редактируете мейкфайл руками?
                          нет, за меня его генерит .gyp файл, который я редактирую руками
                          Ответить
                          • ну вот и получается, что замест мейкфайла я вижу дерево всех файлов в солюшене, скромно занимает себе место сбоку
                            при кодировании видеть два окна вертикально или горизонтально монитор позволяет, но использую ну очень редко
                            последний раз - когда рефакторил плохо написанное говно в нормально написанное говно, сохраняя логическую последовательность проверок и действий, слева новый код, справа старый
                            место на мониторе еще пригождается при показе окон с результатами типа find all references, ну и при отладке, конечно
                            а так в редакторе хватает один файл, одна вкладка, одно окно кода, ein Führer
                            Ответить
                            • Дерево файлов я тоже могу включить, только оно мне не особо нужно. Несколько открытых файлов, как и многие приятные фишечки редактров: пока их не используешь, они вроде и не нужны; когда привыкаешь, становится сложно без них обходится.
                              Ответить
                              • *обходиться
                                пользователю roman-kashitsyn вынесено предупреждение за нарушение правил русского языка
                                Ответить
                                • Самобичевание - это плохо. Поэтому я тебя накажу.
                                  Ответить
                                  • Неповиновение модератору - это плохо.
                                    Помни, Гумно, за тобой могут следить!
                                    Ответить
                            • Типичная раскладка окон (буфферов):
                              Слева узкой полоской speedbar (это то, что в студии наверное назвали бы project manager, т.е. буффер, который показывает файловую структуру / outline известных типов). Иногда эта полоска делится надвое, (если это ECB) и в нижней части экрана - история открытия файлов.
                              Следующий за ней буффер (справа): исходный редактируемый код, как правило, во всю высоту экрана.
                              Остальное пространство справа делится горизонтально на 2-3 буффера, и это обычно буфферы с сообщениями о результатах компиляции, REPL, терминал с шеллом, окно отладчика со свойствами рассматриваемого объекта, jabber или окно с черновиками, иногда данные, если они отдельным файлом, веб станица / ман страница с документацией или какие-нибудь служебные окна, типа результат работы find-dired / find-grep / occurences и т.д.
                              Как бы есть чем пространство заполнить.
                              Ответить
              • такой стиль мне тоже противен. Я за k&r:
                int main() //functions with special braces on separate line
                {
                  if (lalala) {  // control structures like in java
                    ololo();
                  } else {
                    kokoko();
                  }
                }
                я даже не против двухпробельного отступа, хотя 4 тоже вполне неплохо
                Ответить
                • int main() //functions with special braces on separate line
                  {
                    if (lalala) ololo(); // braces are not needed
                    else kokoko(); // ditto
                  }
                  Ответить
                  • > braces are not needed
                    they actually are sometimes
                    Ответить
                    • Иф тоже не нужен:
                      #include <stdio.h>
                      
                      int ololo() //functions with special braces on separate line
                      {
                        printf("ololo");
                      }
                      
                      int kokoko() //functions with special braces on separate line
                      {
                        printf("kokoko");
                      }
                      
                      typedef int TFuncB(); // T means "type"
                      
                      TFuncB * statement[2] = {ololo, kokoko};
                      
                      int main() //functions with special braces on separate line
                      {
                        int lalala = 1;
                        statement[lalala](); // branch selection without the "if statement"
                      }
                      Ответить
                      • typedef TFuncB TVTable[2];
                        Ответить
                        • ООП в моей сишечке?
                          Ответить
                        • Только ты написал не верно:
                          typedef TFuncB* TVTable[2];

                          http://liveworkspace.org/code/1mFc7q$4
                          Ответить
                          • А вообще это ооп ради ооп. Кода стало в несколько раз больше, а код выполняется в несколько раз медленее. На ифе предсказатель сработает обычно, а на втабле обычно не сработает.
                            Алсо: TVTableB
                            Ответить
                            • Ну все зависит от количества ветвлений. Больше 8-16 ветвей всяко будут быстрее работать через vtbl.(Это еще если ифы организованы в двоичное дерево, и ищут за 3-4 сравнения+перехода, а если последовательным сравнением - то vtbl будет быстрее уже при меньшем числе ветвей).
                              Ответить
                              • Не обязательно. Иногда выгоднее расставить ветвления не двоичным поиском, а линейно, но в порядке выпадения вероятностей срабатывания ветвлений.
                                Ответить
                                • Ну если знать вероятности - то да, можно построить дерево по тому же принципу, как в алгоритме хаффмана. Но тут не столько количество ветвей влияет, сколько матожидание числа ошибок предсказателя. Если матожидание получится больше 1 - лучше поюзать косвенный переход. Там оно ровно 1.
                                  Ответить
                                  • @bormand, @LispGovno ... я не пойму, кто из вас кому уподобляется. Прекратите!
                                    Ответить
                                    • > @bormand, @LispGovno ... я не пойму, кто из вас кому уподобляется. Прекратите!
                                      Это просто развдвоение личности.
                                      Ответить
                                    • > Прекратите!
                                      у них и аватары одинаковые
                                      и у теб... oh shi...
                                      Ответить
                                    • > Прекратите!
                                      Пративные!
                                      Ответить
                                    • > я не пойму, кто из вас кому уподобляется.
                                      С чего ты взял, что мы подобны или совпадаем? Мы абсолютно противоположны: Один любит лисп, другой нет. Один тролль, а другой нет. И так можно продолжать и дальше.
                                      Ответить
              • >Я конечно понимаю, что за строчки деньги платят, но это же пиздец лютый.
                Всегда было интересно - кому денег не жалко.
                Ответить
            • http://www.linux.org.ru/forum/development/5817639
              Стиль вайтсмита и стиль ГНУ - говно
              Ответить
              • > Стиль вайтсмита и стиль ГНУ - говно
                Ага, еще какое, никогда не понимал зачем так писать.

                P.S. А стиль гну навевает мысли о паскале:
                if a < 10 then
                  begin
                    writeln("kokoko");
                  end
                else
                  begin
                    writeln("kokoko");
                  end;
                Только в паскале это смотрится терпимо, а на си со скобками как сраное говнище.
                Ответить
                • А причём тут Паскаль? Паскаль идеален для KR.
                  Не, мне питонолисповый стиль больше всего нравится, крестобляди должны им гордиться, потому что Паскаль не даст так сделать, ибо end;end;end;end; смотрится пиздецово.
                  Ответить
                  • ((a<10) &&
                      (printf("kokoko < 10"), 1) ||
                      (printf("kokoko > 10"), 1))
                    Ответить
                    • А в TP есть директива {$B+} (complete boolean eval), при включении которой подобный код перестаёт работать...

                      Во всех ли реализациях сишки логические выражения вычисляются по сокращённой схеме?
                      Ответить
                      • > Во всех ли реализациях сишки логические выражения вычисляются по сокращённой схеме?
                        Да, если я еще не совсем потерял память - об этом написано в стандарте.

                        P.S. Опции компилятора, меняющие семантику программ - ёбаный пиздец. Особенно в этом плане отличился пых с его горой меджик квотов, регистер глобалсов и прочего неведомого говна.
                        Ответить
                      • это требование стандарта С и С++
                        не вижу смысла менять это ключевое поведение настройками компилятора
                        Ответить
                        • > не вижу смысла менять это ключевое поведение настройками компилятора
                          Золотые слова. Чем меньше опций меняющих семантику - тем проще поддерживать программы, и переносить их на другие платформы.
                          Ответить
                          • На самом деле в Паскале никто эту опцию не включает, а кто включает, скажите мне, я в него какашками покидаюсь.
                            Ответить
                            • Ну а если никто не включает - надо ее вообще выпилить нахер, чтобы нубам неповадно было. А так - кто-нибудь подумает, а чего это у меня ифы не выполняют все побочные эффекты, дай ка я опцию включу...
                              Ответить
                              • Это типо совместимость с древним мамонтовым кодом.
                                Ответить
                                • А, т.е. в оригинальном паскале этой самой ленивости в булевых операторах не было? Тогда ок, опция нужная. Единственно можно показать какой-нибудь warning, что эта опция предназначена для говна моманта, и в новых проектах использовать ее не стоит.
                                  Ответить
                    • Что-за странный код? 2 раза кудахчет, если a<10 ?
                      PS: Аааа.... Суть понял, красиво. Не отвечайте.
                      Ответить
                    • http://ideone.com/XiHugz

                      if_(a){a && (printf("true\n"), 1) || printf("false\n");}
                       
                      int main(void) {
                              if_(1);
                              if_(0);
                              return 0;
                      }
                      Ответить
                      • http://ideone.com/IVqogh
                        Лишп машт флоу.
                        Ответить
                        • Лень было лазить по нещёлкающейся ссылке, поэтому попросил достать код своего бота:
                          #include <stdio.h>
                           
                          #define _(f, ...) f(__VA_ARGS__)
                          #define progn(a, b) ((a), (b))
                          #define if(a, b, c) ((a) && ((b), 1) || ((c), 1))
                          #define defun(a, b) a { b }
                           
                          _(defun, void test (int x),
                            _(if, x>10,
                              _(progn,
                                _(printf, "%d > 10", x),
                                _(printf, "\n")),
                              _(progn,
                                _(printf, "%d < 10", x),
                                _(printf, "\n")));)
                           
                          _(defun, int main(),
                            _(progn,
                              _(test, 100500),
                              _(test, 0));)
                          Ответить
                          • >результат: Ошибка выполнения
                            Ответить
                            • http://ideone.com/fdjiKI
                              fxd
                              Ответить
                              • #define _(f, ...) f(__VA_ARGS__)
                                #define progn(...) (__VA_ARGS__)
                                #define if(a, b, c) ((a) && ((b), 1) || ((c), 1))
                                #define defun(a, b) a { return b; }
                                 
                                _(defun, void test (int x),
                                  _(if, x>10,
                                    _(progn,
                                      _(printf, "%d > 10", x),
                                      _(printf, "\n")),
                                    _(progn,
                                      _(printf, "%d < 10", x),
                                      _(printf, "\n"))))
                                 
                                _(defun, int main(),
                                  _(progn,
                                    _(test, 100500),
                                    _(test, 0),
                                    0))
                                В чем дело было?

                                PS: вижу, как код на говнокод перепостил и сравнить получилось. не отвечай. return 0;
                                Ответить
              • стиль ГНУ - ГНУвно
                Ответить
        • Это жестокий троллинг. А вдруг препод попросит объяснить вот это строчку?:
          return *((int*) a) - *((int*) b)
          Ответить
        • #define   TESTARRAYLEN    5
           
          i_compare(a, b) {
             return *((int*) a) - *((int*) b);
          }
           
          int main() {
                  int A[TESTARRAYLEN] = {1, 4, 7, 4, 4};
                  
                  int cur_number, cur_count, max_number, max_count, i;
                  
                  qsort(A, TESTARRAYLEN, sizeof(int), i_compare);
                  
                  max_number = cur_number = A[0];
                  max_count = cur_count = 1;
                  
                  for(i = 1; i < TESTARRAYLEN; ++i) {
                      if(cur_number == A[i]) {
                                  ++cur_count;
                      }
                          else {
                              if(cur_count > max_count) {
                                          max_number = cur_number;
                                          max_count = cur_count;
                              }
                                  
                                  cur_number = A[i];
                                  cur_count = 1;
                          }
                  }
                  
                  printf("%d is most popular: has %d occurences", max_number, max_count);
                  
                  return 0;
          }
          http://ideone.com/hIvNWf
          Раз ты пользуешься функциями высшего порядка, то пользуйся выводом типов по максимуму.
          Ответить
          • Долго вдуплял в слово тестаррейлен
            не просто какой-то там рейлен, а сам Тестар Рейлен
            Ответить
            • в TESTARRAYLENB вдуплял бы ещё дольше, но она показалась бы тебе роднее
              Ответить
            • Просто у тебя зрение уже привыкло первую буковку T игнорировать ;-)
              Ответить
            • TArasB
              Ответить
    • >Нифига не работает, но ошибок не выдает.

      Еще не написано, но уже отлажено!
      Ответить
    • int main() {
          return 0;
      }
      Нифига не работает, но ошибок не выдает.
      Ответить
    • Здесь не любят капитанов, но промолчать трудно. Надо бы как-нибудь намекнуть, но ничего в голову не приходит, поэтому напишу прямо:
      1. Не режет ли глаза A[5], rez1, rez2, rez3, rez4, rez5, а именно вереница переменных рядом с массивом?
      2. Обоснован ли полный отказ от циклов, когда нужно обрабатывать массив?
      3. printf ("/d", ...)
      Ответить
    • int Govn(int a, int b)
      Ответить

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