我正在尝试编写为彩票生成三位数的数字的程序,而用户输入三位数的数字。

  • 如果用户输入按准确顺序匹配彩票,则奖励为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";
    

    最佳答案

    如果块不正确,则在第二和第三个测试条件中。

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

    在这种测试条件下,存在许多问题。
  • 首先,这容易被短路。如果n1匹配h1或h2,则其余条件不会得到测试。记住&&之后,每次比较都适用相同的条件,在&&中,短路的两个条件都必须成立。
  • 假设我们放置了防止出现这种情况的方括号,那么您的条件对于所有三个匹配的顺序都是正确的。

  • 看到这两个问题,最好重新设计逻辑,因为这会使第三块的 Action 变得多余。您的第三个程序段将以某种输入组合运行,而不是您期望的操作

    我认为编码程序逻辑的一种更好的方法是分别比较每个字符并为找到的匹配数维护一个计数器。
    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";
    

    10-07 13:20