2016-10-03 3 views
1

Ich kann nicht herausfinden, warum mein Programm bis zum Ende der letzten "else" Anweisung überspringt. Dies ist mein Code wie folgt, auch ein bisschen grob, weil ich gerade angefangen habe und ich bin neu in Java. Wenn Sie noch etwas brauchen, fragen Sie einfach!Probleme mit meinen if, else Statements

Das Programm, das wir schreiben sollen, wird verwendet, um eine Schließfachkombination zu erhalten. Ich habe hart codiert, was ich die Kombination sein möchte, und das Programm funktioniert, wenn ich 12-34-56 eingib. Aber wenn ich 12-12-34 oder irgendeine andere Variation eingabe, springt es automatisch zum Ende des Programms und sagt Nicht ein Match, obwohl das nicht das Ergebnis sein sollte. Stattdessen sollte es ausdrucken "2 Zahlen in der Schätzung sind Duplikate von einander. 2 Zahlen erscheinen in der Kombination."

Lassen Sie mich wissen, wenn Sie noch etwas benötigen! Danke und einen schönen Tag! (Auch bin ich mit Java und BlueJ all dies zu tun.)

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

Sind Sie sicher, dass die Boolesche Logik so funktioniert, wie Sie es möchten? Brauchen Sie vielleicht ein paar Klammern? – bradimus

+1

Ahhh .. Sie müssen wirklich über Ihre Logik und Syntax neu denken. –

+0

Easy: 'lock1 == guess2' ist falsch. –

Antwort

1

Es gibt zwei Probleme mit den beiden letzten else-if-Bedingungen:

  1. lock und guard müssen ausgetauscht werden . Wir wollen immer alle drei Vermutungen überprüfen. Momentan wird eine Schätzung zweimal/dreimal überprüft und ein/zwei Annahmen werden vernachlässigt. Besonders die zweitletzte else-if kann nur eingegeben werden, wenn lock1 = lock2 = lock3. Eine andere Möglichkeit, das Problem zu erkennen: Um zu wissen, dass Guess contains 3 duplicate numbers. Sie alle drei Vermutungen überprüfen müssen. Gewöhnlich wird nur eine Schätzung geprüft (pro Fall).

  2. Die letzte else-if-Bedingung fehlt einige Disjunkte. Es gibt 18 mögliche Fälle, um exakt zweimal die gleiche Schätzung einzugeben, das Programm prüft nur 12 von ihnen.

Hier sind die vorliegenden und fehlenden Fälle. Jede Ziffer steht für eine der drei Vermutungen.

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

Das Programm war richtig *, nachdem ich die vorletzten else-if-Bedingung

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

geändert und die letzte else-if-Bedingung

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 

* Ich überprüfte alle möglichen Kombinationen mit einem Skript.

Hinweis: Das Programm wäre einfacher, sauberer und erweiterbar, wenn Sie stattdessen Arrays und Schleifen verwenden.

+0

Socowi also muss ich meine Vermutung und Schlösser tauschen? Warum sollte es nicht umgekehrt funktionieren? Liegt es daran, dass es lock1 überprüft und wenn es übereinstimmt, geht es weiter, ohne den Rest zu überprüfen? –

+0

Ja, Sie müssen sie austauschen und die fehlenden Teile hinzufügen. Frühe Ausfahrt (ohne den Rest zu überprüfen) ist nicht das Problem - die Logik ist einfach falsch. Schauen Sie sich genau an 'lock1 == guess1 && lock2 == guess1 && lock3 == guess1', wie ich bereits erwähnt habe, kann dies nur für lock1 = lock2 = lock3 gelten (nicht der Fall hier).Oder mit anderen Worten: Um zu wissen, dass "Tipp enthält 3 Duplikate", müssen Sie alle drei Vermutungen betrachten. Momentan sehen Sie nur einen. – Socowi

+0

Oh, was du sagst! Danke für die tolle Hilfe! Wie ich schon sagte, bin ich neu in der Programmierung (dritte Woche), also ist mir das noch sehr neu. Haben Sie einen guten Tag! –