Rechenaufgabe

melisacbt

Mitglied
import java.util.Scanner;





public class Zusammenrechnen {





public static void main(String[] args) {





Scanner scan = new Scanner(System.in);


int zahl = scan.nextInt();





while(zahl > 0) {


zahl = scan.nextInt();


}





if(zahl < 0) {


System.out.println("Programm beendet");


}





scan.close();


}





}





Frage: Wie kann man das Programm ändern, damit am Ende die Summe der eingegebenen Zahlen (ohne die letzte, negative Zahl) angegeben wird?
 

mihe7

Top Contributor
Hallo erstmal,

bitte verwende Code-Tags, um Code zu posten (im Editor links in der Toolbar auf </> klicken).

Dann wirst Du eine Variable für die Summe brauchen. Die ist anfangs natürlich 0 und in der Schleife addierst Du die eingegebene Zahl dazu. Am Ende kannst Du dann die Summe ausgeben.
 

EinNickname9

Bekanntes Mitglied
Schön ginge anders, aber so kannst du erstmal anfangen:

Java:
import java.util.Scanner;

public class Zusammenrechnen {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int summe = 0;
        int zahl = 0;
        do {
            summe += zahl;
            System.out.println("Gib eine Zahl >0 ein, mit einer Zahl <=0 wird die Eingabe beendet.");
            zahl = scan.nextInt();
        } while (zahl > 0);
        System.out.println("Schleife beendet");
        System.out.println("Summe = " + summe);
        scan.close();
    }
}

Eigentlich schreit das nach einem break; aber das sei ein schlechter Stil, hab ich mir sagen lassen. :(
 

kneitzel

Top Contributor
Eigentlich schreit das nach einem break; aber das sei ein schlechter Stil, hab ich mir sagen lassen. :(
Das geht zwar jetzt etwas vom eigentlichen Thema weg, aber ich schreibe einfach einmal dazu kurz meine Sicht darauf.

Das Problem bei einem break ist aus meiner Sicht nur, dass es halt im Code hinter der Schleife weiter geht. Das kann durchaus ok sein, wenn man kurze, übersichtliche Methoden hat. Aber wenn man immer kurze, übersichtliche Methoden hat, dann hat man eigentlich automatisch kein break; mehr denn dann wäre es ja schon in einer Methode gelandet und das break wäre ein return geworden.

Oder etwas anders ausgedrückt:
Deine Methode muss ja - damit Du das break verwenden kannst - schon zwei Dinge machen:
- In der Schleife wird irgendwas gemacht bis zu einem bestimmten Ereignis/Punkt
- Dann wird nach der Schleife noch irgendwas gemacht.

Das Single Responsibility vom SOLID bezieht sich eigentlich auf Klassen, aber das würde ich gerne einfach weiter herunter brechen auch auf Methoden. Dann sollten Methoden nur eine Sache machen bzw. es sollte immer nur einen Grund geben, dass diese geändert wird (oder wie man das auch immer genau formuliert. Da finden sich teilweise unterschiedliche Formulierungen)

Die Regel würde ich also nicht als Regel aufstellen. Aber das ist ja ein Punkt, den ich öfters hier im Forum erwähne: Ich mag keine Regeln, die etwas verbieten. Also keine "Anti Pattern". Ich mag Vorschläge, wie etwas gelöst werden kann. Da kann man sich dann überlegen, ob so ein Vorschlag sinnvoll ist oder nicht.

Und bezüglich break finde ich es dann interessant, wenn es wirklich voll ausgenutzt wird, also incl. Label benutzt wird. Das habe ich schon mehrfach hier im Forum gesehen, dass da eine Schleife direkt auch ein Label bekommt um dann das break mit label versehen zu können. (Das war aber nie eine Aussage sondern etwas, das ich nur geschlussfolgert habe). Das macht nur dann Sinn, wenn man Methoden generell auch aufblähen kann - so kann ja ein Refactoring / eine Erweiterung dazu führen, dass das break plötzlich von einer weiteren Schleife umfasst würde ...
Und da sehe ich dann tatsächlich ein kleines Problem, da dann schnell unübersichtlicher Code entsteht. Und auch schwer zu testen fürchte ich.

Wie dem aber auch sei - das mit dem return mag manch einem auch aufstoßen. Es gibt wohl Leute, die verlangen, dass Methoden maximal ein return am Ende haben dürfen. Da wäre das mit der Eingabe so natürlich nicht möglich.

Aber den Code würde ich dann am Ende wohl so in der Art schreiben:
Java:
int sum;
int input;
while ((input == getNextNumber()) > 0) {
    sum += input;
}
printSum(sum);
 

mihe7

Top Contributor
@melisacbt die Korrektur war natürlich als Hinweis für Dich gedacht (dass es @kneitzel klar ist , ist klar :)). In dem Zusammenhang vielleicht auch noch der Hinweis, dass sum als lokale Variable explizit zu initialisieren wäre, in dem Fall mit 0.
 

Ähnliche Java Themen


Oben