public class Crane {
private static final int MAXHEIGHT = 1920; // Zoll
private static final int MAXLOADCAPACITY = 30000; // in kg
private ContainerStack position; // aktuelle Position des Krans
private Container containerLoad;
public static int getMaxheight() {
return MAXHEIGHT;
}
public static int getMaxloadcapacity() {
return MAXLOADCAPACITY;
}
public void moveTo(ContainerStack stack) {
position = stack;
}
public void pick() {
if (MAXLOADCAPACITY >= containerLoad.getWeight()) {
containerLoad = position.pick();
}
}
public void place() {
if (MAXHEIGHT >= (MAXHEIGHT - position.calculateContainerStackHeight())) {
position.place(containerLoad);
}
}
}
Wir kommen der Sache näher aber Du machst es Dir zu einfach. Da fehlen noch einige Prüfungen. Überleg mal, was alles schief laufen könnte, wenn Du die einzelnen Methoden (in beliebiger Reihenfolge) aufrufst.
public void pick() {
if (testHeight() == true) {
if (MAXLOADCAPACITY >= containerLoad.getWeight()) {
containerLoad = position.pick();
}
}
}
//
public boolean testHeight() {
if (MAXHEIGHT >= (MAXHEIGHT - position.calculateContainerStackHeight())) {
position.place(containerLoad);
return true;
}
return false;
}
Nein, das meine ich nicht. Du sollst nicht in die Aufgabe schauen, sondern selbst das Denken anfangen.In der Aufgabe steht, dass wenn der Stapel von vornherein zu groß ist, dann soll der Stapel gar nicht erst angehoben werden . Meinst du das ?
Denken... Tipp: es hat mit der Ladung zu tun.Aber wie leg ich fest, dass der Kran nur ein Container immer tragen kann
Nein, das meine ich nicht. Du sollst nicht in die Aufgabe schauen, sondern selbst das Denken anfangen.
Du musst Dir den Spaß bildlich vorstellen. Nun kenne ich die Abbildung in der Aufgabe nicht, ich stelle mir daher einen Kran vor, der z. B. auf einer Schiene fahrbar ist und über einer Reihe von Containerstapeln steht.
Denken... Tipp: es hat mit der Ladung zu tun.
public void pick() {
if (testHeight() == true) {
if (MAXLOADCAPACITY >= containerLoad.getWeight()) {
while (position.stack.size() < 1) {
containerLoad = position.pick();
}
}
}
}
Wann kann diese Bedingung eigentlich falsch werden? Wenn nicht nur der Containerstapel, sondern auch der darunter liegende Keller leer geräumt wurde?Java:if (MAXHEIGHT >= (MAXHEIGHT - position.calculateContainerStackHeight())) {
Oh Stimmt lol , aber das war der Teil den ich nicht mal inhaltlich verstanden habe, aber es muss andersherum sein oder nicht? Die MaxHöhe - höhe stapel muss größer gleich dem Stapel sein?Wann kann diese Bedingung eigentlich falsch werden? Wenn nicht nur der Containerstapel, sondern auch der darunter liegende Keller leer geräumt wurde?![]()
Alles was nicht in der Aufgabe steht überleg ich mir erst, wenn ich die Aufgabe fertig habe xD, deswegen will ich erstmal das Terminal noch fertig machen (weil es da auch 3 Parts gibt, die mich endlos verwirren)Nein, das meine ich nicht. Du sollst nicht in die Aufgabe schauen, sondern selbst das Denken anfangen.
Du musst Dir den Spaß bildlich vorstellen. Nun kenne ich die Abbildung in der Aufgabe nicht, ich stelle mir daher einen Kran vor, der z. B. auf einer Schiene fahrbar ist und über einer Reihe von Containerstapeln steht.
Na ja, nehmen wir mal an, der Kran kann maximal 10m, der Stapel hat gerade 6m und der Container ist 2m hoch. Nach deiner Formel könnte der Kran das dann nicht machen, weilDie MaxHöhe - höhe stapel muss größer gleich dem Stapel sein?
10m - 6m >= 6m
false ergibt.Welche Dinge fehlen denn im Container ?Mach doch erstmal den Kran fertig. Da fehlt ja noch die Hälfte (=Prüfungen).
Grober Unfug.
Schau Dir nochmal das Diagramm an (aktualisierte Version und ohne die Container-Implementierungen), in dem natürlich immer noch Dinge fehlen:
Anhang anzeigen 12899
Wieso im Container? Bzgl. des Containers habe ich nur die konkreten Klassen im Diagramm weggelassen.Welche Dinge fehlen denn im Container ?
Na ja, nehmen wir mal an, der Kran kann maximal 10m, der Stapel hat gerade 6m und der Container ist 2m hoch. Nach deiner Formel könnte der Kran das dann nicht machen, weil10m - 6m >= 6m
false ergibt.
Wieso im Container? Bzgl. des Containers habe ich nur die konkreten Klassen im Diagramm weggelassen.
Musst Du wissen.Alles was nicht in der Aufgabe steht überleg ich mir erst, wenn ich die Aufgabe fertig habe
Jede Klasse besitzt einen Konstruktor.aber eine Frage welche Klasse besitzt den Konstruktor ?
Wozu?Und kann man "40ft und 40ftHC" als enum darstellen bzw ist das sinnvoll ?
Das weiß ich noch nicht. Zum aktuellen Stand besitzt die Klasse eben die beiden Attribute.Meine Terminalklasse sollte ja eigentlich keine Attribute besitzen außer den Kran und ggnf eine Datenstruktur zum Speichern der Stacks besitzen oder ?
Du könntest dem ContainerTerminal eine Methode spendieren:Sonst hat sollte sie eine oder zwei Methoden bekommen? ( bin mir nicht sicher, ob eine Methode alle Paramter entgegennimmt oder nicht) Könnt ihr mir jetzt bitte verraten, wie ihr euch das mit den 2 Integern für den Transport vorgestellt habt ?
public void transportContainer(int originStackId, int destinationStackId)
Eben zum letzteren, soweit hatte ich sie auch schon, aber was passiert mit den 2 mitgegebenen integern? Das war ja schon heute morgen und gestern mein größtes Problem. Ich hatte ja etwas, dass geklappt hatte, aber eben nicht der Aufgabe entsprechend, also falsch.Musst Du wissen.
Jede Klasse besitzt einen Konstruktor.
Wozu?
Das weiß ich noch nicht. Zum aktuellen Stand besitzt die Klasse eben die beiden Attribute.
Du könntest dem ContainerTerminal eine Methode spendieren:
Java:public void transportContainer(int originStackId, int destinationStackId)
Eben zum letzteren, soweit hatte ich sie auch schon, aber was passiert mit den 2 mitgegebenen integern? Das war ja schon heute morgen und gestern mein größtes Problem. Ich hatte ja etwas, dass geklappt hatte, aber eben nicht der Aufgabe entsprechend, also falsch.
Wie würdest du es denn mit den 2 Typen machen? Es gibt ja nur nur die 40ft und 40ftHC und die werden auch per Textdatei mitgegeben? ich habs gerade mit Strings ?
Und zu dem Thema Konstruktor. Ich weiß, dass jede Klasse einen Konstruktor hat, aber zum Bsp beim Kran hab ich ja auch keine weiteren Spezifikationen getroffen ?
Schau Dir das Diagramm aus #101 an: was könnte man mit den Integern anstellen?Das war ja schon heute morgen und gestern mein größtes Problem. Ich hatte ja etwas, dass geklappt hatte, aber eben nicht der Aufgabe entsprechend, also falsch.
Meinst Du für die Initialisierung des Terminals? Prüfen, welcher String es ist und dann ein Objekt der entsprechenden Klasse erstellen.Wie würdest du es denn mit den 2 Typen machen? Es gibt ja nur nur die 40ft und 40ftHC und die werden auch per Textdatei mitgegeben? ich habs gerade mit Strings ?
s. Diagramm aus #101. Das "#" vor dem Konstruktor bedeutet übrigens "protected".Ich weiß, dass jede Klasse einen Konstruktor hat, aber zum Bsp beim Kran hab ich ja auch keine weiteren Spezifikationen getroffen ?
Schau Dir das Diagramm aus #101 an: was könnte man mit den Integern anstellen?
Meinst Du für die Initialisierung des Terminals? Prüfen, welcher String es ist und dann ein Objekt der entsprechenden Klasse erstellen.
s. Diagramm aus #101. Das "#" vor dem Konstruktor bedeutet übrigens "protected".
public void terminalDoWorkContainer(String containertyp, int id, int weight, int stacknumber, int origin,
int destination) {
ContainerStack cs0 = new ContainerStack(stacknumber);
cs0.place(new Container40ft(containertyp, id, weight));
Terminal.printLine(cs0);
}
public void terminalDoWorkContainer(String containertyp, int id, int weight, int stacknumber)
public void terminalTransportContainer(int origin, int destination) {
}
Ja.oder ist der Vorgang des Erstellens der Stacks und der Vorgang des Transports unabhängig voneinader ?
also 2 methoden?
public class ContainerTerminal {
final Crane crane = new Crane();
ContainerStack cs = new ContainerStack(0);
ContainerStack cs2 = new ContainerStack(0);
public void terminalTransportContainer(int origin, int destination) {
if (cs.getContainerStackID() == origin) {
crane.moveTo(cs);
crane.pick();
if (cs2.getContainerStackID() == destination) {
crane.moveTo(cs2);
crane.place();
}
}
}
Vermutlich hast du mehr als zwei Container-Stapel, oder?Wenn ich mich nicht ganz irre sollte es so eigentlich aussehen ? Also der Transport oder
BTW, diesen Teil musst du beim Transport auch noch berücksichtigen.Falls die tatsächlich erreichbare Hubhöhe geringer als die Höhe des Zielstapels ist, ist es dem Kran nicht möglich, den Container auf dem Zielstapel zu platzieren. Der Container wird in diesem Fall gar nicht erst vom Ursprungsstapel entnommen.
Tja, was soll man da noch übersetzen? Du hast einen Stapel mit bekannter Höhe und beabsichtigst einen Container mit ebenfalls bekannter Höhe darauf zu stellen. Beides zusammen darf eben nicht größer als die vorgegebene maximale Höhe sein. Das ist schon das ganze Geheimnis.Okey du hast recht und ich bin jetzt noch mehr verwirrt -.- ; kannst du mir das bitte in eine mathematische Formel übersetzen. Ich checks imemrnoch :Na ja, nehmen wir mal an, der Kran kann maximal 10m, der Stapel hat gerade 6m und der Container ist 2m hoch. Nach deiner Formel könnte der Kran das dann nicht machen, weil10m - 6m >= 6m
false ergibt.
Wenn du überzeugt bist, dass deine Formel stimmt, solltest du auch dabei bleiben. Vielleicht habe ich sie ja falsch verstanden.Bin immernoch der Meinung, dass meine Formel stimmen muss, wobei du gerade ja gezeigt hast, dass es nicht sein kann
Jetzt aber ?Tja, was soll man da noch übersetzen? Du hast einen Stapel mit bekannter Höhe und beabsichtigst einen Container mit ebenfalls bekannter Höhe darauf zu stellen. Beides zusammen darf eben nicht größer als die vorgegebene maximale Höhe sein. Das ist schon das ganze Geheimnis.
Wenn du überzeugt bist, dass deine Formel stimmt, solltest du auch dabei bleiben. Vielleicht habe ich sie ja falsch verstanden.![]()
public void pick() {
if (testHeight() == true) {
if (MAXHEIGHT >= (position.calculateContainerStackHeight() + containerLoad.getHeight())) {
while (position.stack.size() < 1) {
containerLoad = position.pick();
}
}
}
}
Vermutlich hast du mehr als zwei Container-Stapel, oder?
BTW, diesen Teil musst du beim Transport auch noch berücksichtigen.
public boolean testHeight() {
if ((MAXHEIGHT - position.calculateContainerStackHeight()) >= MAXHEIGHT) {
position.place(containerLoad);
return true;
}
return false;
}
public void pick() {
if (testHeight() == true) {
if (MAXHEIGHT >= (position.calculateContainerStackHeight() + containerLoad.getHeight())) {
while (position.stack.size() < 1) {
containerLoad = position.pick();
}
}
}
}
import java.util.HashMap;
import java.util.List;
import edu.kit.informatik.Terminal;
public class ContainerTerminal {
final Crane crane = new Crane();
HashMap<Integer, ContainerStack> hm = new HashMap<Integer, ContainerStack>();
public void terminalDoWorkContainer(String containertyp, int id, int weight, int stacknumber) {
hm.put(stacknumber, new ContainerStack(stacknumber));
cs.place(new Container40ft(containertyp, id, weight));
}
public void terminalTransportContainer(int origin, int destination) {
if (cs.getContainerStackID() == origin) {
crane.moveTo(cs);
crane.pick();
Terminal.printLine(cs);
if (cs2.getContainerStackID() == destination) {
crane.moveTo(cs2);
crane.place();
Terminal.printLine(cs2);
}
}
}
Sagen wir mal so: wenn es nicht sowieso schon falsch wäre, wäre es vielleicht richtig.Jetzt aber ?
Java:public void pick() { if (testHeight() == true) { if (MAXHEIGHT >= (position.calculateContainerStackHeight() + containerLoad.getHeight())) { while (position.stack.size() < 1) { containerLoad = position.pick(); } } } }
soll der Container nicht entnommen werden, wenn er sowieso nicht am Ziel abgelegt werden kann. containerLoad referenziert also noch gar nicht den fraglichen Container. Außerdem machst du das ganze in der pick-Methode, also bevor du überhaupt zum Ziel gefahren bist. Somit referenziert position zu diesem Zeitpunkt auch nicht den Zielstapel.Falls die tatsächlich erreichbare Hubhöhe geringer als die Höhe des Zielstapels ist, ist es dem Kran nicht möglich, den Container auf dem Zielstapel zu platzieren. Der Container wird in diesem Fall gar nicht erst vom Ursprungsstapel entnommen.
Nein, der Code ist ziemlicher Unsinn.Es wird zuerst geprüft, ob man ihn absetzen könnte. Wenn das false ist bzw nicht geht, wird der Vorgang gar nicht erst gestartet ?
Bevor du das Thema abhaken kannst, solltest du zumindest ein grundlegendes Verständnis des Problems und des Codes, den du selber schreibst, haben...Kann mir bitte noch enden um das Thema abzuhacken.
Genügt die? Wie soll denn das Terminal inkl. Kran aussehen? Ich hätte mir etwas vorgestellt wie im Bild unter https://sp.depositphotos.com/185974182/stock-photo-cargo-container-shipping-terminal.html zu sehen ist.Ich hab jetzt als Ansatz eine Hashmap benutzt.
OK:Egal wie, hauptsache das kommt bei raus.
System.out.println("40ft;100;20000kg;0\n" +
"40ftHC;200;30000kg;0\n" +
"40ft;600;22000kg;0\n" +
"40ft;300;22000kg;1\n" +
"40ft;400;19000kg;1\n" +
"40ft;500;20000kg;1\n" +
"40ftHC;700;28000kg;2");
Ja, das entspricht dem, was ich mir vorgestellt hätte. Da würde ich mich fragen, wie man von Stapel 0 zu Stapel 2 kommt, wenn Stapel 1 höher als die maximale Hubhöhe ist...
OK:
Java:System.out.println("40ft;100;20000kg;0\n" + "40ftHC;200;30000kg;0\n" + "40ft;600;22000kg;0\n" + "40ft;300;22000kg;1\n" + "40ft;400;19000kg;1\n" + "40ft;500;20000kg;1\n" + "40ftHC;700;28000kg;2");
public class ContainerTerminal {
final Crane crane = new Crane();
HashMap<Integer, ContainerStack> hm = new HashMap<Integer, ContainerStack>();
public void terminalDoWorkContainer(String containertyp, int id, int weight, int stacknumber) {
hm.put(stacknumber, new ContainerStack(stacknumber));
cs.place(new Container40ft(containertyp, id, weight));
}
public void terminalTransportContainer(int origin, int destination) {
if (cs.getContainerStackID() == origin) {
crane.moveTo(cs);
crane.pick();
Terminal.printLine(cs);
if (cs2.getContainerStackID() == destination) {
crane.moveTo(cs2);
crane.place();
Terminal.printLine(cs2);
}
}
}
Das ist unwichtig für die Aufgabe. Es ist nur ein vereinfachtes Modell. Bitte du scheinst wirklich sehr schlau zu sein. Bitte sag mir wie die Methoden auszusehen haben, damit es zumindest in Theorie klapptJa, das entspricht dem, was ich mir vorgestellt hätte. Da würde ich mich fragen, wie man von Stapel 0 zu Stapel 2 kommt, wenn Stapel 1 höher als die maximale Hubhöhe ist...
System.out.println("40ft;100;20000kg;0\n" +
"40ftHC;200;30000kg;0\n" +
"40ft;600;22000kg;0\n" +
"40ft;300;22000kg;1\n" +
"40ft;400;19000kg;1\n" +
"40ft;500;20000kg;1\n" +
"40ftHC;700;28000kg;2");
?!?erste Frage splitte ich ein Array, so dass ich nur die Einzelteile bekomme außer das kg?????
String[] einzelteile = zeile.split(";");
public class ContainerTerminal {
final Crane crane = new Crane();
HashMap<Integer, ContainerStack> hm = new HashMap<Integer, ContainerStack>();
public void terminalDoWorkContainer(String containertyp, int id, int weight, int stacknumber) {
hm.put(stacknumber, new ContainerStack(stacknumber));
cs.place(new Container40ft(containertyp, id, weight));
}
public void terminalTransportContainer(int origin, int destination) {
if (cs.getContainerStackID() == origin) {
crane.moveTo(cs);
crane.pick();
Terminal.printLine(cs);
if (cs2.getContainerStackID() == destination) {
crane.moveTo(cs2);
crane.place();
Terminal.printLine(cs2);
}
}
}
Eine Map bildet einen Schlüssel auf einen Wert ab. Das hat den Vorteil, dass man über den Schlüssel direkt den Wert erhält. Dazu bietet die Map eine Methode get an... Und gib hm einen vernünftigen Namen, z. B. stacks (oder containerStacks).durch die Map iterrieren oder bis die Nummer zu einem Key passt? aber wie zum Teufel geht das
Ihr seid trotzdem allesamt wirklich krassNoch was: Du hast anscheinend einen falschen Eindruck. Es ist nicht so, dass wir die Aufgabenstellung lesen und dann in fünf Minuten fertigen Code hinschreiben. Wir müssen das Problem, genauso wie Du, analysieren, um es zu verstehen, modellieren, uns wieder korrigieren usw. Darum heißt es auch Software-Entwicklung und nicht Software-Produktion.
if (stacks.containsKey(origin)) {
crane.moveTo(stacks.); // hier ist das Problem, ich weiß, dass es ein Befehl gibt über den ich über den Key auf das Objekt zugreifen kann, aber ich find ihn nicht
crane.pick();
Terminal.printLine(cs);
if (cs2.getContainerStackID() == destination) {
crane.moveTo(cs2);
crane.place();
Terminal.printLine(cs2);
}
}
Ihr seid trotzdem allesamt wirklich krass
Eine Map bildet einen Schlüssel auf einen Wert ab. Das hat den Vorteil, dass man über den Schlüssel direkt den Wert erhält. Dazu bietet die Map eine Methode get an... Und gib hm einen vernünftigen Namen, z. B. stacks (oder containerStacks).
if (stacks.containsKey(origin)) {
crane.moveTo(stacks.); // hier ist das Problem, ich weiß, dass es ein Befehl gibt über den ich über den Key auf das Objekt zugreifen kann, aber ich find ihn nicht
crane.pick();
Terminal.printLine(cs);
if (cs2.getContainerStackID() == destination) {
crane.moveTo(cs2);
crane.place();
Terminal.printLine(cs2);
}
}
public void terminalTransportContainer(int origin, int destination) {
if (stacks.containsKey(origin)) {
crane.moveTo(stacks.get(origin));
crane.pick();
if (stacks.containsKey(destination)) {
crane.moveTo(stacks.get(destination));
crane.place();
}
}
}
public void terminalDoWorkContainer(String containertyp, int id, int weight, int stacknumber) {
ContainerStack containerstack = new ContainerStack(stacknumber);
stacks.put(stacknumber, containerstack);
containerstack.place(new Container40ft(containertyp, id, weight));
}
public class ContainerTerminal {
final Crane crane = new Crane();
HashMap<Integer, ContainerStack> stacks = new HashMap<Integer, ContainerStack>();
public void terminalDoWorkContainer(String containertyp, int id, int weight, int stacknumber) {
if (!stacks.containsKey(stacknumber)) {
ContainerStack containerstack = new ContainerStack(stacknumber);
containerstack.place(new Container40ft(containertyp, id, weight));
stacks.put(stacknumber, containerstack);
} else {
stacks.get(stacknumber).place(new Container40ft(containertyp, id, weight));
}
}
public void terminalTransportContainer(int origin, int destination) {
if (stacks.containsKey(origin)) {
crane.moveTo(stacks.get(origin));
crane.pick();
if (stacks.containsKey(destination)) {
crane.moveTo(stacks.get(destination));
crane.place();
}
}
}
Scheint zu helfenIch schreib zwar die ganze Zeit nur mit mir
Scheint zu helfen
Ich frage mich gerade, was das ganze hier mit Vererbung zu tun haben soll... (s. Titel).