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.
ein paar Fragen zu Klausuraufgaben vom gestern
Hallo Leute,
ich hätte gerne mal fragen, ob ihr bei der letzten Aufgabe Pfadüberdeckung überhaupt möglich findest. Ich finde es nicht, aber bin mir nicht sicher. :rolleyes:
Und bei Klassendiagramm,
Klasse Search
abstract int search ( …)
ich verstehe hier die code nicht, wieso bei konstruktur einen Rückgabe typ es gibt? :nuts:
Pfadüberdeckung
Stimmt, war nicht möglich, da die zweite if-Abfrage nur erreicht werden kann, wenn die erste zu TRUE auswertet. Die zweite kann also im FALSE-Fall gar nicht erreicht werden.
Konstruktor
Ich hab auch in Erinnerung, dass es entweder class Searcher und dann die Methode search hieß oder so. Je nachdem was genau du meinst.
Es gab aber keinen Konstruktor der ein int zurück gegeben hat. Ist mir zumindest nicht aufgefallen
Jep, wollts auch grad ändern. Wie Nyx schon schön hingemalt hat kann man alle Pfade abklappern. Hab vorhin irgendwie komplett falsch gedacht.
Es galt aber nicht nur Verzweigungsüberdeckung => Pfadüberdeckung sondern es gilt Verzweigungsüberdeckung <=> Pfadüberdeckung. (und diesmal sollte es auch stimmen ).
Wie hätte man denn die letzte OCL-Aufgabe am besten gelöst?
[quote=der Klausur]Wird die Methode zufallsListe mit einer Anzahlt n als Parameter aufgerufen so
enthält die Wiedergabeliste danach entweder keine Titel oder maximal n Titel mit
paarweise unterschiedlichem Interpreten[/quote]
Meine Idee war Folgende:
context Wiedergabeliste::zufallsListe(n:int):void
post: titel->size() = 0 or (titel->size() <= n and titel->forAll(m1:Musikstueck| titel->forAll(m2 : Musikstueck| m1 <> m2 implies m1.interpret <> m2.interpret))
Allerdings war ich mir nicht sicher, ob so eine Doppelschleife in OCL funktioniert.
Daher noch ein anderer Ansatz:
context Wiedergabeliste::zufallsListe(n:int):void
post: titel->size() = 0 or (titel->size() <= n and titel->forAll(m1:Musikstueck| titel->select(m2:Musikstueck | m1.interpret = m2.interpret)->size() = 1))
Zumindest die zweite Variante sollte ja auf jeden Fall so funktionieren, oder?
Ich hatte es in der Klausur so gelöst, geht das auch? Ich dachte ich hätte das irgendwo mal gelesen mit den 2 Werten bei forAll.
context Wiedergabeliste::zufallsListe(n:int):void
post: titel->size() = 0 or (titel->size() <= n and titel->forAll(m1, m2 :Musikstueck|m1 <> m2 implies m1.interpret <> m2.interpret))
Edit: Habe gerade nochmal gegoogelt, es geht anscheinend mit 2 Argumenten bei forAll. Allerdings bin ich mir über die Schreibweise nicht ganz klar.
forAll(m1: Musikstueck, m2: Musikstueck |m1 <> m2 implies m1.interpret <> m2.interpret) oder
forAll(m1, m2 :Musikstueck|m1 <> m2 implies m1.interpret <> m2.interpret)
OCL
Wenn wir von einer Klasse auf eine andere zugreifen können
Bsp.: Abteilung -------------> Person
abteilungsleiter
Ist abteilungsleiter dann eine einelementige Liste?
Sprich, wenn wir wissen wollen, ob der abteilungsleiter einer Abteilung die betrachtete person (self) ist, müssen wir includes() verwenden?
In der Übung wurde das mit einem = geprüft.