Какой самый эффективный способ проверить наличие дубликатов в массиве, введенном пользователем? - PullRequest
2 голосов
/ 07 мая 2019

Я пытаюсь написать симулятор для игры в лотерею Powerball , где программа будет запрашивать 5 числа (или белые шары) и вводить их в массив элементов 6 и другоечисло (красный Powerball) в 6 th элемент.Мне нужно выяснить, как проверить наличие дубликатов в первых 5 элементах, но 6 th не обязательно должен быть уникальным.

У меня есть цикл, который, как я думал, будет работать, но он даже не выполняется и довольно грязный.

Есть ли более эффективный способ проверки на наличие дубликатов, возможно, с использованием флага bool?

const int PBALLAMOUNT = 6;
const int PBMAX = 69;
const int PBMIN = 1;
const int REDMAX = 26;

cout << "Enter the numbers you want to use for the white powerballs" << endl;
for (int k = 0; k < PBALLAMOUNT - 1; k++)
{
    cin >> pBallNums[k];
    while (pBallNums[k] < PBMIN || pBallNums[k]>PBMAX) 
    {
        cout << "Invalid input! Please enter different numbers between 1 and 69" << endl;
        cin >> pBallNums[k];
    }
}

bool dup = false;
for (int i = 0; i < PBALLAMOUNT - 1; i++) 
{
    for (int j = i + 1; j < PBALLAMOUNT - 1; j++) 
    {
        while (!dup) 
        {
            if (pBallNums[i] == pBallNums[j]) 
            {
                cout << "Please enter a unique number from the others in your PowerBall number selection" << endl;
                cin >> pBallNums[i];
            }

        }
    }
}

cout << "And what would you like for your redball" << endl;
cin >> pBallNums[5];

while (pBallNums[5] < PBMIN || pBallNums[5] > REDMAX)
{
    cout << " The red powerball needs to be between 1 and 26: ";
    cin >> pBallNums[5];
}

Мне просто нужно, чтобы он предупредил пользователя, если он уже ввел число в массив, и предлагает другой оператор std::cin >> pBallNums, но фактический результат просто ничего не происходит после ввода чисел.

Ответы [ 3 ]

3 голосов
/ 07 мая 2019

"Мне просто нужно предупредить пользователя, если он уже ввел число в массив, и предложить еще один оператор cin >> pBallNums."

В этом случае просто используйтеstd::set и используйте его std::set::emplace метод для сохранения ввода пользователя в набор.

С cppreference.com ,

template< class... Args >
std::pair<iterator,bool> emplace( Args&&... args );

std::set::emplace

Возвращает пару, состоящую из итератора для вставленного элемента или уже существующего элемента , если вставка не произошла, и логическое значение, обозначающее, произошла ли вставка .True for Insertion, False for No Insertion .

Просто возьмите эту информацию для своего случая и повторите цикл для следующего пользовательского ввода.


Здесьпример кода ( см. в прямом эфире ) :

#include <iostream> 
#include <set>

int main()
{
    std::set<int> mySet;

    for(int loopCount{ 0 }; loopCount != 5; )// repeat until maximum loop count
    {
        int input; std::cin >> input; // user input
        // get the std::pair<iterator,bool>
        const auto pairIter = mySet.emplace(input);
        // increment maximum loop count, if insertion successful
        if (pairIter.second) ++loopCount;
    }
    for (const int userInput : mySet)
        std::cout << userInput << " ";

    return 0;
}

Пример ввода :

1
1
2
3
4
2
4
3
5

Вывод :

1 2 3 4 5
1 голос
/ 07 мая 2019

Во-первых, старайтесь не смешивать реальные требования с деталями реализации.

[...] где программа будет запрашивать 5 цифр (или белые шары) и быть введен в массив из 6 элементов и другого числа (красный Powerball) в 6-й элемент.

То, что вы действительно хотите: 5 различных чисел, взятых из пользовательского ввода. И из вашего кода я прочитал, что проверка должна происходить после каждого ввода. Я полагаю, что чтение последнего номера в порядке, поэтому оставим это в стороне.

Далее, привыкните к контейнерам в стандартной библиотеке . Их не так много, но то, что вы можете с ними сделать, неисчислимо. Чтобы иметь отдельные элементы в контейнере, вы хотите либо std::unsorted_set, либо std::set. Тогда в основном все, что вам нужно, это использовать insert:

#include <set>
#include <iostream>
int main()
{
    std::set<int> numbers;
    auto x = numbers.insert(1);
    std::cout << "1 was not present before? : " << x.second << "\n";
    x = numbers.insert(1);
    std::cout << "1 was not present before? : " << x.second << "\n";
}

печать:

1 was not present before? : 1
1 was not present before? : 0
1 голос
/ 07 мая 2019

Сортировка, затем проверка соседних элементов на равенство.

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