# Schleife mit mehreren Bedingungen ?



## unge19 (23. Sep 2017)

Hallo zusammen,
ich versuch eine Aufgabe zu lösen komme aber nicht mehr weiter. Vielleicht kann mir jemand helfen. 
Die Aufgabe ist :
Schreiben Sie ein Programm, das den Anwender nach einer Unter- und Obergrenze für einen Bereich von Ganzzahlen fragt. Das Programm fragt dann den Anwender nach Ganzzahlen, die addiert werden sollen. Das Programm berechnet zwei Summen:


Die Summe der Integer, die im Bereich sind (inklusive)
und die Summe der Integer, die außerhalb des Bereichs sind.
Der Anwender signalisiert das Ende der Eingabe mit einer 0. (gailer.net)


So jetzt habe ich es mit der do while schliefe versucht, sodass ich solange werte eingebe bis ich eine null eingebe. Jetzt weiß ich aber nicht wie ich die Summen berechnen soll ?

vielen dank im voraus


----------



## Lamajockey (23. Sep 2017)

Moin,
ein kleiner hinweis
in der Schleife
erg += erg ;


----------



## Javinner (23. Sep 2017)

unge19 hat gesagt.:


> Hallo zusammen,
> ich versuch eine Aufgabe zu lösen komme aber nicht mehr weiter. Vielleicht kann mir jemand helfen.
> Die Aufgabe ist :
> Schreiben Sie ein Programm, das den Anwender nach einer Unter- und Obergrenze für einen Bereich von Ganzzahlen fragt. Das Programm fragt dann den Anwender nach Ganzzahlen, die addiert werden sollen. Das Programm berechnet zwei Summen:
> ...



Es sollen zwei Zahlen eingegeben werden, welche die Grenzen des Bereiches bilden (Beispiel: Oberer Bereich = 10;Unterer Bereich = 4)
Abgebrochen wird mit '0', bis dahin soll jede weitere Eingabe sortiert/dazu addiert  in: Summe aller Zahlen innerhalb und anschließend der Grenzen, Summe aller Zahlen außerhalb der Grenze.

Ist es so richtig?


----------



## Javinner (23. Sep 2017)

Spoiler: Spoileralarm!





```
public class IntegerGrenze
{

    //Summe der jeweiligen Bereiche;
    static int ausserhalb = 0;
    static int innerhalb = 0;

    public static void main(String[] args)
    {
       
        int oberGrenze = new Scanner(System.in).nextInt();
        int unterGrenze = new Scanner(System.in).nextInt();

        while (true)
        {
            //Test: Obergrenze immer groesser Untergrenze;
            //Schleifenende, wenn true;
            if (oberGrenze <= unterGrenze)
            {
                //Alternativ ist es moeglich, den Wert der Zahlen
                //untereinander zu tauschen;
                //dann natuerlich auch keine Meldung;
                out.println("Die Obergrenze muss größer Untergrenze sein");
                return;
            }
            //Eingabe Wert
            int eingabe = new Scanner(System.in).nextInt();
            //Test: Bereichstest, sortieren;
            if (eingabe <= oberGrenze && eingabe >= unterGrenze)
            {
                innerhalb += eingabe;
            } else {
                ausserhalb += eingabe;
            }
            //Wenn '0', Zusammenfassung:
            //Summe innerhalb und ausserhalb des Bereiches;
            if (eingabe == 0)
            {
                out.printf("Summe innerhalb des Bereiches %d und %d ist %d, "
                        + "\naußerhalb des Bereiches %d%n",
                        oberGrenze, unterGrenze, innerhalb, ausserhalb);
                return;
            }
        }
    }
}
```


----------



## Tobse (24. Sep 2017)

Javinner hat gesagt.:


> Spoiler: Spoileralarm!
> 
> 
> 
> ...


Das geht aber besser:

