# Median berechnen, Benutzereingabe Problem!



## felix6494 (9. Okt 2011)

Hi ich habe ein kleines Problem für dass ich bis jz per google noch keine Lösung gefunden habe. 

Vorher mal mein code nachher mein Problem/Wunschlösung


```
import java.util.*;

public class median {

public	static void main(String[] args) {
	
	
	
		Scanner sc = new Scanner (System.in);
		int eingabe  = sc.nextInt();
		int[] werteingabe = {eingabe};
		
		System.out.println(werteingabe.length);
		System.out.println (Arrays.toString(werteingabe));
		System.out.println("Nun werden wir unseren Array sortieren");
		Arrays.sort(werteingabe);
		System.out.println (Arrays.toString(werteingabe));
		System.out.println("Nun berechnen wir den Median");
		int middle = werteingabe.length/2;  // subscript of middle element
	    
	       System.out.println ((werteingabe[middle-1] + werteingabe[middle]) / 2.0);
	    }
			
			
		}
```

Wie man seht geht es darum den Median von Zahlen berrechnen zu lassen, aber irgendwie funktioniert das mit der Benutzereingabe nicht so wie ich mir das vorgestellt habe =/. Wie kann ich den Array per Benutzereingabe füllen lassen? denn ansonsten gibt er mir 1 2 3 nur als eine Zahl aus und nicht als 3 wie ich das gerne gehabt hätte. 
Ich hoffeihr könnt mir dabei helfen!

mfg felix


----------



## Gast2 (9. Okt 2011)

> Wie kann ich den Array per Benutzereingabe füllen lassen?


In einer Schleife.
Wenn die Anzahl der Werte fest ist nimmst du nen Array, ansonsten ne liste.


----------



## nrg (9. Okt 2011)

probiers doch mal mit einer Schleife (einfach so in Browser getippt):


```
private static Scanner sc = new Scanner (System.in);
//.....
    int[] werteingabe = new int[readInt("Geben Sie die Anzahl der Zahlen an >")];
    for (int i = 0; i < werteingabe.length; i++) {
        werteingabe[i] = readInt("Geben Sie die " + (i + 1) + "(s)te Zahl ein >");
    }
//.....

private static int readInt(String prompt) {
    System.out.print(prompt);
    return sc.nextInt();
}
```


----------



## felix6494 (9. Okt 2011)

Ich hätte mir das so vorgestellt das der benutzer in der Kommandozeile irgendwelche werte eintippen kann, das hat ja dann mit einer Schleife nichts zu tun oder?


----------



## Michael... (9. Okt 2011)

felix6494 hat gesagt.:


> das hat ja dann mit einer Schleife nichts zu tun oder?


der Anwender soll ja mehrere Werte eingeben? Üblicher weise implementiert man sich wiederholende Aktivitäten mittels Schleife ;-)
Bei einer festen Anzahl von Werten könnte man das zwar auch ohne Schleife umsetzen, aber anhand solcher Übungen soll man ja auch was lernen...


----------



## beastofchaos (9. Okt 2011)

Und die Musterlösung wäre dann noch, dass du eine ArrayList<Integer> benutzt und man unendlich viele Zahlen eingeben kann und jedes mal dahinter den sich ergebenen Median sieht. 

