Здесь размещены задания по С++, которые вы можете выполнить. Каждое задание имеет свой уровень сложности. Готовых ответов не будет, поэтому 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
возраст этого человека, вместо неформал
может быть формалист
, либо реалист
). Как видите у людей с грамматикой не всё в порядке, и они говорят лет
после любого числа — непорядок, это нужно обязательно исправить.
Программа должна показать информацию обо всех людях. Затем все люди должны поздороваться друг с другом в следующем порядке: первый здоровается со вторым, затем второй с первым, а затем первый с третьим, третий с первым и т.д. Например:
Александр: Привет, Роман!
Роман: Здравствуйте, Александр!
Александр: Привет, Ирина!
Ирина: Привет, Александр!
Мое решение задания №2
Мое решение задания №1
Задание №2:
Задание №1:
Задание 3:
main.cpp:
Human.h:
Formalist.h:
Informal.h:
Realist.h:
Я напутал с подключенными библиотеками, вместо
<random> нужно было подключить <cstdlib>
и <sstream> -> <string>
Задание 1:
Задание 2:
3 Задание : https://github.com/RockHero666/test Залил на гитхаб ибо много файлов решил сделать для удобства и практики, с раздельными объявлениями и реализациями
Задание №2 :
Задание № 1
Задание №3. У меня получилось вот так:
Моё решение задания №3 (всего три файла, три куска кода, реализацию функций оставила в заголовочных файлах, т.к. все функции довольно простые)
Файл Person.h:
Файл Create_random_person.h:
Файл main.cpp:
Моё решение задания №2:
Моё решение задания №1:
Анастасия, какой опасный код для изменений, просто ужас. Другие прочитают этот код, и подумают, что вы издеваетесь над ними, раз думаете, что длина строки не может быть больше 2^(8 * sizeof(int) — 1) — 1.
Если вы обнаружите, что длина строки слишком большая, и влазит в оперативную память, вы измените тип в цикле на size_t, но тогда у вас будет бесконечный цикл и ваша программа будет неспособна перевернуть строку. Это же издевательство над теми, кто будет пользоваться вашей программой! Как же так, ведь нужно же учитывать ВСЕ ВОЗМОЖНЫЕ случаи, даже в таком легком примере. Ужс, просто нет слов. Теперь не знаю, как жить дальше. 😉
2.
нет проверки корректности ввода, пользователь может ввести отрицательное число, буквы или число > 365.
Зачем отнимать 1 и делать не очевидные номера для дней недели (2 — среда?!), если можно воскресенье сделать нулём (по-американски), и тогда всё встанет на свои места.
Я писал только важную часть кода, я же не пишу этот код, чтобы потом его использовать в приложении. Понятное дело, что нужно делать проверку. Я не сомневаюсь в своих силах, что я справлюсь с проверкой. Просто мне лень было это писать, я вообще не люблю лишний раз делать бессмысленные действия. Пишу чисто в свое удовольствие. А то, как выглядит код для других, в данном случае, мне как — то не важно, для меня искусством кодинга является отношение эффективности(полезной эффективности, а не лишних проверок) к количеству строк.
№1
Kris, вот не понимаю, что Вы хотели сказать этими четыремя строчками? Что все остальные — идиоты, что выкладывают по 30 строк? Или что решение очень простое, и вот его суть? Так остальные предлагают тоже не такие уж и сложные решения, зачем резать глаз своими четыремя строчками вместо всего кода? К тому же, использование swap предполагает подключение <algorithm>. Это тоже очевидно? Тогда зачем вообще выкладывать решение, если всё и так очевидно? Третью задачу, что потруднее, Вы почему-то не выложили. Хотя чего там, строк 20 еле наберётся…
Я действительно не понимаю, зачем Вы выложили эти четыре строчки без комментариев.
Анастасия, Вы слишком бурно реагируете на выложенные другими людьми решения. Попейте водички и успокойтесь. Каким образом я могу выставить других людей идиотами, если весь мой комментарий состоял из номера задачи и самого кода? В каком месте я намекнул на то, что кто-то является идиотом?
Что же до самого кода, то я пишу такой код во всех своих проектах. Я люблю минимализм, ничего лишнего не должно быть. Проверки и другие действия, в данном случае — это шелуха. Понятное дело, что алгоритм простой. Но когда Вы будете писать какие-то сложные алгоритмы, если зацикливаться на шелухе, то код превращается в нечто ужасное, непонятное и трудно изменяемое. Я привык так писать код. Если я пишу какой-то большой проект, а не детскую задачку на переворачивание строки, то я, конечно же, буду писать аккуратно и понятно, со всеми проверками, которые потребуются для приложения. В данном случае, я считаю эту задачу детской, поэтому пишу так, как считаю наиболее правильным. А наиболее правильным я считаю код, который содержит как можно меньше строк и наиболее эффективен по скорости и памяти. Мне так нравится, понимаете?
Что же до последней задачи, то она простая, на самом деле, а писать нужно много. Как я уже написал выше, я не люблю делать лишних действий просто так. Если бы задача того стоила бы, и она была бы нетривиальной, я бы потратил бы и день, даже неделю на ее решение и оформление. Но если я читаю условие и знаю, как она решается, то не вижу смысла в оформлении, если для нее мне нужно будет потратить больше 20-30 строк кода(хотя это количество тоже может варьироваться, в зависимости от моего настроения).
Думаю, вам бы следовало бы меньше агриться на чужой код и не додумывать за авторов комментариев. Агрессия — не слишком хороший тон поведения, особенно, если она необоснованна.
Kris, я абсолютно спокойна. Я спокойна прочитала Ваши ответы, но так и не поняла, зачем Вы выложили свои коды. Задачи-то детские, как решать — понятно, как выглядит Ваш код для других — для Вас не важно. И зачем тогда? Я, например, выкладываю по трём причинам:
1) Чтобы меня могли покритиковать, если критика конструктивная, я смогу в дальнейшем что-то принять на заметку и улучшить.
2) Некоторые задачи для меня кажутся сложными, и что-то не получается сделать сразу. Тогда я делаю как могу, выкладываю, и потом смотрю, как сделали другие. То есть так как конечная цель — научиться, я таким образом сначала до упора пытаюсь сама, а потом смотрю чужие, чтобы понять, что можно было сделать проще или лучше.
3) Если я выкладываю свой код, я потом стараюсь читать чужие коды, чтобы практиковаться читать чужой код. Если у меня есть замечания, я их пишу, и считаю, что это честно, так как свой код я тоже демонстрирую в том числе для замечаний.
Анастасия, по разным причинам выкладываю. В основном, я выкладываю реально редко. Из всех 24 практик, я выложил только в 3 — 4 вроде бы. Бывает, что выкладываю простые задачи, по типу этой, просто потому что хочется, не для того, чтобы мой код оценили другие или что-то еще, просто для себя. Если говорить про более серьезные задачи, то их я выкладываю достаточно подробно, чтобы другие могли прочитать их и понять. Обычную шелуху по типу проверок корректности ввода я всегда опускаю, потому что суть задачи не в этом, а эта шелуха лишь мешает читать код. Можете почитать мои комментарии под некоторыми статьями, там есть интересные приемы, по типу вызова чистой виртуальной функции, что не такая уж и тривиальная задача.
И да, если кто-то и комментирует мой код, находя в нем ошибки, то пусть это будет человек, который видит саму начинку кода, а не лишнюю шелуху по типу cout << "Введите число"; while (tatata.fail()){……. тысяча строк лишнего мусора по проверке корректности кода …..}. Если человек не способен концентрироваться на главном, то пусть лучше не комментирует мой код. Вы говорите, что учитесь читать чужой код. Так вот, самое главное в чтении чужого кода — это видеть начинку кода и игнорировать второстепенный синтаксический сахар, ибо кода будет очень много во многих файлах, а вы должны научиться быстро оценивать то, что делает код и искать семантически неправильные ошибки, ибо они самые опасные и коварные.
Задача 2.
Задание №3.
Файл "person.h":
Файл "person.cpp":
Файл "main.cpp":
Вы молодец, что догадались сделать тип личности переменной родительского класса, я же прочитала задание буквально и такую переменную не сделала. С ней вывод "о себе" проще, т.к. достаточно только в родительском классе этот метод прописать.
Есть одно мааааленькое несоответствие заданию: реалист должен здороваться "Здравствуй, …" не только с людьми старше него больше, чем на 5 лет, но и с людьми, которые младше его больше, чем на 5 лет.
Вспомнилось: "На третьем ходу выяснилось, что гроссмейстер играет восемнадцать испанских партий…" ("12 стульев").
Посчитал, что "не более чем на 5 лет" относится только к слову "больше".
Спасибо за ваши комментарии.
Задача 1.
Задание №2.
Задание №1:
Задание №1
Задание 2:
Илья, вы кругом тут неправы:
1) не сообщаете пользователю, что от него требуется ввести
2) не проверяете ввод пользователя
3) день года % 7 никогда не даст 7, то есть воскресенье никогда не угадается.
Задание 1: