2016-07-12 27 views
-1

Das Ziel hier ist es, 1 Zahl von stdin und dann eine Reihe von Zahlen zu lesen und dann zu überprüfen, ob die beiden eine Bijektion sind. Wenn ich es richtig verstanden habe, bedeutet das, dass die erste Zahl in der Menge der Zahlen sein muss und dass es keine doppelten Zahlen in der Menge geben darf.Lesen von stdin und vergleichen Zahlen in C

Probeneingang

3 
1 2 3 

Beispielausgabe

YES 

Probeneingang

5 
2 3 4 5 2 

Beispielausgabe

NO 

Mein Eingang

3 
1 2 3 

Meine Ausgabe

NO 

Es scheint, dass mein Fehler fr kommt om mein Array, das nach Duplikaten sucht. Es wird immer checkDups bis 1. Dieses Stück Code einstellen:

for(x=0; x < 20; x++) { 
    if(n == numbers[x]) checkNums = 1; 
    for(y=0; y < 20; y++) { 
     if(x != y && numbers[x] == numbers[y]) { 
      checkDups = 1; 
     } 
    } 
} 

vollständigen Code

int n; 
int numbers[21]; 
int i = 0; 
int x = 0; 
int y = 0; 
int checkDups = 0; 
int checkNums = 0; 

scanf("%d", &n); 

while(i < 20 && scanf("%d", &numbers[i]) == 1) i++; 

for(x=0; x < 20; x++) { 
    if(n == numbers[x]) checkNums = 1; 
    for(y=0; y < 20; y++) { 
     if(x != y && numbers[x] == numbers[y]) { 
      checkDups = 1; 
     } 
    } 
} 

if(checkNums == 1 && checkDups == 0) printf("YES"); 
else printf("NO"); 
+1

Schreiben Sie nicht Code, der schwer zu lesen ist, 'for (i = 0; ((i 20 <) && (scanf ("% d", & Zahlen [i])); ++ i) 'ist viel besser lesbar. Und eine Zeile' if'-Anweisungen fügen dem Code nichts hinzu, sind aber schwierig zu lesen.Verwenden Sie auch konsistente Leerstellen. –

+0

@iharob danke. Wird überarbeitet. Hast du andere Fehler entdeckt? – Adjit

+0

Das sind keine Fehler, aber gut lesbar und schönen Code ist ein guter Anfang, um irgendwelche zu finden. –

Antwort

3

Da es eine ist nicht initialisiertes Array (numbers), kann das Verhalten von == nicht sicher sein.

In C11 Standarddokument

ein L-Wert, ein Objekt des automatischen Lagerdauer bezeichnen, die mit dem Register Speicherklasse wird in einem Kontext verwendet, erklärt worden sein könnte, der den Wert des bezeichneten erfordert Objekt, aber das Objekt ist nicht initialisiert. (6.3.2.1).

So das Ergebnis mit numbers[x] (numbers[y]), wo x >= i (y >= i) ist nicht definiert.

Bitte verwenden Sie keine nicht initialisierten Bereich (in diesem Fall die Indizes über i)

+0

Ahh okay, ich bin gerade wieder in C, so müssen sich daran gewöhnen, alles zu initialisieren. Aber jetzt, selbst wenn ich es initialisiere, wird meine Schleife diese initialisierten Werte durchlaufen und wenn sie alle 0 sind, wird es eine Übereinstimmung finden. Obwohl ich zumindest jetzt weiß, was zu tun ist, um das Problem zu lösen. Danke für die Erklärung. – Adjit

+0

@Adjit, nicht nur vor dem Initialisieren aller Array-Elemente, sondern auch nach der Initialisierung sollten Sie sich vor dem Zugriff schützen. In Ihrem Quellcode, für die Anweisung zu überprüfen, ob __any das gleiche Paar existiert__ oder nicht, also, wenn Sie __alle Array-Elemente als '0' __ initialisieren, werden alle zwei Elemente jenseits der Eingabe als __gleiches Paar__ –

2

Diese for Schleife funktioniert für mich geändert:

for(x=0; x < i; x++) { 
    if(n == numbers[x]) 
     checkNums = 1; 
    for(y=x; y < i; y++) { 
     if(x != y && numbers[x] == numbers[y]) { 
      checkDups = 1; 
     } 
    } 
}