2016-11-24 35 views
0

我正在製作一個讀取數字數組然後只顯示重複數字的程序。但是,我的代碼行爲奇怪,並打印出不正確的輸出(輸出附在末尾)。這是到目前爲止我的代碼:在數組數組中顯示重複的數字

#include <iostream> 
using namespace std; 
const int MAX_NUMBER_ELEMENTS = 20; 

void fillArray (int a[], int size, int& numberUsed); 
void deleteRepeats (const int a[], int numberUsed, int n); 

int main() 
{ 
    int array [MAX_NUMBER_ELEMENTS], numberUsed; 

    cout << "This program reads in an array and scans for duplicate elements. " << endl; 
    cout << "Enter the array: \n"; 

    fillArray(array, MAX_NUMBER_ELEMENTS, numberUsed); 
    deleteRepeats(array, numberUsed, 20); 
} 

void deleteRepeats (const int array[], int numberUsed, int n) 
{ 
    int i, j; 

    for (i = 0; i < n; i++) 
    { 
     for (j = i + 1; j < n; j++) 
     { 
      if (array[i] == array[j]) 
       cout << "The duplicate " << array[i] << " was found. "; 
     } 
    } 
} 

void fillArray (int a[], int size, int& numberUsed) 
{ 
    cout << "Enter up to " << size << " nonnegative whole numbers.\n" 
     << "Mark the end of thae list with a negative number.\n"; 
    int next, index = 0; 
    cin >> next; 
    while ((next >= 0) && (index < size)) 
    { 
     a[index] = next; 
     index++; 
     cin >> next; 
    } 

    numberUsed = index; 
} 

我輸入:

This program reads in an array and scans for duplicate elements. 
Enter the array: 
Enter up to 20 nonnegative whole numbers. 
Mark the end of the list with a negative number. 
1 1 3 5 -1 

我的輸出:

重複的1被發現。找到了重複的1。找到了重複的1。找到了重複的1。找到了重複的1。找到了重複的1。找到了重複的1。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的1。找到了重複的1。找到了重複的1。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。找到了重複的0。

正如您所看到的,輸出不顯示重複的數字。我認爲它與循環有關,儘管我不知道如何調試它。任何人都可以啓發我爲什麼不是在讀入數組數組中顯示重複元素的代碼?任何幫助表示讚賞。謝謝!

+0

你怎麼傳遞兩個參數('numberUsed'和'N')爲'deleteRepeats'? 'numberUsed'不會足夠嗎? (它肯定會避免爲5個元素數組顯示20條消息)。還要注意你的函數有一個奇怪的名字:它被命名爲'deleteRepeats',但實際上並沒有刪除任何東西...... –

回答

0

你的循環運行,直到最大端陣列(所以20)IOF,似乎你的陣列與零初始化,所以你的輸入轉換爲

1 1 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

每0報告全部爲零背後 - >這是你看到的輸出,你的循環必須去numberUsed不MAX_NUMBER_ELEMENTS ...


這裏可能校正(未經測試,但這個想法應該清楚):

void deleteRepeats (const int array[], int numberUsed, int n) 
{ 
    int i, j; 

    for (i = 0; i < std::min(numberUsed, n); i++) 
    { 
     for (j = i + 1; j < std::min(numberUsed, n); j++) 
     { 
      if (array[i] == array[j]) 
       cout << "The duplicate " << array[i] << " was found. "; 
     } 
    } 
} 

附錄:只要使用(i,j) < numberUsed是危險的,因爲你可以得到出界未初始化的內存

+0

點亮!這解決了我的問題。 –

+0

注意:沒有理由將兩個大小傳遞給'deleteRepeats','numberUsed'永遠不會大於'n',因爲否則在填充時你已經在整個內存中沒有寫入數組了。 –