PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mathematische Funktionen in Computersprache


galaxylight
14.03.2002, 13:51
Hi @ll

also ich habe da mal eine Frage die Delphi betrifft. Mein Lehrer in der Schule sagte, dass das eines der schwersten Dinge sei, die es gibt zu programmieren. Ich weiß nicht ob es tatsächlich so ist, aber meine Frage ist folgende:
Wie kann ich Delphi beibringen, dass man z.B: in ein Edit-Feld eine Funktion (z.B: x^3-e^x+sin(2x) ) eingeben kann und das Programm diese Zeichen dann in die Computersprache umwandeln können, also z.B: aus der eingabe x^3 - x der im Programm deklarierten Variablen x zuzuweisen und es dann hoch 3 nehmen usw.. Ich hoffe ich drücke mich gut aus, so dass man mich versteht.
Mein Zeil ist es, ein Programm zu entwickeln, welches aus der eingabe einer beliebigen Funktion z.B. die Stammfunktion oder die Ableitung soweit es vorhanden ist zu berechen, desweiteren auch Integrale usw.

Ich hoffe ihr habt meine Frage verstanden :D

Ciao @ll



PS: ich bin kein Programmierprofi :rolleyes:


xOOn
14.03.2002, 15:15
Mein Lehrer in der Schule sagte, dass das eines der schwersten Dinge sei, die es gibt zu programmieren.


frag ihn mal ob es einfacher ist KI zu coden oder solch ein ding!!! und wenn er glaubt dass KI einfacher ist dann kann er ja mal THE MATRIX coden, ich spiel dann neo


also nein es ist wirklich ziemlich komplex sowas zu programmierer! als 1. brauchst du ein teil, welches die eingabe interpretieren kann ( ?( wie heiss das teil doch gleich: parser glaub ich). und dann musst du die dinge ausfuehren, welcher der parser herausgefunden hat.

also klammern, beachte * vor +, ....

also ich weiss nicht wie gut du coden kannst und das mit den integralen einem prog beizubringen dazu muss man schon ziemlich coden koennen.

PS es gibt typen die sagen sie seinen keine profis uns koennen 10x mehr als typen die sagen sie seinen profis!!

xOOn ist ein profi :mauer: :mauer: :mauer: :mauer:

galaxylight
14.03.2002, 15:32
hm ja das denke ich mir, dass man da ziemlich was können muss..
Du sagtest, so ein Ding welches Parser heißt. Naja ich habe eigentlich keine Ahnung was das für ein "Ding" sein soll ;-) Wo bekommt man denn das her oder wie ist das mit dem. Mein Lehrer hat das auch schon angesprochen mit dem Parser, hat aber nichts weiteres gesagt. Ich glaube nicht unbedingt, dass es mit "schwestes" meinte, das schwerste im Programmieren allgemein, sondern bezogen auf dieses spezifische Thema.

Danke mal für deinen Beitrag :)

TenShoe
14.03.2002, 21:35
Hi!
Ganz genau sowas wollte ich vor ein paar Jahren auch schon mal realisieren.
Bin bei dem Versuch aber kläglichst gescheitert.
Das Problem ist, dass man erst im Laufe der Zeit merkt, worauf man alles achten muss.
Und bei komplexeren Funktionen sind das wirklich unendlich viele Dinge.
:(

galaxylight
15.03.2002, 07:48
ojemine, na dann sollte ich mich mal mit kleineren Dingen beschäftigen ;) wird wohl ziemlich kompliziert sein so wie ich dass dann so sehe. Aber ok ein Versuch war es mal wert und danke für deinen Beitrag!

Ciao

Patrik Graf
15.03.2002, 08:22
Oh je...

Galaxylight, da hast du dir was rausgesucht... :D

Also, einen Parser zu coden ist wirklich nicht so einfach, das ist so ähnlich wie einen Interpreter zu coden oder einen Compiler. Nur mit dem kleinen Unterschied, das der Parser für mathematische Funktionen um einiges einfacher zu coden ist... :]

Naja, ich kann dir ja mal einen Denkanstoß geben wie du anfangen könntest:


function InterpretiereString(sFuncStr: String): Integer;
Var Help: Integer;
//Hier kannst du ja noch mehr Vars deklarieren

function Plus(Zahlen: Array of Integer): Integer;
Var i, Help: Integer;
begin
For i := 0 To High(Zahlen) do Help := Help + Zahlen[i];
Result := Help;
end;

