Глава №5. Итоговый тест

  Юрий  | 

  Обновл. 2 мая 2019  | 

 13796

 ǀ   42 

Поздравляю! Мы продвинулись ещё на одну главу вперёд. Чтобы закрепить пройденный материал, быстренько повторим теорию и выполним 2 практических задания.

Теория

Операторы if позволяют выполнить код, основываясь на результате условия (истинно оно или нет). Если условие ложное, то выполняется оператор else. Можно объединять несколько операторов if и else вместе.

Оператор switch обеспечивает более удобный и быстрый способ использования условий/ветвлений в коде. Он отлично сочетается с перечислениями.

Оператор goto позволяет переносить точку выполнения в программе из одного места в другое. Использовать этот оператор не рекомендуется.

Цикл while выполняет определённый код до тех пор, пока условие истинно. Сначала обрабатывается условие, а затем выполняется код.

Цикл do while — это тот же цикл while, только сначала выполняется код, а затем уже проверяется условие. Он отлично подходит для вывода меню или других элементов, так как позволяет выполнить код хотя бы один раз.

Циклы for наиболее используемые циклы. Они идеальны, когда нужно выполнить код определённое количество раз.

Оператор break позволяет немедленно завершить выполнение операторов switch, циклов while, do while или for.

Оператор continue позволяет немедленно перейти к следующей итерации цикла. Будьте осторожны при использовании этого оператора в связке с циклами while или do while — не забывайте о возникновения проблемы с инкрементом счётчика цикла.

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

Тест


Задание №1

В итоговом тесте главы №2 мы написали программу имитации мячика, падающего с башни. Так как тогда мы ещё ничего не знали о циклах и не умели их использовать, то время полета мячика составляло всего лишь 5 секунд.

Используя программу ниже измените её так, чтобы мячик падал столько секунд, сколько необходимо, пока не достигнет земли.

constants.h:

Основной файл:

Ответ №1

constants.h:

Основной файл:

Задание №2

Напишите программу-игру типа Hi-Lo. Во-первых, ваша программа должна выбрать случайное целое число в диапазоне от 1 до 100. Пользователю даётся 7 попыток, чтобы угадать это число. Если пользователь не угадывает число, то программа должна подсказывать, была ли его догадка слишком большой или слишком маленькой. Если пользователь угадывает число, то программа должна сообщить, что всё верно, вы выиграли. Если же у пользователя кончились попытки, и он не угадал число, то программа должна сообщить ему, что он проиграл и показать правильный результат. В конце игры программа должна спросить у пользователя, не хочет ли он поиграть ещё раз. Если пользователь не ведёт ни y, ни n (а что-то другое), то программа должна спросить его ещё раз.

Примерный результат выполнения вашей программы:

Let's play a game. I'm thinking of a number. You have 7 tries to guess what it is.
Guess #1: 64
Your guess is too high.
Guess #2: 32
Your guess is too low.
Guess #3: 54
Your guess is too high.
Guess #4: 51
Correct! You win!
Would you like to play again (y/n)? y
Let's play a game. I'm thinking of a number. You have 7 tries to guess what it is.
Guess #1: 64
Your guess is too high.
Guess #2: 32
Your guess is too low.
Guess #3: 54
Your guess is too high.
Guess #4: 51
Your guess is too high.
Guess #5: 36
Your guess is too low.
Guess #6: 45
Your guess is too low.
Guess #7: 48
Your guess is too low.
Sorry, you lose. The correct number was 49.
Would you like to play again (y/n)? q
Would you like to play again (y/n)? f
Would you like to play again (y/n)? n
Thank you for playing.

Подсказки:

   Используйте в качестве стартового числа во время генерации случайных чисел вызов функции time(0).

   Пользователям Visual Studio: Из-за плохой реализации функции rand() (первое рандомное число не сильно отличается от стартового) — вызовите rand() сразу после установки стартового числа, чтобы сбросить первый результат.

   Используйте функцию getRandomNumber() из урока №71 для генерации случайного числа.

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

