Erste Schritte Frage zu simplem Taschenrechner(switch)

Hallo,
ich beschäftige mich seit etwa einer Woche privat mit Java und bin dabei neben den Tutorials einen simple Taschenrechner zu erstellen. Heute habe ich versucht diesen Absturzsicher zu machen. Sodass er "Ungültige Eingabe" ausgibt wenn man anstatt einer Zahl beispielsweise einen Buchstaben eingibt. Das funktioniert auch soweit jedoch erscheint dadurch in dem Switch der den operator untersucht die Fehlermeldung:
-zahl3 can not be resolved
-zahl4 can not be resolved
wo liegt mein Fehler und wie kann ich es hinbekommen das er auf die zahlen "zugreifen" kann denn in den:
System.out.println("Die zweite Zahl lautet:" + zahl3);
System.out.println("Die zweite Zahl lautet:" + zahl4);
gibt er die korrekte zahl aus.

Hier der Code
Java:
import java.util.Scanner;

public class Taschenrechnermain {

   public static void main(String[] args) {
       String zahl1, zahl2;          //Zahlen die wir eingeben
       String operator;           //Art der Rechenoperation(wegen default schon Absturzsicher)
   
   
       System.out.println("Herzlich wilkommen zum Taschenrechner");
   
   
       System.out.println("Bitte geben sie ihre erste Zahl ein");
       Scanner erstezahl = new Scanner(System.in);
       zahl1=erstezahl.nextLine();
       try{
           Double zahl3 = Double.valueOf(zahl1);
           System.out.println("Die erste zahl lautet:" + zahl3);
           }
       catch(Exception e){
           System.out.println("Ungültige Eingabe");
           }
   
   
       System.out.println("Bitte geben sie ihre zweite Zahl ein");
       Scanner zweitezahl = new Scanner(System.in);
       zahl2=zweitezahl.nextLine();
       try{
           Double zahl4 = Double.valueOf(zahl2);
           System.out.println("Die zweite Zahl lautet:" + zahl4);
           }
           catch(Exception e)
           {
           System.out.println("Ungültige Eingabe");
       
           }
   
   
       System.out.println("Bitte geben sie die Rechenoperation ein");
       Scanner dritte = new Scanner(System.in);
       operator=dritte.nextLine();
   
   
   
       switch(operator)
       {
       case "+":{
            System.out.println(zahl3 + zahl4);
            break;
       }
       case "-":{
            System.out.println(zahl3-zahl4);
            break;
       }
       case "*":{
            System.out.println(zahl3*zahl4);
            break;
       }
       case "/":{
            System.out.println(zahl3+zahl4);
            break;
        }
       default:{
            System.out.println("Ungültige Eingabe");
            break;
       }
       }
   
   
       erstezahl.close();
       zweitezahl.close();
       dritte.close();
}
}
 
Zuletzt bearbeitet:
Habe das Problem durch ausprobieren gelöst indem ich in den cases erneut typecaste ich dachte mit
Double zahl3 = Double.valueOf(zahl1);
hätte ich bereits eine Variable vom Typ Double erstellt die ich dann im restlichen Code verwenden kann. Liege ich da falsch?

Java:
import java.util.Scanner;

public class Taschenrechnermain {

   public static void main(String[] args) {
       String zahl1, zahl2;          //Zahlen die wir eingeben
       String operator;           //Art der Rechenoperation(wegen default schon Absturzsicher)
     
     
       System.out.println("Herzlich wilkommen zum Taschenrechner");
     
     
       System.out.println("Bitte geben sie ihre erste Zahl ein");
       Scanner erstezahl = new Scanner(System.in);
       zahl1=erstezahl.nextLine();
           try{
           Double zahl3 = Double.parseDouble(zahl1);
           System.out.println("Die erste zahl lautet:" + zahl3);
           }
           catch(Exception e){
           System.out.println("Ungültige Eingabe"); 
           }
     
     
       System.out.println("Bitte geben sie ihre zweite Zahl ein");
       Scanner zweitezahl = new Scanner(System.in);
       zahl2=zweitezahl.nextLine();
           try{
           Double zahl4 = Double.parseDouble(zahl2);
           System.out.println("Die zweite Zahl lautet:" + zahl4);
           }
           catch(Exception e)
           {
           System.out.println("Ungültige Eingabe");
         
                   }
     
     
       System.out.println("Bitte geben sie die Rechenoperation ein");
       Scanner dritte = new Scanner(System.in);
       operator=dritte.nextLine();
     
     
     
       switch(operator)
       {
       case "+":{
           Double zahl3 = Double.valueOf(zahl1);
           Double zahl4 = Double.valueOf(zahl2);
           System.out.println(zahl3 + zahl4);
            break;
       }
       case "-":{
           Double zahl3 = Double.valueOf(zahl1);
           Double zahl4 = Double.valueOf(zahl2);
            System.out.println(zahl3-zahl4);
            break;
       }
       case "*":{
           Double zahl3 = Double.valueOf(zahl1);
           Double zahl4 = Double.valueOf(zahl2);
            System.out.println(zahl3*zahl4);
     
            break;
       }
       case "/":{
           Double zahl3 = Double.valueOf(zahl1);
           Double zahl4 = Double.valueOf(zahl2);
            System.out.println(zahl3+zahl4);
         
            break;
        }
       default:{
            System.out.println("Ungültige Eingabe"); 
            break;
       }
       }
     
     
       erstezahl.close();
       zweitezahl.close();
       dritte.close();
}
}
 
