[JAVA] Probleme mit String in Switch und kleine do Schleife am ende.

Wincenty

PCGHX-HWbot-Member (m/w)
Hallo,
wie besagt habe ich 2 Probleme:
einmal bekomme ich es nicht richtig hin den switch case zu benutzen.
und das andere ist das ich eine kleine do Schleife nicht ordentlich hin bekomme am ende einer Großen.

Hier der Basis-kode mit dem ich gearbeitet hab, also da ist keine Switch Case sondern nur if s und die kleine Schleife fehlt ebenfalls

Code:
package ü17;

import java.util.Scanner;

public class SimpleCALC {
    
    public static void main (String [] args) {

        System.out.println("Hallo, wie ist ihr Name?");
        Scanner N = new Scanner (System.in);
        System.out.println("Hallo " + N.nextLine() + ", mein Name ist SimpleCalc.\nIch bin ein Taschenrechner der für Sie die Grundoperationen:\n Addition, Substraction, Multiplikation und die Division\nfür Sie ausrechnet.");
        
        do {
        System.out.println("Bitte geben Sie die Rechnung ein in folgendem Format:\n'Zahl''Leerzeichen''Rechenoperator''Leerzeichen''Zahl' :");
        Scanner eingabe = new Scanner (System.in);
        String enter = eingabe.nextLine();
        String [] e = enter.split(" ");
        double zahl1;
        double zahl2;
        zahl1 = Double.parseDouble (e[0]);
        zahl2 = Double.parseDouble (e[2]);
        
        if (e[1].equals("+")||e[1].equals("-")||e[1].equals("*")||e[1].equals("/")) {
        
        if (e[1].equals("+")) {
            double summe;
            summe = zahl1+zahl2;
            System.out.println(e[0] + e[1] + e[2] + " = " + summe); 
            }
        if (e[1].equals("-")) {
            double substrackt;
            substrackt = zahl1-zahl2;
            System.out.println(e[0] + e[1] + e[2] + " = " + substrackt);
        }
        if (e[1].equals("*")) {
            double produkt;
            produkt = zahl1*zahl2;
            System.out.println(e[0] + e[1] + e[2] + " = " + produkt);        
        }
        if (e[1].equals("/")) {
            double dividukt;
            dividukt = zahl1/zahl2;
            System.out.println(e[0] + e[1] + e[2] + " = " + dividukt);
        }
        }
        else {
            System.out.println("Unzulässiges Zeichen als Rechenoperator");
        }
        System.out.println("Möchten Sie das Programm mit 'Y' beenden oder doch mit 'N' weiter arbeiten?");
        char endlauf;
        Scanner ende = new Scanner(System.in);
        endlauf=ende.next().charAt(0);
        if (endlauf!='N') {
        if (endlauf == 'Y') {
         break;
         } else System.out.println("Falsches Zeichen, bitte wiederholen sie:");}
        } while (true);
    }
}
Hier ist der Code bei dem ich Probleme habe, als Komment hab ich das Problem in der Zeile beschrieben und was ich haben will.

Code:
package ü17;

import java.util.Scanner;

public class simpleTEST {
    
    public static void main (String [] args) {

        System.out.println("Hallo, wie ist ihr Name?");
        Scanner N = new Scanner (System.in);
        System.out.println("Hallo " + N.nextLine() + ", mein Name ist SimpleCalc.\nIch bin ein Taschenrechner der für Sie die Grundoperationen:\n Addition '+', Substraction '-', Multiplikation '*' und die Division '/'\nfür Sie ausrechnet.");
        
        do {
        System.out.println("Bitte geben Sie die Rechnung ein in folgendem Format:\n'Zahl''Leerzeichen''Rechenoperator''Leerzeichen''Zahl' :");
        Scanner eingabe = new Scanner (System.in);
        String enter = eingabe.nextLine();
        String [] e = enter.split(" ");
        double zahl1;
        double zahl2;
        zahl1 = Double.parseDouble (e[0]);
        zahl2 = Double.parseDouble (e[2]);
//[EDIT] ich hab die umwandlung versehentlich gelöscht aber ich glaub es war so: char operator = e.charAt(1); aber die Umwandlung will nicht richtig bei mir gehen und mit         char operator;
        operator = Char.parseChar (e[1]); kommt Fehler das Char. als Class nicht definiert ist.
        
        switch (operator) { //Hier ist das Problem, das ich kein String für den Switch benutzen kann und wenn ich Char benutze, dann vergleicht er nicht mehr richtig also er gibt immer default raus
        case '+': double summe;
        summe = zahl1+zahl2;
        System.out.println(e[0] + e[1] + e[2] + " = " + summe); break;
        case '-': double substrackt;
        substrackt = zahl1-zahl2;
        System.out.println(e[0] + e[1] + e[2] + " = " + substrackt); break;
        case '*': double produkt;
        produkt = zahl1*zahl2;
        System.out.println(e[0] + e[1] + e[2] + " = " + produkt); break;
        case '/': double dividukt;
        dividukt = zahl1/zahl2;
        System.out.println(e[0] + e[1] + e[2] + " = " + dividukt); break;
        default: System.out.println("Unzulässiges Zeichen als Rechenoperator");
        }

        
        System.out.println("Möchten Sie das Programm mit 'Y' beenden oder doch mit 'N' weiter arbeiten?");
        do{
        char endlauf;
        Scanner ende = new Scanner(System.in);
        endlauf=ende.next().charAt(0);
        if (endlauf!='N') {
        if (endlauf == 'Y') {
         break;
         } else System.out.println("Falsches Zeichen, bitte wiederholen sie:"); }
        }while (false); // diese 2 kleinere Schleife soll dafür sorgen solange nicht Y oder N in richtiger Form eingegeben wurde, die Eingabe zu wiederholen, wenn Y soll das Programm beenden und bei N soll beim ersten do wieder einsetzen. Ohne diese kleine Schleife geht die große Schleife ohne Macken, aber die kleine lässt entweder das Programm immer laufen oder bricht immer ab.
        
        } while (true);    
    }
}
Also ich will erst einen Operator also + - * / vergleichen, die eingabe hat ja als ein String begonnen, den ich danach splitte.
Die Zahlen habe ich umgewandelt bekommen, aber ich weiß nicht warum er mir immer default ausgibt, selbst wenn die char einem case entsprechen.
Am Ende fragt das Programm ob es enden soll, bei Y einfach break; bei N nochmals durchlaufen und bei jeder anderen Eingabe soll die Auswahl Y/N erneut stattfinden -> also das while verursacht mir die Probleme bei true und false bei eingabe Y läuft es dennoch weiter wo es doch beendet sein sollte und bei true und N bricht er ab [soll er nicht] und bei false und N macht er die Schleife [soll er]
 
