Практика в С++. Часть №12

  Юрий  | 

  Обновл. 12 Янв 2020  | 

 3452

 ǀ   25 

Здесь размещены задания по С++, которые вы можете выполнить. Каждое задание имеет свой уровень сложности, готовых ответов не будет, поэтому welcome в комментарии.

Easy: Задание №1

Напишите программу, которая выводит строку, введенную пользователем, задом наперёд.

Пример выполнения программы:

Введите строку: London is the capital!
Результат: !latipac eht si nodnoL

Medium: Задание №2


Дано целое число в диапазоне от 1 до 365. Определить, какой день недели выпадает на
это число, если 1 января — понедельник.

Hard: Задание №3

Программно смоделировать разговор людей. Всего есть 5 людей. Каждый человек имеет имя (строку) и возраст (число). Возраст каждого человека генерируется рандомно из диапазона от 20 до 40, а имена из следующего списка: Александр, Андрей, Анастасия, Ирина, Наталья, Павел, Роман, Светлана, Сергей, Татьяна.

Любой человек способен выполнять два действия:

   здороваться с другим человеком;

   рассказывать о себе.

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

   Тип №1: Формалисты. Здороваются со всеми следующим образом: Здравствуй, <имя>!, где <имя> — это имя человека, с которым он здоровается.

   Тип №2: Неформалы. Со всеми здороваются: Привет, <имя>!.

   Тип №3: Реалисты. Если возраст собеседника меньше/равен или больше, не более чем на 5 лет, то здороваются следующим образом: Привет, <имя>!, иначе Здравствуй, <имя>!.

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

Рассказ о человеке является строкой формата Меня зовут Вася, мой возраст 21 лет и я неформал (вместо Вася используется имя любого другого человека, вместо 21 возраст этого человека, вместо неформал может быть формалист, либо реалист). Как видите у людей с грамматикой не всё в порядке, и они говорят лет после любого числа — непорядок, это нужно обязательно исправить.

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

