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

    +1000

    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
    #include <iostream>
    #include <stdio.h>
    #include <fcntl.h>
    #include <string>
    #define print(data) cout<<data<<endl;
    #define ord(data) int(data[0])
    #define str(data) char(data)
    #define open fopen
    #define write(f, data) fputc(data, f)
    using namespace std;
    string input()
    {
            string s;
            cin>>s;
            return s;
    };
    FILE* f;
    int chr;
     
    int main() {
            print("Enter:");
            f = open("code.txt", "w");
            chr = ord(input());
            print(chr);
            write(f, str(chr));
            return 0;
    }

    Вот такую лабу сдал студент 1го курса в нашем вузе. Сказал преподавателю, что ему очень нравится питон и он старается ему подражать.
    http://ideone.com/ctkFP

    Запостил: ohlol, 17 Октября 2011

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

    • >что ему очень нравится питон и он старается ему подражать.
      так и писал бы на питоне, подражатель хренов.
      Ещё и сишный stdio зачем-то приплел.
      Ответить
      • Это как раз понятно - универы переиздают методички двадцатилетней давности, где такое в порядке вещей.
        Ответить
    • > Сказал преподавателю, что ему очень нравится питон и он старается ему подражать.
      да это же чистый php!
      Ответить
    • когда горепреподаватели учат с первого курса делать везде
      using namespace std;
      много маленьких щеночков скулят и топятся в проруби
      Ответить
      • А чем плох using namespace std; ?
        Ответить
        • ключевое слово "везде"
          Ответить
          • ну в хедере не желательно так делать, но это же не хедер?
            Ответить
            • нигде не желательно так делать
              еще ни у кого руки не отсохли написать std:: где нужно
              когда в продакшен коде 100500 неймспейсов, библиотечных и своих, использование "подумай сам откуда я их взял" string или vector или set выглядит колхозом
              правила простые - нет неймспейса - значит из текущей (родительской) области видимости. либо нет неймспейса - значит using namespace ты найдешь глазами здесь же, в данном scope из { ... }
              например, это - хорошо:
              {
                 using namespace boost::assing;
                 myvector += 1, 2, 3, 4 ,5;
              }


              если неймспейс длинный, то лучше использовать
              namespace fs = boost::filesystem; или namespace po = boost::program_options;
              даже удобоваримо namespace asio = boost::asio;
              а то бывают красавцы приходят ко мне на работу и потом в своем говнокоде прямо в глобальном заголовке херачат using namespace std; - потом сидят переделывают, исправляют свои ошибки образования
              Ответить
              • >using namespace boost::assing;
                >myvector += 1, 2, 3, 4 ,5;
                Кстати, я правильно понимаю, после такой перегрузки оператор запятая будет работать не верно по программе, поэтому его нужно прятать в скоп? Здесь косячно сделан boost::assign?
                Ответить
                • неправильно, освежи приоритет операторов, boost::assign отработает на += и затем уже запятая будет работать совместно с их объектом
                  скоп нужен чтобы там, где не нужно (а наполнять вектор значениями обычно нужно далеко не везде) конструкция myvector += значение; не компилилась
                  (опять же, выявление ошибки v += 10 вместо v[0] += 10)
                  Ответить
                  • operator+=(myvector, 1, 2, 3, 4 ,5);
                    Ответить
                    • boost::assign::operator+=(myvector, 1, 2, 3, 4 ,5);
                      Ответить
                      • что это?
                        Ответить
                        • boost::assign::operator+=(myvector, 1) сделает объект boost::assign::list_inserter с длинным шаблоном, для которого уже определен operator , (value_type)

                          можешь даже сам доопределять оператор += для своих контейнеров, если вдруг, полезная штука
                          Ответить
                          • Почитал я, как буст выкрутился для работы
                            += , , , ,

                            Мне кажется, такое "программирование" скорее является просто игрушкой для досуга, чем чем-то реально полезным. То есть задачка интересная, на тему "как сделать так-то", но это на самом деле поебень.
                            Ответить
                            • чтобы проинициализировать стд контейнер предопределенным списком чего либо (а такое встречается не так уж и редко, как ты думаешь), писать
                              v.push_back(1);
                              v.push_back(2);
                              v.push_back(3);
                              v.push_back(4);
                              v.push_back(5);

                              заебёт даже самого терпеливого
                              так что подобный синтаксический сахар от boost::assign - во имя добра
                              Ответить
                              • В "многословной" (с) Аде можно написать для стандартного контейнера так:
                                A.Append((1,2,3,4,5));

                                Ладно, вот в крестовом стиле:

                                v.push_back(5, {1,2,3,4,5})

                                (переопределить push_back для массива)
                                Ответить
                                • такое есть в С++11
                                  а в гцц 3.4.4 будет работать только буст
                                  вообще С++11 еще не очень скоро вытеснит С++03
                                  Ответить
                                  • А чё, старый стандарт не позволяет написать push_back для массива?
                                    Ответить
                                    • а что ты в старом стандарте туда подсунешь? {...} ? какого типа будет вот это вот {} ?
                                      Ответить
                                      • T[]
                                        Ответить
                                        • ну т.е. ты будешь обязан сделать для этого переменную на стеке руками, дать ей имя и уже потом её передавать

                                          смотри

                                          #include <iostream>
                                          
                                          template <class T, size_t N>
                                          void print_list(T (&array)[N])
                                          {
                                              for(std::size_t i = 0; i < N; ++i)
                                                  std::cout << array[i] << std::endl;
                                          }
                                          
                                          int main()
                                          {
                                              int a[] = {0, 1, 2};
                                          
                                              print_list(a);   // компилится ок, и даже работает (естессно)
                                          
                                              print_list({5, 6, 7});  // не компилится
                                          
                                              return 0;
                                          }
                                          Ответить
                                          • сам понимаешь, что буст-ассигн в этом случае решает - не надо париться с лишними переменными, просто пользуйся. use or die!
                                            в С++11 можно будет принимать тип std::initializer_list<T> (и то, надо повнимательней почитать что будет с копированием созданных объектов, столько же как сегодня или больше)
                                            Ответить
                                            • >надо повнимательней почитать что будет с копированием созданных объектов

                                              Когда юзаешь боост:асигн читать внимательно нужно не меньше
                                              Ответить
                                          • Хм, шаблоны научились распознавать размер массива?
                                            А то,что нельзя анонимные массивы на стеке создавать - косяк. В Дельфи такое давно вот есть, я уж не говорю про Аду.
                                            Ответить
                                            • compiled by g++ (GCC) 3.4.4 20050721
                                              как видишь, еще в 2005 году умели, где ты был всё это время?
                                              Ответить
                                            • >Хм, школота научились распознавать размер массива?

                                              В с++ размер массива можно определить и без шаблонов.
                                              Ответить
                                          • print_list((int[]){5, 6, 7});  //компилится
                                            Ответить
                            • >Почитал я, как буст выкрутился для работы
                              В С++11 boost::assign уже не нужен. Это реализовано на уровне языка.
                              Ответить
                            • За перегрузку запятой нужно делать что-то… надолго запоминающееся.
                              Ответить
                              • ну где то встречал для этих целей и перегруженный operator ()
                                типа
                                vector_inserter(v)
                                  (value_1)
                                  (value_2)
                                  (value_3)
                                  (value_4);


                                на вкус и цвет все фломастеры разные
                                на мой взгляд ничего страшного в перегрузке запятой членом класса нет
                                в С++ есть более изощренные способы выстрелить в ногу того, что будет после тебя сопровождать твой код
                                Ответить
                                • Зачем? Это не естественная запись операции, как с арифметическими операциями, только запутывает. .add() будет не намного дольше (зато яснее). Вообще, добавлять несколько элементов сразу очень редко когда нужно, а когда нужно — лучше воспользоваться циклом. В крайнем случае оператор << переопределить — и то идиоматичнее для C++.

                                  Не знаю ни одного случая уместного переопределения запятой.
                                  Ответить
                                • почему нельзя так
                                  std::vector<int> v;
                                  {
                                  int v_init[] = { 1, 3, 4, 9 };
                                  v.assign(v_init, v_init + sizeof(v_init) / sizeof(v_init[0]));
                                  }

                                  ?
                                  Ответить
              • использовать неймспейс буст::жопинг?
                Ответить
                • если требуется кроссплатформенно почесать жопу, а средств stl для этого малопригодны, то да
                  Ответить
              • > using namespace boost::assing;
                > assing

                ОЖОПЕНЕНИЕ
                Ответить
              • надо уволить красавца, который таких красавцев берет на работу
                Ответить
    • > Сказал преподавателю, что ему очень нравится питон и он старается ему подражать

      и уполз домой.
      Ответить
      • Скорее всего проглотил преподавателя и пополз домой, читать книжку по питону и переваривать преподавателя
        Ответить
    • показать все, что скрыто
      Ответить
    • Идиот.
      Ответить
      • http://operatorchan.org/n/arch/src/n79020_facepalm%20(house).jpg
        Ответить
      • показать все, что скрытоПоясните мысль
        Ответить
        • Идио́т (от др.-греч. ἰδιώτης; idiōtēs — незнакомец)
          - Глупый человек; человек, который своим поведением не схож с другими людьми (разг. руг.)
          - Глубоко умственно отсталый человек, страдающий идиотией (мед.)
          Ответить
          • Фу, копипаста из педикивии

            Происходит от др.-греч. ἰδιώτης «отдельный, частный» (так в древних Афинах называли, в частности, граждан, не принимавших участия в общественной жизни), из ἴδιος «свой, собственный ; особенный», далее из праиндоевр. *swe- «свой; себя». В ряде европейских языков греч. слово заимств. через. лат. idiota.
            Ответить
            • Ну у меня в педивикии хотя-бы написано, что это - разговорное ругательное слово, у вас же в словаре написано, что это всего-лишь гражданин Афин, не принимавший участия в общественной жизни.
              Ответить
              • Повезло афинянам, идиоты у них не принимали участия в общественной жизни.
                Ответить
                • не забудьте 4 декабря не пополнить ряды афинят
                  Ответить
        • Смотрите-ка кто отозвался!
          Ответить
    • Блин, а мне нравится С++, как на питоне написать скрипт подражая С++?
      Ответить
      • Писать на брейнфаке, подражая С++.
        По завершению этого курса лечения — любить каждый язык за свои особенности и писать на них хороший код.
        Ответить
    • всё таки очень хочется продолжить квн...
      > Сказал преподавателю, что ему очень нравится питон и он старается ему подражать
      http://s55.radikal.ru/i149/1110/d3/28cd9cd78a7e.jpg
      Ответить
    • питон головного мозга, таких даже облучение в реакторе не спасает :( жаль парня
      Ответить
      • гильотина еще никогда не подводила
        Ответить
      • Да ладно, если вдруг придется фотошоп писать он что на питоне это надрачивать бут? Неа, полюбит плюсики!!!!
        Ответить
    • Фейл!
      >write(f, str(chr));
      В питоне так:
      f.write(str(chr));
      Ответить
      • хреновый из него подражатель значит
        Ответить
        • надо было создать класс
          Ответить
        • >хреновый подражатель
          Не, когда к нему подошёл преподаватель для проверки, он хорошо так подрожал.
          Ответить
    • Лучше бы макрос unless() придумали.
      Ответить
    • vanished
      Ответить

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