Zuletzt bearbeitet:

Robat

Top Contributor
Eine Variable ist immer nur in einem bestommten Scope sichtbar (zwischen den {}) .. In deinem Fall aus nur in dem try-Block. Daher kannst du sie auch nicht im switch-Case benutzen..
Wenn du die Variable vor dem try Block deklarierst, kannst du sie auch unten switch-Case benutzen
 

Javinner

Top Contributor
Willkommen im Forum,

  • Warum benutzt du für deine Werte nicht gleich Double?
  • Eine Schleife wäre angebracht, um die Werte abzufragen und die Eingabe, falls diese Falsch war, korrigieren zu können.
  • Ein Scanner reicht.
  • Double zahl4 = Double.parseDouble(zahl2); System.out.println("Die zweite Zahl lautet:" + zahl4); ist unnötig. Einfach durch System.out.println("blabla" + zahl2); oder ("blabla".concat(zahl2))
  • Es würde mich wundern, wenn du außerhalb der try-Klammer auf die Variablen zahl3 und zahl4 zugreifen könntest
 
Vielen dank für die Hilfe haben den Code nach euren Angaben nochmal durchgearbeitet. Ich benutze für die Werte nicht gleich einen Double da es sonst abstürzen würde wenn ich statt einer Zahl z.B Buchstaben eingeben würde(Dadurch muss ich Kommazahlen nur mit einem "." statt "," eingeben wie ich gemerkt habe, was jedoch keinen Nachteil darstellt).
Habt ihr noch weitere Verbesserungsvorschläge/Tipps für mich?

Java:
import java.util.Scanner;
public class Taschenrechnermain {
   public static void main(String[] args) {
       String zahl1, zahl2;          //Zahlen die wir eingeben
       String operator;        
       int operatortest=0;
       int zahl1test=0;
       int zahl2test=0;
       Scanner scanner1 = new Scanner(System.in);
 
       System.out.println("Herzlich wilkommen zum Taschenrechner");
 
     //Eingabe erste Zahl
       System.out.println("Bitte geben sie ihre erste Zahl ein");
     zahl1=scanner1.nextLine();
       while(zahl1test==0) {
            try{
            Double zahl3 = Double.parseDouble(zahl1);
            zahl1test=1;
            }
            catch(Exception e){
            System.out.println("Ungültige Eingabe. Zahl bitte erneut eingeben.");
            zahl1=scanner1.nextLine();}}
 
  
     //Eingabe zweite Zahl
       System.out.println("Bitte geben sie ihre zweite Zahl ein");
     zahl2=scanner1.nextLine();
      while(zahl2test==0) {
 
            try{
            Double zahl4 = Double.parseDouble(zahl2);
            zahl2test=1;
            }
            catch(Exception e){
            System.out.println("Ungültige Eingabe. Zahl bitte erneut eingeben.");
            zahl2=scanner1.nextLine();}
       }
 
      Double zahl3 = Double.parseDouble(zahl1);
      Double zahl4 = Double.parseDouble(zahl2);
       
          //Eingabe Operator und Berechnung
            while (operatortest==0) {
        System.out.println("Bitte geben sie die Rechenoperation ein");
             operator=scanner1.nextLine();
             switch(operator)
             {
             case "+":{
              System.out.println(zahl3 + zahl4);
              operatortest=1;
              break;}
             case "-":{
              System.out.println(zahl3-zahl4);
              operatortest=1;
              break;}
             case "*":{
              operatortest=1;
              System.out.println(zahl3*zahl4);
              break;}
             case "/":{
              System.out.println(zahl3+zahl4);
              operatortest=1;
              break;}
             default:{
              System.out.println("Ungültige Eingabe");
              break;}
             }
              }
 
       scanner1.close();
 
}
}
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Habt ihr noch weitere Verbesserungsvorschläge/Tipps für mich?
- Nutze eine Do-While Schleife für deine Anwendungsfälle
- Das Parsen von zahl1/2 zu zahl3/4 ist bei dir duplizierter Code
- den String Wert würde ich nicht Klassenglobal speichern, außerdem ist zahl1-zahl3 Beziehung namentlich verwirrend
- Exception abzufangen ist zu generisch und nicht empfohlen. Fange lieber die genauen Exceptions ab

