JAVA - Median berechnen aus 5 Variablen?

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.

Woher ich das weiß:Studium / Ausbildung – Masterstudium Elektrotechnik - Schwerpunkt Embedded Systems

Ahikoteru 
Beitragsersteller
 28.10.2017, 21:53

Würde ich gerne tun, ist leider von der Aufgabe her verboten. Auch jegliche Datenstrukturen sind verboten. Ich muss alles manuell machen

0
Ahikoteru 
Beitragsersteller
 28.10.2017, 22:03
@nudelesser20

"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."

0
PWolff  28.10.2017, 22:23
@Ahikoteru

Welcher Vollhonk, Antipädagoge und Schülerquäler verlangt denn so was?!

2
Ahikoteru 
Beitragsersteller
 28.10.2017, 22:48
@PWolff

Mein Professor im Erstsemester Informatik

Ich bin ein Java Anfänger und kann wirklich noch nicht viel. Ich weiß nicht wie ich sowas ohne professionelle Hilfe lösen soll.

0
PWolff  28.10.2017, 23:53
@Ahikoteru

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.

0

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.)

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Ich habe durch ausprobieren im Terminal herausgefunden, dass bei c < d ein Fehler auftaucht. Den finde ich aber beim besten Willen im Code nicht :/

 - (Computer, Programm, programmieren)

regex9  28.10.2017, 23:29

Bei solchen Fehlern musst du entweder mit einem Debugger durch deine Anwendung steppen oder mit Zettel und Papier.

1

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.


PWolff  28.10.2017, 23:57

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?

0
regex9  29.10.2017, 00:52
@PWolff

Ich denke, extra Wrapperobjekte wären an dieser Stelle zu viel Overhead, zumal sich der FS eh noch völlig am Anfang befindet. Bereits der von mir vorgeschlagene Algorithmus ist eigentlich weit außerhalb des Rahmens, möchte ich meinen.

0
Etter  29.10.2017, 01:12
@PWolff

Irgendwie hab ich das Gefühl, dass man das ganze nicht per Parameter entgegennehmen darf.

0
Etter  29.10.2017, 01:32
@regex9

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) ^^

1
regex9  29.10.2017, 01:37
@Etter

Ah. Da hast du durchaus Recht. Allerdings denke ich mal, dass das eine Vorgabe vom Prof. war bzw. dass der FS es bisher nur so vom Prof. gelehrt bekommen hat.

1