2016-10-03 10 views
1

私のプログラムが最後の "else"文の最後までスキップしている理由を理解できません。これは私のコードです。ちょうど始めたばかりなので少し荒いです。私はJavaに慣れていません。他に何かがあるならば、ちょうど尋ねる必要があります!私のif文、else文の問題

私たちが書き込むはずのプログラムは、ロッカーの組み合わせを取得するために使用されています。私は、12-34-56を入力すると、組み合わせが欲しいものをコーディングし、プログラムが動作します。しかし、私が12-12-34またはそれ以外のバリエーションを入力すると、自動的にプログラムの最後までスキップし、結果ではないにもかかわらず、一致しないと表示されます。代わりに、 "2つの数字はお互いに重複していると推測されます.2つの数字が組み合わせに表示されます。"

他に必要な場合は教えてください。ありがとう、素晴らしい一日を! (また、私はこのすべてを行うには、JavaとBlueJのを使用しています。)

import java.util.*; 
public class Combination 
{ 

public static void main(String[] args) { 

     int lock1 = 12; 
     int lock2 = 34; 
     int lock3 = 56; 

     Scanner input = new Scanner(System.in); 

     System.out.print("Enter first two digits: "); 
     int guess1 = input.nextInt(); 
     System.out.print("Enter second two digits: "); 
     int guess2 = input.nextInt(); 
     System.out.print("Enter last two digits: "); 
     int guess3 = input.nextInt(); 

     if (lock1 == guess1 && lock2 == guess2 && lock3 == guess3) { 
      System.out.print("Exact Match! Locker Unlocked"); 
     } 
     else if (lock1 == guess1 && lock2 == guess3 && lock3 == guess2 
     || lock1 == guess2 && lock2 == guess3 && lock3 == guess1 
     || lock1 == guess2 && lock2 == guess1 && lock3 == guess3 
     || lock1 == guess3 && lock2 == guess2 && lock3 == guess1 
     || lock1 == guess3 && lock2 == guess1 && lock3 == guess2) 
     { 
      System.out.println("All numbers match but not in the correct order"); 
     } 
     else if (lock1 == guess1 && lock2 == guess1 && lock3 == guess1 
     || lock1 == guess2 && lock2 == guess2 && lock3 == guess2 
     || lock1 == guess3 && lock2 == guess3 && lock3 == guess3) { 
      System.out.println("Guess contains 3 duplicate numbers."); 
      System.out.println("One number in the guess appears in the combination."); 
     } 
     else if (lock1 == guess1 && lock2 == guess1 && lock3 == guess2 
     || lock1 == guess1 && lock2 == guess1 && lock3 == guess3 
     || lock1 == guess2 && lock2 == guess2 && lock3 == guess3 
     || lock1 == guess2 && lock2 == guess2 && lock3 == guess1 
     || lock1 == guess3 && lock2 == guess3 && lock3 == guess2 
     || lock1 == guess3 && lock2 == guess3 && lock3 == guess1 
     || lock1 == guess2 && lock2 == guess1 && lock3 == guess1 
     || lock1 == guess3 && lock2 == guess1 && lock3 == guess1   
     || lock1 == guess3 && lock2 == guess2 && lock3 == guess2 
     || lock1 == guess1 && lock2 == guess2 && lock3 == guess2 
     || lock1 == guess1 && lock2 == guess3 && lock3 == guess3 
     || lock1 == guess2 && lock2 == guess3 && lock3 == guess3) { 
      System.out.println("2 numbers in the guess are duplicates of each other." + 
      "2 numbers guess appear in the combination."); 
     } 
     else{ 
     System.out.println("Sorry not a match"); 
     } 


    } 
} 
+0

ブール論理があなたの望むように機能することは確かですか?おそらくかっこが必要でしょうか? – bradimus

+1

Ahhh。あなたは本当にあなたのロジックと構文について考え直す必要があります。 –

+0

簡単に: 'lock1 == guess2'が間違っています。 –

答えて

1