Dein Original:
Java:
String zahl2;
int zahl2test=0;
//.....

    //Eingabe zweite Zahl
       System.out.println("Bitte geben sie ihre zweite Zahl ein");
     zahl2=scanner1.nextLine();
      while(zahl2test==0) {
 
            try{
            Double zahl4 = Double.parseDouble(zahl2);
            zahl2test=1;
            }
            catch(Exception e){
            System.out.println("Ungültige Eingabe. Zahl bitte erneut eingeben.");
            zahl2=scanner1.nextLine();}
       }
 
      Double zahl3 = Double.parseDouble(zahl1);
      Double zahl4 = Double.parseDouble(zahl2);

Vorschlag:
Java:
Double zahl2; // anstatt String, ist initial "null"
//kein zahltest


    //Eingabe zweite Zahl
    do {
        System.out.println("Bitte geben sie ihre zweite Zahl ein");
        String eingabe = scanner1.nextLine(); // Eingabe nur lokal gespeichert, sprechender Name
    
        try{
            zahl2 = Double.parseDouble(eingabe); //
            // kein zahltest
        } catch(NumberFormatException e){ // anstatt Exception
            System.out.println("Ungültige Eingabe. Zahl bitte erneut eingeben.");
        }
    } while(zahl2 == null); // zahl2 ist weiterhin null, falls ungültige Eingabe

    // kein weiteres Parsing, da zahl2 schon verfügbar
 
Danke für den Tipp, die Do/While-Schleife wurde auch in dem Teil, des Tutorials ,den ich heute durchgearbeitet habe behandelt,passte von daher perfekt. Mit deiner Hilfe war es nicht schwer diese in den Code zu integrieren.
Weitere Tipps gerne gesehen.
Hier noch einamal der Code:
Java:
import java.util.Scanner;

public class Taschenrechnermain {

   public static void main(String[] args) {
       
       Double zahl1=0.0, zahl2=0.0;       //Zahlen die wir eingeben(auf 0 initalisiert wegen do/while Scheife)
       String operator;                   //Art der Rechenoperation(wegen while Schleife Absturzsicher)
       int operatortest=0;               //Wert als Bedingung für die while Schleife
       Scanner scanner1 = new Scanner(System.in);
       System.out.println("Herzlich wilkommen zum Taschenrechner");
     
     //Eingabe erste Zahl
       do {
          System.out.println("Bitte geben sie ihre erste Zahl ein");
          String eingabe = scanner1.nextLine();
          try {
              zahl1 = Double.parseDouble(eingabe);
          }
          catch(NumberFormatException e){
               System.out.println("Ungültige Eingabe. Zahl bitte erneut eingeben.");
               eingabe = scanner1.nextLine();}
       }while(zahl1 == null);
       
     //Eingabe zweite Zahl
       do {
          System.out.println("Bitte geben sie ihre zweite Zahl ein");
          String eingabe = scanner1.nextLine();
          try {
              zahl2 = Double.parseDouble(eingabe);}
          catch(NumberFormatException e){
               System.out.println("Ungültige Eingabe. Zahl bitte erneut eingeben.");
               eingabe = scanner1.nextLine();}
       }while(zahl2 == null);
       
 
     //Eingabe Operator und Berechnung
      while (operatortest==0){
           System.out.println("Bitte geben sie die Rechenoperation ein");
           operator=scanner1.nextLine();
               switch(operator){
                      case "+":{
                          System.out.println(zahl1+zahl2);
                          operatortest=1;
                          break;}
                      case "-":{
                          System.out.println(zahl1-zahl2);
                          operatortest=1;
                          break;}
                      case "*":{
                          operatortest=1;
                          System.out.println(zahl1*zahl2);
                          break;}
                      case "/":{
                          System.out.println(zahl1/zahl2);
                          operatortest=1;
                          break;}
                      default:{
                          System.out.println("Ungültige Eingabe");
                          break;}
                      }
                         }
              scanner1.close();
}
}
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Double zahl1=0.0, zahl2=0.0; //Zahlen die wir eingeben(auf 0 initalisiert wegen do/while Scheife)

null nicht 0. null ist default von einem Objekt. Double ist ein Objekt. null bedeudet eher so viel wie "nichts", hat nichts mit der Zahl zu tun.

Also einfach nur...

Java:
Double zahl1, zahl2;
 

mihe7

Top Contributor
@MoxxiManagarm hat übersehen, dass es sich hier nicht um Instanzvariablen handelt und daher nicht mit null initialisiert werden. Also
Java:
Double zahl1 = null, zahl2 = null;
Außerdem gibt es keinen Sinn, im catch-Block nochmal die Eingabe einzulesen, da sich dadurch an der Zahl nichts ändert. Gegenvorschlag:
Java:
     //Eingabe erste Zahl
       System.out.println("Bitte geben sie ihre erste Zahl ein");
       do {
          String eingabe = scanner1.nextLine();
          try {
              zahl1 = Double.parseDouble(eingabe);
          }
          catch(NumberFormatException e){
               System.out.println("Ungültige Eingabe. Zahl bitte erneut eingeben.");
         }
       }while(zahl1 == null);
