Praktikum 1 findArithmeticalOperation()

Moderator: AI 2

flxkrmr
Neuling
Neuling
Beiträge: 6
Registriert: 14. Nov 2015 17:10

Praktikum 1 findArithmeticalOperation()

Beitrag von flxkrmr »

Ich verstehe den Zusammenhang zwischen den Funktionen "findArtithmeticalOperation()" und "findInnermostExpression()" nicht so ganz.
Nach meinem Verständnis müsste "findInnermostExpression()" nach dem innersten Ausdruck suchen (zB. 20-3*5) und die Funktion
"findArithmeticalOperation()" dann IN diesem Ausdruck nach der nächsten zu lösenden Operation suchen (3*5).
Da diese Funktion ("findArithmeticalOperation()") aber ohne Argumente aufgebaut werden soll, verstehe ich nicht wie das implementiert werden kann.

Das einzige was ich mir vorstellen könnte wäre ein privater Pointer in der Klasse, der auf das erste Element des innersten Ausdrucks zeigt.
Geht das in die richtige Richtung? Dann bräuchte man den Rückgabewert der Funktion "findInnermostExpression()" aber nicht mehr.
Da wir die Funktionsprototypen nicht ändern sollen, hänge ich hier gerade fest.

pessoa
Neuling
Neuling
Beiträge: 4
Registriert: 3. Nov 2015 21:02

Re: Praktikum 1 findArithmeticalOperation()

Beitrag von pessoa »

Diese Frage habe ich schon vor 2 Wochen gestellt, aber keine Antwort darauf bekommen. Ich hab die findArithmeticalOperation() dann gar nicht mehr verwendet.
pessoa hat geschrieben: Da hätte ich vielleicht auch drauf kommen können, allerdings erschließt sich mir der Grund für diese Funktion nicht. Mit Task 1 und 2 bin ich fertig und habe sie nicht benötigt. Mir fällt auch keine Stelle ein, wo dadurch irgendetwas einfacher werden würde, da Klammern von ihr ignoriert werden.
Im folgenden Beispiel etwa würde sie auf die "3" zeigen, allerdings kann die dazugehörige Operation noch gar nicht ausgeführt werden.
3+(1+1)

Root88
Neuling
Neuling
Beiträge: 5
Registriert: 28. Jan 2015 22:16

Re: Praktikum 1 findArithmeticalOperation()

Beitrag von Root88 »

Hallo flxkrmr,

Der Zusammenhang zwischen findInnermostExpression() und findArithmeticalOperation() ist hier eher transitiv, und zwar
über die Methode evaluateSimpleExpression(IListElement begin).
Wie du richtig erkannt hast sucht findInnermostExpression() nach dem innersten Ausdruck und liefert dir einen Pointer (MathElement) auf das Element vor dem ersten Element des
innersten Ausdrucks, insofern ein Element vor dem ersten Element des Innersten Ausdrucks existiert, sonnst auf das erste Element.
Wenn deine Methode findInnermostExpression() korrekt funktioniert, solltest du nun einen Teilausdruck des Mathematischen Ausdrucks erhalten, nämlich den innersten, nennen wir ihn mal "T".
In T kannst du nun nach einer Arithmetischen Operation mittels der Methode findArithmeticalOperation() suchen (Hier gilt Punkt vor Strich Rechnung).
Nun kannst du einen Pointer auf den linken Operanden zurückliefern und in evaluateSimpleExpression(IListElement begin) die Rechnung auswerten.

Zu deinem Vorschlag mit einem privaten Pointer, diese Idee geht in die richtige Richtung.
Du hast schon einen Globalen Pointer in der Klasse, mit dem namen "first".
Dieser spiegelt den Anfang der Liste wieder, du könntest diesen z.B. überschreiben (denk dann bitte daran ihn nachher wieder auf den Anfang der Mathlist zu setzen) und für die Methode findArithmeticalOperation().
Dadurch wirst du aber nicht den Rückgabewert von findArithmeticalOperation() los.

Ich hoffe ich konnte dir helfen.

Grüße

Nils

Root88
Neuling
Neuling
Beiträge: 5
Registriert: 28. Jan 2015 22:16

Re: Praktikum 1 findArithmeticalOperation()

Beitrag von Root88 »

Hallo Pessoa,

