#c
#c
Вопрос:
#include <iostream>
#include <vector>
using namespace std;
int main () {
std::vector<int> winning_numbers {13579,26791,26792,33445,55555,62483,77777,79422,85647,93121};
std::cout <<"Please Enter Your Numbers: ";
int users_numbers;
std::cin >> users_numbers;
int size = winning_numbers.size();
int index = 0;
bool found = false;
while(index < size amp;amp; !found) {
if(users_numbers == winning_numbers[index]) {
std::cout << "You Won!" << std::endl;
found = true;
}
index ;
std::cout <<"You Lost" << std::endl;
}
}
Я предполагаю сопоставить номера пользователей с номерами лотерейных билетов, которые у меня есть в моем векторе, и если они совпадают, он говорит «Вы выиграли!», А если вы проиграете, он скажет «Вы проиграли!». Единственное, что бросается в глаза, это то, что мне нужно использовать линейный поиск. Я закончил программу, но по какой-то причине, когда я добавляю «Вы потеряли», она отправляет спам 5 раз, а не один раз, поэтому я не знаю, куда поместить его в мой цикл while.
Комментарии:
1. Вы
cout
находитесь внутриwhile
цикла; переместите его2. @VladFeinstein Видите, я это сделал, и когда я убираю его и использую выигрышные номера, он говорит, что вы выиграли, а затем он также говорит, что вы проиграли!
3. Ваша ошибка — одна из причин, по которой мне не нравится форматирование в стиле «фигурная скобка в той же строке». Ошибка вполне очевидна, если скобка была помещена на строку ниже
while
цикла. Это пример . Я знаю, что аргумент в пользу стиля «одной и той же строчной скобки» заключается в том, что он экономит место, но я не могу сказать вам, сколько раз это либо вызывало ошибки, подобные вашей, либо приводило к созданию файла с ошибками компилятора из-за отсутствия где-то фигурной скобки.4. Вам нужно помнить золотое правило компьютерного программирования: ваш компьютер всегда делает именно то, что вы ему говорите, а не то, что вы хотите, чтобы он делал. Вам нужно точно указать компьютеру, что он должен делать, и только это. Ваша новая версия сообщает вашему компьютеру, что после завершения цикла он всегда должен печатать «Вы проиграли», так что это то, что он делает. Если вы хотите, чтобы ваш компьютер делал что-то еще, вы должны точно указать компьютеру, что он должен делать.
5. @PaulMcKenzie Извините, лол, я не знаю, почему каждый раз, когда я добавляю фигурные скобки в одну и ту же строку. Для меня это выглядит так странно, когда я помещаю фигурную скобку в следующую строку. Мне нужно помнить об этом, спасибо, что напомнили мне.
Ответ №1:
Очень простая ошибка. Хотя отступ может заставить вас думать, что все в порядке, ваша подходящая фигурная скобка находится в неправильном месте для цикла while. В настоящее время он отправляет спам «Вы потеряли» при завершении каждого индекса, который он сканирует, потому что ему говорят. Я бы предложил следующие изменения:
while(index < size amp;amp; !found) {
if(users_numbers == winning_numbers[index]) {
found = true;
break;
}
index ;
}
if (found)
std::cout << "You Won!" << std::endl;
else
std::cout << "You Lost" << std::endl;
Теперь код будет проверять каждый элемент в списке, пока не найдет подходящую пару. Как только это произойдет, он прекратит сканирование списка и выведет сообщение «Вы выиграли!» Если к концу не будет найдено ни одной совпадающей пары, появится сообщение «Вы потеряли».
Комментарии:
1. Хотя теперь, после публикации этого, я понимаю, что вам не нужен перерыв, поскольку вы учитываете это в операторе while.
2. Мне просто любопытно, почему оператор if и else находится вне цикла while? Разве это не должно быть внутри.
3. Если вы хотите, вы можете поместить «Вы выиграли!» внутри цикла while, как вы делали изначально. Но вам нужно где-то проверить это логическое значение, чтобы программа могла определить, нужно ли ей выводить сообщение «Вы потеряли». Поэтому это сообщение должно быть вне цикла, чтобы мы знали, что все возможные шансы совпадения исчерпаны.
4. В качестве альтернативы, если вы действительно хотите, чтобы это было внутри цикла while, вы могли бы добавить следующий код внутри цикла и после первого блока if: (
if(!found amp;amp; index == size - 1) std::cout << "You Lost" << std::endl;
) Это должно гарантировать, что мы достигли конца списка и совпадений не найдено.
Ответ №2:
Вы помещаете std::cout << "You Lost" << std::endl;
внутри цикла while, поэтому он повторяется каждый раз, когда цикл повторяется. Вы должны поместить его вне цикла while, например, так: ìf(!found) std::cout << "You lost" << std::endl;