2017-08-28 46 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; 
} 

請檢查是否有所幫助。