2016-12-17 106 views
-2

我是一名C++程序員。我正在嘗試Eratosthenes的篩子。我的程序正在快速計算多達100萬的素數,並且與Sieve實際相符。但是,我怎麼知道是否有更好的代碼編寫方式,或者我的編碼方式不好。我如何知道我的代碼方法好還是不好?

很多人都說google嘗試google,並將其與其他解決方案進行比較。我不支持這一點,因爲衆所周知,每個程序員都有不同的解決問題的方法。

鏈接到我的代碼:http://pastebin.com/qkrBpd29

+0

關於你的代碼的評論你可以在[代碼評論](http://codereview.stackexchange.com) – celtschk

+1

它工作嗎?代碼是否可讀?它可維護嗎?那麼你的解決方案很好。很可能你總是會回頭看看你在6個月時間內編寫的代碼,並用新發現的知識做一些稍微不同的事情。並不是所有你寫的代碼都需要是「完美的做事方式」。這就是說,如果你正在尋找代碼的一些反饋,看看[代碼審查SE](http://codereview.stackexchange.com/) – Tas

+1

寫你的代碼。離開並做其他與此代碼無關的項目(可以包括其他軟件項目,翻新房屋或任何其他項目,只要您完全不考慮此代碼)。六個月後,清除你的代碼。如果您發現代碼清晰易懂,就會通過。如果你發現代碼亂七八糟,那不是很好的代碼。 – Peter

回答

2

編輯:我只是意識到你的代碼並沒有真正使用任何C++的功能,只有std::cinstd::cout。它基本上是C代碼。我在下面的回答是假設你正在使用C++。

從看你的代碼我會建議,考慮內存管理。你用沒有破壞的資源編寫對象。當這些函數應該是類函數時,您正在編寫接受節點對象的全局函數。

瞭解智能指針std::unique_ptrstd::shared_ptr#include <memory>以及適當地使用它們的位置。

如果可能的話,每當你需要堆上的東西時,在棧上聲明一些東西以確保它在事後被清除,這就是所謂的RAII。 (旁註,RAII,是一直堅持一個可怕的名字,不用擔心它代表什麼,因爲它不是很描述。)

閱讀Effective C++ by Scott MeyersEffective Modern c++ Scott Meyers.

也有從cppcon上一些偉大的演講YouTube上。

+0

謝謝。我以前也曾經遇到過這個問題,使用類跳過了我的想法。謝謝 –

+0

讓我感到意外的是C++的結構和類具有幾乎相同的含義。我很驚訝地發現,在C++中,struct可以具有析構函數,構造函數,繼承,函數,私有成員。 唯一的區別是默認的可見性。類成員和方法默認是私有的,結構默認是公共的。 –

1

如果我理解正確的話,那麼你的實現是基於列表。這不是很好,因爲在刪除之前你必須找到正確的位置。我認爲這是更簡單的使用數組來代替(對不起,java代碼):

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

沒有代碼是完美的,也有做的事情,但問自己或他人的下列問題應該可以幫助你很多正確的方法。

  1. 我的代碼是否正確?它是否始終提供正確的答案?
  2. 我的代碼有效嗎?
  3. 我的代碼是否可維護?其他人可以輕鬆構建它而不必重寫整個事物嗎?
0
struct Node{ 
    int a; 
    Node* linkl; 
    Node* linkr; 
    }*top,*rear; 

頂部和後部是全局變量。不好。全局需要非常少見,你在這裏不需要它們。

相關問題