Java while Schleife zählt eins zu viel hoch

dremba

Ensign
Registriert
März 2021
Beiträge
135
Moin,

ich hab ein kleines Java Programm geschrieben, indem ich einen unteren Grenzwert und einen oberen Grenzwert eingebe. Es werden dann alle ungerade Zahlen zwischen beiden Grenzwerten ausgegeben. Allerdings wird immer eine Zahl über dem oberen Grenzwert ausgegeben. Ansonsten funktioniert das Programm.

Beispiel: unterere Grenzwert 1, oberer Grenzwert 10, Ausgabe: 3,5,7,9,11

Wie mache ich das, dass die 11 nicht ausgegeben wird?

Java:
while(gu < go)
{
    if (gu % 2 == 0)
    {
        gu++;
        System.out.println(gu);
    }
    else
    {
        gu+=2;
        System.out.println(gu);
    }
}
 
Ich vermute mal du musst "gu größer gleich go" definieren.

Diese Bedingung ist ja erst bei 11 erfüllt, wenn du "gu größer go" setzt.


War Unsinn, ich hatte eben gu > go gelesen, ist aber gu < go.
 
  • Gefällt mir
Reaktionen: DarkAngel2401
Dein Denkfehler liegt im "else"-Teil. Wenn gu == 9 ist, ist gu < go immer noch erfüllt und du addierst im else 2 dazu und gibst es aus. Du könntest deine While-Bedingung in ((gu+2) < go) ändern.
 
  • Gefällt mir
Reaktionen: the_nobs und dremba
exakt, und dann noch die Frage - soll die Ausgabe inklusive oder exklusive der Unter- und Obergrenze erfolgen? Je nachdem müssen dann noch die Schleifenbedingung und das Inkrementieren anders behandelt werden.
 
Mikasa123456789 schrieb:
erst die Ausgabe und dann das erhöhen ?
Alexander2 schrieb:
Ich glaube du musst das mit dem addieren und ausgeben umdrehen, damit du nicht über die Zahl der Bedingung hinaus kommst :-)
Habe ich erst auch gedacht, aber dann würde er auch 1 ausgeben und du hast das Problem an der unteren Stelle ;)
 
Ich glaube du musst das mit dem addieren und ausgeben umdrehen, damit du nicht über die Zahl der Bedingung hinaus kommst :-)

Edit:
Mein Gedankengang:
In der letzten Schleife wo die Bedingung noch ok ist rechnest du noch vor der Ausgabe +2 und kommst so aus dem Bereich heraus... in dem was ausgegeben wird.
 
Startwert: 9
nicht teilbar durch 2,
also addierst du 2 drauf UND DANN printest du es.
9+2 = 11.

Deine Loop ist sehr merkwurdig geschrieben.
Mein erster Tipp wäre es stattdessen eine for-loop zu verwenden.
Wenns undbedingt while sein muss, inkrementiere deinen Zähler (gu) nuer einmal ganz am Ende des loops. Un d idealerweise verwende nicht gu als Zähler sondern einen separaten Wert der nur diesen Zweck hat ;)
Dann solltest du schnell zu einer funktionierenden Variante gelangen
 
  • Gefällt mir
Reaktionen: BeBur, HeavensBlade und cvzone
Wenn du den print-Befehl vor die Addition verlegst, sollten die Ergebnisse wie gewünscht aussehen.
 
Danke euch schon mal für die Antworten. Ich versuche das mal umzusetzen :)
 
proserpinus schrieb:
Wenn du den print-Befehl vor die Addition verlegst, sollten die Ergebnisse wie gewünscht aussehen.
Jein, je nachdem ob die Grenzen mit ausgegeben werden sollen oder nicht.

Die Überprüfung ob die Zahl gerade ist würde ich auch aus der while-Schleife ziehen und nur einmal am Anfang machen und dann in eine Schleife mit bekannter ungerader Zahl springen. Dann muss innerhalb der Schleife immer mit 2 inkrementiert werden.
 
Mikasa123456789 schrieb:
wusste nicht das die 1 nicht ungerade wär?!
Er schreibt ja, dass das "Programm" alle ungeraden Zahlen zwischen Ober- und Untergrenze ausgeben soll.
Dann sollte die 1 nicht ausgegeben werden in seinem Beispiel, würde sie aber, wenn man mit 1 startet, weil dann zuerst im Else-Teil ausgegeben wird und dann erst hochgezählt, wenn man deinem Lösungsansatz folgt.

Am simpelsten (ohne seinen Code groß zu ändern) ist die Abbruchbedingung früher auszulösen, also ((gu+2) < go) oder (gu < (go-2)).
 
Das Problem könnte er ja simpel verhindern indem er den untersten wert vor der schleife +1 setzt..
 
Mal ganz naiv:

int gu = 1;
int go = 10;
for (int i = ++gu; i < go; i++) {
if (1 == i % 2)
System.out.println(i);
}

Edit: Untere Grenze soll nicht mit ausgegeben werden.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: SFFox
So jetzt funktioniert es, vielen Dank :)

@SFFox hab es so gemacht.

while((gu+2) < go)
 
  • Gefällt mir
Reaktionen: SFFox
DarkAngel2401 schrieb:
soso, und was ist jetzt mit gu = 2 und go = 4 ?
Sehr guter Punkt 😂 Immer diese edge cases.
 
  • Gefällt mir
Reaktionen: DarkAngel2401
Code:
int gu = 1;
int go = 10;

gu += gu%2 == 0 ? 1 : 2;
while (gu < go) {
   System.out.println(gu);
   gu += 2;
}
 
  • Gefällt mir
Reaktionen: KitKat::new(), dremba und SFFox

Ähnliche Themen

Zurück
Oben