Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Programmieranfänger benötigt Hilfe für Taschenrechner in C#


Joey86 - Fr 13.06.08 12:32
Titel: Programmieranfänger benötigt Hilfe für Taschenrechner in C#
Hi Leute!
Folgendes: Seit einigen Wochen bin ich (einigermaßen) fleißig dabei zu programmieren. Jetzt tu ich mir aber etwas schwer bei einer Hausaufgabe, irgendwie fehlt mir total der Ansatz. Ich hoffe ihr könnt mir helfen. Die Aufgabe nennt sich Formelinterpreter und ist eine Art Taschenrechner. Hier die Aufgabenstellung:

Schreiben Sie einen Formelinterpeter. Das ist ein Programm, das eine Textdatei liest und eine neue Datei erzeugt. Jede gültige Rechenformel der Ausgangsdatei soll in der neuen Datei durch das Ergebnis der Rechnung ersetzt sein.

Steht also in der Ausgangsdatei

Das ist (3+5)*10

soll in der erzeugten Datei stehen:

Das ist 80

Ihr Interpreter soll die Grundrechenarten und Klammern beherrschen, außerdem das Rechnen mit ganzen und Gleitpunktzahlen. Intern dürfen Sie immer mit Gleitpunktzahlen arbeiten.


Irgendwie weiß ich nicht so recht wie ich es hinbekommen soll, dass das Ergebnis richtig ermittelt wird. Also z.B., dass der Punkt Vorrang vor Minus und Plus hat, jedoch die Klammer wiederum Vorrang vor dem Punkt hat.
Könnt ihr mir da etwas auf die Sprünge helfen, evtl sagen wie ich ansetzen muss. Wäre wirklich super von euch!!

Liebe Grüße Joey


FinnO - Fr 13.06.08 12:35

suche mal Copy und Pos


Jakob_Ullmann - Fr 13.06.08 12:36

Das Stichwort heißt "Parsen".


Th69 - Fr 13.06.08 12:37

Such mal nach dem Begriff Parser, dann solltest du genügend Ansätze dafür finden. (Am einfachsten läßt sich ein Top-Down-Parser programmieren.)


Jakob_Ullmann - Fr 13.06.08 12:38

Apropos: http://www.delphi-forum.de/viewtopic.php?t=54738&highlight=parser


bakachan - Fr 13.06.08 14:59

Hab das ganze mal fix durchprogrammiert.

Ich würde es (bzw hab es) über Regex lösen.
Eine Runktion mit Regex um Klammern zu ersetzen.
Eine Funktion um aus 2 Zahlen und 1 Operanden das Ergebnis zu berechnen.

Das ganze verbunden mit den nötigen Regex.Replace oder matches
und schon hat man das was du suchst.


huuuuuh - Sa 14.06.08 21:17
Titel: Re: Programmieranfänger benötigt Hilfe bei kleinem Programm
user profile iconJoey86 hat folgendes geschrieben:
Hi Leute!

[i]Schreiben Sie einen Formelinterpeter. Das ist ein Programm, das eine Textdatei liest und eine neue Datei erzeugt.



[OT] :shock: [/OT]


Martok - So 15.06.08 03:07

Naja, leicht abartige Definition der E/A-Methoden... aber so sind Lehrer halt xD

Für vollständig geklammerte Ausdrücke hatte ich irgendwo mal einen Parser gepostet... Punkt vor Strich braucht man dann aufgrund der Klammern nicht ;)


Jakob_Ullmann - So 15.06.08 08:40

user profile iconbakachan hat folgendes geschrieben:
Hab das ganze mal fix durchprogrammiert.

Ich würde es (bzw hab es) über Regex lösen.
Eine Runktion mit Regex um Klammern zu ersetzen.
Eine Funktion um aus 2 Zahlen und 1 Operanden das Ergebnis zu berechnen.

Das ganze verbunden mit den nötigen Regex.Replace oder matches
und schon hat man das was du suchst.


Fragt sich nur, ob die Schüler Fremdkomponenten benutzen dürfen, wenn ja, wäre das natürlich ein großer Vorteil.


JüTho - So 15.06.08 09:52

