1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Taschenrechner

  • Krackmoe
  • 22. Oktober 2007 um 22:31
  • Unerledigt
  • Krackmoe
    5
    Krackmoe
    Mitglied
    Punkte
    260
    Beiträge
    36
    • 22. Oktober 2007 um 22:31
    • #1

    Möchte noch eine case Anweisung eingeben, dass falls rechenop ein leerzeichen sein sollte oder gar nichts eingegeben wird, das auch Falsche Eingabe erscheint.
    Finde im ganzen Internets nichts dazu, wie ich so einen Case erstelle.

    Java
    import java.util.*;
    
    
    public class calc
    { 
    
    
        public static void main (String[] args) 
        { 
            double a,b;
            double ausgabe=0.00;
            char rechenop;
            Scanner s = new Scanner (System.in);
    
            System.out.print("Geben sie Zahl 1 ein: ");
                a = s.nextInt();
            System.out.print("Geben sie Zahl 2 ein: ");
                b = s.nextInt();        
            System.out.print("Geben sie den Rechenoperator ein: ");
                rechenop = s.next().charAt(0);
            System.out.println();
    
            switch (rechenop)
            {
            case '+':
                ausgabe = a+b;
                System.out.print("Das Ergebnis lautet: " +ausgabe);
                break;
            case '-':
                ausgabe = a-b;
                System.out.print("Das Ergebnis lautet: " +ausgabe);
                break;
            case '*':
                ausgabe = a*b;
                System.out.print("Das Ergebnis lautet: " +ausgabe);
                break;
            case '/':
                ausgabe = a/b;
                System.out.print("Das Ergebnis lautet: " +ausgabe);
                break;
            default:
                System.out.print("Falsche Eingabe");
                break;
            }
    
    
    
            } 
    }
    Alles anzeigen
  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 22. Oktober 2007 um 23:05
    • #2

    tut es ja ohnehin ('default:'). sonst steht einem

    Code
    case ' ':

    doch nichts im wege.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Krackmoe
    5
    Krackmoe
    Mitglied
    Punkte
    260
    Beiträge
    36
    • 22. Oktober 2007 um 23:06
    • #3

    das mit dem case ' ': hab ich schon ausprobiert. Funktioniert aber leider damit nicht.
    Und rein mim default gehts auch nicht, dann tut er nämlich einfach gar nichts und gibt mir keine "Falsche Eingabe" aus.

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 22. Oktober 2007 um 23:08
    • #4

    warum? bei mir funktionierts:

    Java
    import java.util.*;
    
    
    public class calc
    { 
    
    
        public static void main (String[] args) 
        { 
            double a=3,b=4;
            double ausgabe=0.00;
            char rechenop=' ';
                    System.out.println("");
    
    
            switch (rechenop)
            {
            case '+':
                ausgabe = a+b;
                System.out.print("Das Ergebnis lautet: " +ausgabe);
                break;
            case '-':
                ausgabe = a-b;
                System.out.print("Das Ergebnis lautet: " +ausgabe);
                break;
            case '*':
                ausgabe = a*b;
                System.out.print("Das Ergebnis lautet: " +ausgabe);
                break;
            case '/':
                ausgabe = a/b;
                System.out.print("Das Ergebnis lautet: " +ausgabe);
                break;
            case ' ':
                System.out.print("Leerzeichen");
                break;
            default:
                System.out.print("Falsche Eingabe");
                break;
            }
    
    
    
                    System.out.println("");
            } 
    }
    Alles anzeigen

    liefert bei mir "Leerzeichen".

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 22. Oktober 2007 um 23:17
    • #5

    Dein Problem haengt gar nicht mit dem case Statement zusammen. Die Methode next() von der Klasse scanner ist so dokumentiert:

    Zitat


    public String next()

    Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern. This method may block while waiting for input to scan, even if a previous invocation of hasNext() returned true.

    http://java.sun.com/javase/6/docs/…nner.html#next()

    Wie findet man sowas heraus? Zum Beispiel, indem man an verschiedenen Stellen des Programms print statements setzt und so schaut , wo das programm haengenbleibt. Und man kann auch mit den print statements herausfinden, welchen wert die variablen im code haben.

    Wenn Du dann festgestellt hast, welche Methode fuer den Fehler verantwortlich ist, schaust Du erstmal in der API nach, ob Du sie auch wirklich so funktioniert wie Du es angenommen hast.


    Um Dein Problem zu loesen, gibt es nun verschiedene Moeglichkeiten: Du koenntest z.B. die Eingaben zeilenweise einlesen, mit (Scanner.nextLine(), Scanner.hasNextLine()). Oder Du aenderst den delemiter vom Scanner auf etwas anderes, mit useDelemiter; ein Zeilenumbruch bietet sich hier an:

    Code
    s.useDelimiter(Pattern.compile("\n"));

    in diesem fall musst du aber vor

    Code
    rechenop = s.next().charAt(0);

    Noch abfragen, ob es auch wirklich eine Eingabe gegeben hat. Denn wenn es kein Input gibt, kann das natuerlich nicht gutgehen.

    lg, Benjamin Ferrari, bookworm.at

  • Krackmoe
    5
    Krackmoe
    Mitglied
    Punkte
    260
    Beiträge
    36
    • 22. Oktober 2007 um 23:18
    • #6

    Check ich nicht, bei mir kommt NICHTS. Er tut einfach so als ob er noch auf eine Eingabe wartet.

  • Horrendus
    7
    Horrendus
    Mitglied
    Punkte
    520
    Beiträge
    92
    • 23. Oktober 2007 um 00:01
    • #7
    Zitat von Krackmoe

    Check ich nicht, bei mir kommt NICHTS. Er tut einfach so als ob er noch auf eine Eingabe wartet.

    Tja dann hängt dein Programm wahrscheinlich bei .next() ... deswegen wie a9bejo sagte Print Statements machen.

    Aber wenn du es für EProg brauchst (danach sieht es sehr aus) musst du die Eingabe sowieso noch umschreiben.

    lg Stefan

  • Kuoni
    2
    Kuoni
    Mitglied
    Punkte
    35
    Beiträge
    6
    • 23. Oktober 2007 um 15:26
    • #8

    Warum muss er die Eingabe noch umschreiben???
    Muss man in Eprog die Abgaben so implementieren dass die Testläufe mit Textdateien abgehandelt werden??

    lg max

    Die Zeit war schön, nur ans is bled...
    ... dass mit der Zeit die Zeit vergeht :omg:

  • Horrendus
    7
    Horrendus
    Mitglied
    Punkte
    520
    Beiträge
    92
    • 23. Oktober 2007 um 15:36
    • #9

    Naja wegen folgendem:

    1) Es darf keine Ausgabe außer dem Ergebniss oder halt FALSCHE EINGABE kommen, also kein: Bitte geben sie Zahl a ein
    2) Er darf nicht darauf vertrauen das die EProg Spezifikationen so nett zu ihm sind und a) 3 Werte haben die eingelesen werden b) 2 Zahlen am Anfang haben

    Die Textfiles simmulieren nur die Eingabe, aber ohne Textfiles kannst du ihm das END OF FILE so schlecht simulieren (bzw. steht ehh in der Angabe ... unter Windows gehts mit STRG Z, unter Linux hab ichs nicht rausgefunden wie es geht bis jetzt)

    lg Stefan

  • jeuneS2
    11
    jeuneS2
    Mitglied
    Reaktionen
    17
    Punkte
    1.227
    Beiträge
    238
    • 23. Oktober 2007 um 16:37
    • #10
    Zitat von Horrendus

    Die Textfiles simmulieren nur die Eingabe, aber ohne Textfiles kannst du ihm das END OF FILE so schlecht simulieren (bzw. steht ehh in der Angabe ... unter Windows gehts mit STRG Z, unter Linux hab ichs nicht rausgefunden wie es geht bis jetzt)

    Unter Unices ist es STRG+D.

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • thrau
    4
    thrau
    Mitglied
    Reaktionen
    3
    Punkte
    123
    Beiträge
    19
    • 24. Oktober 2007 um 02:18
    • #11

    das problem bei deinem code und den testinputs die dir das eprog testscript geben wird (siehe Horrendus' post) ist soweit ich das beurteilen kann, dass du kein exception handling hast. du musst damit rechnen, dass du einen programmfehler bekommst wenn du eine falsche eingabe tätigst.

    es gibt mehrere möglichkeiten für das problem. die eleganteste (meiner meinung nach) lösung wäre ein try/catch block mit dem du die jeweiligen fehler der bei einer eingabe entstehen könnte (eigentlich sinds eh nur falsche eingabe und keine eingabe) auffängst. das haben wir aber noch nicht gelernt. (im internet kannst du die syntax dafür aber sicher recherchieren).

    du könntest dir aber auch die folien von der heutigen vo nochmal durchsehen, da haben wir das eh gemacht :)
    guck mal auf folie 167-170 / 251 in den aktuellen folien http://tosca.inflab.tuwien.ac.at/eprip/downloads.dohttp://tosca.inflab.tuwien.ac.at/eprip/downloads.do

    hier wird halt jedesmal mit hasNext() überprüft ob die eingabe quasi "stimmt", und dann erst weitergemacht.

  • erikk
    2
    erikk
    Mitglied
    Punkte
    15
    Beiträge
    3
    • 5. November 2007 um 00:10
    • #12

    hallo,
    kann mir bitte jemand sagen wie ich überprüfe ob ein operator eingegeben wurde?! das problem wurde oben schon genannt, aber bin irgendwie auf keine lösung gekommen.
    wenn ich die beiden zahlen eingebe, aber keinen operator, und danach enter drücke wartet er auf eine eingabe, aber eigentlich sollte eine fehlermeldung kommen. ich hoffe jemand kann mir helfen.

    erikk

  • Reinhard Seiler
    2
    Reinhard Seiler
    Mitglied
    Punkte
    40
    Beiträge
    8
    • 5. November 2007 um 13:54
    • #13

    Drücke einfach strg+c (bzw. strg+z bei Linux/Mac) in der DOS-BOx. Damit teilst du dem Programm mit, dass die Eingabe beendet wurde.

    Lg,
    Reinhard

  • Paulchen
    1
    Paulchen
    Gast
    • 5. November 2007 um 14:16
    • #14
    Zitat von Reinhard Seiler

    Drücke einfach strg+c (bzw. strg+z bei Linux/Mac) in der DOS-BOx. Damit teilst du dem Programm mit, dass die Eingabe beendet wurde.

    *räusper* EOF ist Strg+Z unter Windows, in Unices Strg+D; mir ist nicht bekannt, dass Strg+Z in Unices irgendwas ähnliches macht.

    Strg+C dient üblicherweise dazu, irgendeine Aktion abzubrechen, unter Unices schickst du dabei ein Signal an den entsprechenden Prozess, wie das unter Windows funktioniert, weiß ich nicht. Auf jeden Fall ist das nicht dafür gedacht, dem Programm mitzuteilen, dass die Eingabe zu Ende ist.

  • erikk
    2
    erikk
    Mitglied
    Punkte
    15
    Beiträge
    3
    • 5. November 2007 um 14:49
    • #15

    da kommt bei mir immer eine fehlermeldung, und zwar:

    Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:838)
    at java.util.Scanner.next(Scanner.java:1347)
    at Calculator.main(Calculator.java:41)

  • Paulchen
    1
    Paulchen
    Gast
    • 5. November 2007 um 17:00
    • #16

    Dann solltest du vor next() hasNext() aufrufen.

  • erikk
    2
    erikk
    Mitglied
    Punkte
    15
    Beiträge
    3
    • 5. November 2007 um 18:34
    • #17

    danke!

  • Kuoni
    2
    Kuoni
    Mitglied
    Punkte
    35
    Beiträge
    6
    • 6. November 2007 um 20:51
    • #18

    Hi Leute!
    Vielleicht kann mir da jemand helfen.
    Warum erkennt die Methode reader.hasNext() nicht wenn meine Eingabe beendet ist?

    Wenn ich zb:
    "+ 1" eingebe, terminiert das Programm nicht sonder wartet auf weitere Eingaben... warum nur?


    if (reader.hasNext())
    {
    operator = reader.next().charAt(0); //Einlesen des Operators

    }
    else
    {
    error=true;

    }

    if (reader.hasNext() && error==false) //Einlesen der ersten komplexen Zahl!
    {
    z1.a = reader.nextInt();
    }
    else
    {
    error=true;
    }

    if (reader.hasNext() && error==false)
    {
    z1.b = reader.nextInt();
    }
    else
    {
    error=true;
    z1.a=0; // wenn Eingabe zB - 2 ist soll ja 0 + 0 ausgegeben werden,
    z1.b=0; // deshalb werden für diesen Fall Immaginär und Realteil = 0 gesetzt!
    }

    Die Zeit war schön, nur ans is bled...
    ... dass mit der Zeit die Zeit vergeht :omg:

  • Kuoni
    2
    Kuoni
    Mitglied
    Punkte
    35
    Beiträge
    6
    • 6. November 2007 um 22:11
    • #19

    hab den fehler schon gefunden....
    hasnext erkennt EOF wenn ma STRG + D drückt...
    Nach 1 Stunde suche hab ich den Fehler endlich gefunden :winking_face:
    Dafür merk ichs mir jetz!

    Die Zeit war schön, nur ans is bled...
    ... dass mit der Zeit die Zeit vergeht :omg:

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung