ich versuche mich hier an einem Beispiel bei dem durch einen Scanner solange Zahlen eingelesen werden bis "0" eingegeben wird.
Sobald "0" eingegeben wurde gibt das Programm die Höchste Zahl und die Stelle an welche diese steht aus (Bsp. Eingabe: 3, 5, 9, 2, 0 --> Ausgabe: 9 und dessen Position 3)
Leider funktioniert das ganze nicht wenn man nur negative zahlen eingibt. Das Programm soll dabei die letzte Eingabe, die 0 nicht berücksichtigen und die niedrigste negative Zahl ausgeben.
Erkennt jemand meinen Denkfehler?
Java:
publicstaticvoidmain(String[] args){Scanner in =newScanner(System.in);int n = in.nextInt();int position =0;int max =0;while(n !=0){
n = in.nextInt();if(max < n){
max = n;}
position++;}System.out.println("Die größte Zahl = "+ max +" auf Position "+ position);}
Du willst also immer die Zahl ausgeben, dessen absoluter Betrag der größte ist (also die Zahl, die am weitesten von 0 entfernt ist)? Also wenn negative Zahl, dann die Zahl, die am weitesten von 0 entfernt ist. Und dasselbe auch, wenn eine positive Zahl eingegeben wurde. Und wenn z.B. -9 und +10 eingegeben wurde, dann gewinnt +10.
Direkt nach der Eingabe prüfst Du, ob max < n ist - auch wenn n 0 ist. Aber Du willst das ja nur, wenn n nicht 0 nicht. Also max wird nur dann neu gesetzt, wenn max kleine n und n nicht 0 ist.
Du könntest Dein max auf den kleinstmöglichen Wert (Integer.MIN_VALUE) initialisieren, dann werden auf negative Zahlen berücksichtigt.
Außerdem solltes bedenken, dass position mit jeder neuen Eingabe (Loop) weiter läuft und von max entkoppelt ist. Da fehlt also noch was in Deinem Code.
Habe ich ebenfalls zuerst gedacht, ist aber insofern auch nicht perfekt, da trotzdem eine redundante Abfrage auf (n == 0) benötigt wird, damit eben die 0 nicht als Maximum interpretiert werden kann.
Mir gefällt dann doch die while(true)-Schleife mit break-Anweisung an der richtigen Stelle besser. Ansichtssache.
Du musst die max gleich n (nach n initialisiert wurde) initiliasieren.
Dann musst du nur die Vergleichung (max < n) vor du n wieder deklarierst.
Wenn du max gleich 0 initialisierst, dann wird aber keine negative Zahlen geben, die größer als max sind.
Und wenn du die Vergleichung machst, dann sollst du es machen aber wenn du weißt, dass die Zahl kein 0 ist.
Danke euch allen!
Die Kombination aus @KonradN und @MarvinsDepression ist perfekt.
Einfach max mit Integer.Min_Value initialisieren und bei der if Abfrage die Bedingung dass x != 0 dazunehmen.
Was genau macht das Integer.Min_Value? Das setzt doch den Wert von max auf den kleinsten Integer wert oder?
Habe ich ebenfalls zuerst gedacht, ist aber insofern auch nicht perfekt, da trotzdem eine redundante Abfrage auf (n == 0) benötigt wird, damit eben die 0 nicht als Maximum interpretiert werden kann.
Mir gefällt dann doch die while(true)-Schleife mit break-Anweisung an der richtigen Stelle besser. Ansichtssache.
Eine doppelte Bedingungsprüfung wäre vom Aufbau her aber nun wirklich das kleinste Problem.
Außerdem ist ein Vergleich mit 0 ja auch ok, max ist am Anfang ja auch 0.
Alernativ kannst du auch eine Endlosschleife nutzen und bei Eingabe von 0 abbrechen.
Nicht schön, aber wenigstens hast du so die gleiche Aufgabe nicht mehrfach im Code.
Eine weitere Alternative wäre, das Ganze in eine Methode zu packen und anstatt des Break-Befehls an dieser Stelle den aktuellen Max-Wert als Ergebnis zu liefern.
Logik - vor allem, wenn es bei dem, was man machen will, ein Ergebnis gibt - gehört nicht in die Main-Methode.
Du hast da eigentlich relativ viele Möglichkeiten, zum Ergebnis zu kommen. Letztendlich unterscheiden sich die Tips nur durch persönliche Präferenzen.