Как мне создать проверку для этого кода? - PullRequest
1 голос
/ 04 ноября 2011

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

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

int main()
{
    int numlist[20];

    for(int i = 0; i < 20; i++)
    {
        cout << "Enter # " << i + 1 << " : ";

        // here is where I am going wrong... 

        if ((numlist[i] <= 100) && (numlist[i] >= 10))
        {
            cin >> numlist[i];
        }
    }
}

Ответы [ 4 ]

6 голосов
/ 04 ноября 2011

Разве вы не должны поставить оператор ввода cin >> numlist[i] перед тестом if ((numlist[i] <= 100) && (numlist[i] >= 10))?

2 голосов
/ 04 ноября 2011

Просто чтобы дать немного другой способ сделать это, вы можете рассмотреть vector вместо массива и прочитать данные с istream_iterator вместе со стандартным алгоритмом:

std::vector<int> numlist;

std::remove_copy_if(std::istream_iterator<int>(std::cin), 
                    std::istream_iterator<int>(),
                    std::back_inserter(numlist), 
                    [](int i)->bool { return i<10 || i > 100; });

Редактировать: Полагаю, поскольку я использую лямбду C ++ 11, я мог бы также использовать C ++ 11 copy_if, который выражает намерение чуть более прямо:

std::copy_if(std::istream_iterator<int>(std::cin), 
             std::istream_iterator<int>(),
             std::back_inserter(numlist), 
             [](int i)->bool { return i>=10 && i<=100; });

Что касается «умного», то это вовсе не намерение, а то, что требуется, - это простое прямое выражение исходного намерения: копировать (фильтровать) данные из стандартного ввода в контейнер. Требуется немного времени, чтобы привыкнуть к идее рассматривать файлы как контейнеры (особенно такие, как std::cin, который обычно является интерактивным), но в конечном итоге файл является последовательностью, а istream_iterator / ostream_iterator просто позволяет вам обращаться с ними как с другими последовательностями .

2 голосов
/ 04 ноября 2011

похоже, что вы хотите сделать что-то вроде этого:

int temp = 0;

for (int i = 0; i < 20; i++)
{
  cin >> temp;
  if ((temp <= 100) && (temp >= 10))
    numlist[i] = temp;
}
0 голосов
/ 04 ноября 2011

Как уже отмечали другие, вы не можете проверить значение, которое вы даже не прочитали (от пользователя).Чтобы ограничить ввод, вы должны проверять ввод после cin в цикле do while, если он не удовлетворяет ограничению.

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