Проверка того, содержит ли введенное пользователем целое число все 1 или 0? - PullRequest
0 голосов
/ 28 января 2019

Я пытался преобразовать ее в строку и проверить строку, но не могу найти правильный способ проверить ее и повторно запросить пользователя, если он введет что-то отличное от 1 или 0.

int binNum, decNum = 0, i = 0, remainderAmount;
string testString;

cout << "Enter a binary number: ";
cin >> binNum;
testString = to_string(binNum);
for (int i = 0; i < testString.length(); i++)
{
    while (testString[i] != 1 && testString[i] != 0)
    {
        cout << "Please enter a valid binary number: ";
        cin >> binNum;
        testString = to_string(binNum);
    }
}

cout << "Binary number: " << binNum << " is ";

while (binNum != 0)
{
    // Check if remainder is 0 or 1
    remainderAmount = binNum % 10;
    // Remove the last digit from the binary number
    binNum /= 10;
    // Get first decimal number
    decNum += remainderAmount*pow(2,i);
    // Increment the place for the binary power i
    i++;
}

cout << decNum << " in decimal" << endl;
cout << endl;

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Попробуйте что-то вроде этого:

int binNum, decNum = 0, i = 0, remainderAmount;
bool error = false;

int n;

cout << "Enter a binary number: ";  

do
{

    cin >> binNum;

    n = binNum;
    error = false;
    i = 0;
    decNum = 0;

    while (binNum != 0)
    {

        // Check if remainder is 0 or 1
        remainderAmount = binNum % 10;

        if(remainderAmount & -2)
        {
            cout << "Please enter a valid binary number: ";

            error = true;
            break;
        }

        // Remove the last digit from the binary number
        binNum /= 10;
        // Get first decimal number
        decNum += remainderAmount*pow(2,i);
        // Increment the place for the binary power i
        i++;
    }

}
while(error);

cout << "Binary number: " << n << " is ";

cout << decNum << " in decimal" << endl;
cout << endl;
0 голосов
/ 28 января 2019

testString[i] - это char, а не int.

0 и 1 - int с.

'0' и '1' равны char с.

Целое число 0 не совпадает с символом '0' (шестнадцатеричный 0x30, десятичный 48).

Целое число 1 не совпадает с символом '1' (шестнадцатеричное 0x31, десятичное 49).

Вот почему ваш while работает неправильно.

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

Попробуйте что-то вроде этого:

bool isValid(int num) {
    string testString = to_string(num);
    for (int i = 0; i < testString.length(); i++) {
        if (testString[i] != '1' && testString[i] != '0')
            return false;
    }
    return true;

    /* alternatively:
    return (to_string(num).find_first_not_of("01") == string::npos);
    */
}

...

cout << "Enter a binary number: ";
do {
    if (cin >> binNum) {
        if (isValid(binNum)) {
            break;
        }
    } else {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');    
    }
    cout << "Please enter a valid binary number: ";
}
while (true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...