Die summe eines Array in einer Methode berechnen?

1 Antwort

In Deinem Code finde ich gleich mehrere Ungereimtheiten. Fangen wir mal bei Deiner Methode array an. Ich nenne sie hier einmal sum, weil das ja das ist, was sie tut. ;-)

Du musst doubles schon in eine Variable vom Typ double summieren, nicht in eine vom Typ int. Außerdem summierst Du in Deiner Methode über ein neu angelegtes Array namens data (das Du eigentlich überhaupt nicht benötigst), nicht über das Array namens arr, das Dir übergeben wird.

public static double sum(double[] arr) {
double sum = 0.0;

for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}


return sum;
}

Außerdem muss Deine for-Schleife in Deriner main-Methode folgenden Kopf haben.

for (int i = 0; i < arr.length; i++) {
...
}

Denn die Indizes von Arrays in Java laufen von 0 bis length - 1, jeweils einschließlich.

Die Variable a benötigst Du zudem nicht. Du weist ihr zwar einen Wert zu, liest ihn aber nie wieder aus, ist also vollkommen überflüssig.


McEiche13 
Fragesteller
 07.12.2016, 12:26

Wow

ich kann dir garnicht genug danken dafür.

Das ist jetzt alles einleuchtend.

Jetzt sieht es bei mir so aus:

import java.io.*;

public class PI_Aufgabe_2{
public static double sum(double[] arr) {
double sum = 0.0;

for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}

return sum;
}

public static void main(String args[])throws IOException {
BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
double [] arr = new double[6];
int a;
double b;
a = arr.length;
for(int i=0; i<=arr.length; i++){
System.out.println("Den Array bitte mit 6 Zahlen füllen");
arr[i-1] = Double.parseDouble(in.readLine());

}
b = sum(arr);
System.out.println(b);
}
}

Danke nochmal

1
NoHumanBeing  07.12.2016, 12:37
@McEiche13

Zwei Fehler sehe ich noch und eine "Schönheitssache".

for (int i = 0; i <= arr.length; i++){

Nee, das muss wirklich echt kleiner ("<") sein!

length gibt zurück, wie viele Elemente das Array enthält, bei Dir also 6.

Die Indizes gehen dabei von 0 bis 5, jeweils einschließlich. Sie gehen immer von 0 bis length - 1.

Die Schleife muss bei 0 anfangen und sie läuft solange, wie der zweite Ausdruck wahr ist. Diese Bedingung wird vor dem Durchlauf des Schleifenkörpers geprüft. Die Inkrementoperation wird nach dem Durchlauf des Schleifenkörpers durchgeführt. Das heißt für i = 6 ist der Ausdruck (mit "<"-Operator) noch wahr und die Schleife läuft somit noch ein letztes Mal durch. Dann wird i inkrementiert, also i = 7, dann ist die Bedingung aber falsch und der Schleifenkörper wird also für i = 7 nicht mehr durchlaufen. Das ist genau das, was wir wollen, also ein echt kleiner length. Das ist in Java immer so, wenn man aufsteigend über Arrays iteriert, kann man sich also einfach merken und muss es sich nicht nochmal überlegen.

arr[i-1] = Double.parseDouble(in.readLine());

Warum i - 1? Deine Schleife beginnt bei 0. Im ersten Durchlauf greifst Du somit auf arr[-1] zu. Das wird wohl eine Exception schmeißen. Einfach arr[i] zuweisen.

Und die "Schönheitssache": Die Variable a benötigst Du nach wie vor nicht. Schmeiß sie einfach raus, sowohl die Deklaration ...

int a;

... als auch die Zuweisung ...

a = arr.length;

... einfach weg mit diesen beiden Zeilen. Wird keinen Unterschied in der Funktion machen, kostet nur CPU-Zyklen (zugegebenermaßen nicht wirklich viele ;-) ) und macht den Code länger und schwerer verständlich. ;-)

0
NoHumanBeing  07.12.2016, 12:42
@NoHumanBeing

Außerdem kannst Du Deklaration und Zuweisung häufig in einer Zeile machen.

double b;
/* Ein Haufen Code, der b nicht benötigt. */
b = sum(arr);

Macht die Sache nicht übersichtlicher. Dann lieber so.

/* Ein Haufen Code, der b nicht benötigt. */
double b = sum(arr);
0