user profile iconJakob_Ullmann hat folgendes geschrieben:
Fragt sich nur, ob die Schüler Fremdkomponenten benutzen dürfen, wenn ja, wäre das natürlich ein großer Vorteil.

Wieso "Fremdkomponenten"? Die Regex-Klasse gehört zum NET-Standard. Jürgen


Christian S. - So 15.06.08 09:56

Der Fragesteller muss erst einmal sagen, welche Sprache er denn benutzt. Diese Sparte hier gehört ja sowohl zu C# als auch zu Delphi :-)


Jakob_Ullmann - So 15.06.08 10:55

Stimmt, ich bin von Delphi für Win32 ausgegangen.


Joey86 - So 15.06.08 11:14

guten morgen jungs (und mädels?)!


user profile iconbakachan hat folgendes geschrieben:
Hab das ganze mal fix durchprogrammiert.

ahh...wenn ich das schön höre.^^ und ich werd mich damit wieder ewig rumquälen...haha.^^


user profile iconMartok hat folgendes geschrieben:
Naja, leicht abartige Definition der E/A-Methoden... aber so sind Lehrer halt xD
Für vollständig geklammerte Ausdrücke hatte ich irgendwo mal einen Parser gepostet... Punkt vor Strich braucht man dann aufgrund der Klammern nicht ;)


hast du gerade zufällig nen link zum thread oder den threadtitel? meine erste kurze suche ergab keine ergebnisse.


user profile iconChristian S. hat folgendes geschrieben:
Der Fragesteller muss erst einmal sagen, welche Sprache er denn benutzt. Diese Sparte hier gehört ja sowohl zu C# als auch zu Delphi :-)

c#

user profile iconJakob_Ullmann hat folgendes geschrieben:
user profile iconbakachan hat folgendes geschrieben:
Hab das ganze mal fix durchprogrammiert.
Ich würde es (bzw hab es) über Regex lösen.
Eine Runktion mit Regex um Klammern zu ersetzen.
Eine Funktion um aus 2 Zahlen und 1 Operanden das Ergebnis zu berechnen.

Das ganze verbunden mit den nötigen Regex.Replace oder matches
und schon hat man das was du suchst.


Fragt sich nur, ob die Schüler Fremdkomponenten benutzen dürfen, wenn ja, wäre das natürlich ein großer Vorteil.


ich glaube wie ich das programm löse, ist völlig egal. hauptsache es läuft, so kulant ist er dann auf jeden fall. :D


bin leider jetzt erst dazu gekommen, mir die sache mit dem parser mal durchzulesen. werde hier jetzt gleich auch noch im forum mich noch etwas informieren. aber einfach wird mir die sache nicht fallen, das seh ich jetzt schon. :roll:
hmm...was meint ihr nun, mit regex lösen oder einen top-down-parser programmieren, das sind ja die bisherigen vorschläge. was wäre sinnvoller? ach und zum parser...hättet ihr mir da evtl mal anschauungsmaterial oder weitere hilfestellungen, ein wenig überfordert fühl ich mich zur zeit, wenn ich das hier so durchlese. :?

gruß joey


Christian S. - So 15.06.08 12:01

Ach ja, bevor ich es vergesse, ändere doch bitte den Titel Deines Threads. Der sagt irgendwie nix über das eigentliche Problem aus. Danke! :-)


F34r0fTh3D4rk - So 15.06.08 12:12

Vielleicht solltest du dir das hier mal anschauen: http://delphi.zsg-rottenburg.de/parser.html (Der Beispielcode ist allerdings in Delphi, nicht in C#)

mfg


delfiphan - So 15.06.08 13:23

Lösungsmöglichkeiten gibt es hier sehr viele.

Die klassische Lösung wäre zuerst eine Infix zu Postfix Konversion gefolgt von einer einfachen Auswertung mit einem Stack.

Man kann die Aufgabe aber auch mit einer Finite State Machine lösen (in einem Durchgang). Das dazugehörige Diagramm sollte eigentlich im Internet zu finden sein, das Umsetzen in eine konkrete Sprache dürfte dann nur noch etwas Fleissarbeit sein.

C#: Dort kannst du ja mittels CodeDom programmatisch Code kompilieren. Ist zwar wohl nicht unbedingt Sinn der Aufgabe, aber auch eine Lösung.