Sammelthread…
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.
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.
9.1 ADT Bruchrechnen
Zu b) / c):
Oops - mea culpa - ist nun gefixed.
Dass da Frac hingehört ist anscheinend so offensichtlich :scared: , dass es mehreren Reviewern gar nicht erst aufgefallen ist…
PS: Noch ein Argument-Beispiel gegen copy & paste
Duerfen wir eigentlich Sign.neg und Sign.pos bei der b) verwenden?
Ich wüsste auf Anhieb nicht, wie es ohne ginge…
(Die Schreibweise sei ausnahmsweise euch überlassen, also egal ob [m]Sign.pos[/m] oder [m]Sign.pos()[/m] oder sogar nur [m]pos[/m], sofern es eindeutig ist…)
Gut, ich naemlcih auch nicht
Hi,
hätte jemand einen Tipp für mich, wie ich abchecken kann ob
y.sign
des Bruchs
Frac y
positiv oder negativ ist ohne irgendwelchen .equals Methoden anzuwenden?
Weil mit dem ==-Operator kann ich ja nur auf Referenzgleichheit, aber nicht Wertegleichheit checken…
Schau mal den Sourcecode von Sign an und was bei Sign.pos() und Sign.neg() zurueckgegeben wird.
Schau am besten mal in der Sign-Klasse nach ob du wirklich Wertegleichheit brauchst.
Verwirrend
Öhm irgendwie versteh ich das ganze nicht so ganz, habe mal ne Frage zum Vorlesungsbeispiel Folie 10-9. Da wirds ja als axiom insert(insert(x,i),i) = insert(x,i) genommen, aber im Programm steht ja nur
public void insert(int elem) {
if (!contains(elem)) {
is = copyOf(is, is.length + 1);
is[is.length - 1] = elem;
}
}
also wo kommt da beim axiom das zweite insert her? warum lautet das axiom nicht insert(x,i) = insert (x,i)??? Wär schön wenn mal jemand licht ins dunkel bringen kann…
Das Axiom möchte sagen, dass [m]insert(z, i) = z[/m] wenn [m]z = insert(x, i)[/m], d.h. [m]insert[/m] verändert die Liste nicht, wenn das Element [m]i[/m] schon drin ist (gut, genau genommen sagt es, wenn das Element [m]i[/m] das letzte eingefügte ist, aber sicher steht da noch ein entsprechendes Vertauschungsaxiom dabei, das [m]insert(insert(x, i), j)) = insert(insert(x, j), i)[/m] besagt um diesen Fall abzudecken?).
ah ok,
die Axiome sind,
isEmpty(create) = true
isEmpty(insert(x,i)) = false
insert(insert(x,i)i)= insert(x,i)
contains(create,i) = false
contains(insert(x,j),i) = true falls i = j
contains(x,i) sonst
denke mal das letzte ist das Axiom das zurückgibt ob i schon enthalten ist… ok also die Axiome sollen ausdrücken welche Regeln man beachten muss wenn man das ganze dann codiert…also heißt “insert(insert(x,i)i)= insert(x,i)” würde besagen das ich den Code so schreiben muss das wenn eine zahl schon enthalten ist ich diese nicht nochmal eintrage???
Das stimmt soweit.
Das “Problem” mit den Axiomen ist, dass diese immer rekursiv definiert sind. (Basisfälle + Rekursionsfälle)
Wobei sich die Rekursion auf die Datenstruktur bezieht. In einer Liste sind z.B. leere Listen Basisfälle und Listen, die auf eine andere Art erzeugt werden, Rekursionsfälle, da man quasi rekursiv hinschreibt, wie die Liste entstanden ist.
insert(x,i) ist die Liste, die rekursiv aus der Liste x durch einfügen von i entstanden ist.
Allerdings kann man die Axiome nicht immer rekursiv implementierten, da sich nicht jede Datenstruktur wieder rekursiv zurück zerlegen lässt. Am besten geht man vor, indem man sich auf die Namen der Methoden und ggfs Beschreibung konzentriert und seine Implementierung “nach Gefühl” macht und die Axiome anschließend an der eigenen Implementierung testet.
Addition von Brüchen
Dürfen wir Math.abs verwenden? Wäre bei Addition von Brüchen recht hilfreich!
Nein, siehe Aufgabenstellung.
Okay, dann habe ich aber folgendes Problem. Bei der Addition von Brüchen rechne ich einmal: -(3/4) + (2/3) = -(1/12) und einmal: -(2/3) + (3/4)= (1/12).
Ich habe folgende Unterschiedung gemacht: Bruch x ist negativ und Bruch y ist positiv. Doch das klappt nicht, weil Java 8-9=0 rechnet. Wie kann man das geschickter machen? 9>8 darf ich ja schließlich genauso wenig verwenden wie Math.abs. Wäre um jeden Tipp froh
Ob x > y ist kannst du aber rausfinden mit den gegebenen Operationen (== bzw. !=) in Verbindung mit den ops von Nat. Mit 8-9=0 warst du auf gar keinem schlechtem Weg nur hast du daraus noch nicht das richtige gefolgert
Danke für deine Antwort .tom! Okay, aber der Punkt ist, was soll ich daraus folgern? Und noch eine weitere Frage: Bei Teilaufgabe b) muss ich alle Axiome ergänzen, d. h. auch add, sub, mul und div, die ich in c) implementiere oder nur die für einen gekürzten Bruch, also nur num und den?
Im Aufgabentext der c steht :“Keiner weitere Attribute…haben als die vorgegebenen” .
Dürfte ich mir nun beispielsweise eine temporäres frac definiern oder ist das auch verboten?
Innerhalb deiner Methoden darfst du das tun (wenn auch unnötig) - als Klassen- und/oder Instanzattribut hingegen nicht!
Edit stellt klar: auch nicht [m]private[/m]…