2最後の他-IF-条件には二つの問題があります。

  1. lockguardスワップする必要があるが、 。我々は常に3つの推測をすべてチェックしたい。現在、1回の推測は2回/ 3回、1/2回の推測は無視されます。特に、2番目の最後のelse-ifは、lock1 = lock2 = lock3の場合にのみ入力できます。問題を見つけるもう1つの方法:Guess contains 3 duplicate numbers.を知るには、3つの推測をすべてチェックする必要があります。 Currenltyでは、1つの推測だけがチェックされます(ケースごと)。

  2. 最後のelse-if-conditionにいくつかの論理和がありません。正確に2回同じ推測を入力する可能性のある18のケースがあり、プログラムはそのうちの12個だけをチェックします。

ここには欠落したケースがあります。各数字は、3つの推測のうちの1つを表します。私は

guess1 == lock1 && guess2 == lock1 && guess3 == lock1 
|| guess1 == lock2 && guess2 == lock2 && guess3 == lock2 
|| guess1 == lock3 && guess2 == lock3 && guess3 == lock3 

に2つ目の最後の他-IF-条件を変更して

guess1 == lock1 && guess2 == lock1 && guess3 == lock2 
|| guess1 == lock1 && guess2 == lock1 && guess3 == lock3 
|| guess1 == lock1 && guess2 == lock2 && guess3 == lock1 
|| guess1 == lock1 && guess2 == lock2 && guess3 == lock2 
|| guess1 == lock1 && guess2 == lock3 && guess3 == lock1 
|| guess1 == lock1 && guess2 == lock3 && guess3 == lock3 
|| guess1 == lock2 && guess2 == lock1 && guess3 == lock1 
|| guess1 == lock2 && guess2 == lock1 && guess3 == lock2 
|| guess1 == lock2 && guess2 == lock2 && guess3 == lock1 
|| guess1 == lock2 && guess2 == lock2 && guess3 == lock3 
|| guess1 == lock2 && guess2 == lock3 && guess3 == lock2 
|| guess1 == lock2 && guess2 == lock3 && guess3 == lock3 
|| guess1 == lock3 && guess2 == lock1 && guess3 == lock1 
|| guess1 == lock3 && guess2 == lock1 && guess3 == lock3 
|| guess1 == lock3 && guess2 == lock2 && guess3 == lock2 
|| guess1 == lock3 && guess2 == lock2 && guess3 == lock3 
|| guess1 == lock3 && guess2 == lock3 && guess3 == lock1 
|| guess1 == lock3 && guess2 == lock3 && guess3 == lock2 

への最後の他に、もし条件後

missing|present 
-------+------- 
     112 
     113 
121 
     122 
131 
     133 
     211 
212 
     221 
     223 
232 
     233 
     311 
313 
     322 
323 
     331 
     332 

プログラムは、私がチェック* *正しかったですスクリプトを使用してすべての可能な組み合わせ。

ヒント:配列とループを代わりに使用した場合、プログラムはより簡単でクリーンで拡張可能になります。

+0

ソコウィー私は私の推測とロックを交換する必要がありますか?なぜそれは他の方法で動作しないのですか?それはロック1をチェックし、それが一致する場合、それは残りをチェックせずに移動するのでですか? –

+0

はい、スワップして不足している部分を追加する必要があります。早期終了(残りをチェックせずに移動)は問題ではありません - 論理は間違っています。 lock1 == guess1 && lock2 == guess1 && lock3 == guess1'を見てください。これは、前述したように、lock1 = lock2 = lock3の場合にのみ当てはまります(ここでは該当しません)。言い換えれば、「推測に3つの重複が含まれている」ことを知るには、3つの推測をすべて見なければなりません。 Currenlty、あなたはただ一つを見ているだけです。 – Socowi

+0

あなたが言っていることを見てください!大きな助けをありがとう!私が言ったように、私はコーディングの初心者です(3週目)ので、このうちのいくつかはまだ私にとって非常に新しいです。良い一日を過ごしてください! –