Oder man säubert bei jeder neuen Eingabe die Konsole(um alte Ausgaben zu löschen), gibt jede vorher eingegebene Zahl aus und dann sowas wie "Median: 30.543". Wenn du halt die Konsole vorher "sauber" machst, wenn du ne Zahl eintippst, ändert sich nur der Median und es wird nicht "nochmal" geschrieben (eigentlich schon, aber das sieht der User nicht, da er nicht sieht, wie alles gelöscht und neu geschrieben wird 

Gruß, Thomas


----------



## njans (9. Okt 2011)

Du kannst es auch genauso lassen, wie du es jetzt hast.
Wenn die Benutzereingabe z.B. "10 15 6 7 99 123" ist, dann kannst du mittels

```
String stringZahlen = werteingabe.split(" ");
```
Ein String array erzeugen.


```
// Mach ein Array aus der Eingabe
		String[] stringZahlen = werteingabe.split(" ");
		// Erstelle ein leeres int array 
		int[] zahlen = new int[stringZahlen.length]; 
		
		// Gehe über jeden String und parse ihn zum int
		for (int index = 0; index < stringZahlen.length; index++ )
		{
		  // Exceptionhandling fehlt hier noch :)
		  zahlen [index] = Integer.parseInt(stringZahlen[index]);
		}
		
		Arrays.sort(zahlen); // Sortiere das Array
		
		// In der Mitte findet sich nun der Median
		// Ich bin mir nicht sicher, wie es bei geraden Anzahlen von Eingabezahlen aussieht.
		// Ist der Median immer die Mitte abgerundet, oder aufgerundet?
		System.out.println("Der Median ist " + zahlen[zahlen.length/2] );
```


----------



## felix6494 (10. Okt 2011)

Also mal vorne weg ich bin ja wirklich Programmieranfänger und plage mich jz schon circa 1 stunde um da eine funktionistüchtige schleife einzubauen und irgendwie wirft mir eclipse immer wieder fehlereldungen zurück :


```
public static void main(String[] args) {

		Scanner sc = new Scanner (System.in);
		String eingabe  = sc.next();
		
		// Eingabe in einen Array speichern
		int[] werteingabe = new int[3];
	   
		for (int i = 0; i < 3; i++) {
	        werteingabe[i] = ?? ("Geben Sie die " + (i + 1) + "(s)te Zahl ein >");
	    }
		}
```

ich hab jz nochmal neu begonnen und mir sind da ein paar sachen offen. in der for schleife, was muss ich da für  _ = ?? annehmen? Wird das dann mit dieser Schleife überhaupt in den Array so mit ";" einsortiert? es hapert bei mir einfach immer an den gottverdammten schleifen ???:L wut

ich hoffe ihr könnt mir nochmal helfen_


----------



## setsuna9 (10. Okt 2011)

nur mal schnell geschrieben, ohne auf Schönheit zu achten...

```
import java.util.Arrays;
import java.util.Scanner;

public class Median {
	public static int MAXANZAHL = 3;
	public static void main(String[] args) {
		 
        Scanner sc = new Scanner (System.in);
        // Eingabe in einen Array speichern
        int[] werteingabe = new int[MAXANZAHL];
       
        for (int i = 0; i < MAXANZAHL; i++) {
        	System.out.print("Geben Sie die " + (i + 1) + "(s)te Zahl ein >");
        	int eingabe  = sc.nextInt();
            werteingabe[i] = eingabe; 
        }
        System.out.println("Median: " + median(werteingabe));
    }

	private static double median(int[] werteingabe) {
		Arrays.sort(werteingabe); 		
		if (werteingabe.length % 2 == 1){
			return werteingabe[werteingabe.length / 2 ];
		} else {
			return 0.5 * (werteingabe[(werteingabe.length / 2 - 1 )] + werteingabe[(werteingabe.length/2)]); 
		}
	}
}
```


----------



## felix6494 (10. Okt 2011)

oh mann bin ich blöd, echt vielen vielen dank für deine hilfe :applaus:


----------



## njans (10. Okt 2011)

```
return 0.5 * (werteingabe[(werteingabe.length / 2 - 1 )] + werteingabe[(werteingabe.length/2)]);
```
Meh? Ich meinte mich zu erinnern, dass der Median bei einer Liste von geordneten zahlen die Mitte ist, nicht aber das arithmetische Mittel. Demnach wäre diese Zeile kein Median.


----------



## beastofchaos (10. Okt 2011)

Die erste Abfrage schaut noch, ob die Länge eine ungerade Zahl ist, wenn ja, nimmt er den mittleren Wert. Was für mich aber grad kein Sinn ergibt. 
Der Median von 1, 2, 6, 7, 8 ist doch nicht "6", oder? Er müsste iwo zwischen 6 und 7 liegen. Er berechnet aber auch nicht den Mittelwert hier, was mich verwirrt.
Wüsst mal gerne, wie man überhaupt den Median berechnet, konnte grad nur bei wiki verstehen, was er genau ausdrückt, aber die Formel da verwirren meine vom Tag belastete Denk-CPU 

Okay, vll verstehe ich den Median auch nicht richtig. Kann mir einer ein gutes Beispiel dafür nennen, falls das nicht zu viel verlangt ist 

Geht es vll beim Median doch nur darum, dass die Zahlen darunter genauso viele, wie die darüber sind? Dann hätte er nämlich die richtige Rechnung.


----------



## njans (10. Okt 2011)

Der Median von 1 , 2 , 3 , 4 , 5 ist 3.
Problem ist, wenn die Anzahl der Zahlen gerade ist. Dann muss man sich entscheiden, wie man den Median definiert.
Entweder floor(anzahl/2) oder ceil(anzahl/2). Java bietet ja automatisch floor an, daher wäre das praktischer.


----------



## Gast2 (10. Okt 2011)

Der Median einer sortierten Stichprobe ist einfach der Wert der in der Mitte steht. Bei ungerader Anzahl an Werten ist es exakt der Wert in der Mitte, bei gerader Anzahl an Werten ist es der Mittelwert der beiden mittleren Werte.



> Der Median von 1, 2, 6, 7, 8 ist doch nicht "6", oder?


Doch.


----------



## njans (10. Okt 2011)

Hmmm gerade bei Wiki geschaut, jap, EikeB hat Recht.
Dann stimmt das else doch.


----------

