Übungsblatt 4 - Aufgabe 6

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Übungsblatt 4 - Aufgabe 6
Da ich heut übermotiviert bin, hab ich die 6 auch noch gemacht. Mir ist nur noch unklar wie ich die übergebene distance interpretieren soll. Wenn ich davon ausgehe, dass es die Anzahl ist, die man zwischen Freunden “gehen” kann, stimmen zwar die Tests 4, 5 und 6, dann müssten die ersten drei aber auch true sein. Wenn ich davon ausgehe, dass eine distance von 1 bedeutet, dass id0 und id1 identisch sein müssen, stimmen 1, 2, 4 und 6, 3 und 5 aber nicht. Hab ich nen Denkfehler?


Da ich noch übermotivierter bin:

Die Distanz von 1 zwischen id0 und id1 bedeutet, dass zwischen id0 und id1 eine Freundschaft ist, die Distanz von 2 bedeutet, dass entweder zwischen id0 und id1 eine Freundschaft ist oder dass ein Benutzer existiert, der mit id0 und id1 befreundet ist, usw…

id0 und id1 sind nicht erreichbar wegen removeFriendship(), der Rest müsste analog logisch herleitbar sein.

Fraglich ist für mich auch noch:

  • Welche Distanz ist zwischen id0 und id0?
  • Was macht die init()-Methode bei negativen n?
  • Was passiert beim Löschen von id0 und id0? Wird dabei currUsers verändert?
  • Was passiert beim Einfügen eines Benutzers? Wird er gleich sein eigener Freund?

Alles das ist der Grund, wieso ich nicht verstehe, ob bei mir der EST-Testfall nur wegen der falschen Rekursion in isReachable() nicht funktioniert - allerdings sind meine Distanzen allesamt logisch - oder ob bei mir irgendwelche Sperrklauseln falsch gesetzt sind


Au verreck, das hab ich total übersehen.

Ich denke da ist die Distanz 0. Ich frag mich aber warum es für distance = 0 keinen Testcase gibt.

Beides ist in der Aufgabenstellung nicht definiert, ich denke man kann davon ausgehen, dass kein negatives n übergeben wird. Aber ich weiß es obviously nicht.

DAS wiederrum ist in der Aufgabenstellung definiert. Ziemlich weit oben.


Sorry, das mit “sein eigener Freund” war blöd gefragt, natürlich steht das in der Aufgabenstellung.
Was ich eigentlich fragen wollte: wo wird der neue Benutzer eingefügt? Wenn nämlich currUsers durch Löschen variiert werden soll, dann wird die Implementierung deutlich komplizierter.


Eigentlich nicht. Wenn du ihn an der ersten freien Stelle einfügen willst, probierst du einfach durch bis du eine freie Stelle findest und nimmst die.


Hat jemand anderes Probleme mit der Abgabe bei dieser Aufgabe? Der Test läuft bei mir und im CIP mit den richtigen Ergebnissen durch, aber bekomme trotzdem ein Ausrufezeichen. Ich habe keine Funktionennamen oder -argumente geändert, Testfall ist der selbe. Einige eigene Tests funktionieren, glaube also nicht das noch was am Code auszusetzen ist. Gibt es noch irgendwas anderes, durch das das EST mir ein Ausrufezeichen gibt?

Meine Ausgabe: https://gist.github.com/Suyooo/c6933d7f70019c862f09


Habe auch ein unverständliches Ausrufezeichen.
Es gibt normalerweise 2 Möglichkeiten: 1. falscher Algorithmus an irgendeiner Stelle (daher stellte ich 4 Fragen) und 2. falsche Sperrklauseln und demzufolge Exceptions. Wenn man Testfälle verändert, wird übrigens, soweit ich weiß, kein Ausrufezeichen angezeigt, sondern ein rotes Kreuz.


hab auch “Error in given test case”@est, obwohl die ausgabe “richtig” ist


Bei mir ists grün, wir können also davon ausgehen, dass es wenigstens eine Lösung gibt, die richtig ist. (Ich habe den gleichen Output).