Analog natürlich für die zweite Zahl.
 
Hallo, habe den Fehler ausgebessert und die Aufgaben in einzelne Methoden unterteilt die ich dann von der main aufrufe. Leider erscheint nach der Eingabe der ersten Zahl folgende Fehlermeldung:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Unknown Source)
at maintest.operatoreingabe(maintest.java:48)
at maintest.main(maintest.java:8)
Kann mir jemand weiterhelfen?
Java:
mport java.util.Scanner;

public class maintest {
   public static void main(String[] args) {
          maintest newObjekt = new maintest();
    System.out.println("Herzlich wilkommen zum Taschenrechner");
          double zahl1 = newObjekt.zahleneingabe();
          int operatornr =newObjekt.operatoreingabe();
          double zahl2 = newObjekt.zahleneingabe();
          double ergebnis = newObjekt.ergebnis(operatornr,zahl1,zahl2);
          System.out.println("Das Ergebnis ist "+ergebnis);}
    /////////////////////////////////////////////////////////////////////////////////
     public double ergebnis(int operatornr, double zahl1, double zahl2) {
         double ergebnis;
         switch(operatornr) {
         case 1:{ergebnis=zahl1+zahl2;
         break;}
         case 2:{ergebnis=zahl1-zahl2;
         break;}
         case 3:{ergebnis=zahl1*zahl2;
         break;}
         case 4:{ergebnis=zahl1/zahl2;
         break;}
         default:{ergebnis=0;
              break;}}
         return ergebnis;}
     /////////////////////////////////////////////////////////////////////////////////
     public double zahleneingabe() {
         Double zahl=0.0;
         Scanner scanner1 = new Scanner(System.in);
         System.out.println("Bitte geben sie eine Zahl ein");
          do {
             String eingabe = scanner1.nextLine();
             try {
                 zahl = Double.parseDouble(eingabe);
             }
             catch(NumberFormatException e){
                  System.out.print("Ungültige Eingabe. Zahl bitte erneut eingeben.");
            }
          }while(zahl == null);
          scanner1.close();
          return zahl;}
     /////////////////////////////////////////////////////////////////////////////////
     public int operatoreingabe() {
     Scanner scanner1 = new Scanner(System.in);
     int operatornr=0;
     do {
             String operator = scanner1.nextLine();
             switch(operator){
                          case "+":{
                              operatornr=1;
                              break;}
                          case "-":{
                              operatornr=2;
                              break;}
                          case "*":{
                              operatornr=3;
                              break;}
                          case "/":{
                              operatornr=4;
                              break;}
                          default:{
                              System.out.println("Ungültige Eingabe. Operator erneut eingeben.");
                              break;}}}while(operatornr==0);
                              scanner1.close();
                                 return operatornr;}
                             
     
}
 

MoxxiManagarm

Top Contributor
Hinweise:
  • Starte Variablennamen nie mit Java keywords. In deinem Fall newObjekt.
  • Schließe nie einen Scanner mit System.in, du schließt auch diesen Stream damit und daher kann er bei der zweiten Eingabe keine Eingabe mehr erwarten. Besser wäre es Scanner an der Stelle zu einer Instanzvariablen zu machen. Da ist dein Problem, was die Fehlermeldung erzeugt.
  • Für den Operator gibst du keine Anforderung mehr an. Als DAU wüsste ich nicht, was ich nun eingeben soll
  • An der Formatierung musst du noch arbeiten, so wie es da steht ist es sehr schwer lesbar - ganz speziell das Ende einer Methode, nutze hierfür die schließende geschweifte Klammer in einer neuen Zeile und lass die Trennerkommentare weg. IDE's wie Netbeans und Eclipse haben auch Autoformatierungsfunktionen. Bei Eclipse: Rechtsklick Klasse>Source>Format.
  • Klassen werden bei Java konventionell großgeschrieben.
Und wenn du das beherzigst, kommt etwa da dabei heraus:

Java:
import java.util.Scanner;

public class MainTest {
    public static final Scanner scanner1 = new Scanner(System.in);
  
    public static void main(String[] args) {
        MainTest test = new MainTest();

        System.out.println("Herzlich wilkommen zum Taschenrechner");

        double zahl1 = test.zahleneingabe();
        int operatornr = test.operatoreingabe();
        double zahl2 = test.zahleneingabe();

        double ergebnis = test.ergebnis(operatornr, zahl1, zahl2);

        System.out.println("Das Ergebnis ist " + ergebnis);
    }
  
