Member 13329311 Ответов: 3

Как я могу найти проблему в своем коде, хотя там нет сообщения об ошибке? !


Привет,

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

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

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

Ваше время и усилия высоко ценятся, спасибо.

Что я уже пробовал:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int randomnumber ( int low, int high )
{
    return rand() % ( high - low ) + low;
}

int randomnumber();
int low;
int high;
int Entry;
int i;
int target = randomnumber( 1, 100 );

int main()
{

    srand(time(0));

    while (1)
 {

    cout << "Enter any number between 1 and 100: ";
    cin >> Entry;

    for ( i = 0; i <= 100; i++ );
    {
       cout << randomnumber( 1, 100 ) << endl;
    }

    if ( Entry < target )
    {
        cout << "Sorry, Your guess is too low. Try again!";
    }

    else if ( Entry > target )
    {
        cout << "Sorry, Your guess is too high. Try again!";
    }

    else
    {
        cout << "Well done, You guessed just right.";
        break;
    }

 }

}

3 Ответов

Рейтинг:
5

Patrice T

Цитата:
Я пишу исходный код, и он работает без ошибок, но он не точен. например, (несколько раз программа выдает сообщение о том, что ваша догадка слишком высока, хотя пользователь вводит число меньше целевого и наоборот.)

Написание некоторого кода, который компилируется без ошибок, не означает, что код делает то, что ожидается.
"Кошка летит высоко в небе" - это правильная английская грамматика, но не имеет смысла.
Существует инструмент, который поможет вам понять, что не так в вашем коде, его отладчик.

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

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13329311

Уважаемый г-н ppolymorphe,

Спасибо за этот важный совет. Отныне я буду им пользоваться.

Спасибо за ваше время и советы.

Patrice T

Спасибо.
Приятно видеть, что вы находите это полезным.

Рейтинг:
26

Jochen Arndt

Избегайте использования глобальных переменных, особенно когда они инициализируются возвращаемыми функциями. В вашем случае а rand() основанное значение присваивается target до srand() призванный. В результате, target будет иметь одно и то же значение при каждом выполнении программы в большинстве систем.

Кроме того, почему вы печатаете еще одно случайное значение после того, как пользователь ввел свое значение?
Вы, вероятно, сравниваете это с пользовательским вводом в уме. Но это печатное значение не является target ценность. Обратите внимание также на точку с запятой в конце for оператор, который делает цикл бесполезным.

Так что просто перепишите:

int randomnumber ( int low, int high )
{
    return rand() % ( high - low ) + low;
}

int main()
{
    srand(time(0));
    int target = randomnumber( 1, 100 );

    while (1)
    {
        int entry;
        cout << "Enter any number between 1 and 100: ";
        cin >> Entry;
        if ( Entry < target )
            cout << "Sorry, Your guess is too low. Try again!";
        else if ( Entry > target )
            cout << "Sorry, Your guess is too high. Try again!";
        else
        {
            cout << "Well done, You guessed just right.";
            break;
        }
    }
}


Member 13329311

Дорогой Мистер Арндт,

Спасибо за эти ценные заметки. Теперь я понимаю кое-что из логики C++. Ваше предположение было совершенно правильным, поскольку я пытался сравнить печатное значение с пользовательским вводом.

Теперь код работает хорошо. Я также переместил приведенный ниже код внутри цикла while, так что каждый раз, когда я запускаю программу, у меня появляется новое случайное число.
int target = randomnumber( 1, 100 );

Спасибо за ваше время и помощь :)

Jochen Arndt

Спасибо вам за ваши отзывы и принятие моего решения.

Но действительно ли вы хотите назначить новое случайное число цели внутри цикла while?
Это создаст новый с каждой итерацией цикла, так что пользователь не сможет приблизиться, используя напечатанные подсказки.

Member 13329311

Добро пожаловать.

Я просто делаю это, чтобы проверить свое собственное понимание. ни больше ни меньше :)

Рейтинг:
20

OriginalGriff

Просто чтобы добавить к тому, что сказал Йохен: компиляция без ошибок не означает, что ваш код правильный! :смеяться:

Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
cout << "Enter any number between 1 and 100: ";

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!


Member 13329311

Дорогой Мистер Грифф,

Спасибо за эту ценную стратегию, которую вы мне посоветовали. Отныне я буду им пользоваться.

Спасибо за ваше время и советы.

OriginalGriff

Мы вам более чем рады!