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

  Юрий  | 

  Обновл. 7 Июн 2023  | 

 64954

 ǀ   90 

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


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

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

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

  1. Sergei:

    3 задание.

  2. Voyager_lqg7:

    Смотрю на варианты кто как решал третье задание, как то все всё усложняют. Есть вот такие мои варианты, как мне кажется они куда проще. Да без проверок на корректность ввода, но для простоты это отпустим. Здесь же нет той писанины огромных циклов и условий, которые только усложнят читабельность кода. Да конечно для практики новичкам неплохо делать через циклы и массивы, особенно третье задание, но тут нужна простота как мне кажется. И да желательно в main писать только вызовы функций, даже простое взаимодействие с пользователем, но задания простые поэтому не стоит заморачиваться. Так что вот:

    Задание №1:

    Задание №2:

    Задание №3:

    1. Nargiz Kozhakhmetova:

      вот способ легче для 1 задачи

  3. Asylan Usen:

  4. Елизавета:

    1 задание:

    2 задание:

    1. Assassin:

      Вышло красиво, но в 11 строке есть ошибка. Надо было написать так:

      И ещё — надо было учесть, что покупка может быть меньше 500 долларов, хотя я уже, возможно, придираюсь:)

    2. Виталий:

      В задании, где нужно вычислить сумму покупки со скидкой, согласен с Assassin. Кроме того, можно не создавать отдельную переменную, а в консоли просчитать скидку:

  5. Юрій:

    3 задача

  6. Fedor:

    Задание №3

  7. Филипп:

    Задание №2.

  8. Arsen:

    2:

  9. Александр:

    Задание №3

    Пока отлаживал логику — "Награвся як ота дитина!"

    1. Александр:

      Несколько исправлений:

      1. При компиляции под Linux, в 16 строке, где (RAND_MAX + 1) нужно исправить на (RAND_MAX + 1.0), иначе алгоритм генерирует отрицательное число и нарушается логика.

      2. Для очистки консоли в Linux, в 50 строке вместо system("cls")использовал последовательно 2 строки system("clear"), почему-то одной строкой очистка получалась неполноценной.

      3. Циклы в строках 32 – 40 можно переписать так:

      4. Строку 2 можно удалить

      1. Александр:

        Нашел еще одну неполноценность.

        При вводе игроком «ноля», не выдается сообщение о количестве угаданных цифр и количестве цифр на своих местах.
        Причина – не совсем удачный выбор критерия проверки вывода указанного сообщения в строке 62, при старте игры или перезапуске после нажатия «Y».

        Фиксим «баг»:
        Изменяем строку 47:

        В строке 62 вместо if (human_num) прописываем

        в конце строки 63 после std::endl; (или на следующей строке) прописываем

        В принципе exit_char можно присвоить любое значение отличное от 'Y' или 'y'

  10. SirAyane:

    Задание N3.

    За гранью понимания осталось как расценивать повторяющиеся цифры. К примеру загадано 311, пользователь вводит 333. Угадано 3 цифры или 1? Построил алгоритм по уникальности каждой цифры. 333 ответит что угадана одна цифра. 119 — угадано две цифры (1) одна на месте.
    Английский — от фонаря.

  11. Tychka17:

    Задание номер 3.
    Решил завести структурку для максимального удобства, но программа получилась не маленькой, как вы это оцените?

  12. Vlanc:

    задача 3

    1. Alexjazz:

      У вас не работает генерация случайных чисел — вернее всегда будет одно и то же число 🙂 srand(time(NULL)); и подключить заголовочный файл ctime
      Погуглите, как генерируются случайные числа.
      Ну и дальше — если вместо "случайного" числа 478, присвоить int secret = 222, то при введении варианта 223 мы получим 6 совпадений и — 2 корректные позиции что как бы не совсем по условию задачи.

  13. Alexjazz:

    задание №3

  14. Нина:

    Задача 1 (простенькое решение)

  15. Дмитрий:

    Задача 1

  16. WAR:

    Задание №3:

  17. WAR:

    Задание №2:

  18. WAR:

    Задание №1:

  19. Николай:

    Третья задача.

  20. Дмитрий:

    3-е Задание

  21. Алексей:

    Задание 3

  22. Rock:

    1 задание:

    2 задание:

    3 задание: ух и поело мне мозг оно

  23. Radik:

    // 3е задание

    1. Павел:

      Хорошее решение, можно ещё через две unordered_map, в которых ключ — цифра, а значение — количество таковых в загаданном и предполагаемом числах, необходимость использования std::unique и std::string::resize отпадёт, можно будет сразу итерироваться по мапе с предполагаемым числом и смотреть, сколько first-цифр этой мапы есть в second-счётчике мапы с загаданным числом. Но тут идёт нагрузка на память, а в Вашем — на скорость, и потому оба решения по-своему хороши.

      1. Saymonkaje:

        Програма не совсем работает
        Пусть ПК получил 221, если я отвечу 225, то будет:
        Угадано: 1. Соответствует своим разрядам: 2
        Что не соответствует действительности

  24. Slavik:

    Задание №1

    Задание №2

  25. Artem:

    №3:

  26. Юра:

    Задание №3:

    1. Дмитрий:

      На мой взгляд — лучшее решение. По компактности и оптимальности.

  27. Екатерина:

    Задание №2

  28. Игорь:

    Задание 3

  29. Максим:

    Задание №3.

  30. Марат:

    Третье задание. Вроде неплохо получилось!

  31. Виктор:

    Сделал игру "угадай число" через класс, так что в main есть минимум кода.

    1. Марат:

      Ваша программа работает не правильно!
      ИГРА УГАДАЙ ЧИСЛО

      У вас 7 попыток угадать число
      введите 3-x значное целое число: 553
      На своих местах : 1 , угадано : 5

      1. Виктор:

        Не может такого быть, "угадано" не может быть больше 3.

        1. Виктор:

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

  32. Артур:

  33. Алена:

    Задача 2.

  34. Алена:

    Задача 1.

  35. макс:

    1. Shom:

      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

  36. Денис:

    Задание #1:

  37. Владимир:

    Задание №2

  38. Владимир:

    Задание №1

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

    Пример работы программы к третьему заданию — это пример работы плохой программы.
    Ваш вариант: 456
    Угадано: 1. На своих местах: 0
    Ваш вариант: 654
    Угадано: 2. На своих местах: 2
    Цифры те же, но в первом случае (456) угадана 1, а во втором (654) — 2. Плохой пример.

    1. Владимир:

      К кому предназначен комментарий?

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

        автору третьего задания, это из задания пример.

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

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

    1. Владимир:

      Ваш вариант: 111
      Угадано: 3. На своих местах: 2.
      Ваш вариант: 110
      Угадано: 3. На своих местах: 1.
      Ваш вариант: 101
      ***Вы угадали число 101! ***
      На числа 110 и 111, программа выдает результат: "Угадано: 3".

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

        Вы абсолютно правы, Вам попался хороший пример, который я не учла. В функции compareWithNumber вместо

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

        1. Юшка:

          Так всё правильно.
          Все три цифры угадал.

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

    Моё решение задания №2 (решила сделать чуть сложнее):

    1. Discounts.h:

    2. Discount_Price.cpp:

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

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

  43. Владимир:

    // Задание №3

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

      Владимир, настал и Ваш звёздный час. Если про pow (кстати, комментарий к #include<cmath> пишет о row) и раскладывание с его помощью на цифры Вы придумали сами — большой респект! Ваш код мне понравился, хоть и традиционно не запустился на моём стареньком компиляторе. Но goto… это плохой знак, ещё лет 15 назад меня учили, что использовать его — дурной стиль. Я думаю, Вы вполне способны справляться и без него.

  44. Shom:

    Задание №3.

    Не совсем уверен что правильно понял как программа должна реагировать на числа с повторяющимися цифрами.

    1. Сергей:

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

      1. Shom:

        Ниже пример работы программы с загаданным числом 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!***

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

      1) В глаза бросается обилие магических чисел — 32767, 1000, 3, 100, 10, -1, -2. Используйте поясняющие смысл этих чисел константы.
      2) Как работает тип size_t из <cstdlib>?
      3) Раскладывая число на цифры, прописывая каждую цифру в ячейку массива, указывая её номер от 0 до 2 в main (!), это конечно, дичь. И потом практически то же вы делаете с числом от пользователя… Здесь тот самый случай, когда нужно всё это дело выносить в отдельную функцию, как минимум. Насчёт различать отсутствие разрядов разными отрицательными цифрами — идея неплоха, но можно ещё лучше, например, чтобы это каждый раз разное число генерировал или рассчитывал компьютер. Подумайте над этим или посмотрите, как это у меня ; )
      4) Само сравнение по цифрам и местам тоже можно было бы в отдельной функции разместить. Здесь это прям просится.
      5) Логика подсчёта совпадений — довольно топорная. И, конечно, если загаданное число, скажем 321, а пользователь вводит 111, то если программа покажет 3 совпадения — это будет неправильно. Недоработка
      6) "До новых встречь" — убило)) (здесь не должно быть мягкого знака)

      1. Shom:

        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.

  45. Shom:

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

      Поясните, пожалуйста,

      что делают и зачем нужны в этом коде?
      500, 1000, 3, 5 хотелось бы видеть в виде каких-либо констант

      1. Shom:

        Эти две строчки кода округляют расчитанную сумму до сотых.
        Верно, с константами выглядело бы лучше.

  46. Shom:

    Задание №1

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

      последняя формула ужасно написана:

      делим расстояние в км на 100? Зачем? Какой приоритет у умножения относительно деления, Вы помните? Я не помню. Как будет выполняться здесь расчёт: сначала поделится на 100, потом результат перемножается на всё остальное или расстояние делится на произведение всего, что идёт потом? делим на 100, потом умножаем на 100 и ещё раз делим на 100. Я не запускала код, но засомневалась, что он считает верно, формула реально очень запутывающая.

      1. Shom:

        У деления и умножения приоритет равный, то есть действия в скобках будут выполнятся последовательно слева на право.
        Сначала расстояние до дачи разделится на 100 (чтобы высчитать сколько сотен километров мы проехали, так как у нас расход бензина вводится на сотню км), затем полученное значение умножается на расход бензина автомобилем на сто км пробега, затем на цену бензина за литр. И всё это умножается на 2, так как считаем стоимость поездки туда и обратно. Далее полученное значение умножается на 100 — это нужно для округления высчитываемого числа до сотых. Потом число округляется функцией round() до целого и делиться на 100 чтобы получить наше конечное округлённое значение.
        И Вы правы: обе сотни в скобках можно сократить — я их там для наглядности оставил. )

  47. Михаил:

    удалите этот код, я его случайно отправил

  48. Фото аватара Юрий:

    Есть, пишите, сделаю.

  49. Михаил:

    3-е задание

    1. Димас:

      Не совсем корректно работает. Если num=455 и ввести 444 он выдаст что три правильно, хотя по факту одно.

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

      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ю?.. Нужно использовать циклы, обобщая условия, упрощать жизнь себе и другим, ведь читать и проверять их гораздо проще чем такие нагромождения условий.

  50. Илья:

    Задание №3:

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

      1) Названия для переменных у Вас понятные. Это плюс. Но не слишком ли их много?

      вот здесь я бы уже задумалась, не сделать ли это массивом (одним двумерным, двумя массивами или одним массивом — как больше нравится?)
      Соответственно весь ряд условий и перепроверок ниже порождается тем, что каждая из переменных у Вас прописывается вручную, а не как элемент массива. Если бы это был массив/массивы было бы гораздо проще запихнуть это всё в один цикл или два цикла, проверяя всё необходимое.

      2) Так как числа могут быть от 0, для однозначных и двузначных чисел мы получим нули в записи сотен и десятков, хотя по факту число может выглядеть как 7. Если пользователь при этом введёт 101, мы получим совпадение одной или сразу двух цифер (как так у Вас дальше, я не читала), что не верно. Или наоборот, число 100, пользователь вводит 5 и опять совпало сразу две цифры. Это плохо.

  51. Михаил:

    Второе задание

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

      — но Вы не даёте такой возможности!
      Все используемые в коде числа хотелось бы видеть в качестве констант с понятными названиями

  52. Михаил:

    Первое задание

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

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

  53. Илья:

    Задание №2:

  54. Илья:

    Задание №1:

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

      для расстояния и расхода бензина из запроса пользователю не ясны ожидаемые единицы измерения. Он же может и в попугаях измерять.

  55. Ilya:

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

      после вот такого:

      хочется сделать рука-лицо и закрыть этот код.

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

        а после этого:

        ты просто рефлекторно закрываешь этот код, чтобы не засорять мозг , пытаясь отгадать, что человек хотел этим сказать?

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

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