1

宝くじの 3 桁の数字を生成するプログラムを作成しようとしています。ユーザーは 3 桁の数字を入力します。

  • ユーザー入力が正確な順序で宝くじと一致した場合、賞金は $10,000 です。
  • ユーザー入力が宝くじに一致した場合、賞金は $3,000 です。
  • ユーザー入力の 1 つの数字が宝くじの数字と一致する場合、賞金は $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";
4

1 に答える 1

1

ブロックが正しくない場合は、2 番目と 3 番目のテスト条件。

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

このテスト条件では、多くの問題があります。

  • まず、これはショートしやすいです。n1 が h1 または h2 と一致する場合、残りの条件はテストされません。その後のすべての比較にも同じことが当てはまります。 && では、短絡のために両側の両方の条件が真である必要があることに注意してください。

  • これを防ぐ括弧を付けたと仮定すると、条件は 3 つすべてのマッチングに対してどの順序でも true になります。

これら 2 つの問題を考えると、3 番目のブロックのアクションが冗長になるため、ロジックを作り直すのが最善です。3 番目のブロックは、期待どおりの動作ではなく、特定の入力の組み合わせに対して実行されます。


プログラムロジックをコーディングするより良い方法は、各文字を個別に比較し、見つかった一致数のカウンターを維持することだと思います。

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";
于 2013-02-02T06:01:31.113 に答える