Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 19.10.2013, 01:07 Titel: Termberechnung |
|
|
Ich habe jetzt endlich mal ein Programm zum Parsen und Berechnen von Termen fertiggestellt. Unterstützt werden
- Grundrechenarten: Addition, Subtraktion, Multiplikation, Division (einschließlich Integerdivision), Potenzen, (runde) Klammern; selbstverständlich unter Beachtung der Rechenregeln
- FB-Funktionen: sin, cos, tan, asin, acos, atn (und synonym dazu atan, abs, sgn, sqr, exp, log (und synonym dazu ln), ln, int, cint, fix und frac
- Variablen: Es können Variablen festgelegt werden, die für alle Rechnungen gelten ("global"; e und pi sind bereits vordefiniert), aber auch kurzzeitig ("lokal") nur für eine Rechnung definiert werden.
- Fehlermeldung bei fehlerhaftem Term über eine interne Variable
Beispiele:
Code: | print calc("1+2*(3-4)+sgn(-5)") |
gibt -2 aus.
Code: | print calc("a=1;a+2*(3-a)+sgn(a)") |
legt kurzzeitig die Variable a mit Wert 1 an und gibt 6 aus.
Prinzipiell können mehrere Rechnungen, durch Strichpunkte getrennt, hintereinander ausgeführt werden, allerdings wird immer nur der Wert der letzten Rechnung zurückgegeben.
Code: | calcSetVar("a", 1)
print calc("a+2*(3-a)+sgn(a)") |
dasselbe, nur dass a nun auch für weitere Rechnungen zur Verfügung steht.
Eine Variablenname kann aus Buchstaben a-z bestehen und darf nicht mit einer der Funktionen (wie sin, abs ...) identisch sein. Groß-/Kleinschreibung wird nicht beachtet. Eine "globale" Variable kann auch "lokal" überschrieben werden.
Achtung: Die Gültigkeit einer mit calcSetVar gesetzten Variablen wird nicht überprüft; ungültige Variablenbezeichungen können jedoch nicht wieder abgerufen werden!
Code: | print calc("1+sqr(-1)^2") |
gibt 0 zurück (wegen des Fehlers) und setzt Calculate.CalcError auf den Wert Calculate.ErrorIllegalValue sowie Calculate.CalcErrorTerm auf den Wert "sqr(-1)".
Code: | print calc("a=.5; (a-1)(a+1)") |
gibt 0 und den Fehler Calculate.ErrorWrongDecimalPoint zurück. Calculate.CalcErrorTerm enthält den Wert "-0.51.5". Hintergrund: Die beiden Klammern wurden berechnet und die Ergebnisse direkt hintereinander geschrieben. Für eine korrekte Berechnung hätte ein Malzeichen zwischen die Klammern geschrieben werden müssen. "(a+1)(a-1)" wäre übrigens in "1.5-0.5" übersetzt und dann ohne Fehlermeldung als 1 berechnet worden ...
Download:
http://users.freebasic-portal.de/nemored/downloads/funktionsplotter.zip
Die Termberechnung befindet sich in der calculate.bi; plotter.bas ist ein sehr einfacher Funktionsplotter zur Demonstration der calculate.bi.
Für Anmerkungen, insb. Fehlermeldungen, bin ich sehr dankbar. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Roland Chastain
Anmeldungsdatum: 05.12.2011 Beiträge: 193 Wohnort: Frankreich
|
Verfasst am: 19.10.2013, 04:18 Titel: |
|
|
Sehr schönes Programm ! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1258 Wohnort: Ruhrpott
|
Verfasst am: 19.10.2013, 08:25 Titel: |
|
|
Ein blinkender oder sonstwie sichtbarer Cursor würde die Eingabe angenehmer machen, besonders wenn man sich vertippt hat oder verschiedene leicht abgeänderte Funktionen durchprobieren möchte. Ansonsten schließe ich mich der Beurteilung meines Vorgängers an.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 19.10.2013, 11:48 Titel: |
|
|
Zitat: | Ein blinkender oder sonstwie sichtbarer Cursor würde die Eingabe angenehmer machen |
Da stimme ich dir vollkommen zu; allerdings liegt das an (meiner) Funktion InputUsing. Diese habe ich allgemein für Konsolen- und Grafikfensteranwendung geschrieben. Ich muss mal schauen, wie ich das löse. Vielleicht frage ich einfach über SCREENPTR ab, ob ein Grafikfenster initialisiert ist, und zeichne ggf. den Cursor selbst. Mal sehen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 564 Wohnort: Jüterbog
|
Verfasst am: 19.10.2013, 17:59 Titel: |
|
|
Ich bewundere grad den Parser
meine versuche dahingehend, waren... naja
aus einem 3x intern ein 3*x machen? Also diese verkürzte Faktor-Variable Kombi. Vermutlich gibt es dann aber andere Kollisionen
ansonsten kann ich mich nur den Vorpostern anschließen
Mutton |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 19.10.2013, 18:38 Titel: |
|
|
Interessant wären die Fälle:
Zahlenwert, gefolgt von Buchstabe (Beginn einer Variablen oder Funktion)
Zahlenwert, gefolgt von öffnender Klammer
Buchstabe, gefolgt von öffnender Klammer
schließende Klammer, gefolgt von Zahlenwert / Buchstabe / öffnender Klammer.
"2ab" für "2*a*b" klappt schon mal nicht, da die Variable "ab" heißen könnte.
Was auf keinen Fall funktionieren wird, ist eine Kombination mit Variablen, die mit "e" beginnen, da das "e" als Exponentialzeichen gelesen werden würde. "2*e+1" verkürzt geschrieben als "2e+1" würde dann auch wieder keinen Fehler erzeugen, sondern 20 zurückgeben ...
Eine verkürzte Schreibweise durch Weglassen der Malzeichen fände ich wirklich spitze, ich sehe allerdings leider keine realistische Chance, ohne neue Probleme heraufzubeschwören. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1258 Wohnort: Ruhrpott
|
Verfasst am: 21.10.2013, 09:27 Titel: |
|
|
Hier ein Vorschag für einen Cursor:
Code: | ...
' Eingaberoutine
dim taste as string, such as integer
do
do
taste = InKey
'***** neuer Code *****
If Frac(Timer) > .5 Then 'Blinkfrequenz 1/2 Sekunde
Color 0,15 'schwarze Schrift auf weissem Grund (invers)
EndIf
Locate starty,startx + cursor - 1 'Bildschirmposition des Textcursors
Print Mid$(ausgabe,cursor,1); 'Zeichen an Cursorposition auf aktuelle Farbe setzen
Color 15,0 'normale Farbe
'***** Ende neuer Code *****
sleep 1
loop until len(taste)
... | Sicher noch verbesserungsfähig, aber es funktioniert.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 27.10.2013, 23:53 Titel: |
|
|
Update:
Es gab in der calculate.bi bei zwei Funktionen einen Flüchtigkeitsfehler in der Definitionsmenge, außerdem gibt calc() nun den Wert nan (not a number) zurück, wenn der zu parsende String einen Fehler enthält.
In die Eingabefunktion InputUsing habe ich jetzt mit der Anregung von grindstone einen Cursor eingebaut, mit zwei kleinen Änderungen: Der handgemachte Cursor kommt nur im Grafikfenster zum Einsatz (wichtig, weil die Funktion nicht nur für dieses Programm gedacht ist), und es werden die aktuell eingestellte Vorder- und Hintergrundfarbe verwendet.
Der Plotter wurde ebenfalls aktualisiert und verbindet nun ggf. zwei aufeinanderfolgende Punkte, um bei sehr großen Steigungen einen durchgezogenen Graphen zu erhalten statt Einzelpunkte. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 24.11.2014, 23:33 Titel: |
|
|
Nachdem mein erster Versuch mindestens zwei Designfehler hatte, von denen ich einen nur auf sehr hässliche Art und Weise hätte beseitigen können (Unterscheidung zwischen Vorzeichen und Rechenzeichen); habe ich es noch einmal mit einem etwas anderen Ansatz probiert. Dadurch konnte der Funktionsumfang auch auf Bit-Operatoren ausgeweitet werden. Nach einer intensiven Phase der Fehlersuche (Mann, sind die hartnäckig *heul* ) sollte die Funktion jetzt meines Wissens fehlerfrei funktionieren.
http://www.freebasic-portal.de/projekte/formel-parser-96.html
Für ausführliche Tests und ggf. Fehlermeldungen bin ich natürlich dankbar (auch wenn ich noch dankbarer wäre, wenn es gar keine Fehler mehr gäbe ...)
Da jetzt alles zum Namespace Calculate gehört, läuft der Aufruf ein bisschen anders, aber prinzipiell gleich.
edit: Vielleicht errät jemand, was das Projektbild darstellen soll. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 25.11.2014, 16:23 Titel: |
|
|
Ja, schon ganz in die Richtung - allerdings mit einer anderen Art der Verneinung. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 25.11.2014, 16:24 Titel: |
|
|
gut .. aus der logik vieleicht anders ausgedrückt mit "INV PI" oder "Invers PI"
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 25.11.2014, 19:57 Titel: |
|
|
A PI? _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 25.11.2014, 19:59 Titel: |
|
|
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 25.11.2014, 20:01 Titel: |
|
|
hmmmmmmm .... also, da fände ich ein Dach ala ^ passender als ein - *ggg*
aber gut .. API is schon echt nice
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1258 Wohnort: Ruhrpott
|
Verfasst am: 24.04.2015, 07:42 Titel: |
|
|
@nemored: Aus gegebenem Anlass ( -> Kurvendiskussion) hier ein Verbesserungsvorschlag für deinen Funktionsplotter (plotter.bas): Code: | ...
dim as string term, ret, cterm '*****
dim as double wert, wertAlt
screenres 800, 600
koord
cterm = Command '*****
do
wertAlt = 999
If cterm <> "" Then '*****
term = cterm '*****
cterm = "" '*****
Else '*****
term = inputUsing (2, 2, "Funktionsterm (ESC beendet das Programm): f(x) = ", term, _
"0a+++-+*+/+^+(+)+.c,.x" & chr(27) & "s" & chr(107), ret, 49,, 50)
if ret = chr(27) or ret = chr(255, 107) then exit Do
EndIf '*****
cls
koord
... |
Durch die mit '***** gekennzeichneten Änderungen kann der Plotter von einem anderen Programm aus mit einer Funktion als Parameter aufgerufen werden, die er dann sofort darstellt.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 24.04.2015, 13:27 Titel: |
|
|
Jepp, das klingt nach einer guten Idee. Werde mich da aber erst noch gründlicher hinsetzen müssen, weil es in diesem Zusammenhang sicher auch praktisch wäre, dem Plotter über Parameter die gewünschte Fenstergeometrie mitzugeben (also bestimmte vorgegebene Standardwerte, die dann auf Wunsch in der Befehlszeile an die momentanen Bedürfnisse angepasst werden können). Interessant wäre vielleicht auch wahlweise die Ausgabe in eine Datei statt in ein Gfxlib-Fenster, was dann das aufrufende Programm nach eigenem Belieben verarbeiten kann.
Ich habe den Plotter aber auch schon komplett in eine Funktion ausgelagert; für eine Verwendung in einem FB-Programm empfehle ich die plotter.bi aus den ersten Grundzügen meines Mathetrainers. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1258 Wohnort: Ruhrpott
|
Verfasst am: 25.04.2015, 09:36 Titel: |
|
|
Ich habe gerade deinen Mathetrainer heruntergeladen. Irgendwie sind dir da beim Packen einige Zeilenumbrüche abhanden gekommen...
Das Einbinden der "plotter.bi" ins Programm ist natürlich noch viel besser!
Dazu müsste es jetzt nur noch eine ordentliche Beschreibung geben, ich habe fast eine Stunde gebraucht, um herauszufinden, welche Bedeutung die Parameter haben und warum da (erst mal) nichts auf dem Bildschirm erscheint. Aber jetzt läuft es super!
Noch eine automatische Skalierung und eine Eingabemaske dazu (ich meine jetzt die Kurvendiskussion), und der neue Paukerschreck ist fertig.
Und was die Kommandozeilenparameter betrifft: die plotter.bi hat ja eigentlich schon alles, was man dazu braucht, du mußt nur noch die entsprechenden Schalter für die einzelnen Parameter definieren, dazu noch für die Fenstergröße und einen optionalen Dateinamen (der Imagepuffer ist ja auch schon vorhanden). EDIT: Und eine "help"- Funktion wäre auch nicht schlecht.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Zuletzt bearbeitet von grindstone am 26.04.2015, 09:02, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4676 Wohnort: ~/
|
Verfasst am: 25.04.2015, 11:29 Titel: |
|
|
Zitat: | Dazu müsste es jetzt nur noch eine ordentliche Beschreibung geben, ich habe fast eine Stunde gebraucht, um herauszufinden, welche Bedeutung die Parameter haben und warum da (erst mal) nichts auf dem Bildschirm erscheint. |
Öhm, ja ...
Aber wenn man innerhalb einer Stunde die Funktinsweise erschließen kann, ist es wohl zumindest kein allzu schrecklicher Programmierstil.
Zitat: | Irgendwie sind dir da beim Packen einige Zeilenumbrüche abhanden gekommen... |
Schau ich mir mal an. Ich verwende halt Linux-Zeilenumbrüche, die dann wieder nicht jeder Windows-Editor richtig interpretiert. Ich versuche mich zu bessern (weiß sowieso, dass das nicht klappen wird ...) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1258 Wohnort: Ruhrpott
|
Verfasst am: 26.04.2015, 07:50 Titel: |
|
|
Betroffen sind alle Dateien außer der plotter.bi und der calculate.bi. Sie haben als Zeilenumbruch nur ein LF, damit kommt FbEdit offensichtlich nicht klar. Die Lösung ist ganz einfach: Datei in WordPad (nicht Notepad) laden und im Format "Textdokument" wieder abspeichern.
Es braucht ja kein ausgewachsenes Tutorial zu sein. Ein paar Kommentarzeilen im Quelltext würden schon reichen. Nur daß man weiß, welche Funktion jeder Parameter hat.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|