Бесконечные выходы цикла if-else / while? - PullRequest
0 голосов
/ 02 ноября 2019

Я начинающий программист на C ++, пытаюсь создать эту практическую игру «угадай число», которая должна соответствовать некоторым требованиям. Это:

  1. Используйте 'flush' (я не знаю, что это, помогите?)
  2. Выйдите из игры, как только угадано число
  3. Выйдите из игры, как только будет превышено максимум 10 догадок

Но проблема сейчас заключается в том, что когда я ввожу число, оно говорит мне, является ли введенное число выше или ниже случайно сгенерированного правильногономер непрерывно. Поэтому, если оно ниже, вывод будет «ниже-ниже-ниже-ниже-ниже-ниже-ниже-ниже» и так далее. Я не знаю, что я сделал не так?

Вот мой код. (X = случайно сгенерированное число, Y = догадка, Z = количество догадок)

int main() {
  int x , y, z;
  x = rand() % 1000 + 1;
  std::cin>>y;
  do{
    if (y > x){
      std::cout<<"higher"<< std::endl;
      z++;
    } else if (y < x) {
      std::cout<<"lower"<< std::endl;
      z++;
    } else if (y == x) {
      std::cout<<"correct"<< std::endl;
    }
  } while (y != x && z < 11);
  return 0;
}

Ответы [ 5 ]

1 голос
/ 02 ноября 2019
  1. Просто возьмите ввод внутри цикла do-while.
  2. Другая проблема инициализирует Z нулем. Инициализируется по умолчанию и может иметь любое значение.
  3. Предложение инициализировать случайное начальное число:
srand (time(NULL)); // it will give 'x' every time a different value.
int  z=0; // Dont forget to do this thing.

do{
    cout<<"Enter number - "; // This thing your are missing.
    std::cin>>y;
    if (y > x){
      std::cout<<"higher"<< std::endl;
      z++;
    }
    else if (y < x) {
      std::cout<<"lower"<< std::endl;
      z++;
    }
    else if (y == x) {
      std::cout<<"correct"<< std::endl;
    }
  } while (y != x && z < 11);
  return 0;
0 голосов
/ 02 ноября 2019

Вы делаете неправильно несколько вещей:

  • Поскольку вы должны явно использовать операцию сброса, вы должны использовать std::cout << std::flush; где-то.
  • Вам необходимо получить информацию отпользователь внутри тела цикла do-while.
  • Вам необходимо сначала инициализировать генератор случайных чисел, прежде чем его использовать.
  • Вам необходимо инициализировать переменную z равной 0, потому что у вас неопределенное поведение -вы увеличиваете переменную с неопределенным значением (не инициализированным ранее).

Вот ваш код с этими исправлениями:

#include <iostream>
#include <ctime>

int main() {
    int x, y, z = 0;
    srand(time(NULL));
    x = rand() % 1000 + 1;

    std::cout << x << std::endl;

    do {
        std::cin >> y;
        if(y > x) {
            std::cout << "higher" << std::endl;
            z++;
        } else if(y < x) {
            std::cout << "lower" << std::endl;
            z++;
        } else {
            std::cout << "correct" << std::endl;
        }
        std::cout << std::flush;
    } while(y != x && z <= 10);
    return 0;
}

Вы сказали, что не знаете, чтоэто операция сброса. Это операция очистки выходного буфера (используется внутренне объектом std :: cout). Обычно вам не нужно явно очищать выходной буфер, но если вам нужно ...

0 голосов
/ 02 ноября 2019

У вас неопределенное поведение:

z++;

z используется перед инициализацией.

0 голосов
/ 02 ноября 2019

Поместите свой std :: cin в цикл. Вам также нужно сначала установить z и добавлять его на 1 при каждом запуске цикла.

int main() {
  srand (time(NULL));
  int x , y, z;
  x = rand() % 1000 + 1;
  z = 0;

  do{
 std::cin>>y;
    if (y > x){
      std::cout<<"higher"<< std::endl;

    } else if (y < x) {
      std::cout<<"lower"<< std::endl;

    } else if (y == x) {
      std::cout<<"correct"<< std::endl;
    }
  } while (y != x && z++ < 9);
  return 0;
}
0 голосов
/ 02 ноября 2019

1 - переменная z не инициализирована

2 - вы должны читать входные данные каждый раз, когда делаете цикл, я думаю (чтобы прочитать предположение)? как это

do{
   std::cin>> y ;
   // the rest of your loop
while(your condition);

Примечание: вы должны инициализировать случайное начальное число перед использованием случайной функции:

srand (time(NULL));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...