Здесь размещены задания по С++, которые вы можете выполнить. Каждое задание имеет свой уровень сложности. Готовых ответов не будет, поэтому welcome в комментарии!
Easy: Задание №1
Напишите программу, которая запрашивает у пользователя строку, содержащую несколько слов. Затем выведите пользователю ту же строку, но в обратном порядке. Например:
Введите строку:
Меня зовут Анатолий!
Результат:
!Анатолий зовут Меня
Medium: Задание №2
Напишите программу, которая создает два массива и заполняет их случайными числами. Затем она должна возвратить третий массив, который содержит только общие для обоих массивов значения (без дублирований).
Hard: Задание №3
Вы, как пользователь, загадываете число от 0 до 100. Программа должна его угадать, делая предположения, а вы должны сообщать ей, является ли её число слишком большим, слишком маленьким или "Правильно, угадал!"
.
В конце программа должна вывести на экран количество предположений, которые ей потребовались для того, чтобы угадать ваше число.
Примечание: Вам, как программисту, придется выбирать стратегию угадывания компьютером числа пользователя. Самая простая стратегия заключается в переборе чисел от 0 до 100 (например: 1
, 2
, 3
и т.д.), но это очень долго. Лучшим вариантом является деление диапазона пополам:
начинаем с 50
;
если число пользователя больше, то вновь делим диапазон оставшихся чисел на 2 и добавляем к предыдущему предположению, получая, таким образом, 75
;
если число пользователя меньше, то (делим 50 на 2) указываем 25
;
и, таким образом, делим диапазон до тех пор, пока не доберемся до верного результата.
У вас также может быть и другая/своя стратегия.
Задание №1
Задание №2
Задание №3
Задание №2:
Задание №1 (правильная версия):
Задание №1:
Задание 1:
Задание 2:
Задание 3:
Задание 3
Задание 3
UserInput.h
RandNumber.h
RandNumber.cpp
Задание 2
main.cpp
RandNumber.h
RandNumber.cpp
Задание 1
Задание 3
main.cpp
RandNumber.h
RandNumber.cpp
UserInput.h
// Task № 1
Задание №3:
Моё решение задания №3:
Моё решение задания №2:
Моё решение задания №1:
Мне удалось подключить ispunct для кириллицы благодаря примерам ниже) Вот последняя версия кода для задания №1, можно только её прикрепить:
Задание №3.
у Вас нет проверки адекватности пользователя, то есть он мог загадать что-то вне рамок диапазона, у Вас после 100 и до 0 программа работает как перебор всех подряд значений, а нужно это пресекать с вердиктом. И ещё не очень хорошо, что нет гибкости для изменения данных задачи — 0, 100, 50 фигурируют как магические числа.
Но в целом работать с программой приятно, мне понравилось вот это "Вы загадали?", я как-то не додумалась до такой ёмкой фразы.
Спасибо за комментарий! Всё верно: даже за рамками оговоренных правил игры программа продолжает работать. Медленно, но продолжает)
Согласен, если по-серёзному делать, то числа диапазона вариантов надо было вынести в константы. Но так-ка программа маленькая, то решил, что комментариев будет достаточно для определения их предназначения.
Задание №2
То есть Вы сначала, не проверяя второй массив, проверяете каждый элемент первого массива на наличие повторов в нём и берёте на проверку только последний из повторяющихся элементов? Странновато, по-моему. Мне кажется логичней делать проверку на дубли уже после того, как найдено совпадение, даже лучше в последнюю очередь, когда уже есть финальный массив с общими элементами, ведь он точно будет короче первого и не придётся проверять лишнего.
И, раз уж на то пошло, то проверять по-хорошему сначала надо элементы более короткого массива, которым, в общем случае, может быть и не первый.
Спасибо, ваш комментарий помог вспомнить логику работы моей программы)
С последним утверждением полностью согласен: проверку надо начинать с более короткого массива.
Поиск и удаление дубликатов из финального массива приведёт к его многократному пересозданию, что увеличит время работы программы и потребление ресурсов. Проверка на дубли найденного совпадения увеличит количество итераций.
Задание №1
… а ещё простым смертным нужно #include <string> для работы со строками…
Не поняла фишки с двумя пробелами. Зачем? И зачем удалять что-то из входной строки?
Спасибо за вопросы. Как Вы могли заметить, входная строка разбирается с конца к началу: то-есть, в каждой итерации цикла берётся последний элемент строки и прогоняется через блок кейсов. И что-бы значение последнего элемента не было постоянным мы его удаляем после обработки. Исключения составляют слова — они "откусываются" целиком (обработка букв происходит в блоке default).
Один пробел в начале строки нужен, чтобы указать, что слово закончилось и пора его переписывать в выходную строку. Второй пробел появился как "костыль", с ним программа начала работать как задумывалось. Увидел как исправить этот недочёт только после публикации решения, но сейчас уже забыл в чём там дело.
Осталось решить одно последнее задание из части 24 — там будет #include <string>. Если получится опубликовать. Решение второго задания дня три сайт не принимает.
Задание №3
Ваша программа мне оочень понравилась! Она гениальна.
Вот только бы ещё очищать буфер, на случай, если пользователь вводит не один символ, а несколько.
Задача 2.
Алёна, этот Ваш код по структуре удивительно напоминает код Владимира. Вряд ли Вы списывали, но не могу не подметить сходство мыслей.
Ой, как некрасиво дублировать код для генерации двух массивов и для печати трёх… Это на 23-ей-то части практических заданий…
И совсем не обязательно для каждого цикла придумывать новые незначащие имена счётчиков (k, q, t, h).
И тройной вложенный цикл прямо в main — это прям сурово!
Владимир, есть мысль по поводу Вашего комментария:
Тоже столкнулась с данной проблемой. В моей первой версии без учета знаков препинания, а значит без проверки с библиотекой #include <cctype>, все прекрасно работало только с этими строчками кода:
Добавляя проверку на знак препинания, кириллица не выводилась обратно в консоль, но с латинскими буквами все работало отлично.
Вероятно, функции проверки символов библиотеки <cctype> возвращают символы кириллицы в другой кодировке или как-то меняют их. Не углублялась в данный вопрос)
Сейчас эту проблему похоже решили, после обновления VS, программа корректно выводит в консоль знаки препинания и кириллические символы, без строки 13 кода
У меня последняя версия VS, и всё равно ispunct не работает с кириллицей, несмотря на cctype и
Владимир, Вы неплохо выкрутились, записывая слова "как есть" в вектор строк. Но в Вашем коде есть недостатки:
1) невнятные имена переменных вроде vec, s, str
2) define, но про это я Вам уже не раз писала
3) дублирующийся код — для цифр, пунктуации и букв всё одно и то же делаете
4) не учитываете что слова могут состоять из букв, цифр и символов, а таких я сходу немало знаю — имя сына Илона Маска, NOD32, 1C С++17 и так далее.
Задача 1.
Алена, в Вашей программе если ввести тестовую строку : "Меня зовут Анатолий!", то получим результат : "Анатолий! зовут Меня", а в примере задания видим иное : "!Анатолий зовут Меня"
Владимир, да, действительно, спасибо, скопировала сюда первую версию почему-то.
Для учета знаков препинания добавились 2 проверки:
строки 12-14 и 28-30
Алёна, мне понравилась Ваша идея писать в строку через std::cout, то есть это и сохранение в строку и печать одновременно, так?
Но у меня проверка на пунктуацию с кириллицей никак не работает, я пробовала подключать всё то же самое, что и у Вас (cctype и заголовочные файлы для кириллицы), но результат один — рантайм эррор, как раз когда начинает проверять буквы.