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

  Юрий  | 

  Обновл. 29 Авг 2020  | 

 6038

 ǀ   37 

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

Easy: Задание №1

Напишите программу, которая вычисляет дату следующего дня.

Пример выполнения программы:

Введите цифрами дату (число месяц год): 31 12 2018
Последний день месяца! Завтра 01.01.2019

Medium: Задание №2


Напишите программу, которая конвертирует введенное пользователем десятичное число в шестнадцатеричную систему счисления.

Hard: Задание №3

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


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

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

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

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

    Моё решение задания №3, добавила как опцию высокий уровень сложности, когда компьютер просчитывает свой ход:

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

    Моё решение задания №2 (два способа):

  3. Аватар Анастасия:

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

  4. Аватар Shom:

    Задание №3.

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

      Это хорошо, что у Вас хотя бы последний ход компьютер делает более менее "обдуманно". Плохо, что игрок всегда ходит первым, и неговорящие имена параметров функции validationInput(const int a, const int z), которые на самом деле минимальное и максимальное количество спичек за ход. За то "спички" поставили в правильную форму))

  5. Аватар Shom:

    Задание №2.

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

      Я как-то и не задумывалась, чтобы сделать программу для преобразования дробных чисел. А это точно именно так работает? Кажется, нет, ведь в оригинале шестнадцатеричной записи точка не встречается…
      Но Ваша функция преобразования остатка в символ мне понравилась. Действительно элегантная.

      1. Аватар Shom:

        https://math.semestr.ru/inf/16.php
        Да, красивая функция и очень простая)

  6. Аватар Shom:

    Задание №1.

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

      Честно говоря, ожидала от Вас более красивого решения. Весь этот караван условий и проверок в main смотрится не очень профессионально, а ведь Вы способны на очень гармоничные и хорошо структурированные коды…
      И проверка на вИсокосный год явно не полная, раньше была задача как раз на него, оттуда бы и взяли.

      1. Аватар Shom:

        "Караван условий"))) Действительно, очень подходящее определение).
        Почитал про високосный год — оказывается не всё там так просто, как я считал.

  7. Аватар Владимир:

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

      Владимир,

      1) как месяц может быть одновременно меньше 1 и больше 12?

      Причём здесь именно такой год тоже не ясно.

      2) Проверку на декабрь лучше было запихнуть в тот if, который для месяцев с 31 днём. Ведь там происходит всё то же самое, только меняется год и месяц меняется по-другому, было бы короче.

      3) слишком много if и else наводят на мысль, что здесь лучше использовать switch, к тому же тогда программа, проверив одно условие, не будет проверять все остальные, как это происходит у Вас.

      4) но идея с нулями:

      очень удачная. Правда, здесь это Алёна первая воплотила.

  8. Аватар Kris:

    Мне кажется, было бы интересно еще добавить 4 задание, как развитие 3-го. Тип, научить компьютер не просто глупо ходить по рандому, а ходить "умно". Если компьютер ходит 2-м, то он всегда выигрывает при правильной игре, если будет ходить так: 11 — x, где x — ход пользователя. Если же будет ходить первым, и пользователь не будет ходить "умно", то можно придумать алгоритм попытки выйти на выигрышную стратегию, но тут уже риск, что пользователь догонит до выигрышной стратегии. Чтобы этого не было, можно развить игру и играть не со 100 спичками, а с рандомным количеством и рандомным количеством возможностей брать спички. В таком случае, пользователю будет тяжело додуматься до выигрышной стратегии, и комп. будет побеждать 😉

  9. Аватар Алена:

    Задача 2.

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

      У меня получилось похожее на Ваше решение. Я только не поняла значение 1/16 в самом конце.

  10. Аватар Алена:

    Задача 1.

    1. Аватар Владимир:

      Алена, если вместо числа пользователь введет число с буквой, например 5е, то программа будет работать неправильно

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

      Мне не понравилось несоответствие названия и комментария к функции:

      Также присутствует большая размазанность проверок у этой функции внутри. Можно было короче это описать. А ещё проверять на неадекватное число и месяц можно было при вводе даты.

  11. Аватар Денис:

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

      Я код не запускала, но по тому, что вижу:
      1) Игрок всегда ходит первым… Это не совсем честно.
      2) Если игрок сходил и спичек после его хода не осталось, то выполняется break без присуждения победы, а это уже дискриминация компьютера!
      3) Минимальное и максимальное количество спичек за ход встречается в виде литералов в отдельно взятых функциях хода игрока и хода компьютера (здесь в виде параметров). Если правила игры изменятся, придётся менять числа во всех этих местах, то есть эти числа тоже лучше сделать константами в одном месте.

  12. Аватар Денис:

    Задание #3:

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

      по-моему эту дубль решения 3-го задания от Дениса. Модератору: одно из решений стоит удалить.

  13. Аватар Владимир:

    Задание №3

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

      Владимир,
      про недостатки использование #define для глобальных констант я Вам уже писала, но допустим:

      Зачем тогда в функции проверки matches < 1 * MATCH || matches > 10 * MATCH? Почему здесь умножаете на 1 и 10 (литералы!), а не используете Ваш MAX_MATCH? а вот здесь:

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

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

  14. Аватар Владимир:

    Задание №2

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

      Сразу скажу, Ваш код не запускала, но казалось бы привычная функция проверки ввода числа очень смущает:

      Я правильно поняла, что она возвращает только ложь, причём в том случае, если с cin всё в порядке?..
      Эта функция:

      тоже хромает, например, берётся число 32, к нему прибавляем 55 и получаем, как Вы ожидаете символ? Нет, это так не работает. Если Вы хотите получить символ, нужно сделать явное преобразование к типу char. А во вторых, что там будет скрываться в нашем примере за символом 87 (W) никто точно не скажет , но точно не один из символов кодирования 16-ричной записи. Поэтому я считаю, что схалтурили Вы тут, Владимир.
      И последнее:

      по факту это массив для записи символов числа в шестнадцатеричной записи, разве нет?
      В общем, мутное решение какое-то получилось.

  15. Аватар Илья:

    Задание 3:

    1. Аватар Владимир:

      Илья, это у Вас игра в слепую? Между ходами желательно выводить промежуточный результат

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

      На левые вводы пользователя не проверяете. На оставшиеся спички тоже не проверяете. Одно можно отметить: ловкое использование одной булевой переменной для передачи хода. Я тоже подобную использовала.

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

      Андрей,
      Вы не проверяете ввод пользователя даже на минимальное и максимальное количество спичек за ход, что даёт ему большое поле для жульничества. Хотя правила игры пользователь от Вас и не узнает.
      Компьютер у Вас всегда ходит первым, почему?
      И пользователю не показываете ни ход компьютера, ни оставшееся количество спичек, он их сам должен вычислять?

  16. Евгений Павлов Евгений Павлов:

    Думаю стоило бы поменять местами первое и второе.
    Второе ну очень простое, поэтому я написал его на чистом Си.
    Все равно просто:

    1. Юрий Юрий:

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

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

      То чувство, когда из четырёх строчек "на чистом Си" после полного курса С++ ты понимаешь только две, причём одна из них объявляет переменную, а вторая
      return 0;

      1. Аватар Shom:

        Слышал, что в Google всё-ещё printf() используют вместо std::cout, так как он более производительный.
        В книге "Моя первая программа на С/C++" Нейбауер А. все основные операторы языка Си хорошо разобраны. Книжка лёгкая, читается быстро.

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

          После того, как напишешь уже с сотню так программ, читать книжку с названием "Моя первая программа на С/С++" как-то эм… не правильно, короче ))

Добавить комментарий

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