2016-03-29 6 views
0

Ich versuche ein Programm zu schreiben, das entscheiden kann, welchen Mechanismus eine organische Reaktion durchläuft, indem ich eine Reihe von if else- und switch-Anweisungen verwende.Wie benutze ich switch Statements innerhalb von if else Statements

Könnt ihr mir helfen, herauszufinden, was ich hier falsch mache? Ich habe ein Problem damit, die erste if else-Anweisung zu erhalten. Das Programm läuft auf meinem Computer (ich benutze den BlueJ-Editor), aber wenn ich auf die erste Frage "Ist es löslich in Lösung?" Standardmäßig wird die else-Anweisung verwendet. Die switch-Anweisungen im Inneren der if else-Anweisung funktionieren von selbst.

Kann ich Schaltanweisungen in if else Anweisungen verwenden? Gibt es einen einfacheren Weg dies zu programmieren?

Können Sie auch erklären, warum es nicht funktioniert, oder warum eine andere Methode effizienter wäre?

Dank einer Tonne :)

import java.util.Scanner; 
     /** 
     * This program will decide what mechanism a reaction will undergo given information about the reactants. 
     * I will also include a mechanism to give a rudimentary explanation of the decision making process to 
     * get the reaction mechanism. 
     */ 
public class mechanism 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello, this program is designed to figure out what mechanism a reaction will under go."); 
     //The decision tree will be a series of if-else statements. If I find a better method, I will use that 

     System.out.println("Is the reactant soluble in the solvent? Answer in yes or no."); 

     Scanner keyboard = new Scanner(System.in); 

     String Solubility = keyboard.next(); //Defines if the reactant is soluble in the solvent 
     String functional = "unassigned";//Defines if the functional roup is primary secondary or tertiary 
     String Base = "unassigned";//Defines the strength of the base if needed 
     String Polar = "unassigned";//Defines if the reactant is polarizable 
     String Solvent = "unassigned"; //Defines if the solvent is protic or aprotic 

     if (Solubility == "yes") 
     { 

      System.out.println("Is the functional group attached to a primary, secondary, or tertiary carbon?"); 
      System.out.println(" Answer in p for primary, s for secondary, and t for tertiary."); 

      keyboard = new Scanner(System.in); 
      functional = keyboard.next(); 

        switch (functional){ 
         case "p": System.out.println("All unimolecular reactions are ruled out, leaving E2 and Sn2."); 
          System.out.println("Is the reactant a strong base? Answer in y for yes or n for no"); 

          keyboard = new Scanner(System.in); 
          Base = keyboard.next(); 
           if (Base == "y"){ 
            System.out.println("The reaction undergoes E2"); 
          } else{ 
            System.out.println("The reaction undergoes Sn2"); 
         } 

          break; 
         case "s": System.out.println("No reactions have been ruled out."); 
            System.out.println("Is the reactant a strong base? Answer in y or n"); 

            keyboard = new Scanner(System.in); 
            Base = keyboard.next(); 
            if(Base == "y"){ 
             System.out.println("yay"); 
            } else { 
             System.out.println("whatever"); 
            } 
            break; 
         case "t": System.out.println("tertiary"); 
          break; 

        } 
     } 
     else{ 
      System.out.println("No reaction will occur"); 
     } 
    } 
} 
+0

Verwenden Sie Java 8? – Sweeper

+0

Haben Sie bereits den Wert von "Solubility" gedruckt und überprüft? – JanLeeYu

Antwort

0

Es ist ein anderes jener Fehler, die Sie und ich werde eine Weile machen einmal.

Kurze Antwort: Sie können nicht == verwenden Zeichenfolgen vergleichen!

Lange Antwort:

In Ihrem if-Anweisungen, die Sie vergleichen Strings mit ==. Sie sollten nieHAUPT das tun. Die == vergleicht die Speicheradressen der beiden Operanden, wenn sie kein Primitiv sind. Ich weiß, dass Sie überprüfen möchten, ob die Zeichen der beiden Strings identisch sind. Aber zwei Zeichenfolgen mit denselben Zeichen haben möglicherweise nicht die gleiche Speicheradresse!

Was sollten Sie tun, ist die equals Methode verwenden, Zeichenfolgen zu vergleichen, wie folgt aus:

if (Solubility.equals("yes")) 

Sie auch die equalsIgnoreCase Methode verwenden können. Es tut, was es auf dem Deckel sagt. Denken Sie daran, auch alle anderen if-Anweisungen zu ändern!

Darüber hinaus können Sie switch-Anweisungen nicht verwenden, um eine Zeichenfolge zu wechseln. Aber wenn Sie sehen, dass Sie keinen Compilerfehler erhalten haben, denke ich, dass Sie Java 8 verwenden.

Aber wenn Sie nicht Java 8 verwenden, ist der beste Weg IMO, um dies zu lösen, ein Character zu wechseln.

char functionalChar = functional.charAt(0); 
switch (functionalChar) { 
    case 'p': // remember to use single quotes! 
    ... 
} 

Obwohl dies nicht das größte Problem ist, ist es immer noch wert Korrektur:

Sie brauchen nur Scanner einmal instanziiert.

0

Es ist völlig in Ordnung, eine switch-Anweisung für mehrere Eingangstypen verwendet werden - auch innerhalb einer if-Anweisung.

Ihr Problem besteht darin, dass Sie das Scannerobjekt immer neu initialisieren.

Sobald Sie den Scanner initialisiert:

Scanner keyboard = new Scanner(System.in); 

dann an anderer Stelle, wo Sie Eingabe erhalten möchten, nur um es wiederverwenden:

//keyboard = new Scanner(System.in); // You don't need this line 
Base = keyboard.next(); 

Auch der Grund, dass Sie nie eintretende Ihre if-Anweisung ist die Art, wie Sie Solubility mit "Ja" vergleichen. Für Strings sollten Sie entweder equals() oder equalsIgnoreCase verwenden, wenn der Fall keine Rolle spielt.

Ändern Sie die if-Anweisung an die folgende Zeile und der Code wird wie erwartet:

if (Solubility.equalsIgnoreCase("yes")) 
+0

Ich glaube nicht, dass das das Hauptproblem ist. Denkst du nicht, dass die "Löslichkeit ==" ja "' mehr falsch aussieht? – Sweeper

+0

Ja, Sie sind in Ordnung @Sweeper, war da. Ich habe versucht, vor dem Aktualisieren der Antwort zu überprüfen, ob noch weitere Probleme aufgetreten sind. – pczeus