2016-12-17 7 views
-2

Ich bin ein C++ Programmierer. Ich habe Sieb von Eratosthenes versucht. Mein Programm berechnet Primzahlen bis zu einer Million schnell und entspricht dem, was Sie eigentlich ist. Aber woher weiß ich, ob es einen besseren Weg gab, es zu codieren, oder ob meine Art zu programmieren schlecht ist.Woher weiß ich, ob mein Ansatz gut oder schlecht ist?

Viele Leute sagen versuchen Google und vergleichen Sie es mit anderen lösen es. Ich unterstütze das nicht, denn wie jeder weiß, hat jeder Programmierer eine andere Herangehensweise an ein Problem.

Link zu meinem Code: http://pastebin.com/qkrBpd29

+0

Kommentare zu Ihrem Code können Sie auf [Code Review] (http://codereview.stackexchange.com) – celtschk

+1

Funktioniert es? Ist der Code lesbar? Ist es wartbar? Dann ist deine Lösung in Ordnung.Es ist wahrscheinlich, dass Sie immer auf Code zurückblicken, den Sie in 6 Monaten geschrieben haben, und etwas mit neu gewonnenem Wissen etwas anders machen. Nicht jeder Code, den Sie schreiben, muss "der perfekte Weg sein, Dinge zu tun". Wenn Sie nach einem Feedback zum Code suchen, lesen Sie nach [Code review SE] (http://codereview.stackexchange.com/) – Tas

+1

Schreiben Sie Ihren Code. Geh weg und mache andere Projekte, die nichts mit diesem Code zu tun haben (das können andere Softwareprojekte, die Renovierung eines Hauses oder was auch immer sein, solange du überhaupt nicht an diesen Code denkst). Nach sechs Monaten, Staub von Ihrem Code. Wenn Sie feststellen, dass der Code klar und verständlich ist, wird er weitergegeben. Wenn Sie den Code ein Durcheinander finden, ist es kein guter Code. – Peter

Antwort

2

Edit: Ich habe erkannt, dass der Code nicht wirklich jeder von C++ 's-Funktionen verwenden, nur std::cin und std::cout. Es ist im Grunde C-Code. Meine Antwort unten ging davon aus, dass Sie mit C++ arbeiten.

Mit Blick auf Ihren Code würde ich empfehlen, über Speicherverwaltung nachzudenken. Sie haben Objekte mit Ressourcen geschrieben, die nicht zerstört werden. Sie schreiben globale Funktionen, die ein Knotenobjekt akzeptieren, wenn diese Funktionen Klassenfunktionen sein sollen.

Erfahren Sie mehr über Smartpointer std::unique_ptr und std::shared_ptr von #include <memory> und wo Sie sie entsprechend verwenden.

Wenn möglich, wann immer Sie etwas auf dem Heap benötigen, deklarieren Sie etwas auf dem Stack, um sicherzustellen, dass es danach bereinigt wird, dies ist als RAII bekannt. (Nebenbei bemerkt, RAII, ist ein schrecklicher Name, der geblieben ist, keine Sorge über das, was für sie steht, da es nicht sehr aussagekräftig.)

lesen Effective C++ by Scott Meyers und Effective Modern c++ Scott Meyers.

Es gibt auch einige große Vorträge von cppcon auf Youtube.

+0

Vielen Dank. Früher hatte ich dieses Problem auch früher, Klassen zu benutzen übersprang meine Gedanken. Danke –

+0

Etwas, das mich überrascht über C++ ist, dass Struktur und Klasse fast identische Bedeutungen haben. Ich war überrascht, dass in C++ eine Struktur Destruktoren, Konstruktoren, Vererbung, Funktionen, private Mitglieder haben kann. Der einzige Unterschied ist die Standardsichtbarkeit. Klassenmitglieder und Methoden sind standardmäßig privat, Strukturen sind standardmäßig öffentlich. –

1

Wenn ich das richtig verstanden, dann ist Ihre Implementierung basierend auf Listen. Das ist nicht sehr gut, weil Sie zu den korrekten Positionen gelangen müssen, bevor Sie löschen können. Ich denke, es ist viel einfacher, ein Array zu verwenden, anstatt (sorry, Java-Code):

boolean[] isNotPrime = new boolean[MAX + 1]; 
// we know 2 is prime, it's enough to look at the odd numbers 
primes.add(2); // list of primes 
for (int i = 3; i < isNotPrime.length; i += 2) { 
    if (isNotPrime[i]) 
    continue; 
    primes.add(i); 
    for (int j = 3 * i; j < isNotPrime.length; j += 2 * i) 
    isNotPrime[j] = true; 
} 
0

Kein Code ist perfekt und es gibt viele richtige Wege, Dinge zu tun, sondern sich selbst oder andere die folgenden Fragen sollen Ihnen helfen.

  1. Ist mein Code korrekt? Produziert es ständig die richtigen Antworten?
  2. Ist mein Code effizient?
  3. Ist mein Code wartbar? Kann jemand anders darauf aufbauen ohne das Ganze neu schreiben zu müssen?
0
struct Node{ 
    int a; 
    Node* linkl; 
    Node* linkr; 
    }*top,*rear; 

oben und hinten sind globale Variablen. Nicht gut. Globals müssen sehr selten sein und Sie brauchen sie hier nicht.

Verwandte Themen