2017-03-24 1 views
0

Okay, was mache ich hier falsch?Seltsame Array-Ausgaben

Dieses Programm soll 20 Ganzzahlen lesen und dann ein Array der Ganzzahlen ausgeben, die keine Duplikate sind (Ausgabe jeder Ganzzahl nur einmal).

//Program to read 20 integers and return each integer only once (no duplicates). 
#include <stdio.h> 

int main() 
{ 
    int a, b, count=0, temp, array1[20]; 

    printf("Enter 20 array elements between 1 and 10 inclusive\n"); 
    for (a=0; a<20; a++) //Loop to enter 20 elements 
    { 
     scanf("%d", &temp); 
     for (b=0; b<=20; b++) //Loop to test each new element against all previous entered elements 
    { 
     if (array1[b] == temp) //If duplicate increment count 
     { 
      count++; 
     } 
     else if (count == 0 && b == 20) //If there have been no duplicates and 20 numbers have been tested... add entered number to the array 
     { 
      array1[a] = temp; 
     } 
    } 
} 
for (a=0; a<20; a++) 
{ 
    printf("%d\t", array1[a]); 
} 
return 0; 

}

+1

Was sind Ihre Eingaben? Was hast du als Output gesehen? – skrrgwasme

+0

Wenn ich zum Beispiel 1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1,2 eingeben. Ich bekomme die Ausgabe: 4200256, 0, 24, 0, 7344944, 0, 1, 0, -1, -1, 4200357, 0, 1, 0, 4200 233, 0, 0, 0, 24, 0 –

+0

@JakeRitter Bitte geben Sie alle Informationen in die Frage ein, indem Sie sie bearbeiten und nicht in Kommentaren. –

Antwort

2

Hier sind die folgenden Dinge falsch.

  1. In der inneren Schleife, während der ersten Überprüfung, vergleichen Sie mit 20 Elementen. Beim Empfang des ersten Elements haben Sie keine Elemente, mit denen Sie vergleichen können. Ich habe eine Variable size hinzugefügt, um die Größe des Arrays anzuzeigen. size initialisiert auf 0

  2. Die if (count == 0 && b == 20) sollte außerhalb der for-Schleife bewegt werden, und kann

  3. zu if (count == 0) vereinfacht werden, wenn ein Element zu dem Array hinzugefügt wird bei array1[size] und size hinzugefügt wird, wird erhöht.

  4. Sie müssen count bei jeder äußeren for-Schleife reinitialisieren, wie unten gezeigt.

  5. Beim Drucken werden size Elemente gedruckt, die nicht doppelt vorhanden sind.

Der Code ist unten.

//Program to read 20 integers and return each integer only once (no duplicates). 
#include <stdio.h> 

int main() 
{ 
    int a, b, count=0, temp, array1[20]; 

    int size = 0; 
    printf("Enter 20 array elements between 1 and 10 inclusive\n"); 
    for (a=0; a<20; a++) //Loop to enter 20 elements 
    { 
     scanf("%d", &temp); 
     count = 0; 
     for (b=0; b<size; b++) //Loop to test each new element against all previous entered elements 
     { 
      if (array1[b] == temp) //If duplicate increment count 
      { 
       count++; 
      } 
     } 
     if (count == 0) //If there have been no duplicates and 20 numbers have been tested... add entered number to the array 
     { 
      array1[size] = temp; 
      size++; 
     } 
    } 
    for (a=0; a<size; a++) 
    { 
     printf("%d ", array1[a]); 
    } 
    return 0; 
} 

Dieser Code akzeptiert 20 Elemente und speichert und zeigt so viele an, wie sie nicht doppelt vorhanden sind (was 1-20 sein kann). Wenn Sie 20 nicht doppelte Elemente speichern möchten (möglicherweise mehr als 20), können Sie sie leicht ändern.

1

Sie haben mehrere liest von nicht initialisierten Variablen, die nicht definiertes Verhalten ist. Sie greifen auch außerhalb des Bereichs auf das Array zu.

for (b=0; b<=20; b++) 
      ^^ 
      This will result in b in the range [0..20] 
{ 
    if (array1[b] == temp) //If duplicate increment count 
     ^^^^^^^^^ 
     array1[b] is uninitialized 
     and when b is 20 you access out of range 

Weiterhin nur Sie auf das Array schreiben, wenn Zahl 0 und b ist 20

else if (count == 0 && b == 20) 
    { 
     array1[a] = temp; 
    } 

Beachten Sie, dass Sie nie count so nach dem ersten Spiel zurückgesetzt werden Sie nie wieder das Array schreiben

BTW - Sie drucken:

Enter 20 array elements between 1 and 10 inclusive 

aber man kann nie alle Prüfungen der zuführen Eingabewert in diesem Bereich.