Zuletzt bearbeitet:
Switch läuft immer alle cases durch. Und natürlich bei jeder Eingabe auch default, weil default passt immer, egal was da überprüft wird. Deswegen immer bei jedem case das break; nicht vergessen. Dann springt er nach der passenden Eingabe aus dem Switch raus bevor er bei default ankommt.

Mehrere While auf ein do geht glaube ich nicht. Abgesehen davon stimmt da was mit den Klammern nicht, wenn ich das richtig sehe...
 
Zuletzt bearbeitet:
Switch läuft immer alle cases durch. Und natürlich bei jeder Eingabe auch default, weil default passt immer, egal was da überprüft wird. Deswegen immer bei jedem case das break; nicht vergessen. Dann springt er nach der passenden Eingabe aus dem Switch raus bevor er bei default ankommt.

Mehrere While auf ein do geht glaube ich nicht. Abgesehen davon stimmt da was mit den Klammern nicht, wenn ich das richtig sehe...

Ich habe die ganzen Breaks nicht vergessen alle vorhanden.

Ich habe ein do ganz am Anfang welches auf das letzte while geht und das 2. do geht auf das vorletzte while

und klammer technisch mekert eclipse nicht und eclipse ist ja sehr pingelig mit den klammern
 
Wenn ich mich nicht ganz irre, kannst du chars nicht überprüfen. Lass dass mit dem

if (endlauf!='N') {
if (endlauf == 'Y'

weg und setz die Bedingungen jeweils in die Fuß-schleifen ein. In der Bedingung versuchst du es dann mit „equal“ damit kannst du dann auch chars überprüfen
 
Ps. String in case geht nicht. Die erste Variante mit den if's ist da deutlich einfacher ;-)

ich bevorzuge auch die if variante vor allem weil ich gerne sachen extrem verschachtel aber ich will mal endlich das mit switch verstehen und ich hab schon sachen gegoogelt die erolgreich mit String konvertierungen in chars für switch gefunden, aber ich bekomm es nicht richtig auf meine operatoren angewandt
 
Wenn es gehen sollte, weiß ich nicht ganz wie. Da chars glaub ich nicht eindeutig sind, wie zb integer. War eh nie ein Fan von case Anweisungen xD
 
Nabend,
Wenn ich mich nicht ganz irre, kannst du chars nicht überprüfen. Lass dass mit dem

if (endlauf!='N') {
if (endlauf == 'Y'

weg und setz die Bedingungen jeweils in die Fuß-schleifen ein. In der Bedingung versuchst du es dann mit „equal“ damit kannst du dann auch chars überprüfen
Doch das geht, da chars eigendlich primitive Typen also eigendlich nur Zahlen sind aber als Zeichen dargestellt werden.
char c = 'c';
if(c == 'c')
//tuwas


Ps. String in case geht nicht. Die erste Variante mit den if's ist da deutlich einfacher ;-)
doch, auch das geht seid Java 1.7.


Der richtige Klassentyp für char ist Character schau dir die klasse mal an und probiers damit :).

Gruß
 
Nabend,

Doch das geht, da chars eigendlich primitive Typen also eigendlich nur Zahlen sind aber als Zeichen dargestellt werden.
char c = 'c';
if(c == 'c')
//tuwas



doch, auch das geht seid Java 1.7.


Der richtige Klassentyp für char ist Character schau dir die klasse mal an und probiers damit :).

Gruß

Das das mit Y und N geht weiß ich, da ich bereits genutzt hab aber nicht auf so einer weise da hatte ich einfach nur gesagt wenn Eingabe = Y dann break ansonsten gibg er schleife durch aber da kann man auch mit anderen befehlen die schleife laufen lassen und diesmal will ich die eingabe solange wiederholen bis Y oder N eingegeben wurde.

Das man Chars in switches seit 1.7 nutzen kann hab ich auch schon gelesen nur wusste ich nicht das man Character ausschreiben muss, jetzt such ich nur noch das passende Gegenstück für Chars von Double.parseDouble (); aber ich würd es gerne auch irgendwie auf java 1.6 machbar haben, da ich nicht die gewissheit habe, das mein Dozent Java 1.7 verwendet.
 
Okay, sry hab da was verwechselt. Character kann man so überprüfen. Wie du schon sagtest mit == bei einfachem = währe es eine Zuweisung. Equal war bei Strings
 
Zurück