C ++ Использование переменных в уравнениях;ошибка: выражение должно иметь целочисленный тип или тип enum с незаданной областью и другие - PullRequest
0 голосов
/ 23 октября 2019
srand( 0 );
int points; // number of points
float computerNumber; // number generated by the computer
float guess; // user's guess
char quit; // What the user enters when they want to quit
int totalPoints; //the total score of all of the games played
int avgPoints; // the average score of all games played
int gamesPlayed; // how many games have been played
float rangeLow; // the lower end of the range
float rangeHigh; // the higher end of the range
points = 5;
quit = 'n';
gamesPlayed = 0;
totalPoints = 0;
while ( quit != 'q' )
{

    gamesPlayed++;
    cout << "Welcome to Guessing Game! \n";
    points = 5;
    cout << "What would you like your range to be? \n";
    cout << "Low number: \n";
    cin >> rangeLow;
    cout << "High number: \n";
    cin >> rangeHigh;
    if ( rangeLow > rangeHigh )
    {
        cout << "Please use a high number that is greater than the low number. \n";
        cout << "Low number: \n";
        cin >> rangeLow;
        cout << "High number: \n";
        cin >> rangeHigh;
    }
    else
    {
        ;
    }
    computerNumber = rand( ) % (rangeLow - rangeHigh + 1) + 10;
    cout << "Computer Number: " << computerNumber << endl;
    cout << "Points:" << points << endl;
    cout << "what is your guess? \n" << endl;
    cin >> guess;
    cout << "Your guess is: " << guess << endl;

Когда я ввожу этот код (среди других безошибочных строк кода, которые не влияют на эти строки), он не будет компилироваться и выводит два сообщения об ошибках - «выражение должно иметь тип enum целочисленного или незавершенного типа»и "%" недопустимо, правый операнд имеет тип "float" "

У меня такое ощущение, что это как-то связано с использованием переменных в моем уравнении, но это не должно быть проблемой? Все типы переменных являются числами с плавающей точкой, которые имеют отношение к этому уравнению, и я довольно запутался.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

% - оператор модуля для целочисленных значений. Ваши конечные точки диапазона являются переменными с плавающей точкой. В своем упражнении вы должны преобразовать конечные точки computerNumber и guess в int переменные.

int rangeLow, rangeHigh, computerNumber, guess;

Затем взгляните на генератор чисел компьютера и вставьте некоторые значения, чтобы проверить его:

computerNumber = rand() % (rangeLow - rangeHigh + 1) + 10;
                 rand() % (   5     -    20     + 1) + 10;
                 rand() %          -14               + 10;

Итак, у вас будет rand() % -14 + 10. Это не выглядит правильно. Поменяйте местами конечные точки диапазона:

computerNumber = rand() % (rangeHigh - rangeLow + 1) + 10;
                 rand() % (   20     -    5     + 1) + 10;
                 rand() %            16              + 10;

Это, rand() % 16 + 10, лучше, но, очевидно, создаст число в диапазоне [10, 10+16) или поместит его по-другому (как закрытый интервал), [10, 25]. Если вы замените +10 на +rangeLow следующим образом:

computerNumber = rand() % (rangeHigh - rangeLow + 1) + rangeLow;

Теперь вы получите такой диапазон:

[rangeLow, rangeLow + rangeHigh - rangeLow + 1)                             =>
[rangeLow, rangeHigh + 1)                          (left-closed interval)   =>
[rangeLow, rangeHigh]                              (closed interval)

Что означает [5, 20] с примерами значений, которые я использовал.

Теперь взгляните на <<a href="https://en.cppreference.com/w/cpp/header/random" rel="nofollow noreferrer"> random >. Эта часть стандартной библиотеки содержит классы и функции, упрощающие все это:

1 голос
/ 23 октября 2019

Таким образом, ошибка: % оператор не может использоваться со значениями с плавающей запятой, он может использоваться только с целочисленными (int) типами данных.

Вам необходимо ввести float для int, один метод заключается в использовании static_cast<int>(yourFloatNumber), чтобы ваша строка кода вычисления выглядела следующим образом:

computerNumber = rand( ) % (static_cast<int>(rangeLow) - static_cast<int>(rangeHigh + 1)) + 10;

Оператор модуля (%) имеет более строгое требование в том, что его операнды должны иметьцелочисленный тип.

Еще одно решение, освещаемое @NathanOliver в комментариях: если вы согласны с использованием int вместо float для rangeLow и rangeHigh во всем коде, тогда приведите типизациюне требуется вообще.

Ссылка

...