2013-02-02 91 views
1

我正在嘗試編寫生成彩票三位數字的程序,並且用戶輸入三位數字。蘭特數彩票程序

  • 如果用戶輸入的按照確切順序匹配彩票,獎勵是$ 10,000。
  • 如果用戶輸入與彩票相匹配,則獎勵爲$ 3,000。
  • 如果用戶輸入一個數字在彩票一個數字相匹配,該獎項爲$ 1,000個

但我沒有得到任何正確的結果。

h1=rand() % 10; 

int h2=rand() % 10; 
int h3=rand() % 10; 

cout<<"Enter three digite number\n"; 
cin>>n1>>n2>>n3; 

if(n1==h1&&n2==h2&&n3==h3) 
    cout<<"you win 10.000 award\n"; 
else 
    if(n1==h1||n1==h2||n1==h3&&n2==h1||n2==h2||n2==h3&&n3==h1||n3==h2||n3==h3) 
     cout<<"you win 3,000\n"; 
    else 
     if(n1==h1||n1==h2||n1==h3||n2==h1||n2==h2||n2==h3||n3==h1||n3==h2||n3==h3) 
      cout<<"you win 1,000\n"; 
     else 
      cout<<"you don't win anything sorry\n"; 
+0

可以接受兩次(或三次)相同的數字嗎?抽籤不均勻分佈是可以接受的嗎? – Damon

回答

1

您的測試條件在第二個和第三個if塊中是不正確的。

if(n1==h1||n1==h2||n1==h3&&n2==h1||n2==h2||n2==h3&&n3==h1||n3==h2||n3==h3) 

在這個測試條件下,存在很多問題。

  • 首先,這很容易被短路。如果n1與h1或h2匹配,則其餘條件不會被測試。同樣的情況適用於每次比較之後,請牢記其中兩邊的條件都需要爲短路準確的& &。

  • 假設我們放置了防止這種情況的括號,那麼您的條件對於任何順序的所有三個匹配都是正確的。

看到這兩個問題,最好是重做邏輯,因爲這會使第三塊的動作變得冗餘。你的第三塊將運行的投入一定的組合,而不是你希望它做


我認爲更好的方式來編寫你的程序邏輯將是一個個字符分別進行比較,並保持一個計數器數是什麼找到的比賽。

int c=0, win; 
if(n1==h1||n1==h2||n1==h3) c++; 
if(n2==h1||n2==h2||n2==h3) c++; 
if(n3==h1||n3==h2||n3==h3) c++; 

if(c==3) 
{ 
    //Check order of digits 
    if(n1==h1&&n2==h2&&n3==h3) win = 10000; 
    else win=3000 //All digits same but not in order 
} 
else if(c==2) 
    win=3000 
else if(c==1) 
    win=1000 
else 
    win=0 

if(win) cout<<"You win "<<win<<"\n"; 
else cout<<"you dont win anything\n"; 
+0

也許增加解釋爲什麼OP提供的解決方案不起作用會有所幫助。 –

+0

@ s.bandara查看更新。 – asheeshr

+0

感謝man程序完美運行 – Suno87