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:

Termberechnung
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 19.10.2013, 01:07    Titel: Termberechnung Antworten mit Zitat

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



Anmeldungsdatum: 05.12.2011
Beiträge: 193
Wohnort: Frankreich

BeitragVerfasst am: 19.10.2013, 04:18    Titel: Antworten mit Zitat

Sehr schönes Programm !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1258
Wohnort: Ruhrpott

BeitragVerfasst am: 19.10.2013, 08:25    Titel: Antworten mit Zitat

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. Daumen rauf!

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 19.10.2013, 11:48    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 26.08.2008
Beiträge: 564
Wohnort: Jüterbog

BeitragVerfasst am: 19.10.2013, 17:59    Titel: Antworten mit Zitat

Ich bewundere grad den Parser lächeln
meine versuche dahingehend, waren... naja grinsen

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 lächeln

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 19.10.2013, 18:38    Titel: Antworten mit Zitat

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. traurig
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1258
Wohnort: Ruhrpott

BeitragVerfasst am: 21.10.2013, 09:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 27.10.2013, 23:53    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 24.11.2014, 23:33    Titel: Antworten mit Zitat

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. grinsen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 25.11.2014, 11:55    Titel: Antworten mit Zitat

NOT PI?


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 25.11.2014, 16:23    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 25.11.2014, 16:24    Titel: Antworten mit Zitat

gut .. aus der logik vieleicht anders ausgedrückt mit "INV PI" oder "Invers PI"


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 25.11.2014, 19:57    Titel: Antworten mit Zitat

A PI? durchgeknallt
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 25.11.2014, 19:59    Titel: Antworten mit Zitat

Daumen rauf! grinsen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 25.11.2014, 20:01    Titel: Antworten mit Zitat

hmmmmmmm .... also, da fände ich ein Dach ala ^ passender als ein - *ggg*

aber gut .. API is schon echt nice grinsen


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1258
Wohnort: Ruhrpott

BeitragVerfasst am: 24.04.2015, 07:42    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 24.04.2015, 13:27    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1258
Wohnort: Ruhrpott

BeitragVerfasst am: 25.04.2015, 09:36    Titel: Antworten mit Zitat

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! lächeln

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! Daumen rauf!

Noch eine automatische Skalierung und eine Eingabemaske dazu (ich meine jetzt die Kurvendiskussion), und der neue Paukerschreck ist fertig. grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4676
Wohnort: ~/

BeitragVerfasst am: 25.04.2015, 11:29    Titel: Antworten mit Zitat

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 ... verlegen
Aber wenn man innerhalb einer Stunde die Funktinsweise erschließen kann, ist es wohl zumindest kein allzu schrecklicher Programmierstil. grinsen

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1258
Wohnort: Ruhrpott

BeitragVerfasst am: 26.04.2015, 07:50    Titel: Antworten mit Zitat

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.

Zitat:
Öhm, ja ...
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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