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

    +1

    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
    //Попробуйте программно смоделировать разговор людей.Всего есть 10 людей.Каждый человек имеет имя(строку) и возраст(число).
    //Возраст каждого человека генерируется рандомно из диапазона от 20 до 40, а имена состоят из следующего списка: 
    //Александр, Андрей, Анастасия, Ирина, Наталья, Павел, Роман, Светлана, Сергей, Татьяна.
    //Любой человек способен выполнять два действия :
    //-здороваться с другим человеком;
    //-рассказывать о себе.
    //Люди делятся на 3 типа(разные классы) :
    //    Тип №1 : Формалисты.Здороваются со всеми следующим образом : Здравствуйте, <имя>!, где <имя> — это имя человека, с которым он здоровается.
    //    Тип №2 : Неформалы.Со всеми здороваются : Привет, <имя>!.
    //    Тип №3 : Реалисты.Если возраст собеседника меньше / равен или не больше, чем на 5 лет, то здороваются следующим образом : Привет, <имя>!, в противном случае — Здравствуйте, <имя>!.
    //    В программной реализации приветствие должно быть реализовано как полиморфный метод, принимающий человека в качестве параметра и возвращающий строку.
    //    Рассказ о человеке является строкой формата "Меня зовут Вася, мой возраст 21 лет и я неформал" (вместо Вася используется имя любого другого человека, 
    //    вместо 21 возраст этого человека, вместо неформал может быть формалист, либо реалист).Как видите у людей с грамматикой не всё в порядке, 
    //    и они говорят лет после любого числа — непорядок, это нужно обязательно исправить.
    //    Программа должна показать информацию обо всех людях.Затем все люди должны поздороваться друг с другом в следующем порядке : 
    //    первый здоровается со вторым, затем второй с первым, а затем первый с третьим, третий с первым и т.д.Например :
    //    Петя : Привет, Вася!
    //    Вася : Здравствуйте, Петя!
    //    Петя : Привет, Женя!
    //    Женя : Привет, Петя!
    
    
    unique_ptr<Person>& createPerson()
    {
        switch (getRandomNumber(0, 2))
        {
        case 0:
            {
            unique_ptr<Person> person = make_unique<Formalist>(RANDNAME_0_10, RANDAGE_20_40);
            return person; 
            }
        case 1:
            {
            unique_ptr<Person> person = make_unique<Neformal>(RANDNAME_0_10, RANDAGE_20_40);
            return person;
            }
        case 2:
            {
            unique_ptr<Person> person = make_unique<Realist>(RANDNAME_0_10, RANDAGE_20_40);
            return person;
            }
        default:
            {
            unique_ptr<Person> person = nullptr;
            return person;
            }
        };
    }
    
    void createGroup(vector<unique_ptr<Person>>& group, int8_t size)
    {
        unique_ptr<Person> tempPerson = nullptr;
        for (int i = 0; i < size; ++i)
        {
            tempPerson = std::move(createPerson());
            group.push_back(tempPerson);
        }
    }

    Не могу понять как инициализировать массив в createGroup() через unique_pointers. Нужно ли было изначально возвращать shared pointers из createPerson()? Или использовать перемещения с unique_pointers? И куда по правильному впихивать using namespace std; если не в global scope? Спасибо заранее

    Полный код
    https://repl.it/@radionnazmiev/Ravesli#Ravesli_12_H/main.cpp

    Запостил: radionnazmiev, 06 Декабря 2020

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

    • - unique_ptr<Person>& createPerson()
      + std::unique_ptr<Person> createPerson()
      
      - unique_ptr<Person> person = make_unique<Formalist>(RANDNAME_0_10, RANDAGE_20_40);
      - return person; 
      + return std::make_unique<Formalist>(RANDNAME_0_10, RANDAGE_20_40);
      
      - int8_t size
      + size_t size


      > Не могу понять как инициализировать массив в createGroup() через unique_pointers.
      «group.emplace_back(createPerson())» или «group.push_back(createPerson())», если из createPerson() возвращать не ссылку (что вообще-то UB). В обоих случаях (с C++11) в итоге вызовется конструктор перемещения.

      > И куда по правильному впихивать using namespace std; если не в global scope?
      Никуда.
      Ответить
    • Мысли по коду:

      > #define RANDNAME_0_10 (string_view)(Person::nameList[getRandomNumber(0, NAMELIST_SIZE - 1)])
      Не очень хорошо.
      1. Макросы надо откладывать на случай, когда с помощью функций не получается решить задачу.
      2. У каста приоритет меньше, чем у []. Если случайно взять RANDNAME_0_10[0], это будет штрингвью от нулевого символа.

      > for (int i = 0; i < size; ++i)
      Есть более удобный for (auto& x: array) для обхода.
      А далее, если по лестнице абстракций вверх, есть std::for_each для обхода и std::generate для изначальной генерации массива.
      Если в group уже есть size элементов, будет справедливо std::generate(group.begin(), group.end(), createPerson);

      > age % 10 == 1
      Не совсем. В коде должно быть не только % 10, но и % 100.
      1, 21, 31, ... питух, 2, 22, 32, ..., 4, 23 питуха, но 11, 12, ... 19 питухов
      Ответить
      • https://www.lingq.com/ru/learn-russian-online/courses/35085/ispolzovanie-slov-let-i-god-55200/

        Работа с числительными это тот ещё багор.

        Хотя тут, кажется, всё довольно просто:

        https://znanija.com/task/17626254
        Ответить
        • > 17626254
          Дискриминация тех, кому за 100 110.

          > system("chcp 1251 > nul"); //для кириллицы
          Какой багор )))
          Ответить
          • setlocale(LC_ALL, "rus") забыл.
            Ответить
            • Доброе утро, gost!
              Меня зовут bormand, мой возраст 15 лет и я девочка-волшебница!


              А setlocale(LC_ALL, "") под виндой не катит чтобы на платформу не завязываться?
              Ответить
              • Звучит как начало очередной порнухи на порнхабе
                Ответить
              • Доброе утро, bormand!
                https://i.imgur.com/3S7INjS.jpg


                Не знаю, все посредственные лабы требуют «using namespace std» и «setlocale(LC_ALL, "RUS")».
                Ответить
                • Да, реально приветствия в этой лабе как в каком-то клубе анонимных алкоголиков.
                  Ответить
              • катит, это прыщеговно внесли в часть CRT, но я не удивлюсь, если оно там работат через пожу
                Ответить
                • в то время, когда все нормальные люди в 2020 году используют "LCD", у крестоблядей все еще "CRT"
                  Ответить
                  • Не знаю как в 2020, у меня в школе четверть века назад еще на стене было написано "ЛСД" и нарисованы почему-то грибы
                    Ответить
    • > В программной реализации приветствие должно быть реализовано как полиморфный метод, принимающий человека в качестве параметра и возвращающий строку.

      Что за ебанутые задания? Что значит "принимающий человека"? Как он его принимает? Принимает структуру в которой прописан возраст, формал, неформал или реалист он? Хотя нет, там же написано

      > Люди делятся на 3 типа(разные классы) :

      Т.е. отдельный класс для формала, неформала, формалиста? НА-ХУ-Я? Почему не сделать структуру, где есть имя, возраст и просто какой-то там блядь енум, в котором описано, формал неформал или формалист он?

      Это надо чтоб оправдать необходимость использования "void *" "полиморфных методов"? Т.е. мы на ровном месте создаем какую-то питушню1, и потом используем питушню2 чтоб ее решить. Охуенное задание.

      Может там еще будет задание в духе "реализуйте такую-то поебень используя такой-то говнопаттерн", а на деле (если реально надо будет запилить такую питушню в реальном не учебном примере) этот говнопаттерн нахуй не нужен, и всё делается проще?
      Ответить
      • А можно вообще сделать базовый класс Person, интерфейс Helloable, и несколько классов: Formal, Informal, Realist, которые будут реализовать Helloable, как в жабе!

        Вот будет кра-со-та.
        Ответить
        • И обмазать всё это фабриками, билдерами и хмл описаниями.
          Ответить
      • В физике и математике тоже ведь начинают с игрушечных задач. Ибо студент охуеет от реального примера.

        > как он его принимает

        Эм, параметром? chel1.greet(chel2).
        Ответить
        • > Эм, параметром? chel1.greet(chel2).

          Ну вот в задании написано:
          > Затем все люди должны поздороваться друг с другом в следующем порядке : первый здоровается со вторым, затем второй с первым, а затем первый с третьим, третий с первым и т.д.

          т.е. надо
          chel1.greet(chel2); chel2.greet(chel1);
          chel1.greet(chel3); chel3.greet(chel1);
          chel1.greet(chel4); chel4.greet(chel1);
          ...
          chel2.greet(chel3); chel3.greet(chel2);
          chel2.greet(chel4); chel4.greet(chel2);
          chel2.greet(chel5); chel5.greet(chel2);
          ...
          и так чтоб все друг с другом перездоровались, и чтоб эта хуйня в цикле проматывалась, не руками же всю эту питушню анроллить?
          Ответить
          • Если структура с человеком в себе в поле тупо хранит энум о том, формал, неформал или формалист это, такая питушня реализуется тупо двумя вложенными циклами, первый взаимно здоровается со всеми от второго до последнего, второй со всеми от третьего до последнего и так далее. И в самой функции мы смотрим на этот энум, и генерим ту или иную текстушню с приветствием.

            А эта вот питушня с тремя разными классами. Зачем? Зачем?
            Ответить
            • > второй со всеми от третьего до последнего

              Не совсем так, в условии они друг с другом здороваются (т.е. отвечают на приветствия). Скорее со всеми, кроме себя самого, при этом задача так же решается двумя вложенными циклами.
              Ответить
              • > Не совсем так, в условии они друг с другом здороваются (т.е. отвечают на приветствия).

                Ну так я это и имел в виду. По сути такая хуйня
                for(size_t i = 0; i < 10-1; ++i)
                {
                  for(size_t j = i+1; j < 10; ++j )
                  {
                    greet(person[i], person[j]);
                    greet(person[j], person[i]);
                  }
                }
                Ответить
                • А, да, действительно, я по-другому подумал.

                  С полиморфизмом получится почти то же самое:
                  ...
                      person[i].greet(person[j]);
                      person[j].greet(person[i]);
                  ...


                  Тут уже кому что больше нравится. Лично я за «ООП».
                  Ответить
                • в кресты уже завезли мультиметоды?
                  Ответить
                  • Это сишный код. У него там свищ в greet'е, а person'ы -- просто структурки.
                    Ответить
                    • пприготовиться к отплытию
                      Ответить
                    • А кстати, если запилить массив из "void *" хуйни, и туда понаприсваивать указателей на всякие там разные экземпляры разных классов, через RTTI какой-нибудь typeid() хуйней можно узнать из указателя, что это за класс был? Или это говно так не работает?
                      Ответить
                      • Не, на void* оно тебе инфу про void* и вернёт.

                        Можно в std::any засунуть.
                        Ответить
            • > А эта вот питушня с тремя разными классами. Зачем? Зачем?
              Потому что это учебная задача, ёпта! Ты бы ещё до младшеклассников доебался: хули они в столбик умножают, когда эту питушню можно реализовать тупо на калькуляторе?
              Ответить
              • Хуевая учебная задача. Эта учебная задача учит использванию какой-то нахуй не нужной поебени, и потом чел будет эту ссанину куда попало пихать, хотя по факту это там нахуй не надо.

                Почему не показывать в учебных задачах более реальные примеры, где бы от этой питушни был какой-то заметный профит, а не ненужное усложнение?
                Ответить
                • почему бы не платить студенту за учебные задачи? хуевая учебная задача, никакого профита /sema-mode
                  Ответить
                • > Почему не показывать в учебных задачах более реальные примеры, где бы от этой питушни был какой-то заметный профит, а не ненужное усложнение?
                  Приведи реальный пример задачи, которая:
                  1) Решается с использованием самых базовых ООП-парадигм (объекты, поля, методы, возможно, самый-самый простой полиморфизм), чтобы практически ничего не знающий про ООП школьник/студент не охуел;
                  2) Достаточно проста, чтобы среднестатистический школьник/студент мог её решить за пару-другую часов (из которых бо́льшую часть должны занимать отладка и борьба с языком);
                  3) Достаточно сложна, чтобы демонстрировать реальный профит от ООП (например, требовать для своего решения большой и запутанной иерархии различных сущностей с пересекающимися свойствами).
                  Ответить
                  • наследование кошечек с собачками и хвостами
                    Ответить
                    • А ради котодевочек им придётся сразу и множественное наследование изучать?
                      Ответить
                      • полиморфизм на тайпклассах
                        Ответить
                      • А я же верно понимаю, что если множественное наследование будет не виртуальным, что у нас будет два эукариота между собой несвязанных?
                        Ответить
      • > принимающий человека в качестве параметра и возвращающий строку
        принимающий пиздюли в качестве аргумента и возвращающий дом
        Ответить
    • Блядь, как всё сложно. Именно поэтому я за "PHP".
      Ответить
    • Проверься на лямблий, только б-га ради не пцр.
      Кстати, объяснить как она работает, не мог ни один преподдаватель. А в книгах такая лажа, что впору ими подтираться. МБ писмьо керри написать? А то так и умру несведущим.
      Ответить

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