Den einzigen Unterschied, den ich mir erdenken kann, ist dass ich falsch mit currUsers umgehe. Das ist bei mir immer n (habe angenommen, dass es sich dabei um die max. Users handelt).


Danke, die Lösung mit currUsers = n wird in der Tat grün angezeigt, auch wenn ich nicht verstehe, wofür man die Variable (oder auch String name als Eingabeparameter) braucht.


Habe jetzt auch currUsers auf n gestellt, und es funktioniert. Komisch, da das Kommentar über der Variable sagt, es sollte der Anzahl an Benutzern entsprechen. Heisst, um die Aufgabe zu lösen, muss man currUsers falsch verwenden.
Ausserdem wird es in der Aufgabe selbst kein einziges Mal genannt, weshalb ich mich frage, warum es überhaupt einen Einfluss aufs Ergebnis hat.


Nach einigen Überlegungen habe ich den Sinn von currUsers verstanden: das ist nur eine Zahl, die die Dimension des Feldes verdeutlicht, ohne auf das Feld zuzugreifen. An sich ist die Zahl nicht wichtig, aber man kann damit einige Sperrklauseln einfacher schreiben und somit einige Exceptions vermeiden.

Besonders in addUser() ist currUsers sehr hilfreich. Ich habe nämlich den Exceptioncheck in eine externe Methode gepackt und sie erfordert 2 ints id0 und id1. Hätte ich kein currUsers, müsste ich bei addUser() vor der Schleife einige Sperrklauseln hinschreiben. So konnte ich in der for-Schleife einen Index erstellen, der immer im passenden Bereich (von 0 bis currUsers) läuft. Dann habe ich in der Schleife den Exceptioncheck und den Check, ob die Stelle frei ist, für jedes i durchgeführt und danach den Benutzer an die passende Stelle eingefügt.


…die dimension kannste auch mit friendschip.length bekommen

aber andere frage… habe auch currUser=n

und ich habe um einen neuen user an der richtigen position einzufügen noch ne weitere Objektvariable eingefügt, welche mir angibt, wieviele user ich jetzt schon tatsächlich drinnen habe,
dass ich net jedes mal das array friendship durchlaufen muss und nach reflexiven freundschaften schauen muss, ob der user schon vorhanden ist

problem ist → Ausrufezeichen bei est

ist des nicht erlaubt ne eigene objektvariable einzufügen?
und ne weitere frage, wie fügt ihr euren weiteren user ein?

testcase ausgabe ist:

Hans: 0
Klaus: 1
Peter: 2
Silke: 3
Maria: 4
Julia: 5
Friendship 1 true
Friendship 2 true
Friendship 3 true
Reachable 1 false
Reachable 2 false
Reachable 3 false
Reachable 4 true
Reachable 5 true
Reachable 6 true
Friendship 4 false
Friendship 5 false
Friendship 6 false

sollte also passen oder?

lg knotenpunkt


Die Antworten vom Testcase stehen als Kommentar im Quellcode. Einfach nur vergleichen.
Normalerweise steht dem Anlegen von weiteren Methoden oder Variabeln nichts im Weg.
Vielleicht liegt der Fehler ja im Algorithmus noch.


ja stimmt überein… ich wollte damit eigentlich auch zeigen, dass alles stimmt

aber der testcase schlägt dennoch fehl, obwohl alles übereinstimmt

was wird noch geprüft, dass die MAIN-testcases passen?


Vielleicht gibt es noch Randfälle, die du in deiner Implementierung berücksichtigen musst. Z.B. für ein Netzwerk mit nur einem Benutzer oder ähnliches.


Man muss die erste Stelle finden, die leer ist. Einfügen nach der Reihenfolge ist nicht so gut, da man bei dieser Implementierung auch User löschen kann, indem man die Freundschaft zwischen einem User und demselben User entfernt.


Vllt. testen sie es ja auch, ob es rekursiv ist. Denn bei mir klappt es auch(also bekomme einen grünen Haken).


This.
Genau das war bei mir das Problem. Jetzt hab ich auch nen grünen Haken. Danke :slight_smile: