Часть №12: Практические задания по С++

  Юрий  | 

  Обновл. 16 Сен 2021  | 

 24787

 ǀ   34 

Здесь размещены задания по С++, которые вы можете выполнить. Каждое задание имеет свой уровень сложности. Готовых ответов не будет, поэтому 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 (17 оценок, среднее: 5,00 из 5)
Загрузка...

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

  1. Антон:

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

  2. Антон:

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

  3. WAR:

    Задание №2:

  4. WAR:

    Задание №1:

  5. Максим:

    Задание 3:

    main.cpp:

    Human.h:

    Formalist.h:

    Informal.h:

    Realist.h:

    1. Максим:

      Я напутал с подключенными библиотеками, вместо
      <random> нужно было подключить <cstdlib>
      и <sstream> -> <string>

  6. Rock:

    Задание 1:

    Задание 2:

    3 Задание : https://github.com/RockHero666/test Залил на гитхаб ибо много файлов решил сделать для удобства и практики, с раздельными объявлениями и реализациями

  7. andrej:

    Задание №2 :

  8. andrej:

    Задание № 1

  9. RockNRullz:

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

  10. Анастасия:

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

    Файл Person.h:

    Файл Create_random_person.h:

    Файл main.cpp:

  11. Анастасия:

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

  12. Анастасия:

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

    1. Kris:

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

  13. Kris:

    2.

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

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

      1. Kris:

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

  14. 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()){……. тысяча строк лишнего мусора по проверке корректности кода …..}. Если человек не способен концентрироваться на главном, то пусть лучше не комментирует мой код. Вы говорите, что учитесь читать чужой код. Так вот, самое главное в чтении чужого кода — это видеть начинку кода и игнорировать второстепенный синтаксический сахар, ибо кода будет очень много во многих файлах, а вы должны научиться быстро оценивать то, что делает код и искать семантически неправильные ошибки, ибо они самые опасные и коварные.

  15. Алена:

    Задача 2.

  16. Shom:

    Задание №3.

    Файл "person.h":

    Файл "person.cpp":

    Файл "main.cpp":

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

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

      1. Shom:

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

  17. Владимир:

  18. Алена:

    Задача 1.

  19. Shom:

    Задание №2.

  20. Shom:

    Задание №1:

  21. Владимир:

    Задание №1

  22. Илья:

    Задание 2:

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

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

  23. Илья:

    Задание 1:

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

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