3.3f

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.

3.3f
ich verstehe nicht, was sollte man hier machen:
“Implementieren Sie eine Methode checkRiddle, in der in einer Schleife von i = 0 bis
7 einschließlich gezählt wird. Die Belegung für unsere drei Verdächtigen lässt sich nun bei
jedem Schleifendurchlauf an der Belegung der Bits 0, 1 und 2 der Zählvariable ablesen, wobei
0 das niederwertigste Bit ist.
Implementieren Sie eine weitere Methode isBitSet(int value, int bitIndex), die
true zurückgibt, wenn das durch bitIndex beschriebene Bit gesetzt ist. Verwenden Sie nun
diese Methode um innerhalb der Schleife mit Hilfe von eval und isBitSet die verschiedenen
Belegungen zu überprüfen.”


Du hast einen Zähler, der von 0 bis 7 zählt. Die Binärdarstellung der Zahlen sind:
000
001
010
011

Es ist jetzt so gedacht, dass das hinterste Bit sagt, ob kyle der Dieb ist, das vorletzte ob cartman der Dieb ist und das erste, ob stan der Dieb ist.
D.h. für z.B. den Wert 3 = 011 => cartman und kyle sind Diebe, stan nicht. Und jetzt sollst du überprüfen (mit eval()) ob diese Konstellation gültig ist oder nicht. (eval() müsste hier false geben, weil nur ein Dieb dabei sein darf). Und für z.B. 2 = 010 wäre nur cartman der Dieb. Auch hier musst du eval() befragen, ob cartman wirklich der Dieb ist.
Das mit dem Zähler und den einzelnen Bits ist eine einfache Technik um alle möglichen Kombinationen zu testen, ohne von Hand 8 fälle zu überprüfen.

Die Methode soll einfach sagen, ob an der Position bitIndex in der Binärdarstellung von value eine 1 oder 0 steht (damit du damit relativ einfach sehen kannst, ob derjenige ein Dieb ist, oder nicht)
Also: isBitSet(3, 0) = 1 (true) , isBitSet(3, 2) = 0 (false) (Ich weiß nicht, ob bitIndex von links oder von rechts zählen soll bitIndex=0 ist ganz rechts, 31 ganz links)

Ich hoffe das war halbwegs verständlich.

3.3e
ich verstehe die 3.3e) nich so ganz, soll man da die fälle durchgehn unter der Beachtung, dass genau einer und nur einer der Dieb ist?


War wohl etwas missverständlich formuliert von mir

Du sollst alle 4 Funktionen verwenden, die du in der 3.3d) geschrieben hast. Auch bei eval() können mehrere der Parameter a0-a3 true sein, d.h. du musst sicherstellen, dass eval() nur dann true zurück gibt, wenn genau einer der Parameter true ist. Ob du das bereits durch die 4 Funktionen sichergestellt hast oder nicht, sollte dir die 3.3a) sagen.


Was bedeutet es genau ?

Kann jemand mir dass ein bisschen erklaeren ?


Mit welchen Kombinationen von Kyle, Cartman, Stan ist das Rätsel nach F0 lösbar? Wird eval mit einer anderen als diesen aufgerufen und gibt true zurück, sind das Rätsel bzw. die Formeln fehlerhaft. Unabhängig davon sind das Rätsel bzw. die Formeln fehlerhaft, wenn eval für keine Kombination aus Kyle, Cartman, Stan true ergibt oder eval bei mehr als einer Kombination true zurück gibt. (kann man auch noch implementieren)

Edit:

also MUSS man das auch noch implementieren und kann nicht nur


DerBaer, Danke für die Erklärungen!


Also laut Aufgabenstellung und beinhalteter main-Methode wären im Falle von 3 = 011 doch Cartman und Stan die Diebe, da sowohl was die geforderte checkRiddle-Ausgabe angeht [im Falle von Stan eine 0, für Cartman ne 1 und für Kyle die 2] als auch was die main-Methode angeht [boolean stan = isBitSet( i , 0 )] Stan immer der 0 zugewiesen wird.

Und weil…

… 0 das niederwertigste Bit ist, also das ganz rechte in der Binärfolge, ist mit eben jenem ganz rechten Bit Stan gemeint, nicht Kyle.

Kann sein, dass du das mit folgender Erklärung dann im Nachhinein noch so meintest:

…allerdings hat mich diese Erklärung mit „31 ganz links“ dann noch mehr verwirrt.

Ach ja, trotzdem Danke für die restliche Erklärung. Das hat mir durchaus geholfen!


Oh stimmt. Tut mir leid, dass habe ich überlesen. Ja bitIndex 0 ist stan, cartman 1 und kyle 2.

Das mit der 31 kommt daher, dass die Variable value ja ein int ist, und damit 32 Bits enthält (auch wenn ihr nur die letzten/niederwertigesten 3 für die Aufgabe braucht).
Und ich gehe davon aus, dass eure isBitSet() für alle Werte bitIndex von 0 bis 31 funktionieren soll(auch wenn ihr für die Lösung des Rätsels nur die Werte 0, 1 und 2 braucht) (aber ganz sicher bin ich mir nicht).


was soll die methode checkRiddle genau machen ?? ich versteh das nicht …
es ist klar dass sie jede einzelne möglichkeit durchläuft …
meine frage ist ob man für jede einzelne möglichkeit true oder false zurückgeben soll mit hilfe von eval oder was ??
kann jemand mir bitte genau erklären was sie macht ??
was für parametern braucht man ?? oder ohne parameter ??