Петя: Привет, Вася!
Вася: Здравствуй, Петя!
Петя: Привет, Женя!
Женя: Привет, Петя!


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (6 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 25

  1. Аватар RockNRullz:

    Задание №3. У меня получилось вот так:

  2. Аватар Анастасия:

    Моё решение задания №3 (всего три файла, три куска кода, реализацию функций оставила в заголовочных файлах, т.к. все функции довольно простые)

    Файл Person.h:

    Файл Create_random_person.h:

    Файл main.cpp:

  3. Аватар Анастасия:

    Моё решение задания №2:

  4. Аватар Анастасия:

    Моё решение задания №1:

    1. Аватар Kris:

      Анастасия, какой опасный код для изменений, просто ужас. Другие прочитают этот код, и подумают, что вы издеваетесь над ними, раз думаете, что длина строки не может быть больше 2^(8 * sizeof(int) — 1) — 1.
      Если вы обнаружите, что длина строки слишком большая, и влазит в оперативную память, вы измените тип в цикле на size_t, но тогда у вас будет бесконечный цикл и ваша программа будет неспособна перевернуть строку. Это же издевательство над теми, кто будет пользоваться вашей программой! Как же так, ведь нужно же учитывать ВСЕ ВОЗМОЖНЫЕ случаи, даже в таком легком примере. Ужс, просто нет слов. Теперь не знаю, как жить дальше. 😉

  5. Аватар Kris:

    2.

    1. Аватар Анастасия:

      нет проверки корректности ввода, пользователь может ввести отрицательное число, буквы или число > 365.
      Зачем отнимать 1 и делать не очевидные номера для дней недели (2 — среда?!), если можно воскресенье сделать нулём (по-американски), и тогда всё встанет на свои места.

      1. Аватар Kris:

        Я писал только важную часть кода, я же не пишу этот код, чтобы потом его использовать в приложении. Понятное дело, что нужно делать проверку. Я не сомневаюсь в своих силах, что я справлюсь с проверкой. Просто мне лень было это писать, я вообще не люблю лишний раз делать бессмысленные действия. Пишу чисто в свое удовольствие. А то, как выглядит код для других, в данном случае, мне как — то не важно, для меня искусством кодинга является отношение эффективности(полезной эффективности, а не лишних проверок) к количеству строк.

  6. Аватар Kris:

    №1

    1. Аватар Анастасия:

      Kris, вот не понимаю, что Вы хотели сказать этими четыремя строчками? Что все остальные — идиоты, что выкладывают по 30 строк? Или что решение очень простое, и вот его суть? Так остальные предлагают тоже не такие уж и сложные решения, зачем резать глаз своими четыремя строчками вместо всего кода? К тому же, использование swap предполагает подключение <algorithm>. Это тоже очевидно? Тогда зачем вообще выкладывать решение, если всё и так очевидно? Третью задачу, что потруднее, Вы почему-то не выложили. Хотя чего там, строк 20 еле наберётся…
      Я действительно не понимаю, зачем Вы выложили эти четыре строчки без комментариев.

      1. Аватар Kris:

        Анастасия, Вы слишком бурно реагируете на выложенные другими людьми решения. Попейте водички и успокойтесь. Каким образом я могу выставить других людей идиотами, если весь мой комментарий состоял из номера задачи и самого кода? В каком месте я намекнул на то, что кто-то является идиотом?

        Что же до самого кода, то я пишу такой код во всех своих проектах. Я люблю минимализм, ничего лишнего не должно быть. Проверки и другие действия, в данном случае — это шелуха. Понятное дело, что алгоритм простой. Но когда Вы будете писать какие-то сложные алгоритмы, если зацикливаться на шелухе, то код превращается в нечто ужасное, непонятное и трудно изменяемое. Я привык так писать код. Если я пишу какой-то большой проект, а не детскую задачку на переворачивание строки, то я, конечно же, буду писать аккуратно и понятно, со всеми проверками, которые потребуются для приложения. В данном случае, я считаю эту задачу детской, поэтому пишу так, как считаю наиболее правильным. А наиболее правильным я считаю код, который содержит как можно меньше строк и наиболее эффективен по скорости и памяти. Мне так нравится, понимаете?

        Что же до последней задачи, то она простая, на самом деле, а писать нужно много. Как я уже написал выше, я не люблю делать лишних действий просто так. Если бы задача того стоила бы, и она была бы нетривиальной, я бы потратил бы и день, даже неделю на ее решение и оформление. Но если я читаю условие и знаю, как она решается, то не вижу смысла в оформлении, если для нее мне нужно будет потратить больше 20-30 строк кода(хотя это количество тоже может варьироваться, в зависимости от моего настроения).

        Думаю, вам бы следовало бы меньше агриться на чужой код и не додумывать за авторов комментариев. Агрессия — не слишком хороший тон поведения, особенно, если она необоснованна.

        1. Аватар Анастасия:

          Kris, я абсолютно спокойна. Я спокойна прочитала Ваши ответы, но так и не поняла, зачем Вы выложили свои коды. Задачи-то детские, как решать — понятно, как выглядит Ваш код для других — для Вас не важно. И зачем тогда? Я, например, выкладываю по трём причинам:

          1) Чтобы меня могли покритиковать, если критика конструктивная, я смогу в дальнейшем что-то принять на заметку и улучшить.

          2) Некоторые задачи для меня кажутся сложными, и что-то не получается сделать сразу. Тогда я делаю как могу, выкладываю, и потом смотрю, как сделали другие. То есть так как конечная цель — научиться, я таким образом сначала до упора пытаюсь сама, а потом смотрю чужие, чтобы понять, что можно было сделать проще или лучше.

          3) Если я выкладываю свой код, я потом стараюсь читать чужие коды, чтобы практиковаться читать чужой код. Если у меня есть замечания, я их пишу, и считаю, что это честно, так как свой код я тоже демонстрирую в том числе для замечаний.

      2. Аватар Kris:

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

        И да, если кто-то и комментирует мой код, находя в нем ошибки, то пусть это будет человек, который видит саму начинку кода, а не лишнюю шелуху по типу cout << "Введите число"; while (tatata.fail()){……. тысяча строк лишнего мусора по проверке корректности кода …..}. Если человек не способен концентрироваться на главном, то пусть лучше не комментирует мой код. Вы говорите, что учитесь читать чужой код. Так вот, самое главное в чтении чужого кода — это видеть начинку кода и игнорировать второстепенный синтаксический сахар, ибо кода будет очень много во многих файлах, а вы должны научиться быстро оценивать то, что делает код и искать семантически неправильные ошибки, ибо они самые опасные и коварные.

  7. Аватар Алена:

    Задача 2.

  8. Аватар Shom:

    Задание №3.

    Файл "person.h":

    Файл "person.cpp":

    Файл "main.cpp":

    1. Аватар Анастасия:

      Вы молодец, что догадались сделать тип личности переменной родительского класса, я же прочитала задание буквально и такую переменную не сделала. С ней вывод "о себе" проще, т.к. достаточно только в родительском классе этот метод прописать.
      Есть одно мааааленькое несоответствие заданию: реалист должен здороваться "Здравствуй, …" не только с людьми старше него больше, чем на 5 лет, но и с людьми, которые младше его больше, чем на 5 лет.

      1. Аватар Shom:

        Вспомнилось: "На третьем ходу выяснилось, что гроссмейстер играет восемнадцать испанских партий…" ("12 стульев").
        Посчитал, что "не более чем на 5 лет" относится только к слову "больше".
        Спасибо за ваши комментарии.

  9. Аватар Владимир:

  10. Аватар Алена:

    Задача 1.

  11. Аватар Shom:

    Задание №2.

  12. Аватар Shom:

    Задание №1:

  13. Аватар Владимир:

    Задание №1

  14. Аватар Илья:

    Задание 2:

    1. Аватар Анастасия:

      Илья, вы кругом тут неправы:
      1) не сообщаете пользователю, что от него требуется ввести
      2) не проверяете ввод пользователя
      3) день года % 7 никогда не даст 7, то есть воскресенье никогда не угадается.

  15. Аватар Илья:

    Задание 1:

Добавить комментарий для Илья Отменить ответ

Ваш E-mail не будет опубликован. Обязательные поля помечены *