1. Man braucht nur einen Scanner. Für jedes Einlesen ein new Scanner() zu schreiben ist schlechter Stil; wenn man sich den angewöhnt bekommt man in größeren Projekten Probleme mit der Performance und dem Speichergebrauch.
2. while(true) ist äußerst selten eine gute Idee. Ich hätte es so gemacht:


Spoiler





```
int eingabe;
while ((eingabe = scanner.nextInt()) != 0) {
    // ...
}
```


----------



## mrBrown (24. Sep 2017)

Tobse hat gesagt.:


> 2. while(true) ist äußerst selten eine gute Idee. Ich hätte es so gemacht:
> 
> ```
> int eingabe;
> ...



Ich hätte es so gemacht:


```
for (int eingabe = scanner.nextInt(); eingabe != 0; eingabe = scanner.nextInt()) {
    // ...
}
```


----------



## Javinner (24. Sep 2017)

@Tobse , @mrBrown
Wie legt ihr dann die Grenzen fest?
Findet jeweils eine eigene Eingabe für die Ober- und Untergrenze
oder lässt sich dieses Vorhaben in die for, bzw. while-Schleife integrieren?
Warum ist while(true) eine äußerst selten gute Idee?


----------



## mrBrown (24. Sep 2017)

Javinner hat gesagt.:


> Wie legt ihr dann die Grenzen fest?
> Findet jeweils eine eigene Eingabe für die Ober- und Untergrenze


Die Eingabe wie bei dir vor der Schleife, nur nicht mit jeweils eigenem sondern mit einem zu Anfang erstelltem Scanner.


----------



## JStein52 (24. Sep 2017)

Javinner hat gesagt.:


> Warum ist while(true) eine äußerst selten gute Idee?


Es ist besser verständlich weil man direkt am Schleifenkopf schon sieht wann die Schleife beendet wird.
Und aus diesem Grund finde ich übrigens die Variante von @Tobse am lesbarsten.


----------



## Javinner (24. Sep 2017)

Was jetzt noch fehlt, ist der Code zu jeweiliger Lösung..
Würde diese Vorgehensweise den Sinn des
Foren/Java Programmierung/Java-Basics Java-Anfängerthemen
nicht ein weiteres Mal offenbaren?

Ich denke, der Tread-Ersteller kann mit den Vorschlägen wenig anfangen.
Wäre es dann nicht sinnvoller, die Breite der Lösungswege durch paar kleine
ausführliche Beispiele aufzuzeigen? Ich denke ja.


----------



## mrBrown (24. Sep 2017)

Javinner hat gesagt.:


> Was jetzt noch fehlt, ist der Code zu jeweiliger Lösung..
> Würde diese Vorgehensweise den Sinn des
> Foren/Java Programmierung/Java-Basics Java-Anfängerthemen
> nicht ein weiteres Mal offenbaren?


mMn nicht - das hier ist kein Forum für fertige Lösungen, sondern für Hilfestellungen.
Eine fertige Lösung hat er von dir doch schon bekommen, genau wie eine Antwort auf seine Frage.


----------



## Javinner (24. Sep 2017)

edit: bitte versteht mich nicht falsch! Sicher muss jeder selbst ran und es lernen. Ich für mein Teil finde, dass paar ausführliche Beispiele zu dem jeweiligen Problem hier unendlich viel mehr sagen, als Code-Schnipsel und ein guter Rat, weil genau hier und jetzt einem die möglichen Lösungswege
nicht einfallen und nicht einfallen können, da eben noch keine Ahnung.

Darum bietet ihr ja den Anfänger den Podium auf eurem Portal an.
Was meint ihr?


----------



## JStein52 (24. Sep 2017)

Javinner hat gesagt.:


> Ich denke ja.


Sehe ich genau so. Und wenn er jetzt deinen Vorschlag mit der ein oder anderen Verbesserungsidee kombiniert sollte er es ja hinkriegen


----------



## Javinner (24. Sep 2017)

JStein52 hat gesagt.:


> Sehe ich genau so. Und wenn er jetzt deinen Vorschlag mit der ein oder anderen Verbesserungsidee kombiniert sollte er es ja hinkriegen



Diesen Tread hier als Beispiel genommen:
Die Unterhaltung zieht sich und frisst unnötig Platz auf dem Server, der Interessant muss sich durch X-Meinungen durchgraben, bis er, wenn überhaupt zu einer Lösung kommt. Kurz um: ein gewöhnliches Verhalten eines X-beliebigen Forums.

Wäre es denn nicht besser, wenn man zum Thema paar Beispiele postet und 
dann diesen Tread dicht macht. Eventuell dann noch den Namen des Treads ändert, so dass es durch die Forum-Suche leichter gefunden werden kann
und zukünftigen Anfängern die Hilfe bietet und aber auch Admins entlastet, 
da diese Fragen sicher immer wieder aufkommen.


----------



## mrBrown (24. Sep 2017)

Javinner hat gesagt.:


> Diesen Tread hier als Beispiel genommen:
> Die Unterhaltung zieht sich und frisst unnötig Platz auf dem Server, der Interessant muss sich durch X-Meinungen durchgraben, bis er, wenn überhaupt zu einer Lösung kommt. Kurz um: ein gewöhnliches Verhalten eines X-beliebigen Forums.
> 
> Wäre es denn nicht besser, wenn man zum Thema paar Beispiele postet und
> ...


Oder anders:
Der TO muss nur die erste Antwort lesen, sieht da die Antwort zu seiner Frage.
Für alle Interessierten gibts danach noch weitere Infos.


----------



## JStein52 (24. Sep 2017)

Javinner hat gesagt.:


> Wäre es denn nicht besser, wenn man zum Thema paar Beispiele postet


Jaaaa. Wenn du hier ein in sich geschlossenes Beispiel zur Frage postest ist immer Geschrei dass keine fertige Lösung gepostet werden soll. Andererseits wird auch oft auf "stackoverflow" verwiesen wo es genau so ist: ein komplettes Stück Code als Antwort auf eine Frage, evtl. noch ein oder zwei Alternativen von anderen und gut ist.


----------



## Flown (24. Sep 2017)

Tobse hat gesagt.:


> 1. Man braucht nur einen Scanner. Für jedes Einlesen ein new Scanner() zu schreiben ist schlechter Stil; wenn man sich den angewöhnt bekommt man in größeren Projekten Probleme mit der Performance und dem Speichergebrauch.


Nicht mit Performance, sondern mit Richtigkeit. Scanner konsumieren meist mehr vom InputStream (die nicht mehr zurückgestellt werden können) und andere Scanner liefern dann unerwartete Ergebnisse. Also ist es nicht nur "langsamer" sondern obendrein noch falsch.


----------



## Flown (24. Sep 2017)

Javinner hat gesagt.:


> Wäre es denn nicht besser, wenn man zum Thema paar Beispiele postet und
> dann diesen Tread dicht macht. Eventuell dann noch den Namen des Treads ändert, so dass es durch die Forum-Suche leichter gefunden werden kann
> und zukünftigen Anfängern die Hilfe bietet und aber auch Admins entlastet,
> da diese Fragen sicher immer wieder aufkommen.


Nette Idee, aber wer verwaltet dann die Posts (managed Namen, verschiebt die Lösung an den Anfang? - Entlastet die Mods wie?)

Paar Punkte die "normale" User nicht! machen:
- Wir haben hier einen FAQ Bereich, der gut gefüllt ist, aber kein Mensch lest sich die Sachen auch durch. Zum Beispiel NullPointerException/Stringvergleich
- Google benutzen! Probleme sind zigfach gelöst, aber es ist bequemer wenn es jemand anders macht
- Das hier ist ein Forum und kein QA-Board wie StackOverflow, darum gibts hier nicht das Frage-Antwort Spiel

Jetzt noch meine persönliche Ansicht:
Was ist wertvoller, wenn man auf die Lösung selber kommt, oder wenn man es stupide abtippt und nichts dabei lernt/versteht?


----------



## JStein52 (24. Sep 2017)

Flown hat gesagt.:


> Google benutzen! Probleme sind zigfach gelöst, aber es ist bequemer wenn es jemand anders macht


Prinzipiell gebe ich dir ja recht. Aber jetzt wirds rekursiv: ich habe schon oft was gegoogelt wo ich in der Treffermenge auch Threads hier im Forum dabei hatte. Aber die nützen mir alle nichts wenn ich nur sehe dass einer die gleiche Frage hatte aber keine Lösung dabei ist.


----------



## Flown (24. Sep 2017)

JStein52 hat gesagt.:


> Prinzipiell gebe ich dir ja recht. Aber jetzt wirds rekursiv: ich habe schon oft was gegoogelt wo ich in der Treffermenge auch Threads hier im Forum dabei hatte. Aber die nützen mir alle nichts wenn ich nur sehe dass einer die gleiche Frage hatte aber keine Lösung dabei ist.


Wenn man so kurzsichtig ist und glaubt, dass nur der erste Treffer bei Google hilft...


----------



## JStein52 (24. Sep 2017)

Ich habe es ja gefunden. Aber bei stackoverflow

Edit: das war übrigens der erste Treffer


----------



## Flown (24. Sep 2017)

JStein52 hat gesagt.:


> Ich habe es ja gefunden. Aber bei stackoverflow


Ich zweifle nicht daran, dass du weißt wie man richtig sucht und Ergebnisse interpretiert. Ganz anders sind ein paar Fragesteller hier .


----------



## Javinner (24. Sep 2017)

Worauf ich hinaus will:
Wenn jemand, hier ganz offensichtlich ein blutiger Anfänger, um Hilfe bietet, weil er eine Aufgabe, wie hier gestellt, nicht lösen kann, dann ist es nur eine Frage der Zeit, bis der nächste mit dem gleichen Anliegen um die Ecke kommt.

Nun kann hier getan werden:
a) Die Unterhaltung, welche wir hier gerade führen.
Hält die Mods auf, bietet aus der Sicht der erfahrener Nutzer eine unzureichende Lösung an so wie viele Posts, welche dem Thema nicht dienlich sind, weil eben der, der nach Hilfe ruft, mit den Vorschlägen so in der Form nichts anfangen kann.  Also reiht sich diese Unterhaltung in die zahllosen Unterhaltungen, welche einem Anfänger so nicht weiter helfen.

b) Anstatt jemanden einen Verweis auf etwas geben, was er noch nicht versteht,
weil eben noch gar keine Idee, was alles geht usw., wäre doch eine kleine Präsentation der einigen Lösungswege und eine kurze Erklärung dazu (für meine Lösung habe ich keine fünf Minuten gebraucht), wie man dies oder das hätte machen können doch viel hilfreicher, oder? Was hätten wir dann? Genau: eine Frage, paar Lösungswege und die Forum-suche für den nächsten Interessenten. Auf Dauer spart es Speicherplatz und Zeit, denke ich.


Dass das Selbsterlernte viel länger hält, ist außer Frage.
Jedoch, hier schreibe ich nur für mich, ist es am Anfang sehr schwer:
a) die Vielfalt der Lösungswege zu erarbeiten
b) mit dem gelernten etwas anzufangen, ein Funke, wenn man so will.

Zudem finanziert sich dieses Forum durch Werbung und käme es auch nicht euch zu gute, wenn dieses Forum den Anfänger ausführliche Hilfestellung leisten würde?, mehr Seitenaufrufe.

Da ich aber nicht nur maulen will, sondern auch gewillt bin, etwas dafür tun ,biete ich hiermit an, zu einigen Fragen Hilfestellung zu leisten.
Dafür brauche ich aber selbstverständlich Hilfe, bzw. ein der es drauf hat,
um die Lösungen zu prüfen. Wenn jemand sich angesprochen fühlt, dann bitte per PN melden. Hier schlagen wir zwei Fliegen gleichzeitig: der Blickwinkel eines Anfängers und eines Profi!

Was meint ihr?


----------



## Flown (24. Sep 2017)

Also ich kann nur sagen, dass sich das Forum hier selbst finanziert (Hosting) und ich nicht dafür bezahlt werde (auch die anderen Mods - außer vl. Matze - der das betreibt).

Trotzdem ich bleibe dabei. Es ist hier ein Forum kein QA-Board. 
Ich seh's immer so. Man sollte hier, wenn man Lösungen postet, gute Lösungen bereitstellen. Dazu noch eine passende Erklärung. 
Hat er das dann aus eigener Kraft geschafft und ist selbst auf den Lösungsweg gekommen? Nein. Wird er beim nächsten Problem wieder kommen? Wahrscheinlich.

Nachdem der TE keinen Code geliefert hat, was er bereits getan hat, kann ich sagen wir sind kein Codingservice. Was ich bereitstellen würde ist eine Prosaform für die Lösung und die Übersetzung ist dem TE überlassen. Wird er mehr lernen als beim vorgsetzten Code? Ja. Wird er beim nächsten Mal versuchen auch erst den Prozess dahinter zu verstehen? Womöglich.

Darum hier wäre meine Hilfe:

```
var untergrenze = Zahl einlesen
var obergrenze = Zahl einlesen
var zahl = Zahl einlesen
var summeInnerhalb = 0
var summerAußerhalb = 0
Solange (zahl != 0) {
  Ist untergrenze <= zahl <= obergrenze, dann summeInnerhalb += zahl
  Sonst, summerAußerhalb += zahl
  zahl = Zahl einlesen
}
summeInnerhalb ausgeben
summeAußerhalb ausgeben
```


----------



## JStein52 (24. Sep 2017)

Ich verweise nur mal auf den Parallel-Thread zum Funktionsplotter, wo sich ein ähnliches Drama anbahnt. Die Brocken die man den beiden da hinwirft werden sie absolut nicht weiterbringen. Das einzige was da helfen würde wären einige bis viele Zeilen Code.


----------



## Javinner (24. Sep 2017)

Eine Prosaform: wieder was gelernt.
Wenn ich es anschaue, dann ist es letztendlich auch das, was ich meine.
Ein Pfad. Dass derjenige die Basics dann selbst umsetzten muss, ist natürlich selbstverständlich.

Ich stelle mir gerade vor, wie diese Unterhaltung wohl aussehen würde, wenn
man dies von Anfang an so gestaltet hätte.

P.S. Jetzt fühle ich mich irgendwie blöd, weil das Thema Geld aufkommt.
Wollte hier keines Falls irgendwas vorwerfen. Mehr Klicks, mehr Geld war der
einzige Gedanke.


----------



## Tobse (24. Sep 2017)

JStein52 hat gesagt.:


> Ich verweise nur mal auf den Parallel-Thread zum Funktionsplotter, wo sich ein ähnliches Drama anbahnt. Die Brocken die man den beiden da hinwirft werden sie absolut nicht weiterbringen. Das einzige was da helfen würde wären einige bis viele Zeilen Code.


Ich sehe das wie @Flown. Das hier ist nicht Stack-Overflow; ich versuche den Fragestellern in diesem Thread zu zeigen, wie sie selbst zu einer Lösung kommen. Und zwar in dem Tempo, in dem Sie es schaffen können; nicht in dem Tempo, in dem Sie die Lösung brauchen. Wenn Ihre Abgabe heute 0:00 ist und sie nur durch viel Copy&Paste ihr Ziel erreichen sind sie hier einfach an der falschen Stelle.

Gegen den Goliath Stackoverflow können wir nichts ausrichten; in anderen Platformen des Stackexchange Netzwerkes bin ich selbst viel aktiv und poste auch die eine oder andere fertige Lösung. Wir hier im Forum können aber etwas bieten, was es dort nicht gibt: *interaktive* Unterstützung und Diskurs. Klar will das nicht jeder; vor allem nicht wenn er in 24h eine Aufgabe fertig abgeben muss, der er nicht gewachsen ist. Aber diese Leute finden sich auf SO eh zurecht.

Nur mal so zum Thema fertige Lösung: Von Stackoverflow aus verbreiten sich unzählige Sicherheitslücken und Bugs, weil die Leute einfach nur Copy&Pasten ohne es nur ansatzweise zu verstehen - so bspw. auch hier der Fehler mit dem mehrfachen Scanner.


----------



## schxstin (14. Jun 2022)

Ich sehe das nicht so wie @Flown. Ich möchte den Usern dieses Forums gerne diese Lösung bereitstellen um das Problem was du und viele andere haben zu verstehen und dann gegebenfalls bei mir oder anderen zu vergleichen und zu erkennen was das Problem genau war. 

Lg Justin



```
import java.util.Scanner;

