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

  Юрий  | 

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

 27525

 ǀ   41 

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

Easy: Задание №1

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

Введите строку:
Меня зовут Анатолий!
Результат:
!Анатолий зовут Меня

Medium: Задание №2


Напишите программу, которая создает два массива и заполняет их случайными числами. Затем она должна возвратить третий массив, который содержит только общие для обоих массивов значения (без дублирований).

Hard: Задание №3

Вы, как пользователь, загадываете число от 0 до 100. Программа должна его угадать, делая предположения, а вы должны сообщать ей, является ли её число слишком большим, слишком маленьким или "Правильно, угадал!".

В конце программа должна вывести на экран количество предположений, которые ей потребовались для того, чтобы угадать ваше число.

Примечание: Вам, как программисту, придется выбирать стратегию угадывания компьютером числа пользователя. Самая простая стратегия заключается в переборе чисел от 0 до 100 (например: 1, 2, 3 и т.д.), но это очень долго. Лучшим вариантом является деление диапазона пополам:

   начинаем с 50;

   если число пользователя больше, то вновь делим диапазон оставшихся чисел на 2 и добавляем к предыдущему предположению, получая, таким образом, 75;

   если число пользователя меньше, то (делим 50 на 2) указываем 25;

   и, таким образом, делим диапазон до тех пор, пока не доберемся до верного результата.

У вас также может быть и другая/своя стратегия.


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

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

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

  1. Finchi:

    Задание №1

    Задание №2

    Задание №3

  2. WAR:

    Задание №2:

  3. WAR:

    Задание №1 (правильная версия):

  4. WAR:

    Задание №1:

  5. Rock:

    Задание 1:

    Задание 2:

    Задание 3:

  6. Максим:

    Задание 3

  7. Kir:

    Задание 3

    UserInput.h

    RandNumber.h

    RandNumber.cpp

  8. Kir:

    Задание 2

    main.cpp

    RandNumber.h

    RandNumber.cpp

  9. Kir:

    Задание 1

  10. Kir:

    Задание 3

    main.cpp

    RandNumber.h

    RandNumber.cpp

    UserInput.h

  11. Евгений:

    // Task № 1

  12. RockNRullz:

    Задание №3:

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

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

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

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

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

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

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

      Мне удалось подключить ispunct для кириллицы благодаря примерам ниже) Вот последняя версия кода для задания №1, можно только её прикрепить:

  16. Shom:

    Задание №3.

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

      у Вас нет проверки адекватности пользователя, то есть он мог загадать что-то вне рамок диапазона, у Вас после 100 и до 0 программа работает как перебор всех подряд значений, а нужно это пресекать с вердиктом. И ещё не очень хорошо, что нет гибкости для изменения данных задачи — 0, 100, 50 фигурируют как магические числа.
      Но в целом работать с программой приятно, мне понравилось вот это "Вы загадали?", я как-то не додумалась до такой ёмкой фразы.

      1. Shom:

        Спасибо за комментарий! Всё верно: даже за рамками оговоренных правил игры программа продолжает работать. Медленно, но продолжает)
        Согласен, если по-серёзному делать, то числа диапазона вариантов надо было вынести в константы. Но так-ка программа маленькая, то решил, что комментариев будет достаточно для определения их предназначения.

  17. Shom:

    Задание №2

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

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

      1. Shom:

        Спасибо, ваш комментарий помог вспомнить логику работы моей программы)
        С последним утверждением полностью согласен: проверку надо начинать с более короткого массива.
        Поиск и удаление дубликатов из финального массива приведёт к его многократному пересозданию, что увеличит время работы программы и потребление ресурсов. Проверка на дубли найденного совпадения увеличит количество итераций.

  18. Shom:

    Задание №1

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

      … а ещё простым смертным нужно #include <string> для работы со строками…
      Не поняла фишки с двумя пробелами. Зачем? И зачем удалять что-то из входной строки?

      1. Shom:

        Спасибо за вопросы. Как Вы могли заметить, входная строка разбирается с конца к началу: то-есть, в каждой итерации цикла берётся последний элемент строки и прогоняется через блок кейсов. И что-бы значение последнего элемента не было постоянным мы его удаляем после обработки. Исключения составляют слова — они "откусываются" целиком (обработка букв происходит в блоке default).
        Один пробел в начале строки нужен, чтобы указать, что слово закончилось и пора его переписывать в выходную строку. Второй пробел появился как "костыль", с ним программа начала работать как задумывалось. Увидел как исправить этот недочёт только после публикации решения, но сейчас уже забыл в чём там дело.

      2. Shom:

        Осталось решить одно последнее задание из части 24 — там будет #include <string>. Если получится опубликовать. Решение второго задания дня три сайт не принимает.

  19. Владимир:

    Задание №3

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

      Ваша программа мне оочень понравилась! Она гениальна.
      Вот только бы ещё очищать буфер, на случай, если пользователь вводит не один символ, а несколько.

  20. Алена:

    Задача 2.

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

      Алёна, этот Ваш код по структуре удивительно напоминает код Владимира. Вряд ли Вы списывали, но не могу не подметить сходство мыслей.

  21. Владимир:

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

      Ой, как некрасиво дублировать код для генерации двух массивов и для печати трёх… Это на 23-ей-то части практических заданий…
      И совсем не обязательно для каждого цикла придумывать новые незначащие имена счётчиков (k, q, t, h).
      И тройной вложенный цикл прямо в main — это прям сурово!

  22. Владимир:

    1. Алена:

      Владимир, есть мысль по поводу Вашего комментария:

      Тоже столкнулась с данной проблемой. В моей первой версии без учета знаков препинания, а значит без проверки с библиотекой #include <cctype>, все прекрасно работало только с этими строчками кода:

      Добавляя проверку на знак препинания, кириллица не выводилась обратно в консоль, но с латинскими буквами все работало отлично.
      Вероятно, функции проверки символов библиотеки <cctype> возвращают символы кириллицы в другой кодировке или как-то меняют их. Не углублялась в данный вопрос)

      1. Владимир:

        Сейчас эту проблему похоже решили, после обновления VS, программа корректно выводит в консоль знаки препинания и кириллические символы, без строки 13 кода

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

          У меня последняя версия VS, и всё равно ispunct не работает с кириллицей, несмотря на cctype и

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

      Владимир, Вы неплохо выкрутились, записывая слова "как есть" в вектор строк. Но в Вашем коде есть недостатки:
      1) невнятные имена переменных вроде vec, s, str
      2) define, но про это я Вам уже не раз писала
      3) дублирующийся код — для цифр, пунктуации и букв всё одно и то же делаете
      4) не учитываете что слова могут состоять из букв, цифр и символов, а таких я сходу немало знаю — имя сына Илона Маска, NOD32, 1C С++17 и так далее.

  23. Алена:

    Задача 1.

    1. Владимир:

      Алена, в Вашей программе если ввести тестовую строку : "Меня зовут Анатолий!", то получим результат : "Анатолий! зовут Меня", а в примере задания видим иное : "!Анатолий зовут Меня"

      1. Алена:

        Владимир, да, действительно, спасибо, скопировала сюда первую версию почему-то.

        Для учета знаков препинания добавились 2 проверки:
        строки 12-14 и 28-30

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

          Алёна, мне понравилась Ваша идея писать в строку через std::cout, то есть это и сохранение в строку и печать одновременно, так?
          Но у меня проверка на пунктуацию с кириллицей никак не работает, я пробовала подключать всё то же самое, что и у Вас (cctype и заголовочные файлы для кириллицы), но результат один — рантайм эррор, как раз когда начинает проверять буквы.

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

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