Ответ №2

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

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

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

  1. Аватар Игорь:

    2-е задание. Долго колупал. Была одна проблема: с каждым нажатием на Enter выводил на экран 48-ю строку(Сыграем в игру Правила просты: я загадываю число от 1 до 100, а ты отгадываешь. У тебя 7 попыток!) и при этом переменная Attemp(попытка #) всегда была равна 1, т.е. Attemp #: 1. Хотя с каждой попыткой должен быть инкремент +1. И цикл отрабатывал только 7 раз как и положено. Но что самое странное — я удалил эту строку вообще, потом запустил программу и все равно программа выводит мне эту строку с каждым нажатием Enter.
    более 5 часов ушло на разборки, но теперь все работает!

  2. Аватар zashiki:

    как то так( с "продолжить игру" подсмотрела)

  3. Аватар Вячеслав:

    Вот что-то такое у меня получилось…
    Можете оценить, насколько хорошо/плохо он написан ( сразу оговорюсь, что проверку на ввод данных пользователем не делал, только для y / n ) .

  4. Аватар Александр:

    Мда, по этим решениям видно, на сколько моё решение далеко от идеала. Салага я ещё, раз у меня строк в коде более чем в два раза больше, чем в решении задачи №2.

  5. Аватар Алексей:

    Заморочился, но практика.

    Выбор сложности и тд и тп.

  6. Аватар Алексей:

    Да, простые, то простые, но как берешься.

    Вроде бы понял, новичек зеленые еще.
    Вот сейчас кумекаю, как сделать проверку ввода на угадание числа и возврат к точке, где ввел не числа.

  7. Аватар Kishmyak:

    сделал такой вот код, плюс в том, что прога спрашивает, в каких пределах чисел вы хотите поиграть

  8. Аватар Алексей:

    Задачи вроде-бы не сложные, простые.
    Только во втором случаи, функция то одни и те же номера генерирует.

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

    Задание №1
    constants.h:

    Основной файл:

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

    Задание №2

  11. Аватар Дмитрий:

    Поясните, пожалуйста, как в ответе на вторую задачу работает функция playAgain? Конкретно интересует:

    Выполнять цикл пока переменная ch не равна 'y' и 'n' одновременно? Разве здесь не должен быть оператор "ИЛИ"?

    1. Аватар Павел:

      Выполнять цикл пока переменная не равна одному значению и не равна второму. Если переменная равна хоть одному из этих значений, то условие не будет выполняться и цикл закончится.

  12. Аватар Константин:

    Я не знал как делать (игру hi-lo), поэтому сделал просто:

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

    Решил сделать как мини-игру:) Лого, просто для полноты картины:)
    Можно совершать ставки на игру, вроде ошибок не заметил, перепроверял много раз.

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

      А при чем ставки? В этой игре гарантированно выигрываешь, если следовать простому медианному алгоритму. Достаточно ровно 7 попыток.

  14. Аватар Павел:

    Вторая задача с Вихрем Мерсенна:

  15. Аватар zvezdonom:

    Доброго времени суток. На первое задание почему-то никто не предложил варианта, когда выбирается шаг по времени вывода данных, а так же проверка пользовательского ввода. Допустим, я хочу бросить с высоты 1 метр и показать данные каждые 0.1 сек. Вот результат моей программы:

    Enter the height of the tower in meters:
    1
    Enter the step of the time in seconds:
    0.1
    All fall time is 0.451754 seconds.
    At 0 seconds, the ball is at hight: 1 meters;
    At 0.1 seconds, the ball is at hight: 0.951 meters;
    At 0.2 seconds, the ball is at hight: 0.804 meters;
    At 0.3 seconds, the ball is at hight: 0.559 meters;
    At 0.4 seconds, the ball is at hight: 0.216 meters;
    At 0.5 seconds, the ball is on the ground.

    И сама программа (4 файлика):

    1. calculate.h

    2. constants.h

    3. calculate.cpp

    4. main.cpp

  16. Аватар Юрий:

    Первое задание. Заглавочный файл не изменяется, поэтому:

  17. Вячеслав Вячеслав:

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

  18. Аватар Игорь:

    Довольно долго бился, но все-таки победил самостоятельно, без подсказок ))) Только функцию _getch() подсмотрел в инете, т.к. с использованием цикла был многократный вывод вопроса при множественном наборе символов (так и не додумал как через цикл)

  19. Аватар Alexey:

  20. Аватар Диана:

    первое задание…

  21. Аватар Дмитрий:

    Задание №2

  22. Аватар Алексей:

    Ответ на Задание №2:

  23. Аватар Юрий:

    Привет. Вопрос такой — я обрабатываю некорректный ввод числа от 1 до 100. При этом если это будет число меньше нуля, больше ста, символ, дробь — некорректный ввод обрабатывается и программа работает как нужно. Но если пользователь вводит строку к примеру "55нгук78437" буфер cin принимает число 55 и никак на это моя программа не ругается. Как можно обработать такой ввод?

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

      Напиши после cin команду cin.ignore(32767, '\n')

  24. Аватар Игорь:

  25. Аватар Владислав:

    Привет. Решение второго задания хорошее, но стоило бы еще сделать проверку ввода числа от пользователя, ибо если будет введен символ, то будет бесконечный цикл. А также в правилах указывается, что загадывается число от 1 до 100, то стоило бы и сделать проверку числа на нахождение в этом диапазоне (т.к. можно и отрицательные числа вводить, никто не запрещает 🙂 )
    Ну и мой код:

  26. Аватар Alexey:

    Решил вторую задачу несколько другим путём. Пришлось добавить заголовочный файл, чтобы можно было объявлять одну функцию внутри другой, а также оператор goto, т.к. это было первое, что пришло на ум.

    Hi-lo.h:

    Hi-lo.cpp:

  27. Аватар artem:

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

    Мой вариант:

  29. Аватар Алибек:

    Вторая задача:

  30. Аватар Андрей:

    Фух, долго пришлось писать эту программу -))
    Пришлось сначала на листке рисовать блоки (кстати было бы неплохо сделать статью на эту тему для начинающих или в Телеграме как Вы делаете пакет ссылок на одну тему)

    От себя я решил немного усложить и добавил 2 условия:
    1 После озвучивания правил игры спрашиваю согласия пользователя
    2 В запросе числа от пользователя добавил проверку на корректность ввода числа.

    И саму игру решил не выносить в отдельную функцию — onlinegdb.com/HJcySZIRz.

    1. Юрий Юрий:

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

      Здесь нужно использоваться оператор И, вместо ИЛИ:

      1. Аватар Андрей:

        Если мы поставим оператор И вместо ИЛИ то у нас такое условие никогда не выполнится. Нет таких чисел одновременно меньше 0 и больше 100.
        Ошибка была в расположении циклов For и If относительно друг друга.
        Поменял местами и вроде все варианты работают.