Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Welche Methode zum Parsen von chemischen Formeln? (https://www.delphipraxis.net/90718-welche-methode-zum-parsen-von-chemischen-formeln.html)

Nagetier 21. Apr 2007 10:52


Welche Methode zum Parsen von chemischen Formeln?
 
Hinweis: Dieses Thema wurde von diesem abgetrennt, da es ein eigenständiges ist.


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]

sirius 21. Apr 2007 14:18

Re: uSthEvaluator - Arithmetischer Parser
 
Was willst du jetzt woher bekommen? Also Parser sind ja einige gelinkt.

Nagetier 21. Apr 2007 14:38

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^^

sirius 21. Apr 2007 17:00

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.

Nagetier 22. Apr 2007 10:26

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

sirius 22. Apr 2007 12:20

Re: uSthEvaluator - Arithmetischer Parser
 
Zitat:

Zitat von Nagetier
Was für Methoden hast du denn genau angewendet? Also was für Arten von Code?

Hä? :drunken:

Alles so, wies da steht.

Nagetier 22. Apr 2007 14:27

Re: uSthEvaluator - Arithmetischer Parser
 
Zitat:

Zitat von sirius
Zitat:

Zitat von Nagetier
Was für Methoden hast du denn genau angewendet? Also was für Arten von Code?

Hä? :drunken:

Alles so, wies da steht.

Ja, ich mein, im Sinne von speziellen Methoden die es für sowas gibt, damit ich mir Beschreibungen von sowas durchlesen kann, um den Code zu kapieren, da dieser für mich nicht ganz ersichtlich ist...^^

Unter Methoden versteh ich sowas wie "Explode" un so über Begriffe...

// vll könnte ein Mod das wirklich mal aufteilen ;)

sirius 22. Apr 2007 18:06

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.

Nagetier 25. Apr 2007 22:24

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

sirius 26. Apr 2007 21:11

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.

Nagetier 26. Apr 2007 21:26

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

sirius 27. Apr 2007 09:52

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:
//...
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.}
Soviel zur Funktion "Zeichensetzen". Das Ergebnis wird wie bereits erwähnt auch im Programm angezeigt.
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: rekursiver Algorithmus
In Beitrag #13 hatte ich damals eine PP-Präsentation erstellt. Die Funktion calc heißt dort TTR.

Nagetier 27. Apr 2007 14:12

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 ;)

sirius 27. Apr 2007 14:50

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;

Nagetier 27. Apr 2007 15:04

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 27. Apr 2007 17:54

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.

Nagetier 30. Apr 2007 11:30

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:
Stringgrid.Rows[0] := term2;
einfügen, oder?

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;

sirius 30. Apr 2007 13:44

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 :?

Nagetier 30. Apr 2007 14:29

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^^

sirius 30. Apr 2007 15:07

Re: Welche Methode zum Parsen von chemischen Formeln?
 
Zitat:

Zitat von Nagetier
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...

Ja, aber er list sie nur aus, wenn der Term auch gerade nur das Element betrifft. Ansonsten interessiert er sich nicht für fmol. Zumindest nicht bei diesem Aufruf.

Nagetier 30. Apr 2007 15:24

Re: Welche Methode zum Parsen von chemischen Formeln?
 
Ist es dann überhaupt möglich, dass in einem Stringgrid erscheinen zu lassen?

sirius 30. Apr 2007 15:27

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?

Nagetier 30. Apr 2007 15:30

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...

sirius 30. Apr 2007 15:38

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!

Nagetier 30. Apr 2007 16:14

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...

sirius 1. Mai 2007 19:39

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.

Nagetier 1. Mai 2007 21:58

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