2016-11-24 56 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',因为否则在填充时你已经在整个内存中没有写入数组了。 –