function Minus(Zahlen: Array of Integer): Integer;
Var i, Help: Integer;
begin
For i := 0 To High(Zahlen) do Help := Help - Zahlen[i];
Result := Help;
end;
//Und so weiter... Was du halt so brauchst
begin
If Pos(´+´,sFuncStr) > 0 Then begin
//Rausfinden was addiert werden soll und dann Funktion
//Plus aufrufen "Help := Plus([Zahl1,Zahl2,Zahl3,...]);"
end;
If Pos(´-´,sFuncStr) > 0 Then begin
//Hier das selbe wie mit Plus...
end;
//Natürlich solltest du die Mathematischen Dinge genaustens beachten :)
end;


Ich hoffe das hat dir weitergeholfen :D

xOOn
15.03.2002, 08:32
naja ich hab sowas mal fuer +-*/ realisiert ist gar nciht mal so schwer! solange man nur wenige operatoren und keine klammern hat! und das ganze bei integralen wuerd ich mir nicht antun weil das endet mit :mauer:

nicht zu vergessen ein parser muss auch erkennen koennen dass eine routine keinen sinn ergibt (zumindest bei reelen zahlen)

1++2+3 ist einfach aber das prob beginnt bei
111 / (1 - 1)
sqrt (-1)

naja und bei ableitungen ist es noch krasser, weil da muss man selbst meist erstmal rumkopfen bis man sieht welche regeln man anwenden muss, und naja die den pc entscheiden zu lassen ????

Patrik Graf
15.03.2002, 13:04
@xOOn:

galaxylight hat bei mir coden gelernt :D, also hat er das drauf :))

Der packt das schon 8)

@galaxylight:

wenn du nicht mehr weiter kommst und so -> ?( aussiehst, ruf mich an. Kennst ja meine Nummer :D

galaxylight
15.03.2002, 15:02
;) ;) hoi Grafitty

joa hast recht, bei Dir hab ich alles wesentliche gelernt und bin Dir auch dankbar dafür! Und danke auch für deinen Codinghilfe hier oben. Ich habe es mir angekuckt und ich begreife das prinziep schon. Ob ich es tatsächlich versuche, muss ich mir mal überlegen ;)

bis denne

ciao

Diogenes
15.03.2002, 15:10
Ich hab´s einmal probiert und bin nicht gescheitert. Ich hab´ das ganze dann leider unwiederbringlich verloren.

Ein Versprechen: Ich werd´ mich hinknozen und meinen Parser wieder-coden: als BPW-unit.

nexus
16.03.2002, 01:31
Also wenn man sich auf ganzrationale Funktionen beschränkt, ist das ganze nicht so schwierig.
Hab sowas mal in Java gecodet, geht aber auch gut mit Delphi.
Den Parser habe ich damals aber übergangen, indem ich erst abgefragt habe, welchen Grad die Gleichung hat und danach habe ich die Koeffizienten einzeln eingelesen.

galaxylight
16.03.2002, 08:21
ja das stimmt nexus, ganzrationale Funktionen sind leichter zu programmieren, sogar ohne nen parser. Das habe ich auch noch hinbekommen vor kurzem, aber es ist langweilich sich nur auf ganzrationale zu konzentrieren und keine e oder sinus finktion einbauen zu können 8)

ciao mal

Diogenes
17.03.2002, 14:05
Mein Parser geht mit allem.

Er basiert auf der Erkenntnis, daß jeder Ausdruck aus einer Folge von Teilen besteht, die ich Werte und Operatoren nenne.

Ein Wert kann sein:
eine Konstante. Das ist ein vordefineierter Wert, der fix mit einem Bezeichner verbunden ist.
eine Funktion. Ihr folgt direkt wiederum ein Wert. Mein Parser repräsentiert mit einer Funktion Code, der 1 Real-Parameter hat und 1 Real zurückgibt.
ein Parameter. Das ist ein Zeiger auf eine Real-Variable, der durch einen Bezeichner repräsentiert wird.
die Laufvariable X. Das kommt daher, daß der Parser spezifisch für´s Berechen 1-parametriger Funktionnen (x -> f(x) ) gedacht ist.
ein Teilausdruck, eingeleitet mit einem KlammerAuf-Zeichen. Sein Ende-Kennzeichen ist das KlammerZu-Zeichen.
Ein Ausdruck besteht aus mindestens einmal der Folge <Wert><Operator>, wobei der allerletzte Operator das ZeilenEnde ist. Dadurch ist einfache Iterpretation möglich.

