在用户输入的数组中测试重复项的最有效方法是什么?

时间:2019-05-07 19:25:42

标签: c++ arrays algorithm duplicates user-input

我正在尝试编写一个模拟器来玩强力球彩票,该程序会要求输入5个数字(又称白球)并输入到{{1} }元素数组和另一个数字(红色的Powerball)插入第6个元素。 我需要弄清楚如何测试前6个元素中的重复项,但是第5个不必是唯一的。

我有一个我认为可以工作的循环,但是它甚至没有执行,而且非常混乱。

是否有更有效的方法来测试重复项,可能涉及布尔标志?

6

如果用户已经在数组中输入了一个数字并提供了另一个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]; } 语句,我基本上只需要它来提醒用户,但是输入数字后实际上什么也没发生。

3 个答案:

答案 0 :(得分:3)

  

“我基本上只需要它来警告用户是否已经输入   数组中输入一个数字,并提供另一个cin >> pBallNums语句。”

在这种情况下,只需使用 7 days 并使用 std::set 方法将用户输入存储到集合中。

来自 std::set::emplace

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

std::set::emplace

     

将由迭代器组成的一对返回到插入的元素,如果没有插入,则返回已经存在的元素   发生,并且出现布尔值表示插入是否发生。真正   表示插入,假表示不插入

只需针对您的情况获取此信息,然后再次循环以供下一次用户输入。


这是示例代码cppreference.com

#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 :(得分:1)

排序,然后检查相邻项目是否相等。

答案 2 :(得分:1)

首先,尽量不要将实际需求与实施细节混为一谈。

  

[...]程序将要求输入5个数字(又名白球)的地方   并输入一个6元素数组和另一个数字(红色   强力球)进入第六个元素。

您真正想要的是:从用户输入中提取5个不同的数字。从您的代码中,我读到检查应该在每次输入之后进行。我想读最后一个数字是可以的,所以让它放在一边吧。

接下来,习惯使用containers in the standard library。它们的数量并不多,但是您可以做的事无数。要在容器中包含不同的元素,您需要std::unsorted_setstd::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