    public double zahleneingabe() {
        Double zahl = 0.0;

        System.out.println("Bitte geben sie eine Zahl ein");
        do {
            String eingabe = scanner1.nextLine();
            try {
                zahl = Double.parseDouble(eingabe);
            } catch (NumberFormatException e) {
                System.out.print("Ungültige Eingabe. Zahl bitte erneut eingeben.");
            }
        } while (zahl == null);
  
        return zahl;
    }

    public double ergebnis(int operatornr, double zahl1, double zahl2) {
        double ergebnis;
      
        switch (operatornr) {
            case 1: {
                ergebnis = zahl1 + zahl2;
                break;
            }
            case 2: {
                ergebnis = zahl1 - zahl2;
                break;
            }
            case 3: {
                ergebnis = zahl1 * zahl2;
                break;
            }
            case 4: {
                ergebnis = zahl1 / zahl2;
                break;
            }
            default: {
                ergebnis = 0;
                break;
            }
        }
        return ergebnis;
    }  

    public int operatoreingabe() {
        System.out.println("Bitte geben sie einen Operator ein");
      
        int operatornr = 0;
        do {
            String operator = scanner1.nextLine();
            switch (operator) {
                case "+": {
                    operatornr = 1;
                    break;
                }
                case "-": {
                    operatornr = 2;
                    break;
                }
                case "*": {
                    operatornr = 3;
                    break;
                }
                case "/": {
                    operatornr = 4;
                    break;
                }
                default: {
                    System.out.println("Ungültige Eingabe. Operator erneut eingeben.");
                    break;
                }
            }
        } while (operatornr == 0);
      
        return operatornr;
    }

}
 
Habe den Code erneut nach deinen Hinweisen überarbeitet und konnte damit die Fehlermeldung verhindern. Danach rief der Code aber auch dann die nächste Methode auf wenn eine falsche Zahl eingegeben wurde, wodurch man die Zahl nicht erneut eingeben konnte. Das habe ich mithilfe der while Schleifen in der main gelöst allerdings kann man nun keine 0 mehr eingeben was bei einer einfachen Berechnung mit 2 Zahlen eh überflüssig ist. Allerdings muss es da doch noch eine besser Lösung geben. Kann ich den double Werten statt der 0 auch irgendwie einen "leeren" Wert hinzufügen den ich dann in der while Bedingung abfrage und wenn ja wie?

Java:
import java.util.Scanner;
public class Taschenrechnermain {
 public static final Scanner scanner1 = new Scanner(System.in);
 public static void main(String[] args) {
  Taschenrechnermain test = new Taschenrechnermain();
  int operatornr = 0;
  double zahl1 = 0, zahl2 = 0;
  System.out.println("Herzlich wilkommen zum Taschenrechner");
  while (zahl1 == 0)
   zahl1 = test.zahleneingabe();
  while (operatornr == 0)
   operatornr = test.operatoreingabe();
  while (zahl2 == 0)
   zahl2 = test.zahleneingabe();
  double ergebnis = test.ergebnis(operatornr, zahl1, zahl2);
  if (ergebnis != 0)
   System.out.println("Das Ergebnis ist " + ergebnis);
 }
 public double zahleneingabe() {
  Double zahl = 0.0;
  System.out.println("Bitte geben sie eine Zahl ein");
  do {
   String eingabe = scanner1.nextLine();
   try {
    zahl = Double.parseDouble(eingabe);
   } catch (NumberFormatException e) {
    System.out.print("Ungültige Eingabe. Zahl bitte erneut eingeben.");
   }
  } while (zahl == null);
  return zahl;
 }
 public double ergebnis(int operatornr, double zahl1, double zahl2) {
  double ergebnis;
  switch (operatornr) {
  case 1: {
   ergebnis = zahl1 + zahl2;
   break;
  }
  case 2: {
   ergebnis = zahl1 - zahl2;
   break;
  }
  case 3: {
   ergebnis = zahl1 * zahl2;
   break;
  }
  case 4: {
   ergebnis = zahl1 / zahl2;
   break;
  }
  default: {
   ergebnis = 0;
   break;
  }
  }
  return ergebnis;
 }
 public int operatoreingabe() {
  System.out.println("Bitte geben sie einen Operator ein(+,-,*,/)");
  int operatornr = 0;
  do {
   String operator = scanner1.nextLine();
   switch (operator) {
   case "+": {
    operatornr = 1;
    break;
   }
   case "-": {
    operatornr = 2;
    break;
   }
   case "*": {
    operatornr = 3;
    break;
   }
   case "/": {
    operatornr = 4;
    break;
   }
   default: {
    System.out.println("Ungültige Eingabe. Operator erneut eingeben.");
    break;
   }
   }
  } while (operatornr == 0);
  return operatornr;
 }
}
 

mihe7

Top Contributor
Der Code in zahleneingabe() macht folgendes:
1. setze zahl auf 0.0
2. lies eingabe und konvertiere diese in eine Zahl z
3. Falls Konvertierung erfolgreich, setze zahl auf z, ansonsten gibt eine Fehlermeldung aus
4. Falls zahl == null gilt, springe zu 1

