![]() |
Welche Methode zum Parsen von chemischen Formeln?
Hinweis: Dieses Thema wurde von
![]() Hallo erstmal ;) Ich hab diese Diskussion hier über Google gefunden, da ich im Moment auf der Suche bein das Rechnen mit Klammern meinem Delphi näher zu bringen, in Form von Rechnen mit Chemischen Formeln. Deshalb würde es mich doch stark interessieren, welcher "Rechner" für soetwas geeignet ist, bzw, was für einer im Post von shmia angesprochen wird, und wo man soetwas herbekommen kann... Danke schon einmal Nager [edit=Matze]Thema gesplitted. Mfg, Matze[/edit] |
Re: uSthEvaluator - Arithmetischer Parser
Was willst du jetzt woher bekommen? Also Parser sind ja einige gelinkt.
|
Re: uSthEvaluator - Arithmetischer Parser
Ja habe jetzt auch einen, der iO zu sein scheint, allerdings weiß ich nicht, wie ich die Chemischen Formeln auteilen soll, damit ich diese Weiterverarbeiten kann...
Da fehlt mir noch n Idee, wie ich Formeln im Stil von 2(H3O) aufteilen kann dass mein Programm mir rechnet: 2*H und 2*3*O UNd dann am besten die H's und O's druch Molmassen und andere Werte aus meiner Datenbank in Form eines StringGrids ersetzt... Alles in allem ein sehr komplexes Problem :) Vll sogar ma n netten Thread eröffnen^^ |
Re: uSthEvaluator - Arithmetischer Parser
Liste der Anhänge anzeigen (Anzahl: 1)
Ja mach daraus mal nen neuen Thread!
Edit: Also aus H30 dachte ich wird 3*H+1*O :gruebel: also zumindest ist in H2O zweimal Wasserstoff drinn, wenn mich meine Chemiekenntnisse noch nicht völlig verlassen haben. Achja, und ich hatte grad mal Zeit und Lust: siehe Anhang Das ist sicherlich ausbaufähig und nur ne Idee. Die Rechenregeln müssten sicherlich überprüft werden (procedure zeichensetzen). @Mods: Splitten wäre jetzt mal nicht schlecht. |
Re: uSthEvaluator - Arithmetischer Parser
Jop, genau so in etwa habe ich mir das vorgestellt...
Ich versuch mich mal in den VCode einzuarbeiten, für einen quasi Anfänger is das ein ziemlicher Brocken ;) Ich verstehe bis jetzt leider nur recht wenig, aber ich versuchs mal. Was für Methoden hast du denn genau angewendet? Also was für Arten von Code? Aber schon mal Danke für den Ansatz ;) Nager |
Re: uSthEvaluator - Arithmetischer Parser
Zitat:
Alles so, wies da steht. |
Re: uSthEvaluator - Arithmetischer Parser
Zitat:
Unter Methoden versteh ich sowas wie "Explode" un so über Begriffe... // vll könnte ein Mod das wirklich mal aufteilen ;) |
Re: uSthEvaluator - Arithmetischer Parser
:gruebel: wie meinen? Spezielle Methoden?
Also ich habe nix komisches, oder spezielles oder so benutzt. Das ist einfach so dahin geschrieben. Das einzig typische für so einen Parser ist die Funktion "calc", die ich geschrieben habe. die beinhaltet eben den rekursiven Algorithmus zum berechnen von mathematischen Termen. |
Re: Welche Methode zum Parsen von chemischen Formeln?
So, also ich hab mir den Code jetzt mal angeguckt, aber ich kapier teilweise einfach nicht, was das Programm macht :(
Hättest du vll sowas wie ICQ, oder ähnliches, damit ich dich löchern kann zu diesem Code, denn der is genau das, was ich brauche, nur um ihn zu verwenden, sollte ich ihn verstehen... Weil ich denke, dass Zeile für Zeile zu erklären zu schwer ist, oder :>? Nager |
Re: Welche Methode zum Parsen von chemischen Formeln?
Dazu hatte mich schonmal ein anderer User gebeten, aber ich komme kaum dazu. dieses WE sind ja Delphi Tage...ansosnten will ich, wenn ich mal Zeit habe meine eigenen privaten Projekte (und es sind nur ganz kleine) vorrantreiben.
Mal sehen, vielleicht Montag oder Dienstag. Aber du kannst auch hier direkt Fragen stellen. |
Re: Welche Methode zum Parsen von chemischen Formeln?
Ok, danke ;)
Allerdings weiß ich auch nicht, was ich nicht verstehe, da ich halt einfach nichts verstehe will man fast meinen, vll fehlt auch nur der Knackpunkt, wos dann Klick macht und aha, wäre nicht das erste mal bei mir :> Ich versuchs mal weiter übers We! Danke |
Re: Welche Methode zum Parsen von chemischen Formeln?
Benutze den Debugger und schaue dir die Variablen im Watch-Window an.
Das Programm gliedert sich Prinzipiell in zwei Teile (genauso, wie man es auch beim ausführen sieht) 1. Teil: Einsetzen von Operationszeichen Das Ergebnis wird in dem, von oben gesehen, zweiten Edit-Feld angezeigt (was edit3 heißt). Aus z.B. H2O wird H*2+O. Bzw. aus 3H3S04 wird 3*(H*3+S+O*4). Das alles erledigt die Funktion "zeichensetzen" (mit Hilfe von "PlusvorZahl") Die Funktion geht einfach Schritt für Schritt durch den String "term" und schaut z.b sowas an:
Delphi-Quellcode:
Soviel zur Funktion "Zeichensetzen". Das Ergebnis wird wie bereits erwähnt auch im Programm angezeigt.
//...
else if (term[k] in ['a'..'z','A'..'Z'])and(term[k+1] in ['0'..'9']) then term:=copy(term,1,k)+'*'+copy(term,k+1,length(term)) //... {Wenn an Stelle k im term ein Buchstabe ist und an Stelle k+1 im term eine Zahl, dann wird dazwischen ein '*' gesetzt für k=1 und term='H20' wird so term:='H'+'*'+'2O' Wenn nix geändert wird erhöht sich k um 1 ansosnten um 2. Demnach ist jetzt k=3 (da was geändert wurde) Beim nächsten Schleifendurchlauf dürfte die Funktion anfolgender Bedingung hängen bleiben:} if (term[k] in ['0'..'9'])and(term[k+1] in ['a'..'z','A'..'Z']) then begin if PlusvorZahl(term,k) then begin n:=k+1; //Klammer setzen: 2H2SO4+2Cl --> 2*(H*2+S+O*4)+2*(Cl) while (n<=length(term))and not(term[n] in ['(',')','+']) do inc(n); term:=copy(term,1,k)+'*('+copy(term,k+1,n-k-1)+')'+copy(term,n,length(term)); inc(k); end else term:=copy(term,1,k)+'+'+copy(term,k+1,length(term)); end {term[k] ist eine Zahl und term[k+1] ein Buchstabe Hier muss erstmal überprüft werden, was vor der Zahl passiert ist, deswegen die Funktion PlusvorZahl. wenn vor der Zahl (hier: 2) ein Pluszeichen steht (oder der Term vor der Zahl anfängt), dann muss eine Klammer gesetzt werden (inkl. Multiplikationszeichen) ansonsten kommt ein Pluszeichen hinter die Zahl z.B. in 3H2O existiert zweimal der Zustand: erst Zahl dann Buchstabe "3H" und "2O" aber aus "3H" wird "3*(H"...")" und aus "2O" wird einfach "2+O", da die zwei ja zum Wasserstoff gehört.} Bis hierhin war es neu. Ab jetzt braucht man die Formel (den Term), die man erstellt hat nur noch auszurechnen und für die chemischen Zeichen, die wir jetzt einfach als Variablen betrachten, können wir irgendwelche Zahlen, z.B. molare Massen einsetzen. Der zweite Schlag (Teil) wird durch die Funktion "calc" gemacht, eim klassicher MatheParser. Als Vorbereitung muss noch festgelegt werden, mit welchen Zahlen, wir unsere Variablen (Elemente) ersetzen. Dazu wird der ValueListeditor in Fmol gespeichert (Man hätte hier auch direkt den Valuelisteditor nehmen können, aber so kann man Fmol auch mal anders, z.B. durch ein Stringrid oder aus einer Datei füllen) Also wir brauchen die Funktion calc und die StringListe Fmol, in der jeder einzelne String durch "Element=molare Masse" besetzt ist. Und jetzt kommt die rekursive Funktion calc (die als Hilfe noch pos0 benutzt). Schau dir dazu mal folgenden Thread an: ![]() In Beitrag #13 hatte ich damals eine PP-Präsentation erstellt. Die Funktion calc heißt dort TTR. |
Re: Welche Methode zum Parsen von chemischen Formeln?
Super!
Habe ihn jetzt besser verstanden, und auch mal eingebaut, klappt ganz nett, allerdings habe ich meine Daten in einer Stringlist gespeichert, und möchte diese bei Fmol nutzen, wie gebe ich Fmol nun an, welche Spalten genutzt werden sollen? Aber sonst, tip top, danke ;) |
Re: Welche Methode zum Parsen von chemischen Formeln?
Meinst du jetzt StringList oder Stringgrid?
Also bei einer Stringlist brauchst du nur assign verwenden (sowie ich bei den Valuelisteditor) bei allen anderen musst du dir das Fmol halt irgendwie zusammensetzen. Wenn es keine günstige Methode gibt, dann halt Schritt für Schritt:
Delphi-Quellcode:
fmol:=Tstringlist.create;
try fmol.add('H=1,004'); fmol.add('O=16'); //so wird die Liste erstellt, das "=" ist wichtig damit ich hinterher den Namen vom Wert unterscheiden kann (siehe NameValueseparator"), falls du das "=" anderweitig in der Liste benutzt, müsstest du eben den fmol.namevaluesparator ändern //das anfügen geht natürlich auch anders fmol.add(s); //wenn s ein string ist //oder fmol.add(stringgrid1.cells[2,1]+'='+stringgrid1.cells[5,1]); //oder for i:=1 to 10 do fmol.add((stringgrid1.cells[2,i]+'='+stringgrid1.cells[5,i]); finally fmol.free; end; |
Re: Welche Methode zum Parsen von chemischen Formeln?
Ok, habs jetz gelöst mit einem StringGrid, :hello:
Wunderbar, wunderbar, kann ich jetzt evtl noch in einem Stringgrid die Verwendeten Elemente vll noch deren Anzahl, sowie die Molare Masse anzeigen lassen? |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
|
Re: Welche Methode zum Parsen von chemischen Formeln?
Also ich hab das jetztmal versucht, mit der Tabelle, dafür müsste ich doch aus dem String "term" einen TStrings abgreifen, zum einen die Chemischen Symbole und zum anderen dann noch einmal die Molaren Massen, und dann das ganze per
Delphi-Quellcode:
einfügen, oder?
Stringgrid.Rows[0] := term2;
So klappt es nicht, irgendwie hab ich da n Denkfehler wohl drinne, da hab ich einfach versucht, sozusagen die erste "Spalte" abzugreifen, aber das geht net so...
Delphi-Quellcode:
function Tform1.Berechnen(term:string):double; //Berechnet Masse
var p:integer; st : string; tst : Tstrings; begin if pos0('+',term,p) then result:=Berechnen(copy(term,1,p-1))+Berechnen(copy(term,p+1,length(term))) else if pos0('*',term,p) then result:=Berechnen(copy(term,1,p-1))*Berechnen(copy(term,p+1,length(term))) else if term[1]='(' then result:=Berechnen(copy(term,2,length(term)-2)) else if term[1] in ['a'..'z','A'..'z'] then //Molare Masse in Fmol wird gesucht result:=strtofloat(Fmol.ValueFromIndex[Fmol.indexofname(term)]) else begin result:=strtofloat(term); end; st :=Fmol.ValueFromIndex[Fmol.indexofname(term)]; tst := st[1]; MolGrid.Rows[0]:= tst; end; |
Re: Welche Methode zum Parsen von chemischen Formeln?
Nee, das klappt ganz sicher nicht.
Bist du mal mit einem Debugger drüber gegangen? Du dürftest schon bei der Zuweisung von st einen Fehler bekommen. Du hast wahrscheinlich noch nie rekursive Funktionen geschrieben. So einfach kannst du da nicht drin rumschreiben. Ich sehe auch leider aus dem Quelltext nicht, was du willst. Bzw was anders ist, als das, was ich schon vorgeschlagen hatte. Dann noch zwei Sachen: 1. Mein Programm war nur ein schnelles TestProg. Du solltest den Parser besser unter eine eigene Klasse legen und nicht bei TForm1 lassen. 2. hab ich grad vergessen :? |
Re: Welche Methode zum Parsen von chemischen Formeln?
Ich hab vor die Zuordnungen, die er ja macht, zum parsen der Formeln einfach in eine Tabelle zu schreiben, er ließt ja aus Fmol die Werte aus, und ersetzt sie zum rechnen...
Jetzt will ich, dass der Nutzer dies als Ausgabe in einem Stringgrid sieht... Allerdings, wie du schon sagst, will das nicht so einfach gehen, wie mans gerne hätte. Wegen den Zuordnungen, das is noch dein Programm in dem ich rumschreib, ich hab das ganze für mein Proggi eh nochma abgeschrieben, sonst hät ich das vll nie begriffen ;) Wie auch immer, muss halt versuchen das da rauszufummeln, was im Programm rumschwirrt ;) //Achja, im Quelltext hab ich TStrings stehen, hier im Board wohl net, lol :> //Edit2: Jetzt wo dus sagst mit dem TForm1 un so, in meinen Programm heißt das sogar noch TForm1, 0ldschool quasi^^ |
Re: Welche Methode zum Parsen von chemischen Formeln?
Zitat:
|
Re: Welche Methode zum Parsen von chemischen Formeln?
Ist es dann überhaupt möglich, dass in einem Stringgrid erscheinen zu lassen?
|
Re: Welche Methode zum Parsen von chemischen Formeln?
:?: Mir fehlt immer noch das Verständnis.
Du willst die Werte einfach aus Fmol in ein StringGrid eintragen? Warum? Und warum hier? |
Re: Welche Methode zum Parsen von chemischen Formeln?
Naja, ich will, dass er mir die Elemente, die ich benutze auflistet...
Schwer zu erklären Also wenn ich jetz als Formel hab: C2H6O3 Dann will ich, dass ich der tabelle das steht: C - "Molmasse" H - " O - " Deshalb habe ich gedacht, ich versuche das, wass er zum berechnen nimmt abzugeifen un es einfach in mein Stringgrid zu setzen, dies war die einzige Stelle, an der ich dachte, dass es vll gehen könnte... |
Re: Welche Methode zum Parsen von chemischen Formeln?
Hmm, das könte gehen, dann müsstest du deinen code nur (abgeändert) ein paar Zeilen weiter oben bringen. Allerdings wird er dann bei Methansäure dir zweimal die molare Masse von Wasserstoff und von Sauerstoff auflisten. Das müsstest du dann wiederum querchecken.
Möglich ist alles! Und nochwas: Du hast tst nie initialisiert! |
Re: Welche Methode zum Parsen von chemischen Formeln?
Mmh, ok un wo genau kann ich das dann abfangen?
Bzw, wie müsste das aussehen, damit er einmal nur die Elemente anzeigt, also nicht 3x dies 4x das, sonder halt nur H und C egal wie oft ;)? Ich denke es wäre ganz nett, wenn man das ganze noch mit einem Checkbutton machen könnte, geht ja dann über if Abfrage... |
Re: Welche Methode zum Parsen von chemischen Formeln?
Na das kommt dahin, wo auch der Wert der molaren Masse aus fmol herausgesucht wird.
(Checkbutton ist auch möglich.) Mal ne Frage meinerseits: Bist du dir sicher, dass das Projekt für dich schon geeignet ist? Du hast noch einige Lücken in Pascal und wenn das dein erster rekursiver Algorithmus ist, dann ist auch klar, dass du in den Funktionen nicht durch siehst. |
Re: Welche Methode zum Parsen von chemischen Formeln?
Der Teil meines Programms ist wirklich verdammt knifflig, deswegen schaff ichs auch nicht alleine ;)
Werd mich da wohl tiefer in diese Materie einarbeiten, bis zum Abgabetermin werde ich das nicht mehr ganz schaffen, sollte aber kein Thema sein, da der Rest des Programms so gut wie fertig ist, ich baus mir dann selbst mal ein, sollte ich in ca 1-2 wochen kapiert haben... Aber Danke für den Tipp ;) Ich werd mich mal durchwühlen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz