2016-10-09 3 views
-1

ich zur Zeit mit der Programmierung zu tun Praxis bin (vor allem mit C-Programmierung) und ich versuche, ein Ende des Kapitel Problems aus, das diese Beschreibung hat:Ausgabe Mit Arrays Für die Suche nach doppelten Integers

„Verwenden Sie einen Single-indizierte Array löse das folgende Problem: Lies 20 Zahlen ein, die jeweils zwischen 10 und 100 sind Da jede Zahl gelesen wird, drucke sie nur, wenn es sich nicht um ein Duplikat einer bereits gelesenen Nummer handelt Fall "in dem alle 20 Zahlen sind unterschiedlich. Verwenden Sie das kleinstmögliche Array, um dieses Problem zu lösen"

Hier ist, was ich bisher:

#include <stdio.h> 
#include <stdbool.h> //used this library for the ability to use true and false 
#define SIZE 20 

bool searchArray(int integer, unsigned int j); //prototype for the searchArray function 

int main (void) 
{ 

bool print; 
int numbers[20]; 
unsigned int i; 

for (i = 0; i < SIZE; i++) 
{ 
    scanf("%d", &numbers[i]); 
    print = searchArray(numbers[i], i); //receives true or false 

    if (print == true) 
    { 
     printf("\nNumber at element %d: %d\n", i, numbers[i]); 
    } 
    else if (print == false) 
    { 
     printf("\nThis element has a copy in the array already\n"); 
    } 



} 

} 


bool searchArray(int integer, unsigned int j) //function that helps decide whether or not to print out the integer 
{ 
static int numberscopy[20]; 
unsigned int n; 


numberscopy[j] = integer; 

for (n = 0; n < SIZE; n++) 
{ 

     if (numberscopy[n] == numberscopy[j] && n != j) // for making sure that the inputted integer is equal to any element that's currently in the array and making sure it's not including the very same integer that was just input on it's first appearance 
     { 
      return false; 
     } 
    return true; 
} 

} 

ERKLÄRUNG: Was ich in diesem Programm tat, war, dass ich eine Funktion definiert searchArray genannt, die an den Eingängen des aktuellen Array-Element und Array-Index geben einen Booleschen Wert basiert (richtig oder falsch). In meiner for-Schleife in der Hauptfunktion habe ich scanf benutzt, um ganze Zahlen vom Benutzer einzeln zu empfangen. Jedes dieser Integer-Elemente wird in einem Array-Index in einem Array namens "numbers" abgelegt.

Dann werden sowohl das Array-Element als auch der aktuelle Index des Arrays, in dem sich das Programm befindet, in die searchArray-Funktion eingefügt. Innerhalb der searchArray-Funktion wird jedes Element in das lokale 20-Element-Array der Funktion mit der Bezeichnung "numbercopy" eingegeben (wobei in diesem Array jede Zahl eingegeben wird, basierend auf dem aktuellen Wert von i, der das searchArray passiert). Dann gibt es innerhalb der searchArray-Funktion eine for-Schleife, die alle aktuellen Elemente im numbercopy-Array durchsucht und prüft, ob die gerade eingegebene Integer bereits im numbercopy-Array ist. Wenn es gefunden wird, gibt es "false" zurück. Wenn nicht, wird stattdessen "true" automatisch zurückgegeben.

Ich dachte, das würde funktionieren, aber das Problem ist, dass es scheint, nur Duplikate der allerersten Ganzzahl zu erkennen, die bei jedem Lauf eingegeben wird. Wenn zum Beispiel eine Zahl 25 zuerst eingegeben wird, dann eine 32 als nächstes, dann wieder eine 25 und dann wieder eine 32, erkennt sie richtig, dass die 25 bereits in der Anordnung ist, wenn ich 25 zur zweiten Zeit stelle, aber für die 32 Es scheint es nicht zu erkennen und druckt 32, wenn es wieder eingefügt wird. The example here

Wer weiß, warum das nicht funktioniert, wie ich dachte, es wäre?

+0

Wenn Sie * indent * Ihr Code korrekt, dann werden Sie den Fehler sofort sehen. Auch jeder vernünftige Compiler sollte eine Warnung wie "Kontrolle kann Ende der nicht-void-Funktion erreichen" ausgeben. Ein anderer Ansatz wäre es, den Code zu debuggen. –

+0

Entschuldigung, ich habe vergessen, den Code zu korrigieren, den ich hatte, als ich ihn hier hineinkopierte, ich habe sie tatsächlich eingerückt. Was meinen Compiler angeht, starte ich meine C-Programme auf dem Ubuntu-Terminal (im Moment habe ich keine IDE, deshalb habe ich auf Ubuntu partitioniert, das auf meinem Computer programmiert wurde). – dj2k

+0

Sie benötigen keine IDE, um Compiler-Warnungen zu erhalten. Verwenden Sie gcc als Compiler? Dann versuche 'gcc -Wall main.c'. –

Antwort

0
for (n = 0; n < SIZE; n++) 
{ 

     if (numberscopy[n] == numberscopy[j] && n != j) 
     { 
      return false; 
     } 

} 
     return true; 
} 

statt

for (n = 0; n < SIZE; n++) 
{ 

     if (numberscopy[n] == numberscopy[j] && n != j) 
     { 
      return false; 
     } 
    return true; 
} 

} 
+0

Das hat funktioniert! Ich fühle mich so dumm, es war einfach so! Obwohl jeder Ahnung hat, warum das, was ich vorher hatte, nur für die allererste Ganzzahl, die eingegeben wurde, funktioniert hat? – dj2k

+0

Da in Ihrem Beispiel die Zahlen [0] = 25, und die Schleife beginnen, die Variable aus Index 0 zu vergleichen, so dass es gelingen. – mrsiz

+0

Hmm ok. Ich dachte ursprünglich, wo ich "return false" platzierte. war nicht wirklich wichtig, da ich angenommen habe, solange die "Rückkehr falsch"; wurde nicht erreicht, es würde stattdessen zu "Rückkehr wahr" gehen. – dj2k

Verwandte Themen