Problem: zahl wird niemals null werden (Nachtrag: entweder ist die Konvertierung erfolgreich, dann ist es eine Zahl, oder nicht, dann wird zahl nicht gesetzt), folglich wird der Rücksprung in 4. niemals erfolgen.

Lösung: setze zahl in Schritt 1 nicht auf 0.0 sondern auf null.

Java:
public double zahleneingabe() {
  Double zahl = null;
  System.out.println("Bitte geben sie eine Zahl ein");
  do {
   String eingabe = scanner1.nextLine();
   try {
    zahl = Double.parseDouble(eingabe);
   } catch (NumberFormatException e) {
    System.out.print("Ungültige Eingabe. Zahl bitte erneut eingeben.");
   }
  } while (zahl == null);
  return zahl;
 }
 
Nochmal vielen Dank für die Hilfe von euch. Habe das Programm, nachdem ich den Fehler in der Schleife verbessert habe, nun noch in Klassen aufgeteilt und die Funktion Brüche miteinander zu verrechnen hinzugefügt. Ich werde noch eine Methode mit der Nutzer wählen können ob sie einfach/bruch-rechnen wollen, sowie eine Methode die den Bruch kürzt hinzufügen. Ich denke danach werde ich erstmal mit Arrays rumexperementieren.
Java:
import java.util.Scanner;

public class Taschenrechnermain {
    public static final Scanner scanner1 = new Scanner(System.in);

    public static void main(String[] args) {
        EinfacheBerechnung berechnung = new EinfacheBerechnung();
        Benutzereingaben eingabe = new Benutzereingaben();
        Bruchrechnung bruchberechnung = new Bruchrechnung();
        System.out.println("Herzlich wilkommen zum Taschenrechner");
        int artderberechnung=2;//muss noch ersetzt werden durch auswahl für benutzer(neue methode in Benutzereingaben anlegen)
        //Bruchrechnung starten
        if(artderberechnung==1) {
        System.out.println("Bitte geben sie den Zähler des ersten Bruchs.");
        double zahl1 = eingabe.zahleneingabe();
        System.out.println("Bitte geben sie den Nenner des ersten Bruchs.");
        double zahl2 = eingabe.zahleneingabe();
        int operatornr = eingabe.operatoreingabe();
        System.out.println("Bitte geben sie den Zähler des zweiten Bruchs.");
        double zahl3 = eingabe.zahleneingabe();
        System.out.println("Bitte geben sie den Nenner des zweiten Bruchs.");
        double zahl4 = eingabe.zahleneingabe();
        double ergebnisnominator = bruchberechnung.ergebnisnominator(operatornr, zahl1, zahl2, zahl3, zahl4);
        double ergebnisdenominator = bruchberechnung.ergebnisdenominator(operatornr, zahl1, zahl2, zahl3, zahl4);
        System.out.println("Das Ergebnis lautet " + ergebnisnominator +"|"+ergebnisdenominator );
        System.out.println("Das entspricht " + ergebnisnominator/ergebnisdenominator );
        }
        //Einfache Berechnung starten
        if(artderberechnung==2) {
            System.out.println("Bitte geben sie die erste Zahl ein.");
        double zahl1 = eingabe.zahleneingabe();
        int operatornr = eingabe.operatoreingabe();
        System.out.println("Bitte geben sie die zweite Zahl ein.");
        double zahl2 = eingabe.zahleneingabe();
    double ergebnis = berechnung.ergebnis(operatornr, zahl1, zahl2);
    System.out.println("Das Ergebnis lautet: "+ergebnis);
        }


    
    }

}

Java:
public class EinfacheBerechnung {
 
    public double ergebnis(int operatornr, double zahl1, double zahl2) {
        double ergebnis;

        switch (operatornr) {
        case 1: {
            ergebnis = zahl1 + zahl2;
            break;
        }
        case 2: {
            ergebnis = zahl1 - zahl2;
            break;
        }
        case 3: {
            ergebnis = zahl1 * zahl2;
            break;
        }
        case 4: {
            ergebnis = zahl1 / zahl2;
            break;
        }
        default: {
            ergebnis = 0;
            break;
        }
        }
        return ergebnis;
    }
 
 

}

Java:
import java.util.Scanner;

public class Benutzereingaben {
    public static final Scanner scanner1 = new Scanner(System.in);
 
    public double zahleneingabe() {
        Double zahl = null;

    
        do {
            String eingabe = scanner1.nextLine();
            try {
                zahl = Double.parseDouble(eingabe);
            } catch (NumberFormatException e) {
                System.out.print("Ungültige Eingabe. Zahl bitte erneut eingeben.");
            }
        } while (zahl == null);

        return zahl;
    }
 
