2011-03-07 76 views
0

我寫了下面的代碼洗牌一副紙牌:For循環不表現爲預期沒有嵌套的DO-而

int i,j; 
for(int x=1;x<53;x++) { 
    i=rand()%4; 
    j=rand()%13; 
    if(deck[i][j]=0) 
     deck[i][j]=x; 
    else 
     x--; 
} 

這並沒有產生任何結果,而下面的代碼產生的結果:

int i,j; 
for(int x=1;x<53;x++) { 
    do { 
     i=rand()%4; 
     j=rand()%13; 
    } while(deck[i][j]!=0); 
    deck[i][j]=x 
} 

這有什麼不同?

+0

你是什麼意思*沒有產生任何結果*?你在期待什麼,實際發生了什麼? – 2011-03-07 14:28:30

+2

'if(deck [i] [j] = 0)'是賦值,因此總是爲真,使用比較運算符'=='並再次檢查。 – sled 2011-03-07 14:28:44

+0

@sled,你是不是故意「因此總是虛假」? – 2011-03-07 15:46:31

回答

7

我沒有看完你的邏輯,但if(deck[i][j]=0)聞起來像一個問題。你的意思是if(deck[i][j]==0)

編輯現在看着它,我不知道你是如何得到你得到的答案。底部循環選取一個隨機的i和j值,並確保deck[i][j]爲0(或NULL,我猜測)。當它爲[i] [j]找到NULL值時,它將x賦值給它。

在你的循環中,如果deck [i] [j]不爲空(假設你的意思是==,我認爲你做了),那麼你將遞減x。底部循環在身體內部的任何地方都不會觸摸X - 只有在for狀態下。你爲什麼決定減少x?

4

if(deck[i][j]=0)是不是一個比較,使用==

(它現在的任務,始終假 - 的(a=b)b,在這種情況下,b爲0,0是假)

5

的問題是,在你的

if(deck[i][j]=0) 

您使用=,而必須使用==

賦值運算符(=)的結果是對分配對象的引用,在這種情況下,它是對deck[i][j]的引用,您剛剛設置爲0.因此,就像您寫入if(0)if(false)。這就是爲什麼你的代碼永遠不會執行。 HTH

* 作爲附帶說明,請注意,在C++中,我們std::random_shuffle函數,它是在<algorithm>頭*

0

替換

if(deck[i][j]=0) //assigns 0 to deck[i][j] 

與此線

if(deck[i][j]==0) 
0

由於使用賦值而不是比較,你的第一個循環將永遠持續下去。 「if」將總是評估爲false(可惜int容易退化爲bool),所以x會在每個循環中遞減到原來的位置。

在任何情況下,儘管這是一種非常低效的洗牌方式,因爲您稍後會收到大量衝突。你應該做的是從x到x隨機選擇一個隨着x減小的數字,並且在開始使用一個沒有混洗的包後,用位於該位置的卡交換下一個空閒空間。

即:

開始用52位,其中位置0成立0,位置1保持1等

從0至51(含)選擇一個號碼的包。 無論出現什麼號碼,請將位置51(這將是51)中的內容與之交換。例如,如果你17,把17到51單元格並移動到51單元17

現在選擇從0到50與50位交換了一個數字,等

0
if(deck[i][j]=0) 

這就是問題。你想寫==

這就是爲什麼一些指引建議,應該寫爲,

if(0 == deck[i][j]) 

因爲偶然的錯誤是在編譯時被捕獲。我的意思是如果你錯誤地寫了=而不是==,那麼代碼甚至不會編譯!