 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Peaknut
Anmeldungsdatum: 05.06.2013 Beiträge: 2
|
Verfasst am: 05.06.2013, 13:36 Titel: mathematische Funktionen eingeben |
|
|
Hallo,
ich bräuchte im Rahmen eines Programms eine Möglichkeit eine mathematische Funktion eingeben zu können.
Bisher sieht meine Funktion so aus:
FUNCTION fkt (x AS Double) AS DOUBLE
Dim As Double e=Exp(1.0)
RETURN x^2 'Ein beispiel
Ich möchte die Funktion aber nicht immer im Editor umändern sondern dass der Nutzer sie in der Konsole eingeben kann.
Hat jemand eventuell eine Idee? |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 05.06.2013, 16:15 Titel: |
|
|
Hallo und willkommen im Forum!
Das heißt, du möchtest die Verarbeitung des Terms nicht fest in deinem Programm codiert haben, sondern ein beliebiger Term soll zur Laufzeit des Programms eingegeben und ggf. aufgelöst/berechnet werden, richtig?
Dafür müsstest du dir entweder einen eigenen Formelparser schreiben, eine bereits von jemand anders entwickelte "eval"-Funktion benutzen, auf eine Bibliothek zurückgreifen oder versuchen, sowas über Windows-Scripting zu lösen.
Da FreeBASIC Maschinencode erzeugt und zur Laufzeit nicht interpretiert wird (wie z. B. VBScript, php, ...), ist es nicht möglich, dein eigenes Programm zur Laufzeit selbst in seinem Quelltext zu modifizieren.
Im Folgenden ein paar Ansätze:
- Eigener Formelparser: Du zerlegst deine String-Eingabe zunächst in Tokens (-> Lexer) und dann erzeugst du einen Baum (-> Parser), der die Struktur/Verschachtelung deines Ausdrucks widerspiegelt. Den Baum könntest du dann z. B. zu einem LaTeX-Ausdruck weiterverarbeiten oder Stück für Stück ausrechnen. (Viel Arbeit und erfordert viel Knowhow in dem Bereich.) Siehe: Andere Frage im Forum zu einem ähnlichen Problem.
- Fertige Eval-Funktion: Für ähnliche Herausforderungen haben schon andere Programmierer vor dir Programme entwickelt. Siehe zum Beispiel: Lutz Ifers EVAL. Einen solchen fertigen Formelauswerter könntest du um deine individuell benötigten Funktionen erweitern.
- Externe Bibliothek: Es gibt verschiedene Bibliotheken für mathematische oder statistische Berechnungen. Diese könntest du in FreeBASIC einbinden. Nachteile können sein ein hoher Einarbeitungsaufwand, lizenzrechtliche Probleme oder der Umstand, dass du eine externe Lib mit deinem Programm mitliefern musst.
- Windows-Scripting: Du könntest zur Laufzeit deines Programms zunächst ein Script / Script-Stückchen erzeugen (Windows-Scripting), das deinen Formelausdruck enthält und berechnen kann. Dieses lässt du dann von deinem Programm ausführen und wertest dessen Ergebnis aus. Siehe ytwinkys eval. Nachteil: Funktioniert nur unter Windows und setzt aktiviertes Scripting voraus. Dein Programm wäre also nicht ganz selbstständig.
Ich hoffe, die aufgeführten Ideen helfen dir ein Stückchen weiter.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Peaknut
Anmeldungsdatum: 05.06.2013 Beiträge: 2
|
Verfasst am: 06.06.2013, 14:51 Titel: |
|
|
Okay danke dir !
Ich hab ein weiteres Problem (ich weiß nicht ob ich ein neues Thema eröffnen soll oder nicht)
Ich poste mal meinen Code:
Code: | FUNCTION fkt (x AS Double) AS DOUBLE
Dim As Double e=Exp(1.0)
RETURN x^6-5
END FUNCTION
Print "f(x): (5-x^2)*(x+3)"
DIM x as Double,h as Double
INPUT "Geben Sie bitte x0 ein: ", x
INPUT "Geben Sie bitte h ein: ", h
FUNCTION abl (x AS Double, h as Double ) AS DOUBLE
RETURN (fkt(x+h)- fkt(x)) / h
END FUNCTION
FUNCTION newton(x AS Double, h as Double) AS DOUBLE
RETURN x-fkt(x)/abl(x,h)
END FUNCTION
FUNCTION Runde(x As Double) As Double
Dim Wert As integer=100000
Return CInt(x*Wert)/Wert
End FUNCTION
DIM xneu AS DOUBLE, i AS INTEGER= 0,Zaehler AS INTEGER
INPUT "Anzahl Wiederholungen: ", Zaehler
DIM antwort as String
INPUT "Wollen Sie das Newton-Verfahren Schritt für Schritt sehen? (Ja/Nein)" , antwort
Dim As Double StartZeit, EndZeit 'brauchen wir für die Zeitmessung
StartZeit=Timer 'Anfangszeit festhalten
DO
xneu=newton(x,h)
IF Runde(xneu)=Runde(x) THEN EXIT DO
x=xneu
If antwort="Ja" OR antwort="ja" OR antwort="J" THEN Print i,xneu, "f(x)",Runde(fkt(xneu))
i+=1
LOOP UNTIL i=Zaehler
PRINT ""
IF i=Zaehler THEN PRINT "NULLSTELLE NICHT ERMITTELBAR: zu wenig Wiederholungen oder Funktion besitzt keine Nullstelle" ELSE PRINT "Eine moegliche Nullstelle ist bei ca: " , Runde(xneu)
PRINT ""
EndZeit=Timer 'Endzeit stoppen
Print Using"#######.###" ;(EndZeit-Startzeit)*1000;
Print "s gedauert"
PRINT "Beliebige Taste zum Beenden druecken..."
SLEEP |
Ich möchte nun die Dauer messen können, die Freebasic benötigt um die Nullstelle zu finden. Das geht eigentlich ganz gut, wenn ich jedoch Schritt für Schritt anzeigen lassen möchte kommen unmögliche Zeiten heraus !
Wo liegt das Problem? |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 06.06.2013, 16:56 Titel: |
|
|
Die Werte stimmen schon. Nur wenn du mit 1000 multiplizierst (was du ja machst) erhältst du Millisekunden - keine Sekunden. Timer liefert ja schon einen Wert in Sekunden.
Beachte dass die "Berechnung" in diesem Fall so gut wie keine Zeit benötigt und nur dir Ausgabe mit PRINT viel Zeit benötigt. Beachte weiters, dass Timer nicht so genau messen kann und einzelne Millisekunden oft nicht mehr ganz exakt sind. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|