    public int operatoreingabe() {
        System.out.println("Bitte geben sie einen Operator ein(+,-,*,/)");

        int operatornr = 0;
        do {
            String operator = scanner1.nextLine();
            switch (operator) {
            case "+": {
                operatornr = 1;
                break;
            }
            case "-": {
                operatornr = 2;
                break;
            }
            case "*": {
                operatornr = 3;
                break;
            }
            case "/": {
                operatornr = 4;
                break;
            }
            default: {
                System.out.println("Ungültige Eingabe. Operator erneut eingeben.");
                break;
            }
            }
        } while (operatornr == 0);

        return operatornr;
    }

}

Java:
public class Bruchrechnung {
    //Operatorlegende:+=1,-=2,*=3,/=4
    //zahl1 Zähler des ersten Bruchs zahl2 Nenner des ersten Bruchs usw.
 
    public double ergebnisnominator(int operatornr, double zahl1, double zahl2,double zahl3, double zahl4) {
        double ergebniszähler;
        switch (operatornr) {
        case 1: {
            ergebniszähler =(zahl1*zahl4)+(zahl3*zahl2);
            break;
        }
        case 2: {
            ergebniszähler = (zahl1*zahl4)-(zahl3*zahl2);
            break;
        }
        case 3: {
            ergebniszähler = zahl1*zahl3;
            break;
        }
        case 4: {
            ergebniszähler = zahl1*zahl4;
            break;
        }
        default: {
            ergebniszähler = 0;
            break;
        }
        }
        return ergebniszähler;
    }
 
 
    public double ergebnisdenominator(int operatornr, double zahl1, double zahl2,double zahl3, double zahl4) {
        double ergebnisnenner;
        switch (operatornr) {
        case 1: {
            ergebnisnenner = zahl2*zahl4;
            break;
        }
        case 2: {
            ergebnisnenner = zahl2*zahl4;
            break;
        }
        case 3: {
            ergebnisnenner = zahl2*zahl4;
        
            break;
        }
        case 4: {
            ergebnisnenner = zahl2*zahl3;
            break;
        }
        default: {
            ergebnisnenner = 0;
            break;
        }
        }
        return ergebnisnenner;
    }

}
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
  • Wenn du mit Brüchen anfängst wird zahl1-4 aber schon unschön. Denke immer daran, andere wollen deinen code lesen und verstehen! Also besser: nenner1, zaehler1, nenner2, zaehler2 ODER du machst dir eine Bruchklasse. Dann hast du bruch1.getNenner(), bruch2.getZaehler()... Die Zuordnung von Nenner und Zaehler bleibt erhalten.
  • In Ergänzung dazu kannst du der Klasse Bruch jeweilige Methoden erstellen z.B. bruch1.addiere(bruch2)
  • ergebniszähler // vermeide Umlaute in Benennenungen
 
Ich habe heute die Zeit gefunden deine Anregungen noch umzusetzen und die fehlenden Klassen hinzuzufügen.
Hier der Code:
Java:
import java.util.Scanner;

public class Taschenrechnermain {
   public static final Scanner scanner1 = new Scanner(System.in);

   public static void main(String[] args) {
       EinfacheBerechnung berechnung = new EinfacheBerechnung();
       Benutzereingaben eingabe = new Benutzereingaben();
       Bruchrechnung bruchberechnung = new Bruchrechnung();
       System.out.println("Herzlich wilkommen zum Taschenrechner");

       double artderberechnungnr = eingabe.artderberechnung();
       // Bruchrechnung starten
       if (artderberechnungnr == 1) {
           System.out.println("Bitte geben sie den Zähler des ersten Bruchs.");
           double nominator1 = eingabe.zahleneingabe();
           System.out.println("Bitte geben sie den Nenner des ersten Bruchs.");
           double denominator1 = eingabe.zahleneingabe();
           int operatornr = eingabe.operatoreingabe();
           System.out.println("Bitte geben sie den Zähler des zweiten Bruchs.");
           double nominator2 = eingabe.zahleneingabe();
           System.out.println("Bitte geben sie den Nenner des zweiten Bruchs.");
           double denominator2 = eingabe.zahleneingabe();
           double ergebnisnominator = bruchberechnung.ergebnisnominator(operatornr, nominator1, denominator1,
                   nominator2, denominator2);
           double ergebnisdenominator = bruchberechnung.ergebnisdenominator(operatornr, nominator1, denominator1,
                   nominator2, denominator2);
           System.out.println("Das Ergebnis lautet: " + ergebnisnominator + "|" + ergebnisdenominator);
           System.out.println("Das entspricht: " + ergebnisnominator / ergebnisdenominator);
           double ggt = Bruchrechnung.ggt(ergebnisnominator, ergebnisdenominator);
           System.out.println("Oder gekürzt: " + ergebnisnominator / ggt + "|" + ergebnisdenominator / ggt);
       }
       // Einfache Berechnung starten
       if (artderberechnungnr == 2) {
           System.out.println("Bitte geben sie die erste Zahl ein.");
           double zahl1 = eingabe.zahleneingabe();
           int operatornr = eingabe.operatoreingabe();
           System.out.println("Bitte geben sie die zweite Zahl ein.");
           double zahl2 = eingabe.zahleneingabe();
           double ergebnis = berechnung.ergebnis(operatornr, zahl1, zahl2);
           System.out.println("Das Ergebnis lautet: " + ergebnis);
       }

   }

}

