2016-11-24 5 views
0

Ich mache ein Programm, das ein Array von Zahlen einliest und dann nur die doppelten Nummern anzeigt. Mein Code verhält sich jedoch merkwürdig und gibt falsche Ausgaben aus (Ausgänge am Ende angehängt). Dies ist mein Code so weit:Anzeige doppelte Zahlen in einem Array von Zahlen

#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; 
} 

Mein Eingang:

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 

Meine Ausgabe:

Das Duplikat 1 gefunden wurde. Das Duplikat 1 wurde gefunden. Das Duplikat 1 wurde gefunden. Das Duplikat 1 wurde gefunden. Das Duplikat 1 wurde gefunden. Das Duplikat 1 wurde gefunden. Das Duplikat 1 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 1 wurde gefunden. Das Duplikat 1 wurde gefunden. Das Duplikat 1 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden. Das Duplikat 0 wurde gefunden.

Wie Sie sehen können, zeigt die Ausgabe keine doppelten Nummern an. Ich denke, es hat etwas mit der Schleife zu tun, obwohl ich nicht weiß, wie man es debuggt. Kann mir jemand erklären, warum nicht der Code die doppelten Elemente im eingelesenen Zahlenfeld anzeigt? Jede Hilfe wird geschätzt. Vielen Dank!

+0

Was passieren Sie zwei Parameter ('numberUsed' und' n') zu 'deleteRepeats'? Wäre 'numberUsed' nicht ausreichend? (Es würde sicherlich vermeiden, 20 Nachrichten für ein 5-Elemente-Array anzuzeigen). Beachten Sie auch, dass Ihre Funktion einen seltsamen Namen hat: Sie heißt 'deleteRepeats', löscht aber eigentlich nichts ... –

Antwort

0

Ihre Schleife läuft, bis das maximale Ende iof Array (so bis 20), scheint es, dass Sie Ihre Array mit Nullen initialisiert wird, so dass Ihre Eingabe übersetzt

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

alle 0 Berichte alle dahinter Nullen - > das ist die Ausgabe, die Sie sehen, Ihre Schleife nicht MAX_NUMBER_ELEMENTS ...


hier eine mögliche Korrektur numberUsed gehen (nicht getestet, aber die Idee sollte klar sein):

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. "; 
     } 
    } 
} 

Nachtrag: nur (i,j) < numberUsed verwenden ist gefährlich, weil Sie

außerhalb der Grenzen nicht initialisierten Speicher bekommen konnte
+0

Beleuchtet! Das hat mein Problem gelöst. –

+0

Hinweis: Es gibt keinen Grund, zwei Größen an "deleteRepeats" zu übergeben, "numberUsed" kann NIEMALS größer als "n" sein, weil Sie sonst bereits alle Speicherbereiche beschrieben haben, die beim Ausfüllen nicht im Array waren. –

Verwandte Themen