2016-11-24 3 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'で十分ではないでしょうか? (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レポートに変換走ります - >可能補正(テストされていないが、考え方は明確にする必要があり)、ここで


...あなたのループがMAX_NUMBER_ELEMENTSしないnumberUsedに行かなければならないあなたが見る出力を、thatsの:

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を使用しますが、初期化されていないメモリに範囲外得ることができるので、あなたが `deleteRepeats`に二つのパラメータ(` numberUsed`と 'N'を)何を渡すか

+0

Lit!それが私の問題を解決しました。 –

+0

注: 'deleteRepeats'に2つのサイズを渡す理由はありません。' numberUsed'は 'n'より大きいことはありません。そうしないと、配列を埋める際に、 –

関連する問題