2017-08-28 20 views
0

我一直在试图让我的C++程序检查数组中的重复项,因为我需要这个程序来编写程序。但是,它不起作用,我想我知道这个问题是怎么回事,但我不知道如何解决它。如何确保数组中没有重复项?

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <algorithm> 

using namespace std; 

int asknum(int ask); 
int check(int checking); 

bool error = false; 

int test [10] = {}; 

int i = 0; 

int gen = 0; 

int main() { 
    //int gen = 0; 

    for (i=0; i<10; i++) { 
     gen = asknum(gen); 
    } 
    for (int b=0; b<10; b++) { 
     cout << test [b] << endl; 
    } 

    return 0; 
} 

int asknum(int ask) { 
    ask = 0; 
    gen = 0; 
    int nouse; 
    cout << "Please enter a value: "; 
    cin >> ask; 
    error = 0; 
    nouse = check(ask); 
} 

int check(int checking) { 
    int n = 0; 
    for (n=0; n<10; n++) { 
     int temp = test [n]; 
     if (temp == checking) { 
      cout << "Value is the same. Enter another value.\n"; 
      error = 1; 
      gen = asknum(gen); 
     } 

    } 

    if (n == 10) { 

     if (error == 0) { 
      gen = 0; 
      test [i] = checking; 
     } 
    } 
} 

我的代码有什么问题?我第一次编写代码时,它的工作很完美。但是当我注意到一个缺陷,那就是如果你经常输入一个现在的数字,它会停止询问一个新的数字,我决定把代码移入函数,但现在它不能正常工作!这里是输出:

Please enter a number: 1 
Please enter a number: 2 
Please enter a number: 3 
Please enter a number: 3 
That number already is used. Please type in another value. 
Please enter a number: 4 
Please enter a number: 5 
Please enter a number: 6 
Please enter a number: 7 
Please enter a number: 8 
Please enter a number: 9 
Please enter a number: 10 
1 
2 
3 
3 
5 
6 
7 
8 
9 
10 

我认为通信有问题。请帮忙!

谢谢!

+7

使用'std :: set'来保证容器不会包含重复项。 – user0042

+0

我会在哪里放置? –

+0

而不是'int test [10] = {};':'std :: set test;'你的代码需要更多的适配。 – user0042

回答

1

Okey,所以你想要做的是要求用户输入一个整数,如果你的容器中不存在该整数,你想将它添加到容器中。

在C++中,我会建议避免c风格的数组,而不是看看使用其中一个C++容器,例如std::set

那么参考页面告诉我们关于std::set的是什么?

集合是按照特定顺序存储唯一元素的容器。

听起来就像我们想要的!

最大的好处是std::set内置了功能,例如,基于元素的值查找现有的元素。

的如何可以看的一个例子:

void getNumberFromUser(set<int>& numbers); 

int main() 
{ 
    set<int> numbers; 

    for (int i = 0; i < 10; ++i) { 
     getNumberFromUser(numbers); 
    } 

    for (auto& value : numbers) { 
     cout << value << endl; 
    } 

    return 0; 
} 


void getNumberFromUser(set<int>& numbers) 
{ 
    int value; 

    cout << "Please enter a value: "; 
    cin >> value; 

    auto result = numbers.insert(value); 

    while (!result.second()) { 
     cout << "That number is already used. Please type in another value.\n"; 
     cout << "Please enter a value: "; 
     cin >> value; 

     result = numbers.insert(value); 
    } 
} 

由于set::insert

返回一对,以其部件对::第一设置为指向任一新插入的元件或一个迭代到集合中已有的等价元素。如果插入了新元素,则将pair中的pair :: second元素设置为true;如果已经存在等效元素,则将该元素设置为false。

我们所要做的就是检查返回对的第二个值是true还是false,以确定该值是否已被使用。

我希望这有所帮助,不要害怕看c++ reference pages,他们不像你想象的那么可怕!

+0

谢谢!这工作:)我确实改变了一些东西,我不得不声明顶部的空白,并且我也使'int i'成为一个全局变量,所以我可以在if语句的底部添加'i - ',因为它会将失败的尝试计为一次尝试。 :) –

+0

不错!但是我建议不要使用全局变量,并且使用while循环来解决计数失败的问题。如果可以,应尽量避免全局变量。 – MaLarsson

1

添加副本3后,程序继续从gen = asknum(gen);继续执行,并在函数asknum(int ask)中将错误分配为0。这就是为什么它通过if条件来分配数组中的第i个元素。取下asknum(int ask)error=0后把它如果条件check

编辑: 检查了上述方案仍因asknum内调用asknum给予相同的输出然而误差值相同。使其在工作主要变化for循环CIN到:

for (i=0; i<10; i++) { 

    gen = asknum(gen); 
     if(error==1) 
     { 
      i--; 
      error=0; 
     } 
    } 

,并检查:

int check(int checking) { 
    int n = 0; 
    for (n=0; n<10; n++) { 
     int temp = test [n]; 
     if (temp == checking) { 
      cout << "Value is the same. Enter another value.\n"; 
      error = 1; 
      //fflush(stdout); 
      //cin.clear(); 
      //gen = asknum(gen); 
     } 

    } 
    //cout<<error<<"\n"; 

     if (error == 0) { 
      gen = 0; 
      test [i] = checking; 
      cout<<checking<<" "<<i<<"\n"; 
     } 
    //error=0; 
} 

请检查是否有所帮助。