Wenn du einen Ausdruck hast, nehmen wir mal dein Beispiel: 3+(1+1)
Dann würde als innerster Ausdruck (1+1) von der Methode findInnermostExpression() zurückgeliefert werden.
evaluateSimpleExpression(IListElement begin) würde dann auf diesem Teilausdruck arbeiten und findArithmeticalOperation() würde dann einen pointer auf die linke 1 von (1+1) liefern.
dann wird der Ausdruck ausgewertet und gibt (2) wieder nun muss man sich noch um die Klammern kümmern, was auch in evaluateSimpleExpression(IListElement begin) passieren soll.
An dieser Stelle verweise ich auf die Aufgabenstellung, dort steht auf Seite 4, unter Schritt 3, der Satz: "Nachdem alle Operationen ausgeführt wurden, muss die Methode alle Klammern um den Ausdruck löschen, wenn es welche gibt."
Wenn nun die Klammern korrekt entfernt wurden erhält man den Ausdruck 3+2 und wiederholt die obigen Schritte.
Das Endergebnis ist dann 5.
Ich hoffe ich konnte dir weiter helfen.

Grüße

Nils

pessoa
Neuling
Neuling
Beiträge: 4
Registriert: 3. Nov 2015 21:02

Re: Praktikum 1 findArithmeticalOperation()

Beitrag von pessoa »

Root88 hat geschrieben: Zu deinem Vorschlag mit einem privaten Pointer, diese Idee geht in die richtige Richtung.
Du hast schon einen Globalen Pointer in der Klasse, mit dem namen "first".
Dieser spiegelt den Anfang der Liste wieder, du könntest diesen z.B. überschreiben (denk dann bitte daran ihn nachher wieder auf den Anfang der Mathlist zu setzen) und für die Methode findArithmeticalOperation().
Dadurch wirst du aber nicht den Rückgabewert von findArithmeticalOperation() los.
Nils
Das würde natürlich funktionieren, allerdings finde ich dieses Verfahren etwas unsauber. Im objektorientierten Programmieren sollte man das Verhalten von Funktionen nicht über globale Variablen steuern, stattdessen sollten diese eine abgeschlossene Einheit bilden.
Besser wäre es doch, wenn der Kopf von findArithmeticalOperation so aussehen würde:

public IListElement findArithmeticalOperation( IListElement begin, IListElement end)

Die Funktion sucht dann nur zwischen den angegebenen Grenzen nach Operatoren unter Beachtung von Punkt vor Strich.

flxkrmr
Neuling
Neuling
Beiträge: 6
Registriert: 14. Nov 2015 17:10

Re: Praktikum 1 findArithmeticalOperation()

Beitrag von flxkrmr »

Root88 hat geschrieben:Du hast schon einen Globalen Pointer in der Klasse, mit dem namen "first". Dieser spiegelt den Anfang der Liste wieder, du könntest diesen z.B. überschreiben (denk dann bitte daran ihn nachher wieder auf den Anfang der Mathlist zu setzen) und für die Methode findArithmeticalOperation().
Wenn ich den Wert von "first" in der Funktion findInnermostExpression() überschreibe und erst in findArithmeticalOperation() zurücksetze, dürfte ich ja zwischen diesen beiden Funktionen keine Funktion der Klasse aufrufen, die den Pointer "first" verwendet. Da finde ich den Lösungsansatz von pessoa mit den Argumenten für findArithmeticalOperation() besser.
Root88 hat geschrieben:Dadurch wirst du aber nicht den Rückgabewert von findArithmeticalOperation() los.
Ich meinte den Rückgabewert von findInnermostExpression(). Wenn ich die Position des innersten Ausdrucks im Pointer "first" speicher, brauche ich den Rückgabewert dieser Funktion nicht mehr.

Root88
Neuling
Neuling
Beiträge: 5
Registriert: 28. Jan 2015 22:16

Re: Praktikum 1 findArithmeticalOperation()

Beitrag von Root88 »

@flxkrmr

Du setzte den Pointer nicht in findArithmeticalOperation() zurück.
Sondern erst dann, wenn du in deinem Teilausdruck keine Operatoren mehr gefunden hast.

Dies ist natürlich nur eine von vielen Möglichkeiten.

Du kannst dir auch gerne Hilfmethoden erstellen, wie z.B. eine Methode die pessoa vorgeschlagen hat.
Bitte denkt aber daran, das eure Test laufen müssen und ihr nicht den gegebenen Code ändert. (Siehe Aufgabenstellung Seite 1: "Verändern Sie nicht den gegebenen
Code (Dies schließt Methodensignaturen und Zugriffsmodifizierungen ein).")

@pessoa:
Da du dich hier in der MathList Klasse befindest ist es kein Problem in der Klasse mit einer privaten Variable zu arbeiten, welche für die internen Methoden sichtbar ist, aber nicht von außen.
Damit erhältst du auch eine abgeschlossene Einheit.

Wenn es noch Fragen gibt, ich habe morgen (Dienstag 16.11) Sprechstunde ab 15:20 - 16:05 im c-Pool.

Antworten

Zurück zu „AI 2“