Operatoren sind
Gewöhnliche Operatoren: + - * / ^(Potenz) etc.
Ende-Kennzeichen: Das Zeilenende oder das KlammerZu-Zeichen
Ist der Wert ein KlammerAuf (, wird ein Ausdruck verschachtelt ausgewertet, dessen EK (Ende-Kennzeichen) ein ) ist. Ist der Wert eine Funktion, wird einfach (rekursiv) noch ein Wert geholt und die Funktion nachgestellt. Das kann ein Klammer-Ausdruck sein, muß es aber nicht.

Operatoren kommen auf einen Stack, wenn ihre Priorität höher als der des letzten ist.

Das 2. ist Regisitrierung der Bezeichner durch das
Das ist das 1. Grundprinzip meines Parsers.
verwendende Programm: Flexibilität nahezu ohne Ende.

Das 3. ist, daß er den Ausdruck in einen nachher zu evaluierenden P-Code compiliert.

Felix Kaiser
17.03.2002, 14:15
Hmm, nen Lehrer von mir hat sowas u.a. in sein &acute;Matheprogramm&acute; reingebaut, mit VB hat der des Teil aber gemacht. http://www.funktion-online.de/

Mir war aber noch nich sooo langweilig um so nen Parser zu coden :D

Diogenes
17.03.2002, 14:32
Da war mich auch nicht fad. Ich wollt nur ein Progrämmchen für Kurvendiskussion basteln und für einen Rollenspiel-Charakter-Generator Würfelvorschriften machen.

nj0y
18.03.2002, 13:58
Ich hab mal sowas programmiert, als ich nen Compiler für ne eigene Programmiersprache geschrieben habe. Das war noch zu DOS-Zeiten. Das Prinzip war so, daß ich den Ausdruck in die von Diogenes genannte Teile aufgeteilt habe (Operatoren, Konstanten usw.) und dann einfach so den Ausdruck analysiert habe, wie man es als Mensch auch tun würde: Innerste Klammer suchen, auswerten, Ergebnis anstelle der innersten Klammer ersetzen und dann weiterrechnen, dann halt weiter mit Potenzen, Punktrechnung, Strichrechnung usw. ... hat wunderbar funktioniert für Ganzzahlen, Fließkommazahlen und Strings (letztere mit eingeschränkten Operatoren, ich glaub nur + und - waren möglich, wobei - eine Ganzzahl die letzten paar Zeichen abgeschnitten hat).

Patrik Graf
21.03.2002, 19:40
So...

Ich hab für galaxylight einen kleinen Parser gecoded. Das Ding kann ^,+,-,*,/,sin,cos und tan. War ein Arbeitsaufwand von ca. 3-4 Stunden. Hab noch ein paar kleine Bugs dringelassen, damit er sich damit beschäftigen muß :D . Aber es sind wirklich nur kleine Bugs, nicht das das bei ihm mit :mauer: ended...

Also :D, wer ihn noch haben möchte, einfach eine kleine eMail an mich.

galaxylight
22.03.2002, 07:00
*handheb* ja ich möcht ihn dann ;);););):D

danke dafür, mal sehen wie er aussieht und ob du es nicht zu schwer gemacht hast *g*

bis denne dann :rolleyes:

galaxylight
22.03.2002, 07:01
*handheb* ja ich möcht ihn dann ;);););):D

danke dafür, mal sehen wie er aussieht und ob du es nicht zu schwer gemacht hast *g*

bis denne dann :rolleyes:

Patrik Graf
22.03.2002, 08:55
Hmmm...

Dann solltest du mal deine eMails abrufen, den ich hab dir den schon vor 2 Tagen geschickt :D

Diogenes
31.03.2002, 17:58
... und wird auch nicht gebrochen!

Mein Parser ist fertig. Er ist allerdings eine Pascal unit.

Wer will?
Wie kann ich schicken?

Patrik Graf
18.09.2002, 11:13
Hmmm... heute wollte ich meinen Parser nochmal anschauen... jedoch viel mir dann auf, das er garnicht mehr auf meiner Festplatte ist... :confused:

Ich kann mich noch daran erinnern, das ich ihn Agent geschickt habe...

Agent, bitte schick ihn mir mal per eMail oder lass ihn hier als Anhang rumhängen... :D Thanx.

Manu
18.09.2002, 13:29
Puh, du verlangst Sachen.. ;)
Wie hieß die Datei? ich weiß auch nciht mehr genau, ob ich den noch hab.. *such*

Cya