Seite 1 von 25 1234511 ... LetzteLetzte
Ergebnis 1 bis 15 von 369

Thema: Ein Narr lernt Java

  1. #1
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144

    Ein Narr lernt Java



    So, ich dachte, so gegen Ende des Studiums lerne ich doch noch mal ein bisschen programmieren

    Geht auch - mit diesem Tutorial - ganz gut.

    Jetzt dachte ich mir, ich schreibe ein Kassenprogramm, das, solange man nicht zur Abrechnung will, immer neue Posten anlegt, nach dem Steuersatz fragt und das nachher addiert.

    So sieht das aus:

    PHP-Code:
    import java.util.*;
    class 
    Entscheidungen {

        
    /**
         * @param args
         */
        
    public static void main(String[] args) {
            
    // TODO Auto-generated method stub
    Scanner scan = new Scanner(System.in);        
    int a=0,b=0,aufrechnung=0,steuer,brutto;
    String antwort,ans;
    final 
    int STEUERA=7STEUERB=19;
    System.out.println("Willkommen an der Kasse");
    while (
    aufrechnung==0)
        {
    aufrechnung=1;
        
    System.out.println("Ware mit ermäßigtem Steuersatz (J/N)?");
        
    antwortscan.nextLine(); 

        if (
    antwort.equals("J")) 
        {
            
    System.out.println("Wert der Ware in Cent?");
            
    a=ascan.nextInt();
        }
        else 
            {
                if (
    antwort.equals("N"))
                {
                    
    System.out.println("Wert der Ware in Cent?");
                    
    b=bscan.nextInt();
            
                }
                else 
    System.out.println("Unzulässige Antwort"); 
            }

    System.out.println("Zur Abrechnung (J/N)? ");
        
    ansscan.nextLine();
        
        if (
    ans.equals("N"))
        {
            
    aufrechnung=0;
        }
        else 
        {
            
    System.out.println("Abrechnung:"); 
        }
        
    }

    steuer=a*STEUERA b*STEUERB;
    brutto=100*a+100*b+steuer;

    System.out.println("Die Gesamtsumme beträgt: "brutto/10000.0 "€");
    System.out.println("Davon sind "steuer/10000.0 +"€ Steuern");
        }

    Leider macht er nicht das, was ich will - wie solls auch anders sein Es wird keine Eingabe an dieser Stelle
    Code:
    System.out.println("Zur Abrechnung (J/N)? ");
    	ans= scan.nextLine();
    	
    	if (ans.equals("N"))
    	{
    		aufrechnung=0;
    	}
    	else 
    	{
    		System.out.println("Abrechnung:"); 
    	}
    abgewartet.

    Im oberen Teil (wo nach dem Steuersatz gefragt wird), wird aber sehr wohl eine Eingabe abgewartet.

    Kann das jemand nachvollziehen und mir sagen, was mein Fehler ist? Muss ich ein weiteres Scannerobjekt definieren? Das kann ich mir eigentlich nicht vorstellen, da ich mein Scannerobjekt ja für alle Eingaben benutze, und das funktioniert ...

    Danke
    Geändert von Peregrin_Tooc (14. September 2011 um 00:11 Uhr) Grund: Tippfehler beseitigt, Code lesbarer gemacht
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  2. #2
    Unbekannter Nr 17984 Avatar von Walahan
    Registriert seit
    15.11.09
    Ort
    Oldenburg
    Beiträge
    21.289
    while (aufrechnung==0)
    (...)
    }

    System.out.println("Zur Abrechnung (J/N)? ");
    Hast Du da ein "wend" als Beendigung von "while" unterschlagen? So kenne ich es von C oder Basic, von Java habe ich keinen Plan.

  3. #3
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Nein, bei Java ist die Syntax
    while (Bedingung) {Hier steht, was getan wird, solange die Bedingung erfüllt ist}

    Die Schleife funktioniert auch, je nachdem, wie ich die Variable aufrechnung initialisiere bzw. in der Schleife setze, läuft sie nie, genau einmal oder unendlich oft.
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  4. #4
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    OK, es liegt tatsächlich an den Scannerobjekten. Mal friemeln, wie ich das jetzt erledige, ich nehme an, dass es ein Problem ist, die Scanner den Typ wechseln zu lassen.

    Tante Edith lässt mitteilen: So funktioniert es:
    PHP-Code:
    import java.util.*;
    class 
    Entscheidungen {

        
    /**
         * @param args
         */
        
    public static void main(String[] args) {
            
    // TODO Auto-generated method stub
    Scanner scan = new Scanner(System.in);        
    Scanner scan2 = new Scanner(System.in);
    int a=0,b=0,aufrechnung=0,steuer,brutto;
    String antwort;
    final 
    int STEUERA=7STEUERB=19;
    System.out.println("Willkommen an der Kasse");
    while (
    aufrechnung==0)
        {
    aufrechnung=1;
        
    System.out.println("Ware mit ermäßigtem Steuersatz (J/N)?");
        
    antwortscan2.nextLine(); 

        if (
    antwort.equals("J")) 
        {
            
    System.out.println("Wert der Ware in Cent?");
            
    a=ascan.nextInt();
        }
        else 
            {
                if (
    antwort.equals("N"))
                {
                    
    System.out.println("Wert der Ware in Cent?");
                    
    b=bscan.nextInt();
            
                }
                else 
    System.out.println("Unzulässige Antwort"); 
            }

    System.out.println("Zur Abrechnung (J/N)? ");
        
    antwortscan2.nextLine();
        
        if (
    antwort.equals("N"))
        {
            
    aufrechnung=0;
        }
        else 
        {
            
    System.out.println("Abrechnung:"); 
        }
        
    }

    steuer=a*STEUERA b*STEUERB;
    brutto=100*a+100*b+steuer;

    System.out.println("Die Gesamtsumme beträgt: "brutto/10000.0 "€");
    System.out.println("Davon sind "steuer/10000.0 +"€ Steuern");
        }

    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  5. #5
    負けないで Avatar von nephtys
    Registriert seit
    04.04.09
    Beiträge
    2.373
    Zitat Zitat von Walahan Beitrag anzeigen
    Hast Du da ein "wend" als Beendigung von "while" unterschlagen? So kenne ich es von C oder Basic, von Java habe ich keinen Plan.
    Zum Glück gibt es in meiner C Welt so etwas Gruseliges nicht.

    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    OK, es liegt tatsächlich an den Scannerobjekten. Mal friemeln, wie ich das jetzt erledige, ich nehme an, dass es ein Problem ist, die Scanner den Typ wechseln zu lassen.
    Das Problem an der Stelle ist, dass du bei der Eingabe eines Integers leider nicht nur den Integer eingibst, sondern das Ganze mit einem Newline (Entertaste ) terminierst. nextInt liest natürlich nur die eingegebene Zahl ein, und lässt das \n im Stream. Wenn du unten nun nextLine aufrufst, holst du dir natürlich unbeabsichtigter Weise das newline.

    So, jetzt solltest du es wieder auf eine Lösung mit nur einem Scannerobjekt reduzieren können.

  6. #6
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Zitat Zitat von nephtys Beitrag anzeigen
    Das Problem an der Stelle ist, dass du bei der Eingabe eines Integers leider nicht nur den Integer eingibst, sondern das Ganze mit einem Newline (Entertaste ) terminierst. nextInt liest natürlich nur die eingegebene Zahl ein, und lässt das \n im Stream. Wenn du unten nun nextLine aufrufst, holst du dir natürlich unbeabsichtigter Weise das newline.

    So, jetzt solltest du es wieder auf eine Lösung mit nur einem Scannerobjekt reduzieren können.
    Ah. Hmmm. Nee, is kla

    Ich glaube, das Problem habe ich verstanden. Wie die Lösung aussehen könnte, ist mir allerdings im Moment noch schleierhaft. Ich muss irgendwie das newline aus dem Stream holen, nachdem die Integer eingegeben wurde. Aber wie geht das?
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  7. #7
    Beyond Mars Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    59.538
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Ah. Hmmm. Nee, is kla

    Ich glaube, das Problem habe ich verstanden. Wie die Lösung aussehen könnte, ist mir allerdings im Moment noch schleierhaft. Ich muss irgendwie das newline aus dem Stream holen, nachdem die Integer eingegeben wurde. Aber wie geht das?
    Ich hätte jetzt gesagt, dass es sicher eine Funktion gibt die das letzte Zeichen abschneidet. Im Zweifel müsstest du dir so eine Funktion selber schreiben.

    Als Alternative gäbe es noch die Möglichkeit einen String einzulesen, ihn zu bearbeiten und dann in einen int umzuwandeln.

    Letzteres hätte auch den Vorteil das du eine Liste anlegen könntest, und so eingaben wie "Kaffee:400", "Fahrrad:30000" machen könntest, und dann bei der Abrechnung eine schöne Ausgabe ala:
    Kaffee 400
    Fahrrad 30000
    Gesamt 30400
    anfertigen kannst.

    Eh naja, du könntest dann auch Werte wieder ändern

  8. #8
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Habs rausgefunden: Nicht scan.nextLine() sondern scan.next verwenden.

    Jetzt verstehe ich allerdings noch nicht, warum es scan.nextLine und scan.next gibt, wenn scan.next doch auch das richtige macht
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  9. #9
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Zitat Zitat von [VK] Beitrag anzeigen
    Ich hätte jetzt gesagt, dass es sicher eine Funktion gibt die das letzte Zeichen abschneidet. Im Zweifel müsstest du dir so eine Funktion selber schreiben.

    Als Alternative gäbe es noch die Möglichkeit einen String einzulesen, ihn zu bearbeiten und dann in einen int umzuwandeln.

    Letzteres hätte auch den Vorteil das du eine Liste anlegen könntest, und so eingaben wie "Kaffee:400", "Fahrrad:30000" machen könntest, und dann bei der Abrechnung eine schöne Ausgabe ala:
    Kaffee 400
    Fahrrad 30000
    Gesamt 30400
    anfertigen kannst.

    Eh naja, du könntest dann auch Werte wieder ändern
    Das nächste Ziel ist es erstmal, dass sich das Programm die Posten merkt und sie nachher alle mit der entsprechenden Steuer ausgibt.
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  10. #10
    Beyond Mars Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    59.538
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Habs rausgefunden: Nicht scan.nextLine() sondern scan.next verwenden.

    Jetzt verstehe ich allerdings noch nicht, warum es scan.nextLine und scan.next gibt, wenn scan.next doch auch das richtige macht
    Wenn ich die Java API richtig lese dann gibt dir nextLine() die gesamte Zeile aus, während next dir nur das nächste "Token" ausgibt. Wenn du "24 S 123" eingibst dürfte er dir nur 24 ausgeben. Kann ich auch ihren.

    Ich halte es trotzdem für sinnvoller die gesamte Zeile einzulesen und das EOL Zeichen zu entfernen, such mal nach Java trim()

  11. #11
    Ausgetreten
    Gast
    Seit wann gibt es denn dieses Scanner-Objekt. Ich kenne hauptsächlich Java4/Java5. Da habe ich die Eingaben immer mit einem BufferedReader eingelesen

  12. #12
    ... Avatar von Janilein
    Registriert seit
    02.08.04
    Ort
    Göttingen
    Beiträge
    13.696
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Habs rausgefunden: Nicht scan.nextLine() sondern scan.next verwenden.

    Jetzt verstehe ich allerdings noch nicht, warum es scan.nextLine und scan.next gibt, wenn scan.next doch auch das richtige macht
    Bei sowas kann man auch gern mal in der Java API Dokumentation nachschlagen.

    http://download.oracle.com/javase/1,...l/Scanner.html

    nextLine: Advances this scanner past the current line and returns the input that was skipped.
    next: Finds and returns the next complete token from this scanner.

    Das Problem war einfach, dass nextLine() was anderes gemacht hat, als du dachtest, dass es macht.

  13. #13
    負けないで Avatar von nephtys
    Registriert seit
    04.04.09
    Beiträge
    2.373
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Habs rausgefunden: Nicht scan.nextLine() sondern scan.next verwenden.

    Jetzt verstehe ich allerdings noch nicht, warum es scan.nextLine und scan.next gibt, wenn scan.next doch auch das richtige macht
    Scanner.next() führt genau zu dem Verhalten, das [VK] beschrieben hat. Dein eingelesener String endet am nächsten Whitespace.
    Eine einfache Lösungsidee wäre es, nach dem nextInt() ein "Dummy-nextLine()" einzufügen, um den Delimiter loszuwerden. Ansonsten bleibt natürlich die Möglichkeit alles als String einzulesen und dann selber zu parsen.

    Man muss aber schon sagen, dass Java trotz solch unintuitivem, aber erklärbarem, Verhalten, eine unverständlich große Durchdringung besitzt.

    In Java 5 gab es Scanner schon, soweit ich mich korrekt erinnere.

  14. #14
    Macht Musik Avatar von Peregrin_Tooc
    Registriert seit
    21.05.05
    Ort
    St. Ingbert
    Beiträge
    11.144
    Was meinst Du mit Durchdringung?
    Zitat Zitat von Leonard Bernstein
    This will be our reply to violence:
    to make music more intensely,
    more beautifully,
    more devotedly than ever before.
    Meine Stories:
    Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
    Der Erste Kaiser wieder aufgenommen

  15. #15
    負けないで Avatar von nephtys
    Registriert seit
    04.04.09
    Beiträge
    2.373
    Zitat Zitat von Peregrin_Tooc Beitrag anzeigen
    Was meinst Du mit Durchdringung?
    Marktdurchdringung. Es wird, meiner Meinung nach, der Qualität der Sprache unangemessen oft benutzt. Ich sehe den Nerd-Flamewar kommen...

Seite 1 von 25 1234511 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •