JAVA - Median berechnen aus 5 Variablen?
Huhu, ich bin grade an einem Programm, welches den Median aus 5 Integern ausgeben soll. Ich habe dazu einen Lösungsansatz, allerdings ist dieser nicht ganz aufgegangen. Mein Code bezieht sich bisher nur darauf die kleinste der 5 Zahlen auszugeben. Mein Ziel ist es die drei kleinsten Zahlen in die richtige Reihenfolge zu bringen und die dritte als Median auszugeben. Hat jemand eine Idee was ich falsch gemacht habe? Hier mein Code:
public class Median3 { public static void main(String[] args) {
if (args.length != 5) {
System.out.println("ERROR");
} else {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = Integer.parseInt(args[2]);
int d = Integer.parseInt(args[3]);
int e = Integer.parseInt(args[4]);
int n0 = 0;
int n1 = 0;
int n2 = 0;
int n3 = 0;
int n4 = 0;
int median;
if (a <= 0 || b <= 0 || c <= 0 || d <= 0 || e <= 0) {
System.out.println("ERROR");
} else {
if (a == b || a == c || a == d || a == e || b == c || b == d || b == e || c == d || c == e || d == e){
System.out.println("ERROR");
} else {
if(a > b) {
n0 = b;
}
else if(a > c && c < n0) {
n0 = c;
}
else if(a > d && d < n0) {
n0 = d;
}
else if(a > e && e < n0) {
n0 = e;
}
else {
n0 = a;
}
System.out.println(n0);
}
}
}
//System.out.println(median);
}
}
4 Antworten
Pack die Zahlen in ein Array, lass das der Größe nach sortieren und gib den Wert am Index 2 aus. Das funktioniert für dein Programm, sofern du immer 5 Zahlen vergleichen möchtest.
"Schreiben Sie ein Programm Median, das fünf verschiedene Integer aus der Befehlszeile entgegenimmt und den Median ausgibt, d.h. zwei der fünf Werte sind größer und zwei der Werte sind kleiner. Verwenden Sie fünf Variablen um die Eingabewerte zu speichern. Sie dürfen weder Arrays noch andere Datenstrukturen verwenden."
Welcher Vollhonk, Antipädagoge und Schülerquäler verlangt denn so was?!
Der pädagogische Sinn ist wohl, dass ihr euch so richtig erleichtert fühlt, wenn ihr endlich bequemere Methoden verwenden dürft.
Euer Prof geht vermutlich allzu selbstverständlich davon aus, dass jemand, der im 21. Jahrhundert mit einem Informatik-Studium anfängt, mindestens 5 Jahre Programmiererfahrung mitbringt. (Irgendwie kann ich es ja auch nachvollziehen. Schließlich ist Informatik ein Wahlfach an praktisch allen weiterführenden Schulen.)
Pädagogisch weit sinnvoller wäre es, für absolute Anfänger einen eigenen Kurs (ggf. mit mehr Wochenstunden) anzubieten, in dem erst mal die absoluten Grundlagen so lange geübt werden, bis sie sitzen.
Aber das wiederum erinnert mich an das erste Semester meines Physikstudiums - da wurde im ersten Semester auch gleich mit einem hohen Tempo losgelegt; als es im zweiten etwas weniger wild weiterging, habe ich überlegt, ob die vielleicht möglichst am Anfang die meisten schon mal entmutigen wollen, damit nur die Enthusiasten dabei bleiben. (Außer in Mathe - da wurde im 1. Semester so ungefähr der ganze Schulstoff ab Klasse 1 wiederholt, aber da ging es bis zum 4. Semester in dem Tempo weter.)
Letztlich liegt dein Problem hier wohl weniger im Erlernen der Programmiersprache, als in der Logik des Programmierens. Hier ist es extrem hilfreich, sehr gut in Mathe zu sein. Tipp: erst das Problem mathematisch exakt formulieren, dann einen Algorithmus draus machen, und das Code Schreiben kommt zuletzt.
Bis ich durch die Logik des Codes durchsteige, dauert mir zu ehrlich gesagt zu lange ...
-----
Darfst du Zähler (mehrere weitere Variablen) verwenden?
Unter diesen bescheuerten Voraussetzungen, nur Einzelvariablen verwenden zu dürfen, würde ich zu jeder Variablen zählen, wie viele andere kleiner sind und dann das mit Zähler 2 suchen.
int n_a=0; int n_b=0; ... int n_e=0;
if (b<a) n_a++;
if (c<a) n_a++;
...
if (e<a) n_a++;
if (a<b) n_b++;
...
if (c<e) n_e++;
if (d<e) n_e++;
int median=-1; // für die Assertion, dass median genau einmal gesetzt wird
if (n_a==2) {assert median<0; median=a;};
...
if (n_e==2) {assert median<0; median=e;};
assert median>=0
Wenn gleiche Zahlen erlaubt sind, wird es etwas komplizierter. Dann würde ich vermutlich zwei Zähler je Variable nehmen, eine, die die größeren Zahlen zählt, und eine, die die kleineren Zahlen zählt. Median ist jede Zahl, für die diese beiden Zähler gleich sind. (Der Median ist ja nicht immer eindeutig.)
Ich habe durch ausprobieren im Terminal herausgefunden, dass bei c < d ein Fehler auftaucht. Den finde ich aber beim besten Willen im Code nicht :/

Bei solchen Fehlern musst du entweder mit einem Debugger durch deine Anwendung steppen oder mit Zettel und Papier.
Verwende für die Logik den Bose-Nelson-Algorithmus (er sortiert deine Variablen in wenigen Zügen) und bei der Umsetzung weniger Verschachtelungen (if-else).
public class Median {
public static void main(String[] args) { if (args.length != 5) { System.out.println("ERROR"); return; }
int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); int c = Integer.parseInt(args[2]); int d = Integer.parseInt(args[3]); int e = Integer.parseInt(args[4]);
if ((a + b + c + d + e) / 5 < 1) { System.out.println("ERROR"); return; }
if (a == b || a == c || a == d || a == e || b == c || b == d || b == e || c == d || c == e || d == e){ System.out.println("ERROR"); return; }
int temp;
if (a > b) { temp = a; a = b; b = temp; }
if (d > e) { temp = d; d = e; e = temp; }
if (c > e) { temp = c; c = e; e = temp; }
if (c > d) { temp = c; c = d; d = temp; }
if (a > d) { temp = a; a = d; d = temp; }
if (a > c) { temp = a; a = c; c = temp; }
if (b > e) { temp = b; b = e; e = temp; }
if (b > d) { temp = b; b = d; d = temp; }
if (b > c) { temp = b; b = c; c = temp; }
System.out.println("Median is: " + c); } }
Die Austauschvorgänge könnte man normalerweise in eine eigene Methode auslagern, dafür müssten die Variablen jedoch global, also als Klassenvariablen, angelegt werden.
Oder man definiert eine eigene Klasse, die die Variablen enthält.
Halt - Datenstrukturen waren ja lt. Aufgabenstellung verboten, und dazu könnten auch eigene Klassen zählen. Vielleicht gilt es ja, eine Klasse IntegerWrapper zu definieren, die nur eine einzige Variable enthält?
Beruhigt das: https://ideone.com/GkbjjE oder habe ich deine Bedenken falsch verstanden?
Nah ich bin ja eh nicht der Fragesteller. Ich denke halt gerade daran, dass Datenstrukturen nicht zulässig sind, während die Parameter über ein Array (also eine Datenstruktur) zugänglich wären.
Dementsprechend würde ich vermuten, dass man vll. einen Scanner nutzen soll, aber vll liege ich auch falsch =D
Ansich finde ich die Idee sowas nicht in einer Datenstruktur zu erledigen "unvorteilhaft" (anders gesagt finde ich die Aufgabenstellung daneben) ^^
Würde ich gerne tun, ist leider von der Aufgabe her verboten. Auch jegliche Datenstrukturen sind verboten. Ich muss alles manuell machen