Abstand zum Durchschnitt von 5 Zahlen berechnen...

Funktionierdochmal

Bekanntes Mitglied
... und die Zahl mit dem geringsten Abstand ausgeben.

Java:
    public static void main(String[] args) {
        Scanner scanner = new Scanner (System.in);
        int[] array = new int[5];
       
        int zahl = scanner.nextInt();
        int zahl1 = scanner.nextInt();
        int zahl2 = scanner.nextInt();
        int zahl3 = scanner.nextInt();
        int zahl4 = scanner.nextInt();
       
        array[0] = zahl;
        array[1] = zahl1;
        array[2] = zahl2;
        array[3] = zahl3;
        array[4] = zahl4;
        double durchschnitt = berechneDurchschnitt(array);
       
        System.out.println(durchschnitt);
        int minimumZahl = berechneAbstand(durchschnitt, array);
        System.out.println(minimumZahl);
        scanner.close();
    }
   
    public static double berechneDurchschnitt(int[] array) {
        double durchschnitt = 0;
        int summe = 0;
        int zaehler = 0;
        for (int i = 0; i < array.length; i++) {
            summe += array[i];
            zaehler++;
        }
        durchschnitt = summe / zaehler;
       
        return durchschnitt;
    }
//HIER!
    public static int berechneAbstand(double durchschnitt, int[] array) {
        int counter = 0;
        int minimum = 0;
        int bisherigeZahl = 0;
        for (int i = 0; i < array.length; i++) {
            if (durchschnitt <= i) {
                for (double j = durchschnitt; j <= i; j++) {
                    counter++;
                }
                if (minimum > counter) {
                    minimum = counter;
                    bisherigeZahl = i;
                }
            } else if (durchschnitt > i) {
                for (double j = i; j <= durchschnitt; j++) {
                    counter++;
                }
                if (minimum > counter) {
                    minimum = counter;
                    bisherigeZahl = i;
                } 
           
        }
       
    }
        return bisherigeZahl;

}
   
}

Hier berechne ich den Durchschnitt eines Arrays, aber der Part, wo ich nicht weiterkomme, ist die berechneAbstand Methode... Dort wird immer 0 ausgegeben, wieso?
 
Neben krgewb's Hinweis scheinen deine ganzen for-Schleifen etc. auch etwas überkompliziert.

Den Abstand zwischen zwei Zahlen a und b kriegst du mit
Java:
Math.abs(a-b)
Dann reicht auch eine for-Schleife 😉
 
Es geht nicht um die Parameter, sondern darum, was IN der Methode steht. Zeig mal die Stelle in berechneAbstand, wo Du eines der Elemente des Arrays verwendest.
 
for (int i = 0; i < array.length; i++) {
if (durchschnitt <= i) {
for (double j = durchschnitt; j <= i; j++) {

If anweisung sowie For Schleife arbeiten mit dem jeweiligen Element im Array...oder nicht?
 
Java:
    public static int berechneAbstand(double durchschnitt, int[] array) {
        int counter = 0;
        int minimum = 0;
        int bisherigeZahl = 0;
        for (int i = 0; i < array.length; i++) {
            if (durchschnitt <= array[i]) {
                for (double j = durchschnitt; j <= array[i]; j++) {
                    counter++;
                }
                if (minimum > counter) {
                    minimum = counter;
                    bisherigeZahl = array[i];
                }
            } else if (durchschnitt > array[i]) {
                for (double j = array[i]; j <= durchschnitt; j++) {
                    counter++;
                }
                if (minimum > counter) {
                    minimum = counter;
                    bisherigeZahl = array[i];
                } 
           
        }
       
    }
        return bisherigeZahl;

}
 
Ich dachte immer counter++; und counter = counter + 1; seien dasselbe?
Im Prinzip ja. Warum fragst Du?

Zu jeder Zeit gilt counter >= 0. Dein minimum ist zu Beginn 0. Folglich kann der Fall minimum > counter niemals eintreten.

Damit reduziert sich Dein Code zunächst zu:
Java:
    public static int berechneAbstand(double durchschnitt, int[] array) {
        int counter = 0;
        int bisherigeZahl = 0;
        for (int i = 0; i < array.length; i++) {
            if (durchschnitt <= array[i]) {
                for (double j = durchschnitt; j <= array[i]; j++) {
                    counter++;
                }
            } else if (durchschnitt > array[i]) {
                for (double j = array[i]; j <= durchschnitt; j++) {
                    counter++;
                }
            }      
        }
        return bisherigeZahl;
    }
Da der counter nur noch hochzählt, aber sonst nirgends verwendet wird, weiter zu:
Java:
    public static int berechneAbstand(double durchschnitt, int[] array) {
        int bisherigeZahl = 0;
        for (int i = 0; i < array.length; i++) {
        }
        return bisherigeZahl;
    }
Und letztlich zu
Java:
    public static int berechneAbstand(double durchschnitt, int[] array) {
        return 0;
    }

Du möchtest unter allen Zahlen eines Arrays diejenige ermitteln, die den kleinsten Abstand zu einem gegebenen Wert w hat.

Dann kannst Du drei Fälle unterscheiden:
  1. wenn das Array leer ist, dann gibt es keine Zahl aus dem Array mit minimalem Abstand zu w.
  2. wenn das Array aus einem Element besteht, dann ist dieses Element die Zahl mit dem minimalen Abstand zu w.
  3. wenn das Array aus weiteren Elementen besteht, dann kann sich unter diesen eine Zahl befinden, deren Abstand zu w kleiner ist als der Abstand des ersten Elements zu w.
Daraus lässt sich unmittelbar ein Algorithmus ableiten:
Code:
IF array leer THEN FEHLER  // Fall 1
minAbstand := abstand(array[0], w)
minZahl := array[0]
FOR i := 1 .. array.length-1
    aktAbstand := abstand(array[i], w);
    IF aktAbstand < minAbstand THEN
        minAbstand := aktAbstand;
        minZahl := array[i];
    END IF
NEXT
RETURN minZahl;
Wie Du den Abstand ermittelst, ist eine andere Frage. Math.abs ist eine Möglichkeit, der ternäre Operator (und damit if) eine andere, außerdem spielt es für die Ermittlung des minimalen Abstands keine Rolle, ob Du den einfachen oder den quadratischen Abstand verwendest.
 
Java:
if (durchschnitt > array[i]) {
    for (double j = array[i]; j <= durchschnitt; j++) {
        counter++;
    }
}
Das kann auch wie folgt geschrieben werden:
Java:
if (durchschnitt > array[i]) {
    counter = (int) (durchschnitt - array[i]);
}
Aber ich glaube, dass er es nach seiner Art programmieren will.
 

Zurück
Oben