Как я могу проверить, соответствует ли переменная определенному числу несколько раз, меняя при этом, что делать, если она совпадает?

#c #macos

Вопрос:

Я хочу проверить, что такое переменная «num» от 0 до 15, Как я могу проверить, является ли это одним из этих чисел и какое число у меня есть до сих пор.

 #include <iostream>
using namespace std;
int num = 0;
int main()
{
 
cout << "Number to check:";
cin >> num;


{
    if num = 0;
    cout << "0000";
    {
        if num = 2;
        cout << "0010";
        {
            if num = 1;
            cout << "0001";
            {
                if num = 3;
                cout << "0011";
                {
                    if num = 4;
                    cout << "0100";
                    {
                        if num = 7;
                        cout << "0111";
                        {
                            if num = 5;
                            cout << "0101";
                            {
                                if num = 6;
                                cout << "0110";
                                {
                                    if num = 8;
                                    cout << "1000";
                                    {
                                        if num = 9;
                                        cout << "1001";
                                        {
                                            if num = 10;
                                            cout << "1010";
                                            {
                                                if num = 11;
                                                cout << "1011";
                                                {
                                                    if num = 12;
                                                    cout << "1100";
                                                    {
                                                        if num = 13;
                                                        cout << "1101";
                                                        {
                                                            if num = 14;
                                                            cout << "1110";
                                                            {
                                                                if num = 15;
                                                                cout << "1111";
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
}

return 0;
 

Как я могу это сделать, если я не могу, как я могу преобразовать число в 4-разрядный двоичный байт? И, если возможно, как я могу убедиться, что введенное число находится в диапазоне от 0 до 15 и что во введенной строке нет букв

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

1. Вы скомпилировали свой код? Вы можете проверить, находится ли входное число в диапазоне от 0 до 15, используя простое if

Ответ №1:

Приведенная ниже программа делает то, что вы хотите.

     #include<iostream>
    #include <bitset>
    int main() {
    
    
        int num = 0;
        std::cout << "Number to check: ";
        std::cin >> num;
        while (std::cin.fail() || num > 15 || num < 0) {
            std::cout << "Error! Invalid Input n";
            std::cin.clear();
            std::cin.ignore(256, 'n');
            std::cout << "Number to check: ";
            std::cin >> num;
        }
        std::bitset<4> value;
            value = { static_cast<unsigned long>(num) };
            std::cout << value.to_string() << "n";
    
        return 0;
    }
 

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

1. Почему у вас есть переключатель из пятнадцати одинаковых ящиков?

2. Это не столько неэффективно (за исключением напрасной работы по копированию и вставке), сколько бессмысленно. std::bitset<4> value { static_cast<unsigned long>(num) }; std::cout << value.to_string() << "n"; этого достаточно.

3.@east1000 выглядит немного безумно. Вы можете просто value = static_cast<unsigned long>(num); std::cout << value.to_string() << "n"; ОДИН РАЗ, так как вы уже знаете num , что это от 0 до 15

4. @molbdnilo точно мои мысли 😉

5. Хех, нет, совсем нет! Никакой ревности здесь, я имел в виду дублирование, а не набор бит

Ответ №2:

Используйте <набор битов>

 #include <bitset>
#include <iostream>
#include <string>

int main()
{
    std::string input{ "12" };
    // std::cin >> input;

    unsigned long number = std::stoul(input); // does number checking

    if (number < 16) // do value checking
    {
        std::bitset<4> value{ number };
        std::cout << value.to_string() << std::endl;
    }
}
 

Ответ №3:

Поскольку вы объявили num как целое число, ваша программа не будет работать, если во время ввода вы введете неигровые символы cin . Я считаю, что самый короткий вариант вашего кода без обработки std::bitset был бы

 const int MAX_BITS = 4;
cout << "Number to check:";
cin >> num;
if (num < 0 || num > (1 << MAX_BITS) - 1) {
    cout << "Invalid number, next time enter between 0 and " << (1 << MAX_BITS) - 1;
    return 0;
}

for(int bit = MAX_BITS - 1; bit >= 0; --bit){
    cout << ((num amp; (1 << bit)) > 0);
}
cout << endl;
 

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

1. Зачем изобретать велосипед, если вы можете использовать стандартную библиотеку?

2. @PKramer Я не утверждаю, что сделал бы это при наличии стандартного подхода. Я просто даю вариант, который требует только операций из первых глав книг по C

3. Достаточно справедливо 😉 Хотя я думаю, что большинство книг на C тоже требуют обновления, научите STL, прежде чем «как писать свои собственные структуры данных с помощью указателей».