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

  Юрий  | 

  Обновл. 15 Сен 2020  | 

 61536

 ǀ   92 

Поздравляю! Мы продвинулись еще на одну главу вперед. Чтобы закрепить пройденный материал, давайте быстренько повторим теорию и выполним 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 (214 оценок, среднее: 4,92 из 5)
Загрузка...

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

  1. Vitalt1158:

    Вторая:

    Файл Main.cpp:

    Файл Function.h:

    Файл Function.cpp:

  2. Artem:

    Решил полностью переделать код из 1 задания\

  3. Ironsaid:

    Тоже решил кинуть свой код на второе задание. Знаю что не идеален но главную работу выполняет. Также есть забавный баг если вместо числа ввести букву 🙂

  4. Max:

    С do while кажется код был бы более понятным.

  5. Kayfor:

    Моё видение порвого задания:

  6. Андрей:

    Оставлю и я здесь свой стрёмный вариант второго задания.)

  7. Виталий:

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

  8. Виталий:

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

  9. Артурка:

    2-е задание:

    GuessNumberGame.h:

    GuessNumberGame.cpp:

  10. Ruslan:

    Задание № 2.

  11. Ангелина:

    Мой вариант второй задачи:

    Да, с goto, да, забыла про do while, так вышло 🙂 Хотя в лекциях даже писалось, что do while идеален для вызова меню.

  12. Ruslan:

    Задание № 1

    constants.h :

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

  13. Ангелина:

    Ух, это было мозголомно, но круто) Целый день просидела.

    Первая задача (constants.h не меняется):
    main.cpp

    А еще сделала вариант, который выводит не просто секунды падения, а секунды и минуты) Тогда main() выглядит так:

    Можно было, конечно, еще запилить часы, тогда бы последнее else if в цикле for выглядело бы так:

    Ну и в конце соответствующую строчку добавить.
    Но тогда высота башни получается что-то уж совсем неимоверной)

  14. Никита:

    Второе задание с использование Вихря Мерсенна для рандомной генерации

  15. Павел:

    Всё работает, но в функции test(), которая должна выдавать разные ошибки на числа, которые меньше 1 или больше 100 и введение не чисел. Однако он всегда выдаёт только первую ошибку, т.е "Ваше число должно быть больше 1 и меньше 100". Если что, я пробовал поменять местами ошибки в ветвлении if, и тогда на все случаи прога выдаёт, что введённое мной число не является числом, даже если это просто число меньше или больше 100. Кто знает, с чем это связано?

    1. Сергей:

      Попробую внести ясность. Для этого рекомендую воспользоваться уроком 27. Отладка программ: стек вызовов и отслеживание переменных. https://ravesli.com/urok-27-otladka-stek-vyzovov-i-otslezhivanie-peremennyh/

      1. В строке 30 объявлена целочисленная переменная x (не инициализирована, а значит компилятор проинициализирует её: 0).

      2. В строке 33 используется cin >>. При вводе символов (например"asdf") происходит Ошибка №3: Извлечение не выполняется. Урок №72. Обработка некорректного пользовательского ввода https://ravesli.com/urok-72-obrabotka-nekorrektnogo-vvoda-cherez-std-cin/.
      А переменная x так и осталась с "мусором" (0), т. е. x=0.

      3. В строке 34 вызов функции проверки test(x), где x = 0, обрабатывается как "меньше 1 или больше 100" (строка 14: if(yourNumber < 1 || yourNumber > 100) ).

  16. Баринов Александр Сергеевич:

    Здравствуйте, сам написал программу к итоговому тесту 5 заданию 2 и столкнулся с проблемой: программа в первый раз работает, но после второго вызова функции test() 2 раза выдаёт текст с вводом, а потом закрывается(при этом не важно что вводишь). Кто понимает из-за чего это помогите.

    1. Сергей:

      Попробую внести ясность. Для этого рекомендую воспользоваться уроком 27. Отладка программ: стек вызовов и отслеживание переменных. https://ravesli.com/urok-27-otladka-stek-vyzovov-i-otslezhivanie-peremennyh/

      1. Строка 52: char result = test();. В случае ввода 'y' переменная result = 'y' (это КЛЮЧЕВОЙ момент).

      2. В цикле do (строка 54) будет обработан стейтмент (строка 58): bool result2 = game(guess, number);.
      После этого будет обработана либо строка 61-62, либо строка 66-67, где присутствует вызов функции test() (это Ваш первый раз). Но результат вызова теряется, поэтому переменная result сохраняет 'y'. (п.1).

      3. В строке 70 (if (result == 'n')) управление перейдет на строку 74 (else), а затем строка 76 (вызов функции test() (это Ваш второй раз), а результат вызова теряется). Внимание: значение result не меняется (='y').

      4. Строка 78: while (result != 'n' && result != 'y'); приводит к while (false) и прекращению цикла.

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

    Здравствуйте. Вот мой код. Если будут какие-либо предложения для улучшения кода — говорите, буду рад услышать чужое мнение.

    Код:

  18. Onium:

    Такой ответ на второе задание

    1. Сергей:

      Сделано очень интересно, с enum class, вообще здорово.
      Но в строке 78 функцию void choice() надо переписать.
      При некорректном вводе (например, "asd") выполнится else (строка 90 ) и по условию: exit(0), а желательно "Неккоректный ответ. Введите еще раз:".

  19. Onium:

    Такой ответ на первое задание

  20. Viktor:

    Ось мій варіант другого завдання. Дякую за ці чудові курси)))

  21. Pipka Jenskaya:

    Ну, мой вариант

  22. Nikita:

    Написал свой вариант с возможностью выбора диапазона значений. В процессе написания столкнулся с множеством проблем, оно и к лучшему, многое вспомнил и многому научился. Юрий, спасибо за уроки!

    Main.cpp

    add.h

    functions.cpp