Ich hab die checkRiddle Methode etwas anders gelöst…und zwar mit zwei forschleifen.
Der Gedanke mit den Bits ist bei mir grundlegend auch der selbe und mein Ergebnis ist auch das richtige, aber nachdem ich mir das hier durchgelesen habe, denk ich dass ich es “falsch” gelöst habe im Sinne der Aufgabenstellung.
Was genau soll das für eine “Zählvariable” sein? Einfach nur ein int-Wert?
Und soll die Methode eine void-Methode oder eine int-Methode sein?
Eine return-Anweisung in einer forschleife ist wenig geschickt, wenn man sowohl die falschen als auch die richtige Möglichkeit zurückgeben soll…
Und wie soll man die zurückgeben, wenn es eine intMethode ist? Weil return beendet ja wie gesagt die Methode und wenn man für jede falsche Möglichkeit -1 zurückgeben soll wäre das Ding doch nach dem ersten Durchlauf fällig…oder kann man das mit System.out.println lösen? Wobei das dann wieder eine void-Methode wäre…


Danke, DerBaer. Meine Verwirrung wurde hiermit etwas entworren.


Saphira:

1: Zählvariable ist in diesem Fall einfach ein int Wert, welcher z.B. in einer for-Schleife hochgezählt wird (und damit die Schleifendurchläufe zählt).
2: Nachdem die Methode checkRiddle {-1, 0, 1, 2} zurückgeben soll, dürfte der Typ int nicht verkehrt sein.
3: -1 soll zurückgegeben werden wenn das Rätsel fehlerhaft ist (d.h. in keiner Konstellation alle Bedingungen erfüllt), falls das Rätsel lösbar ist soll entsprechend dem Täter 0, 1 oder 2 zurückgegeben werden. Das heißt für mich, erst alle Kombinationen durchgehen, schauen ob eine Kombination das Rätsel löst, und falls ja am Schluss der Methode den Täter zurückgeben. Ansonsten -1 zurückgeben → Immer alle Fälle ausprobieren, Rückgabe am Schluss der Methode.


Du sollst alle Möglichkeiten mithilfe der eval() testen. D.h. du erzeugst dir eine möglichkeit und rufst eval() auf. Das ergebnis merkst du dir. Dann suchst du dir die nächste Möglichkeit und testest wieder mit eval(). usw. Wenn du alle 8 Möglichkeiten durchprobiert hast, kannst du anhand der 8 Ergebnisse sehen, wer der Täter ist, oder ob das Rätsel fehlerhaft ist (z.B. wenn eval() mit zwei verschiedenen Möglichkeiten true zurückgegeben hat, ist es nicht eindeutig und damit fehlerhaft). Und je nachdem, gibst du (einmal, ganz am Ende) -1, 0, 1 oder 2 zurück.
Und Parameter? Das Ergebnis von isBitSet() z.B. ist abhängig von der Zahl und dem Index, deshalb hat sie die Parameter value und bitIndex. Wie sieht es mit der checkRiddle() aus? Ist das Ergebnis, wer der Dieb ist, von irgendetwas abhängig? [size=4](Außerdem steht in der Angabe bei den anderen Funktionen explizit welche Parameter es gibt)[/size]

Die Zählvariable ist ein int, ja.
Returnwert: siehe oben(ihr sollt nur einmal etwas zurückgeben, also nach eurer Schleife). Zurückgeben heißt, ihr braucht ein Return. Ausgeben heißt System.out.println()
Ich weiß nicht, wie du das mit 2 for-Schleifen ähnlich machst, und ich weiß nicht, wie das bewertet wird, aber die Aufgabe redet explizit von dieser Zählervariable. Insofern wäre ich vorsichtig mit alternativen Lösungen.


Ersteinmal danke an julupu und DerBaer für die Antworten. Ich verstehe jetzt, wie ich es machen muss. Nur noch eine Frage, die eigentlich nicht direkt hierher gehört…das exlusiv Oder aus der einen Bedingung…es setzt ja erstens voraus, dass nur einer der Dieb sein kann. Aber beschränkt es sich darauf oder geht es zweitens auch davon aus, dass einer der Dieb sein muss?
Weil wenn nicht hätte ich zwei Ergebnisse, für die die Formeln stimmen. Das eine besagt wer genau der Dieb ist (was anhand der Namen eigentlich schon von Anfang an klar ist…) und das andere wäre ein typischer -1-Fall (was sich vermeiden ließe, wenn das exlusiv Oder eine Lösung voraussetzen würde).
Und wenn ich jetzt also mit checkRiddle herausfinde, wer der Dieb ist, aber noch eine zweite Lösung habe, die ein -1-Fall ist, was muss ich dann zurückgeben? -1, oder? Obwohl der eine Dieb theoretisch genau bestimmt wurde?


Ahh, ist ok. In der Aufgabenstellung steht ja, dass auf jeden Fall 0, 1 oder 2 für den jeweiligen Dieb zurückgegeben werden soll, falls einer feststeht. Damit ist es ja nur sekundär von Bedeutung, ob es einen nichteindeutigen Fall zusätzlich dazu gibt.


Exklusives Oder setzt 1 true vorraus. (“A oder B, aber nicht beide”). (false, false, false) ist also keine gültige Belegung für die Bedinung


Exklusives Oder sagt aber auch, dass alle drei die Täter sein können (nicht nur einer).


Wo hast du diese Information her?

Exklusives Oder != Oder