#c #constraints
#c #ограничения
Вопрос:
Я пытаюсь сделать так, чтобы код проверял, находится ли пользовательский ввод между (и включая) 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) amp;amp; (numlist[i] >= 10))
{
cin >> numlist[i];
}
}
}
Ответ №1:
Разве вы не должны поместить оператор ввода cin >> numlist[i]
перед тестом if ((numlist[i] <= 100) amp;amp; (numlist[i] >= 10))
?
Ответ №2:
похоже, вы хотите сделать что-то вроде этого:
int temp = 0;
for (int i = 0; i < 20; i )
{
cin >> temp;
if ((temp <= 100) amp;amp; (temp >= 10))
numlist[i] = temp;
}
Ответ №3:
Просто чтобы дать немного другой способ, которым вы могли бы это сделать, вы могли бы рассмотреть a vector
вместо массива и прочитать данные с помощью an 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 lambda, я мог бы также использовать 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 amp;amp; i<=100; });
Что касается «умного», то это совсем не намерение — скорее, требуется простое, прямое выражение первоначального намерения: скопировать (отфильтрованные) данные из стандартного ввода в контейнер. Требуется некоторое время, чтобы привыкнуть к идее обработки файлов как контейнеров (особенно таких, как std::cin
, которые обычно являются интерактивными), но в конечном итоге файл представляет собой последовательность, а istream_iterator / ostream_iterator просто позволяют обрабатывать их как другие последовательности.
Комментарии:
1. Умный… Но я просто думаю, что если вам нужен фильтр, C просто не лучший язык для выражения этого…
Ответ №4:
Как отмечали другие, вы не можете проверить значение, которое вы даже не прочитали (от пользователя). Чтобы ограничить ввод, вы должны проверять ввод после cin внутри цикла do while, если он не удовлетворяет ограничению.
do
{
//you might cout here
cin >> numlist[i];
}
while ((numlist[i] > 100) || (numlist[i] < 10));
Комментарии:
1. Возможно, вы захотите также
i
где-нибудь, но в остальном, я думаю, это ближе всего к тому, что задал OP.2. я должен быть вне этого цикла, я дал только код для получения одного и того же ввода, если он не соответствует ограничению.