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

  Юрий  | 

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

 30815

 ǀ   77 

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

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

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

    Ниче се мячик такой в первом задании…
    Никого не смущает что у него скорость линейно возрастает со временем?
    С высоты километра он достигнет скорости пули,
    А с низкой околоземной орбиты он уже перейдет в разряд снаряда Рельсотрона.
    При весе мячика около килограмма, при падении, кратер будет размером с два десятка метров.

  2. Аватар Никита:

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

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

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

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

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

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

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

    Код:

  6. Аватар Onium:

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

  7. Аватар Onium:

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

  8. Аватар Viktor:

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

  9. Аватар Pipka Jenskaya:

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

  10. Аватар Nikita:

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

    Main.cpp

    add.h

    functions.cpp

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

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

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

      Я сам далеко не спец и могу ошибаться, но мои замечания таковы:
      1. В цикле while (в функции main) обработай сначала случай cin.fail(), а затем все остальные случаи (так как это сейчас — cin принимает значение ошибки и никак не может сравнить эту ошибку со случаями, когда х=рандому, больше или меньше его).
      2. Кстати, еще одна моя придирка: нафиг делать сравнение ">=" и "<=", если случай "=" у тебя обрабатывается отдельно?

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

        Исправил код. Теперь обрабатывает как надо, онако 2 if в одном for выглядит как говнокод:

        1. Аватар Bampi:

          Замени на switch(x), если не нравится или чтоб main не нагружать кодом(читабельней становится), то в функцию передать х и там обработать.

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

          А что тебе мешает в 80-й строке использовать "else if" (тем самым объединив все условия в один блок, как было в первоначальной версии)?

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

          Дмитрий, добрый день.
          Если я в 80-ой строке использую else if вместо if, тогда вместо 2-х (один делает проверку на корректность ввода, а второй на корректность выполнения условий) циклов у меня будет один. Проще говоря после ввода текста выполниться условие корректности ввода и на этом цикл будет завершаться, а следующий цикл сравнения условий не выполниться. Касательно оператора switch(x) можно было и через него, но я уже сделал)))

          Вот и всё решение.

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

          Павел, доброго времени суток!
          Вот как это видится мне:

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

          Добрый день Дмитрий!
          Да примерно так как вы описали, только условие выполниться не последовательно, а примерно так(ну во всяком случае как понимаю я, может и ошибаюсь))))
          1)Проверка корректности ввода текста:
          если да, то выход из цикла
          если нет, то переходим к следующему шагу
          2)Проверка равенства значения x и random:
          если да, то выход из цикла
          если нет, то переходим к следующему шагу
          и т.д.

          (Эх жаль картинку добавить нельзя. Я бы блок схему нарисовал для наглядности)).
          То есть цикл при выполнении первого условия дальше не проверяет и тогда не выполняется сравнение значений. А если не выполниться первое условие то дальнейшее выполнение тоже бестолковое, т.к. само значение некорректно(знак или буква, а может слово). По этой причине я и сделал 2 цикла вместо 1.

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

          Павел, вы чуть-чуть ошибаетесь. Первое условие (cin.fail) — это проверка на правильность ввода. Первое условие выполнится как раз только тогда, когда ввод будет НЕ корректным (т.е. в том случае, когда дальнейшие сравнения и не имеют никакого смысла). Если ввод будет правильным первое условие выполняться не будет и сравнение пойдет дальше!

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

          Тогда получается, что строчка "if (cin.fail())" предусловие к выполнению цикла. Так то код рабочий и смотрится грамотнее, но логика что то отлетает напрочь. Я думал, что If/else это линейный цикл, который при выполнении условия его завершает, а тут получается, что "if (cin.fail())" не совсем в цикле. Спасибо за науку.)))

  12. Аватар Виталий:

    В общем написал как мог, вроде работает (возможно с багами =))

    1. Аватар Bampi:

      Из доков про <random>:

      Дальше чтоб получить число из диапазона (1,100) с равномерным распределением dist(gen). Ну и завернуть в функция, где возвращается данное число.

  13. Аватар Юра:

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

  14. Аватар Геннадий:

  15. Аватар Вадим:

  16. Аватар Михаил:

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

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

    Ребят, помогите!
    Голова взорвалась. Почему тут при true цикл останавливается, а у меня сколько бы ни делал, на какой бы попытке ни угадывал, все равно приходится доделывать остальные попытки.

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

      Необходимо предусмотреть условие выхода из цикла

      ->ввели верное число
      ->break;(вышли из цикла)

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

    Здравствуйте люди).
    Смотрю вы забыли про goto)
    С ним все намного легче (только если правильно использовать)
    Bот мой ответ на 2 задание с goto:

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

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

    заголовочный файл:

    программа:

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

    Ответ на второе задание.

  21. Аватар Анастасия Лузинсан:

    Сделала возможность определения диапазона значений и количества попыток. Рандомное число определяется по Вихрю Мерсенна. Всё проходит через проверку на ошибки (вроде). И, всё завязано на меню(так что можно добавить опции).

  22. Аватар Maksim:

    Хочу поблагодарить за данный материал. Очень много полезной информации. Контент действительно качественный !!! и инфа. очень легко заходит. Спасибо!

    1. Юрий Юрий:

      Пожалуйста)) Спасибо за отзыв)

  23. Аватар Maksim:

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

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

  25. Аватар zashiki:

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

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

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