Java:
public class EinfacheBerechnung {

   public double ergebnis(int operatornr, double zahl1, double zahl2) {
       double ergebnis;

       switch (operatornr) {
       case 1: {
           ergebnis = zahl1 + zahl2;
           break;
       }
       case 2: {
           ergebnis = zahl1 - zahl2;
           break;
       }
       case 3: {
           ergebnis = zahl1 * zahl2;
           break;
       }
       case 4: {
           ergebnis = zahl1 / zahl2;
           break;
       }
       default: {
           ergebnis = 0;
           break;
       }
       }
       return ergebnis;
   }

}

Java:
import java.util.Scanner;

public class Benutzereingaben {
   public static final Scanner scanner1 = new Scanner(System.in);

//Kann zum einlesen für all doubles verwendet werden in main davor jedoch println("Aufforderung")
   public double zahleneingabe() {
       Double zahl = null;

       do {
           String eingabe = scanner1.nextLine();
           try {
               zahl = Double.parseDouble(eingabe);
           } catch (NumberFormatException e) {
               System.out.print("Ungültige Eingabe. Zahl bitte erneut eingeben.");
           }
       } while (zahl == null);

       return zahl;
   }

   public int operatoreingabe() {
       System.out.println("Bitte geben sie einen Operator ein(+,-,*,/)");

       int operatornr = 0;
       do {
           String temp = scanner1.nextLine();
           switch (temp) {
           case "+": {
               operatornr = 1;
               break;
           }
           case "-": {
               operatornr = 2;
               break;
           }
           case "*": {
               operatornr = 3;
               break;
           }
           case "/": {
               operatornr = 4;
               break;
           }
           default: {
               System.out.println("Ungültige Eingabe. Operator erneut eingeben.");
               break;
           }
           }
       } while (operatornr == 0);

       return operatornr;
   }

   public int artderberechnung() {
       int artderberechnungnr = 0;
       do {

           System.out.println("Tippen sie 1 um mit Brüchen zu Rechnen und 2 für eine einfache Berechnung");
           String temp = scanner1.nextLine();
           switch (temp) {
           case "1": {
               artderberechnungnr = 1;
               break;
           }
           case "2": {
               artderberechnungnr = 2;
               break;
           }
           default: {
               break;
           }
           }

       } while (artderberechnungnr == 0);
       return artderberechnungnr;
   }
}

Java:
public class Bruchrechnung {
   // Operatorlegende:+=1,-=2,*=3,/=4

   public double ergebnisnominator(int operatornr, double nominator1, double denominator1, double nominator2,
           double denominator2) {
       double ergebniszähler;
       switch (operatornr) {
       case 1: {
           ergebniszähler = (nominator1 * denominator2) + (nominator2 * denominator1);
           break;
       }
       case 2: {
           ergebniszähler = (nominator1 * denominator2) - (nominator2 * denominator1);
           break;
       }
       case 3: {
           ergebniszähler = nominator1 * nominator2;
           break;
       }
       case 4: {
           ergebniszähler = nominator1 * denominator2;
           break;
       }
       default: {
           ergebniszähler = 0;
           break;
       }
       }
       return ergebniszähler;
   }

   public double ergebnisdenominator(int operatornr, double nominator1, double denominator1, double nominator2,
           double denominator2) {
       double ergebnisnenner;
       switch (operatornr) {
       case 1: {
           ergebnisnenner = denominator1 * denominator2;
           break;
       }
       case 2: {
           ergebnisnenner = denominator1 * denominator2;
           break;
       }
       case 3: {
           ergebnisnenner = denominator1 * denominator2;

           break;
       }
       case 4: {
           ergebnisnenner = denominator1 * nominator2;
           break;
       }
       default: {
           ergebnisnenner = 0;
           break;
       }
       }
       return ergebnisnenner;
   }

   public static double ggt(double ergebnisnominator, double ergebnisdenominator) {
       while (ergebnisdenominator != 0) {
           if (ergebnisnominator > ergebnisdenominator) {
               ergebnisnominator = ergebnisnominator - ergebnisdenominator;
           } else {
               ergebnisdenominator = ergebnisdenominator - ergebnisnominator;
           }
       }
       return ergebnisnominator;
   }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
H Frage zum Array Java Basics - Anfänger-Themen 17
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
B Fachliche Frage bei Rechnungen Java Basics - Anfänger-Themen 16
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Einfache Frage zur Punktnotation objektname.methode(wert) Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben