Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

mathematische Funktionen eingeben

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Peaknut



Anmeldungsdatum: 05.06.2013
Beiträge: 2

BeitragVerfasst am: 05.06.2013, 13:36    Titel: mathematische Funktionen eingeben Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 05.06.2013, 16:15    Titel: Antworten mit Zitat

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Peaknut



Anmeldungsdatum: 05.06.2013
Beiträge: 2

BeitragVerfasst am: 06.06.2013, 14:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 06.06.2013, 16:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 11.06.2013, 08:11    Titel: Re: mathematische Funktionen eingeben Antworten mit Zitat

Peaknut hat Folgendes geschrieben:
Hallo,ich bräuchte im Rahmen eines Programms eine Möglichkeit eine mathematische Funktion eingeben zu können.



Guck dir mal die Skriptsprache Lua an:

http://www.freebasic-portal.de/tutorials/einbindung-der-skriptsprache-lua-102.html

statt luaL_dofile nimmst du einfach luaL_dostring
http://www.lua.org/manual/5.1/manual.html#luaL_dostring
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz