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

    +24

    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
    #include <conio.h>
    #include <stdio.h>
     
     
    const int SIZE = 33;
     
    void DecToBin (unsigned int num, char *bin)
    {
       int i,j;
       char tmp[SIZE];
     
       for(i=0; num; num>>=1, i++)
               tmp[i] = (num&1)?('1'):('0');
       
       for(j=0; j<i; j++)
               bin[j] = tmp[i-j-1];
       bin[j]='\0';
    }
     
    unsigned int shl(unsigned int num, int shift)
    {
            return (num << shift) | (num >> 32 - shift);
    }
     
    void main()
    {
            int n, m;
            scanf("%d", &n);
            
            char bin[SIZE];
     
            DecToBin(n,bin);
            printf("%s\n", bin);
     
            m = shl(n, 35);
            DecToBin(m,bin);
        printf("%s\n", bin);
            _getch();
    }

    Еще одна очередная лаба, но уже код преподавателя, который он дал в качестве примера. Сказал что код на C++ (к вопросу, где здесь с++), и что нам нужно переписать его на "яве".

    Запостил: maksim_ovcharik, 18 Октября 2012

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

    • void main() под c++ не подходит. Так что плюсов тут нет.
      Ответить
      • Да и сишные инклуды, и описание переменных перед циклом как бы намекают нам об этом.
        Ответить
      • void main уже на ГК обсуждалось
        это законно и в с++, если implementation это позволяет (например, вижуал студия)
        г++ это не позволяет (имеет право), поэтому и ругается
        Ответить
    • > shl
      rol
      Ответить
    • на плюсах выглядит лучше
      http://ideone.com/1fGuw
      Ответить
    • Интереса ради решил выяснить неужели в С++ нету штатного способа напечатать число в двоичном представлении.
      Что оказалось. С стандартные библиотеки - не предоставляют, зато можно в восьмеричном. Распечатать число за произвольным основанием нельзя (printf). Штатные инстументы С++ (cout) - тоже можно, как и в С, за основанием 10, 16, и 8, ни бинарного, ни произвольного нет. Буст (format) - тоже надо писать самому. Но зато есть в Qt QString.
      Ответить
      • есть нестандартное расширение stdlib.h (gcc, понятное дело, плевало на это):
        char * itoa(int value, char * str, int base);

        ну а касательно плюсов - для хелловорлда можно и std::bitset приладить для этого (см мой коммент выше) :)
        Ответить
      • неудивительно
        какбы считается что программист может в уме справиться с квартетом бит
        а октальную систему не хоронят ради традиций 197х и tar
        Ответить
        • Ну это как в истории которая случилась ночью с собакой, можно и простые числа в уме посчитать, не только представить как последовательности из ноликов и единичек.
          Ответить
          • при всей наглядности двоичная система слишком громоздка для практического использования
            32 разрядное число займет четверть экрана, вот и прикиньте вероятность опечататься и/или пропустить опечатку в этой каше из ноликов и единичек
            поэтому вопрос переведен в категорию профпригодности
            Ответить
            • Хз, в Лиспе в зависимости от размера экрана можно и десять экранов, и сто, да и тыщу тоже можно, Особенно если на смартфоне каком-нибудь показывать. Как-то никого это не остановило...

              Ну а если серьезно, то мне в реальной жизни нужно было один раз написать сериализацию double, и нужно было распечатывать все биты в двоичном представлении, чтобы точно понять правильно я это делаю или нет. Так что аргумент абсолютно надуманый.
              Ответить
              • а лисп то тут причем?

                для одного случая в жизни можно соединить вместе два колеса, руль и педаль, тем более для отладки
                Ответить
                • anonimb84a2f6fd141, не пойму, почему у вас id одинаковый в разных сообщениях
                  Ответить
                  • wat?
                    Ответить
                    • Он имел в виду, что у настоящего Анонимуса id каждый раз разный, а у вас он всегда равен 84a2f6fd141. Поэтому это не анонимность, а всего лишь псевдонимность.
                      Ответить
              • > мне в реальной жизни нужно было один раз
                Поэтому из-за одного-двух раз в жизни включать вывод в двоичной системе в стандартные библиотеки имхо глупо. Кому надо - за 5 минут навелосипедит себе реализацию. Так что аргумент абсолютно надуманый.
                Ответить
                • Моя реальная жизнь просто еще не закончилась... И в данном случае я имел в виду, что код использовался не только для тестов, но и в рабочей программе. Для тестов, конечно, приходилось пользоваться гораздо чаще. Ну и хобби, типа проекта Ойлера и т.п.
                  Ответить
      • Любой вменяемый программист сможет написать представление числа в двоичном формате минут за 15-20
        Подскажите-ка нам, как нам в CL получить аргументы командной строки
        Ответить
        • Тонко
          Ответить
        • И как следствие будет делать это каждый раз, на каждом новом месте работы, в каждой ветке проекта, а если забывчивый попадется, то и по нескольку раз в каждой ветке проекта. А чо? всего-то пару минут потратить.

          Лисп - пример осымсленного подхода к проблеме. Во многих языках подход такой же. Если нужно распечатать число за произвольным основанием, есть какая-нибудь штатная функция для этого. А в С с какого-то перепуга есть вместо сделать одну универсальную функцию, сделали 3 не-универсальные. В итоге, как практика показала, одна из них вообще практически никогда не нужна.
          Ответить
        • А как то, что в Лиспе нет независимого от реализации способа получить аргументы относится к тому, что в С нет чего-то абсолютно с этим не связаного? В Лиспе еще много чего нет, и аргументы переданные программе таким способом не самая большая проблема. Более того, при традиционном способе работы с программами, такая возможность вообще как-бы и не нужна...
          Ответить
          • Недостаток алгоритма можно легко компенсировать его самостоятельной реализацией.
            Недостаток языковых средств взаимодействия с окружением просто так восполнить нельзя.

            > В Лиспе еще много чего нет
            Зато там много чего совершенно ненужного.
            Самый богатый и удобный язык в плане стандартной библиотеки, с моей точки зрения, - python. На сишку же грешить смысла нет - она никогда не претендовала на роль удобного в использовании языка с богатой библиотекой, и она прекрасна в своей наготе.
            Ответить
            • Внимательно перечитайте мой ответ выше, вы разговариваете с кем-то другим, а не со мной.

              Бусты всякие не претендовали на роль языка с богатой билбиотекой? Та че, правда чтоле?
              Ответить
              • Как крестоблядские бусты связаны с сишечкой?
                Ответить
                • Интереса ради решил выяснить неужели в С++ нету штатного способа
                  Ответить
                  • Конечно же нету ;)
                    http://ideone.com/7wCkF
                    Ответить
                    • Это не распечатывание числа, это конвертация числа во что-то другое и печать этого чего-то другого. Хотя, это и близко, но не то же самое.

                      #8*01010101 #b01010101
                      Ответить
                      • В связи с повсеместной компьютеризацией общества, просьба "распечатайте мне пачку чая" воспринимается неадекватно.
                        Ответить
                      • И вообще, оно не печатает его на принтере, а выводит на непонятный жидкокристаллический дисплей ;)

                        Поэтому это не печать, а что-то другое.
                        Ответить
                        • Это у вас жк, а кто-то на перфолентах печатает.
                          Ответить
              • а в чем таки проблема была с бустом?
                http://liveworkspace.org/code/be68efe5509626b3a34806e2a896b46c
                #include <boost/spirit/include/karma.hpp>
                
                template <class T>
                inline std::string gen_binary(T arg)
                {
                   char buf[sizeof(T)*CHAR_BIT+1] = {0}, * p = buf;
                   boost::spirit::karma::generate(p, boost::spirit::karma::bin, arg);
                   return buf;
                }

                да и про вот такой штатный способ (еще раз):
                std::cout << std::bitset<sizeof(my_value)*CHAR_BIT>(my_value) << std::endl;
                Ответить
          • > при традиционном способе работы с программами, такая возможность вообще как-бы и не нужна
            Видимо, я пользуюсь крайне нетрадиционным подходом...
            Ответить
            • Скорее всего. Мне ни разу в жизни не понадобилось, и представить не могу, зачем могло бы понадобиться.
              Ответить
              • find . -name '*.java' | wc -l
                Ответить
                • И? Писать системные утилиты на Лиспе все равно нет смысле изза множество других причин. Вы еще попробуйте аргументы командной стоки в HTML страницу передать, например. Кто вам виноват, что вы кубом в круглую дырку?
                  Ответить
                  • > Писать системные утилиты на Лиспе все равно нет смысле

                    Почему на python, к примеру, очень даже имеет смысл, а на Lisp нет?
                    Ответить
                    • Потому что на Лиспе конвенция вызова методов не совместима с Сишными, и как результат, написание системных модулей превращается в написание системных модулей на Си, с последующим прикручиванием интерфейсов в Лиспе - занятие бессмысленное само по себе, т.как проще написать на Си, т.как на Си прийдется писать все равно.
                      Питон и так написан на Си, и поэтому общается с системой на "понятном" ей языке. Т.е. это по-сути Си программа-интерпретатор, котрая выполняет Си-же код.

                      Ну и, понятное дело, что речь идет о реализациях, не предназначенных для встраивания в другие окружение. Для последних сама по себе идея аргументов командной строки не имеет смысла.
                      Ответить
                      • Пф, какая разница, из какого языка разбирать входной поток и гадить в выходной.
                        Юниксовая архитектура каналов и фильтров достаточно гибка, чтобы объединять программы, написанные на любых языках, способных к вводу/выводу.
                        Ответить
                        • Еще какая разница. Сишные программы работают с Си-рантаймом, (libc) или что-там за аналог в Виндовсе. Там описано как и куда и что передавать, в каких участках памяти хранить и откуда читать. В большинстве Лиспов это вообще никак не совместимо с Сишными АПИ, для это и существует uffi, чтобы транслировать из одной конвенции в другую. Соответственно, с массой накладных расходов и т.п.
                          Юниксовая система предполагает, что все что в ней используется использует Сишные конвеции вызовов функций. Я не понял в чем тут гибкость проявляется. Любой другой язык / среда, которые будут рабоать с системой должны делать это посредством Сишных АПИ, ну или повторить их в точности... других вариантов нет.
                          Ответить
                          • Рантайм CL при вводе\выводе не использует функций libc или его аналогов, а общается напрямую с ядром? А посоны и не знали...
                            Ответить
                            • Как было заявлено в предыдущем сообщении, использует uffi. Но это вынужденная мера. В системах написаных на Лиспе - не использует, естесственно.

                              Что касается выполнения кода - то, например, у SBCL - свой формат исполняемых файлов с машинным кодом, не похожий вообще на ELF, и если специально системные вызовы не используются (т.е. нет вызовов через foregin function interface), то и соответственно, нет никаких обращений к Си рантайму.
                              Ответить
                              • > В системах написаных на Лиспе - не использует, естесственно.
                                Ну собственно логично. Вещь в себе. И если к системе, использующей сишные апи, лисп прикрутить можно, и он даже работает, и отлично пользуется средствами системы, то к лисп машине нельзя прикрутить ни одного другого языка. Вообще. Разве что DSL на лиспе, или интерпретируемые им же скрипты.
                                Ответить
                                • Не правда :) Есть даже Си компилятор написаный на Лиспе для такой системы... хех. Но увы, я про такие только читал.
                                  Ответить
                                  • Интересно, попробовал поискать. Нашел, что этот компилятор назывался zeta-c. Но вот все линки на него куда-то пропали ;(
                                    Ответить
                                    • Я думаю, что если пробраться в музей МИТ, то он там еще где-то должен быть... я один раз даже пообщался с человеком заведующим мат. частью, разделом по Лиспу. Они искали кого-то в тех. поддержку. Но не прошел по конкурсу :'(
                                      Ответить
                              • > у SBCL - свой формат исполняемых файлов

                                А мои жабо-программы хранятся в .class-файлах, упакованных в .jar архивы, но это никак не мешает мне передавать им аргументы командной строки или использовать их в пайпах
                                Ответить
                                • Ваши жабопрограммы интерпретируются жаборантаймом, которы в свою очередь является, в том же Линуксе ELF исполняемым файлом.
                                  Ответить
                                  • а sbcl не является исполняемым файлом?
                                    Ответить
                                    • > а sbcl не является исполняемым файлом?
                                      Его рантайм является. Он кстати написан на си, и довольно маленький. А вот сам интерпретатор лиспа и прочее хранятся в снапшоте, который подгружается этим рантаймом.
                                      Ответить
                              • > у SBCL - свой формат исполняемых файлов
                                Ага. Многометровый снепшот оперативки. К которому опционально подклеен рантайм. (Писали тетрис на CL в SBCL, знаем).
                                Ответить
                              • Постеснялся хоть посла б!..
                                Аль совсем башкой залип?..
                                Где бы что ни говорили --
                                Все одно сведет на Лисп!
                                Ответить
                            • > Рантайм CL при вводе\выводе не использует функций libc или его аналогов, а общается напрямую с ядром?

                              ошибочка вышла: не напрямую с ядром, а напрямую с устройствами, заставляя пикселы на вашем мониторе светиться без участия ядра
                              Ответить
                              • Ну собственно если это специализированная лисп-машина то почему нет?
                                Ответить
                          • > Юниксовая система предполагает, что все что в ней используется использует Сишные конвеции вызовов функций

                            Юниксовая система предполагает, что в конечном счёте вызываются функции ядра для записи в файл и чтения из файла, и ничего более. Язык реализации и принятые в нём конвенции вызовов не имеют никакого значения.
                            Ответить
                            • > функции ядра для записи в файл и чтения из файла, и ничего более
                              Функции открытия и закрытия файлов смотрят на вас с недоумением.
                              Ответить
                              • когда в последний раз открывали stdout?
                                Ответить
                                • > когда в последний раз открывали stdout?
                                  Хм. Ну одними stdin'ами и stdout'ами сыт не будешь... А как же работать с устройствами, с прочими файлами?
                                  Ответить
                                  • я понимаю, что open, close и creat очень нужны, просто для возможности взаимодействия с системой они не обязательны, ведь по умолчанию уже открыты три устройства, которые обычно не закрывают
                                    Ответить

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