Autor |
Beitrag |
Joey86
      
Beiträge: 56
|
Verfasst: Fr 13.06.08 13:32
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
Zuletzt bearbeitet von Joey86 am So 15.06.08 17:02, insgesamt 1-mal bearbeitet
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Fr 13.06.08 13:35
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 13.06.08 13:36
Das Stichwort heißt "Parsen".
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 13.06.08 13: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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 13.06.08 13:38
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Fr 13.06.08 15: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
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: Sa 14.06.08 22:17
Titel: Re: Programmieranfänger benötigt Hilfe bei kleinem Programm
Joey86 hat folgendes geschrieben: | Hi Leute!
[i]Schreiben Sie einen Formelinterpeter. Das ist ein Programm, das eine Textdatei liest und eine neue Datei erzeugt.
|
[OT]  [/OT]
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 15.06.08 04: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 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 15.06.08 09:40
bakachan 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: So 15.06.08 10:52
Jakob_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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 15.06.08 10: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 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 15.06.08 11:55
Stimmt, ich bin von Delphi für Win32 ausgegangen.
|
|
Joey86 
      
Beiträge: 56
|
Verfasst: So 15.06.08 12:14
guten morgen jungs (und mädels?)!
bakachan 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.^^
Martok 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.
Christian 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#
Jakob_Ullmann hat folgendes geschrieben: | bakachan 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.
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.
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 15.06.08 13:01
Ach ja, bevor ich es vergesse, ändere doch bitte den Titel Deines Threads. Der sagt irgendwie nix über das eigentliche Problem aus. Danke! 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: So 15.06.08 13:12
Vielleicht solltest du dir das hier mal anschauen: delphi.zsg-rottenburg.de/parser.html (Der Beispielcode ist allerdings in Delphi, nicht in C#)
mfg
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 15.06.08 14: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.
|
|