2017-03-22 2 views
0

Immer wenn ich versuche, den folgenden Code zu kompilieren, kann ich den Anfangswert eingeben, nach dem ich frage, aber dann passiert nichts. Außerdem gibt es keinen Build-Fehler, der aufgenommen wird, also weiß ich nicht, warum das passiert. Bitte helfen Sie und danken Sie im Voraus.Kompilieren meines einfachen C-Codes

#include <stdio.h> 
#include <stdbool.h> 
int n; 
int allDaPrimes[1000]; 
int counter = 0; 
bool isPrime(int number); 
int i; 

int main() 
{ 
    printf("Please enter a numeric value now: "); 
    scanf("%d", &n); 
    for (i = 2; i <n; i++){ 
     isPrime(i); 
     if(isPrime(i)) { 
      allDaPrimes[counter] = i; 
      counter++; 
     } 
     } 


    for(i= 0; i==counter; i++){ 
     printf("%d", allDaPrimes[i]); 
    } 
    return 0; 

    } 

bool isPrime(int number) { 
    for (i= 2; i <= number; i++){ 
     if(number % i == 0 && number != i){ 
      return false; 
     } 

    } 
    return true; 
} 
+0

Ich nehme an, das liegt daran, dass Ihre 'isPrime'-Funktion eine schreckliche Komplexität hat, also läuft sie für immer. Versuchen Sie, auf 'int (sqrt (number) +0.5)' zu beschränken, Sie werden die gleichen Ergebnisse haben, viel schneller. Hinweis: Sie rufen es zweimal in Ihrer Schleife an; es noch schlimmer machen. –

+1

Wenn es bis zu dem Punkt läuft, an dem Sie einen Wert eingeben können, handelt es sich nicht um ein * compiling * -Problem, weil Ihr Code kompiliert, verknüpft und ausgeführt wurde. Jetzt ist es ein * Debugging-Problem, und Sie verwenden einen Debugger, um durch den Code zu gehen. –

+0

Verwenden Sie stattdessen einen Siebalgorithmus. (Nachsieb von Erathostenen) –

Antwort

1

Alle Ihre Variablen werden global und nicht lokal in den Funktionen deklariert, in denen sie verwendet werden. Dies bedeutet, dass Sie Konflikte zwischen den verschiedenen Funktionen bekommen.

Nehmen Sie zum Beispiel i. In der Schleife in main, beginnen Sie damit auf 2 gesetzt. Aber isPrime() ändert es zu n+1, weil das der letzte Wert ist, der sein wird, nachdem die Schleife dort beendet wird. Aber Sie rufen das zweimal an, so dass in+2 endet, so dass die Hauptschleife nur einmal ausgeführt wird. Und wenn Sie irgendwelche Werte im Array haben, ist es n+2, wenn n+1 eine Primzahl war.

+0

Guter Arbeitsmann! Darüber hinaus war auch wahr, was in der anderen Antwort angegeben ist. – linuxfan

+0

drehte gerade alle meine "ich" in "ich, j, k ... etc" und es funktioniert !!!!! Vielen Dank Chris! –

+0

@PeterLouis während das zweifellos "funktioniert", wäre der richtige Weg, "int i;" an den Anfang des Blocks zu setzen, in dem sie verwendet werden. Es gibt kein Problem mit der Wiederverwendung von "i" in der zweiten Hauptschleife wie du es initialisierst. –

3

Dies ist ein logischer Fehler im Code, die Ihr Code bedeuten genau das tut, was Sie gesagt, dass es zu, aber es ist nicht das, was Sie im Auge im Kopf hatten.

Das Problem ist, diese Aussage

for(i= 0; i==counter; i++){ 
    printf("%d", allDaPrimes[i]); 
} 

Es mit i = 0 beginnt läuft dann während i == Zähler, das ist wahrscheinlich nicht das, was Sie im Sinn hatte. Wahrscheinlich meinten Sie: i<counter

+0

Wow, ich bin dumm! Ich habe gerade angefangen zu lernen, wie man programmiert, also denke ich, dass es einige ernste Lernschmerzen gibt. Vielen Dank! –

+0

Also habe ich dieses Problem behoben und es "i <= counter" gemacht und das Problem besteht :( –

+1

Versuchen Sie, die Nummer 11 als Eingabe einzufügen und zu sehen, ob es funktioniert, wenn Sie riesige Zahlen eingeben, kann es einfach hängen, da es dauert so lange gegeben Ihr Algorithmus – Simba

Verwandte Themen