Здесь размещены задания по С++, которые вы можете выполнить. Каждое задание имеет свой уровень сложности. Готовых ответов не будет, поэтому welcome в комментарии!
Easy: Задание №1
Напишите программу вычисления стоимости поездки на автомобиле на дачу (туда и обратно). Исходными данными являются:
расстояние до дачи (в км);
литраж бензина, который потребляет автомобиль на 100 км пробега;
цена одного литра бензина.
Пример результата выполнения программы:
Расстояние до дачи (км): 67
Расход бензина (литров на 100 км пробега): 8.5
Цена литра бензина (у.е.): 50
Поездка на дачу и обратно обойдется в 569.5 у.е.
Medium: Задание №2
Напишите программу вычисления стоимости покупки с учетом скидки. Скидка в 3% предоставляется, если сумма покупки больше 500 долларов, в 5% — если сумма покупки больше 1000 долларов.
Пример результата выполнения программы:
Введите сумму покупки: 640
Вам предоставляется скидка в 3%
Сумма с учетом скидки: 620.80 долларов.
Hard: Задание №3
Напишите программу, реализующую игру «Угадай число». Компьютер загадывает число от 0
до 999
(используйте генерацию случайных чисел), а пользователь угадывает его. На каждом шаге угадывающий делает предположение, а задумавший число — сообщает, сколько цифр из числа угаданы и сколько из угаданных цифр занимают правильные позиции в числе. Например, если задумано число 725
и выдвинуто предположение, что задумано число 523
, то угаданы две цифры (5
и 2
), и одна из них занимает верную позицию. Например:
Компьютер загадал трехзначное число. Вы должны его отгадать. После очередного числа вам будет сообщено, сколько цифр угадано и сколько из них находится на своих местах.
Ваш вариант: 123
Угадано: 0. На своих местах: 0
Ваш вариант: 456
Угадано: 1. На своих местах: 1
Ваш вариант: 654
Угадано: 2. На своих местах: 2
Ваш вариант: 657
Угадано: 2. На своих местах: 2
Ваш вариант: 658
Угадано: 3. На своих местах: 3
***Вы угадали число 658!***
3 задание.
Смотрю на варианты кто как решал третье задание, как то все всё усложняют. Есть вот такие мои варианты, как мне кажется они куда проще. Да без проверок на корректность ввода, но для простоты это отпустим. Здесь же нет той писанины огромных циклов и условий, которые только усложнят читабельность кода. Да конечно для практики новичкам неплохо делать через циклы и массивы, особенно третье задание, но тут нужна простота как мне кажется. И да желательно в main писать только вызовы функций, даже простое взаимодействие с пользователем, но задания простые поэтому не стоит заморачиваться. Так что вот:
Задание №1:
Задание №2:
Задание №3:
вот способ легче для 1 задачи
1 задание:
2 задание:
Вышло красиво, но в 11 строке есть ошибка. Надо было написать так:
И ещё — надо было учесть, что покупка может быть меньше 500 долларов, хотя я уже, возможно, придираюсь:)
В задании, где нужно вычислить сумму покупки со скидкой, согласен с Assassin. Кроме того, можно не создавать отдельную переменную, а в консоли просчитать скидку:
3 задача
Задание №3
Задание №2.
2:
Задание №3
Пока отлаживал логику — "Награвся як ота дитина!"
Несколько исправлений:
1. При компиляции под Linux, в 16 строке, где (RAND_MAX + 1) нужно исправить на (RAND_MAX + 1.0), иначе алгоритм генерирует отрицательное число и нарушается логика.
2. Для очистки консоли в Linux, в 50 строке вместо system("cls")использовал последовательно 2 строки system("clear"), почему-то одной строкой очистка получалась неполноценной.
3. Циклы в строках 32 – 40 можно переписать так:
4. Строку 2 можно удалить
Нашел еще одну неполноценность.
При вводе игроком «ноля», не выдается сообщение о количестве угаданных цифр и количестве цифр на своих местах.
Причина – не совсем удачный выбор критерия проверки вывода указанного сообщения в строке 62, при старте игры или перезапуске после нажатия «Y».
Фиксим «баг»:
Изменяем строку 47:
В строке 62 вместо if (human_num) прописываем
в конце строки 63 после std::endl; (или на следующей строке) прописываем
В принципе exit_char можно присвоить любое значение отличное от 'Y' или 'y'
Задание N3.
За гранью понимания осталось как расценивать повторяющиеся цифры. К примеру загадано 311, пользователь вводит 333. Угадано 3 цифры или 1? Построил алгоритм по уникальности каждой цифры. 333 ответит что угадана одна цифра. 119 — угадано две цифры (1) одна на месте.
Английский — от фонаря.
Задание номер 3.
Решил завести структурку для максимального удобства, но программа получилась не маленькой, как вы это оцените?
задача 3
У вас не работает генерация случайных чисел — вернее всегда будет одно и то же число 🙂 srand(time(NULL)); и подключить заголовочный файл ctime
Погуглите, как генерируются случайные числа.
Ну и дальше — если вместо "случайного" числа 478, присвоить int secret = 222, то при введении варианта 223 мы получим 6 совпадений и — 2 корректные позиции что как бы не совсем по условию задачи.
задание №3
Задача 1 (простенькое решение)
Задача 1
Задание №3:
Задание №2:
Задание №1:
Третья задача.
3-е Задание
Задание 3
1 задание:
2 задание:
3 задание: ух и поело мне мозг оно
// 3е задание
Хорошее решение, можно ещё через две unordered_map, в которых ключ — цифра, а значение — количество таковых в загаданном и предполагаемом числах, необходимость использования std::unique и std::string::resize отпадёт, можно будет сразу итерироваться по мапе с предполагаемым числом и смотреть, сколько first-цифр этой мапы есть в second-счётчике мапы с загаданным числом. Но тут идёт нагрузка на память, а в Вашем — на скорость, и потому оба решения по-своему хороши.
Програма не совсем работает
Пусть ПК получил 221, если я отвечу 225, то будет:
Угадано: 1. Соответствует своим разрядам: 2
Что не соответствует действительности
Задание №1
Задание №2
№3:
Задание №3:
На мой взгляд — лучшее решение. По компактности и оптимальности.
Задание №2
Задание 3
Задание №3.
Третье задание. Вроде неплохо получилось!
Сделал игру "угадай число" через класс, так что в main есть минимум кода.
Ваша программа работает не правильно!
ИГРА УГАДАЙ ЧИСЛО
У вас 7 попыток угадать число
введите 3-x значное целое число: 553
На своих местах : 1 , угадано : 5
Не может такого быть, "угадано" не может быть больше 3.
На двух компиляторах проверил программу. Работает как задумано.
Задача 2.
Задача 1.
101
Компьютер загадал трёхзначное число. Вы должны его отгадать. После очередного числа вам будет сообщено, сколько цифр угадано и сколько из них находятся на своих местах.
введите число: 1
ваш варииант 1
на своих местах 2; угадано 3
введите число: 0
ваш варииант 0
на своих местах 1; угадано 3
введите число: 3
ваш варииант 3
на своих местах 1; угадано 2
введите число: 2
ваш варииант 2
на своих местах 1; угадано 2
введите число: 0
ваш варииант 0
на своих местах 1; угадано 3
введите число: 10
ваш варииант 10
на своих местах 0; угадано 3
введите число: 11
ваш варииант 11
на своих местах 1; угадано 3
введите число: 101
ваш варииант 101
на своих местах 3; угадано 3
Задание #1:
Задание №2
Задание №1
Пример работы программы к третьему заданию — это пример работы плохой программы.
Ваш вариант: 456
Угадано: 1. На своих местах: 0
Ваш вариант: 654
Угадано: 2. На своих местах: 2
Цифры те же, но в первом случае (456) угадана 1, а во втором (654) — 2. Плохой пример.
К кому предназначен комментарий?
автору третьего задания, это из задания пример.
Моё решение задания №3:
Ваш вариант: 111
Угадано: 3. На своих местах: 2.
Ваш вариант: 110
Угадано: 3. На своих местах: 1.
Ваш вариант: 101
***Вы угадали число 101! ***
На числа 110 и 111, программа выдает результат: "Угадано: 3".
Вы абсолютно правы, Вам попался хороший пример, который я не учла. В функции compareWithNumber вместо
нужно сделать немного по=другому, чтобы учесть тот случай, когда цифра на своём месте уже была засчитана по совпадению с цифрой на другом месте:
Так всё правильно.
Все три цифры угадал.
Моё решение задания №2 (решила сделать чуть сложнее):
1. Discounts.h:
2. Discount_Price.cpp:
Моё решение задания №1:
// Задание №3
Владимир, настал и Ваш звёздный час. Если про pow (кстати, комментарий к #include<cmath> пишет о row) и раскладывание с его помощью на цифры Вы придумали сами — большой респект! Ваш код мне понравился, хоть и традиционно не запустился на моём стареньком компиляторе. Но goto… это плохой знак, ещё лет 15 назад меня учили, что использовать его — дурной стиль. Я думаю, Вы вполне способны справляться и без него.
Задание №3.
Не совсем уверен что правильно понял как программа должна реагировать на числа с повторяющимися цифрами.
Из минусов программы вижу только один: если загаданное число будет с повторяющейся цифрой, то программа будет работать некорректно, а именно выводить неправильное число угаданных чисел. Проверь это, если не веришь. Сам долго маялся с этой проблемой, но все же решил.
Ниже пример работы программы с загаданным числом 121. Программа себя ведёт как и было запланировано. А Вы считаете какие ответы она должна выводить?
Ваш вариант: 1
Угадано: 2. На своих местах: 1.
Ваш вариант: 101
Угадано: 2. На своих местах: 2.
Ваш вариант: 10
Угадано: 2. На своих местах: 0.
Ваш вариант: 212
Угадано: 3. На своих местах: 0.
Ваш вариант: 12
Угадано: 3. На своих местах: 0.
Ваш вариант: 21
Угадано: 3. На своих местах: 2.
Ваш вариант: 233
Угадано: 1. На своих местах: 0.
Ваш вариант: 121
Угадано: 3. На своих местах: 3.
***Вы угадали число 121!***
1) В глаза бросается обилие магических чисел — 32767, 1000, 3, 100, 10, -1, -2. Используйте поясняющие смысл этих чисел константы.
2) Как работает тип size_t из <cstdlib>?
3) Раскладывая число на цифры, прописывая каждую цифру в ячейку массива, указывая её номер от 0 до 2 в main (!), это конечно, дичь. И потом практически то же вы делаете с числом от пользователя… Здесь тот самый случай, когда нужно всё это дело выносить в отдельную функцию, как минимум. Насчёт различать отсутствие разрядов разными отрицательными цифрами — идея неплоха, но можно ещё лучше, например, чтобы это каждый раз разное число генерировал или рассчитывал компьютер. Подумайте над этим или посмотрите, как это у меня ; )
4) Само сравнение по цифрам и местам тоже можно было бы в отдельной функции разместить. Здесь это прям просится.
5) Логика подсчёта совпадений — довольно топорная. И, конечно, если загаданное число, скажем 321, а пользователь вводит 111, то если программа покажет 3 совпадения — это будет неправильно. Недоработка
6) "До новых встречь" — убило)) (здесь не должно быть мягкого знака)
1) Категорически не согласен. Считаю, что запись этих чисел в константы является действием избыточного характера, которое, к тому-же, усложнит читаемость кода.
2) size_t — беззнаковое целое число, в <cstdlib> не входит, насколько мне известно.
«std::size_t обычно используется для индексации массивов и счетчиков циклов. Программы, которые используют другие типы, например unsigned int, для индексации массивов, могут неправильно работать на, например, 64-битных системах, когда индекс превзойдет UINT_MAX или если он полагается на возможность переполнения 32-битного числа.»
4) Возможно. Дело вкуса.
5) Работа программы с загаданным числом 321:
Ваш вариант: 111
Угадано: 1. На своих местах: 1.
Ваш вариант: 333
Угадано: 1. На своих местах: 1.
Ваш вариант: 222
Угадано: 1. На своих местах: 1.
Ваш вариант: 321
Угадано: 3. На своих местах: 3.
***Вы угадали число 321!***
6) : ь
Задание №3. Корректировка №1.
Поясните, пожалуйста,
что делают и зачем нужны в этом коде?
500, 1000, 3, 5 хотелось бы видеть в виде каких-либо констант
Эти две строчки кода округляют расчитанную сумму до сотых.
Верно, с константами выглядело бы лучше.
Задание №1
последняя формула ужасно написана:
делим расстояние в км на 100? Зачем? Какой приоритет у умножения относительно деления, Вы помните? Я не помню. Как будет выполняться здесь расчёт: сначала поделится на 100, потом результат перемножается на всё остальное или расстояние делится на произведение всего, что идёт потом? делим на 100, потом умножаем на 100 и ещё раз делим на 100. Я не запускала код, но засомневалась, что он считает верно, формула реально очень запутывающая.
У деления и умножения приоритет равный, то есть действия в скобках будут выполнятся последовательно слева на право.
Сначала расстояние до дачи разделится на 100 (чтобы высчитать сколько сотен километров мы проехали, так как у нас расход бензина вводится на сотню км), затем полученное значение умножается на расход бензина автомобилем на сто км пробега, затем на цену бензина за литр. И всё это умножается на 2, так как считаем стоимость поездки туда и обратно. Далее полученное значение умножается на 100 — это нужно для округления высчитываемого числа до сотых. Потом число округляется функцией round() до целого и делиться на 100 чтобы получить наше конечное округлённое значение.
И Вы правы: обе сотни в скобках можно сократить — я их там для наглядности оставил. )
удалите этот код, я его случайно отправил
Есть, пишите, сделаю.
3-е задание
Не совсем корректно работает. Если num=455 и ввести 444 он выдаст что три правильно, хотя по факту одно.
1) В задании написано: "Компьютер загадывает число от 0 до 999", Вы решили упростить задачу, сделав минимум 100?
2) гениальное название переменной для числа от пользователя kkk, что Вы хотели этим сказать?
3) if ((kkk<99)||(kkk>1000)) — должно быть if ((kkk<=99)||(kkk>=1000)), иначе Вы разрешаете вводить 99 и 1000, а к чему это приведёт?
вот здесь уже будет не то, что Вы ожидали
4)
а где здесь мы даём возможность ввести число ещё раз? Нигде. Только пишем, чтобы пробовал.
5)
чтобы условие было true, здесь достаточно чтобы хоть одно из условий было true, что уже противоречит смыслы заключения. Но т.к. выше Вы уже и так проверили, что ни одного совпадения нет, то этот if просто лишний.
6) Извините, но читать дальше такие выражения просто нет желания:
Общий вывод таков: Вы описали чересчур прямолинейную логику работы программы, стараясь учесть всё, но не учли. Если такой бедлам возник при работе с 3 цифрами, что будет с 6ю, 10ю?.. Нужно использовать циклы, обобщая условия, упрощать жизнь себе и другим, ведь читать и проверять их гораздо проще чем такие нагромождения условий.
Задание №3:
1) Названия для переменных у Вас понятные. Это плюс. Но не слишком ли их много?
вот здесь я бы уже задумалась, не сделать ли это массивом (одним двумерным, двумя массивами или одним массивом — как больше нравится?)
Соответственно весь ряд условий и перепроверок ниже порождается тем, что каждая из переменных у Вас прописывается вручную, а не как элемент массива. Если бы это был массив/массивы было бы гораздо проще запихнуть это всё в один цикл или два цикла, проверяя всё необходимое.
2) Так как числа могут быть от 0, для однозначных и двузначных чисел мы получим нули в записи сотен и десятков, хотя по факту число может выглядеть как 7. Если пользователь при этом введёт 101, мы получим совпадение одной или сразу двух цифер (как так у Вас дальше, я не читала), что не верно. Или наоборот, число 100, пользователь вводит 5 и опять совпало сразу две цифры. Это плохо.
Второе задание
— но Вы не даёте такой возможности!
Все используемые в коде числа хотелось бы видеть в качестве констант с понятными названиями
Первое задание
названия переменных должны быть понятными для всех читающих этот код. И хотя в данном случае программа очень маленькая и и так всё понятно, приобрести такую привычку не мешало бы.
Не указаны единицы измерения. Пользователь может ввести расстояние в милях, а у Вас — километры, и т.д.
Задание №2:
Задание №1:
для расстояния и расхода бензина из запроса пользователю не ясны ожидаемые единицы измерения. Он же может и в попугаях измерять.
после вот такого:
хочется сделать рука-лицо и закрыть этот код.
а после этого:
ты просто рефлекторно закрываешь этот код, чтобы не засорять мозг , пытаясь отгадать, что человек хотел этим сказать?