public class Kapitel18_Aufgabe2 {
    public static void main (String []args)
    {
        int untergrenze, obergrenze, daten = 1, summeInnerhalb = 0, summeAußerhalb = 0;
        Scanner sc = new Scanner(System.in);
       
       
        System.out.println("Bereiche addieren");
        System.out.println("Untergrenze des Bereichs:");
        untergrenze = sc.nextInt();
       
        System.out.println("Obergrenze des Bereichs:");
        obergrenze = sc.nextInt();
       
        while (daten != 0)
        {
         System.out.println("Daten eingeben:");
         daten = sc.nextInt();
       
         if (daten > obergrenze || daten < untergrenze)
             summeAußerhalb = summeAußerhalb + daten;
       
         else
             summeInnerhalb = summeInnerhalb + daten;
         }
       
        System.out.println("Summe der Werte innerhalb des Bereichs: "+summeInnerhalb);
        System.out.println("Summe der Werte außerhalb des Bereichs: "+summeAußerhalb);
       
    }

}
```


----------



## KonradN (14. Jun 2022)

Dir ist bewusst, dass Du auf einen 5 Jahre alten Thread antwortest?

Und reiner Code hilft dem Frager nur, dass er die aktuelle Aufgabe erledigt hat. Dadurch kommt kein Verständnis. Der TE wird also nicht in der Lage sein, so ein Problem zukünftig zu lösen.

Da diese Fragestellungen in der Regel durch Schule / Studium aufkommen, ist damit Probleme vorprogrammiert:
a) Auf diesen einfachen Grundlagen wird im weiteren aufgebaut. Da die Grundlagen nicht verstanden wurden, sind alle weiteren Dinge vermutlich auch nicht zu verstehen und damit wird die Lücke immer größer. ==> Die vermeintliche Hilfe hat die eigentliche Problematik somit nur verschlimmert.
b) Bei der Wissenskontrolle wird die Person schlicht nicht in der Lage sein, das Wissen, das geprüft wird, vorzuweisen. Somit steigt die Chance, dass Prüfungen, die in der Regel folgen werden, nicht bestanden werden.

Man könnte jetzt noch diverse Erkenntnisse bringen bezüglich Lernen von Inhalten - aber das würde schlicht zu weit führen.

Und da der Thread schlicht uralt ist, lasse ich es bei der Aussage einfach bewenden


----------



## schxstin (14. Jun 2022)

KonradN hat gesagt.:


> Dir ist bewusst, dass Du auf einen 5 Jahre alten Thread antwortest?
> 
> Und reiner Code hilft dem Frager nur, dass er die aktuelle Aufgabe erledigt hat. Dadurch kommt kein Verständnis. Der TE wird also nicht in der Lage sein, so ein Problem zukünftig zu lösen.
> 
> ...


  jo des is mir schon bewusst, hab den code einfach trotzdem reingeschickt für die anderen die mal nach der aufgabe suchen


----------

