 |
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 |
Kayon
Anmeldungsdatum: 04.04.2006 Beiträge: 4
|
Verfasst am: 04.04.2006, 16:56 Titel: Eingabe einer Funkton |
|
|
Hallo,
mich beschäftigt folgendes Problem: Ich suche eine Möglichkeit eine beliebige Funktion, z.bsp. ln(2x^2-4x) über den "INPUT" einzugeben um sie anschließend weiter zu verarbeiten(z.bsp den Graphen ausgeben)
Behelfsweise habe ich schon versucht mithilfe von "CASE" die Eingabe von Funktionen über die Standardform (ich mein ax^2+bx+c) zu ermöglichen. Bis zu einem gewissen Grad ist das zwar möglich jedoch ist das ziemlich aufwendig und unflexibel. |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 04.04.2006, 17:29 Titel: |
|
|
Da hast du dir auch ein nicht so leichtes Thema ausgesucht.
Du musst nämlich diese Eingabe mit der Funktion parsen und aufteilen.
Du musst also gut mit Stringoperationen umgehen können, um die einzelnen Werte und Operationen herauszufiltern und wenn du nicht mit Standardformeln rechnen willst, musst du zusätzlich die mathematischen Regeln und Besonderheiten beachten. _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 04.04.2006, 18:04 Titel: Dazu habe ich mir für die QB-MonsterFAQ Folgendes vorgemerkt |
|
|
Dazu habe ich mir für die QB-MonsterFAQ Folgendes vorgemerkt
Frage deutsch
~~~~~~~~~~~~~~
Wie berechne ich das Ergebnis eines Formelausdrucks, der als Textstring eingegeben wird?
Wie berechne ich einen als String vorliegenden Formelausdruck?
Question English
~~~~~~~~~~~~~~
How to calculate the result of a mathematical expression which has been entered as a text string?
Antwort
~~~~~~~~
[ von Thomas Antoni und Olaf Deters, 12.06.2002 - 27.1.2004 ]
Hierzu benötigst Du einen sogenannten "Formula Solver" oder "Formula Parser" , der den Text in Zahlen und mathematischen Operatoren zerlegt, die entsprechende Berechnung durchführt und das Ergebnis bereitstellt.
Beim Programmieren des einfachen Taschenrechners für die MonsterFAQ ist mir (Thomas Antoni) die folgende Idee gekommen: Mann müsste doch den Eingabestring für eine beliebige Formel. z.B.
"(25^3) * sin(0.45)"
per Programm als QB-Quellsprache in eine externe BAS-Datei schreiben und diese dann per CHAIN aufrufen, abarbeiten und das Ergebnis anzeigen lassen können.
Beim obigen Beispiel würden die für die Eingabe der Formal und die Anzeige des Ergebnisses zuständigen Befehle ganz einfach so lauten:
Code: |
INPUT "y = "; Formel$ 'Formel eingeben
PRINT "y = "; (25^3) * sin(0.45) 'Formel berechnen und anzeigen
|
Der letztere Befehl würde in die externe Datei geschrieben werden. Dann hätte man auf einfachste Art einen sehr leistungsfähigen wissenschaftlichen Taschenrechner realisiert.
Eine Schwierigkeit liegt darin, dass die meisten Anwender Winkel wohl im Gradmaß und nicht in dem bei QBasic üblichen Bogenmaß eingeben möchten.
Dazu kann man im Formelstring ein "zahl°" durch "(Zahl * 6.28/360)" ersetzen.
Das folgende Programm von Olaf Deters und mir setzt diese Idee programmtechnisch in QBasic um:
Code: |
'*****************************************************************
' FORMEL.BAS = Formel-Loeser in QBasic
' ==========
' ACHTUNG: Dieses Programm muss im Verzeichnis "C:\TEMP\" stehen.
' Bei einem anderen Verzeichnis muss man die Pfadvorgabe
' in der 2. Befehlszeile anpassen!
'
' FORMEL.BAS ist quasi ein wissenschaftlicher Taschenrechner.
' Es nimmt vom Anwender einen beliebigen Formelausdruck entgegen,
' berechnet dessen Ergebnis und zeigt es an.
'
' Der Formelausdruck muss der QBasic-Syntax entsprechen, mit einer
' Ausnahme: Die Eingabe von Winkeln kann auch in Grad statt im
' Bogenmass erfolgen. Dazu muss der Anwender hinter dem Winkel ein
' Gradzeichen "ø" eingeben.
'
' Das Programm funktioniert nur als BAS-Datei und nicht als
' kompilierte EXE-Datei. Programmtechnisch ist das ganze so
' realisiert, dass das Programm den Formelstring in eine zweite
' externe BAS-Datei "Test.bas" schreibt. Ansschliessend wird
' die Kontrolle per CHAIN an Test.bas uebergeben. Test.bas
' berechnet die Formel, zeigt sie an und springt wiederum per
' CHAIN zurueck zum Beginn des Hauptprogramms.
'
' Der vom Windows-ANSI-Code abweichende DOS-ASCII-Zeichencode fuer
' das Grad-Symbol ist zu beachten.(ANSI: "°", ASCII: "ø")
'
' (c) Olaf Deters u. Thomas Antoni, 26.1.2004 - 27.1.2004
'*****************************************************************
DECLARE FUNCTION Ersetze$ (F$)
COLOR 0, 7 'Schwarze Schrift auf hellgrauem Grund
WIDTH 80, 50 'VGA-Aufloesung mit 80 Spalten und 50 Zeilen
CLS
'
'---- Bedienungshinweise anzeigen -------------------------
'
PRINT
PRINT " ------======== F O R M E L - L O E S E R =======--------"
PRINT
PRINT " ________________Unterstuetzte Funktionen________________"
PRINT " a + b ..... Addition"
PRINT " a - b ..... Subtraktion"
PRINT " a * b ..... Multiplikation"
PRINT " a / b ..... Division"
PRINT " sqr(a) .... Quadratwurzel von a"
PRINT " a^b ....... Exponentialfunktion a hoch b"
PRINT " a^(1/b) ... allgemeine Wurzelfunktion b-te Wurzel aus a"
PRINT " log(a) .... Natuerlicher Logarithmus von a (zur Basis e)"
PRINT " sin(a) .... Sinus (a im Bogenmass)"
PRINT " cos(x) .... Cosinus (a im Bogenmass)"
PRINT " tan(a) .... Tangens (a im Bogenmass)"
PRINT " atn(x) .... Arcus Tangens (Winkel im Bogenmass)"
PRINT " aø ........ Winkel im Gradmass"
PRINT " hex$(a) ... Dezimal/Hexadezimal-Wandlung fuer a"
PRINT " val("; CHR$(34); "&ha"; CHR$(34); ")";
PRINT " Hexadezimal/Dezimalwandlung fuer a"
PRINT " MOD ....... Modulo-Division (liefert d.ganzzahligen Rest)"
PRINT " ========================================================="
PRINT " Beispielformel : (log(sin(30ø))^2 + 1.4"
PRINT " ========================================================="
'
'---- Formel eingeben -------------------------------------
PRINT
PRINT
PRINT "Gib die gewuenschte Formel ein: "
PRINT
INPUT "y = ", F$
F1$ = Ersetze$(F$) 'Winkelangaben mit Gradzeichen ins Bogenmass
'umrechnen
'
'---- Formel in Datei Test.bas schreiben ------------------
'Es wird der folgende Quellcode geschrieben:
' PRINT "y = "; Fa$
' PRINT
' PRINT "[belieb.Taste]=Wiederholen";
' PRINT ".....[Esc]=Beenden"
' t$ = INPUT$(1)
' IF t$ = CHR$(27) THEN END
' CHAIN "c:\temp\formel.bas"
'Ausrufezeichen muessen als CHR$(34) geschrieben werden
'
OPEN "c:\temp\Test.bas" FOR OUTPUT AS #1
PRINT #1, "PRINT "; CHR$(34); "y = "; CHR$(34); ";"; F1$
PRINT #1, "PRINT"
PRINT #1, "PRINT "; CHR$(34); "[belieb.Taste]=Wiederholen"; CHR$(34); ";"
PRINT #1, "PRINT "; CHR$(34); ".....[Esc]=Beenden"; CHR$(34)
PRINT #1, "t$=input$(1)" ' Warten auf beliebige Taste
PRINT #1, "IF t$ = CHR$(27) THEN END"
PRINT #1, "CHAIN "; CHR$(34); "c:\temp\formel.bas"; CHR$(34)
'Ruecksprung zum Hauptmodul
CLOSE #1
'
'----- Test.bas aufrufen ----------------------------------
CHAIN "c:\temp\test.bas"
'
FUNCTION Ersetze$ (F$)
'----- Umrechnung Grad- in Bogenmass ----------------------
'----- ("Zahlø") -> ("Zahl * 2 * Pi / 360")
'Es wird im Formelstring nach einem Gradzeichen "ø" gesucht.
'Steht davor eine Zahl, so wird das Gradzeichen durch
'den Teilstring "* 3.1415962# / 180" ersetzt.
FOR X = 1 TO LEN(F$)
IF MID$(F$, X, 1) = "ø" THEN
Y = X
DO UNTIL MID$(F$, Y, 1) = "(" OR MID$(F$, Y, 1) = ")": Y = Y - 1
LOOP
L$ = LEFT$(F$, Y)
SELECT CASE VAL(MID$(F$, Y + 1, X - Y - 1))
CASE IS <> 0
M$ = STR$(VAL(MID$(F$, Y + 1, X - Y - 1)) * 3.1415962# / 180)
CASE IS = 0
M$ = " * 3.1415962# / 180"
END SELECT
R$ = RIGHT$(F$, LEN(F$) - X)
F$ = L$ + M$ + R$
F$ = Ersetze(F$)
END IF
NEXT X
Ersetze$ = F$
END FUNCTION
|
((FORMEL.BAS bereits in progs/neu/ ))
Dieses Programm könnte man natürlich noch beliebig verbessern. Sinnvoll wäre es z.B., alle auftretenden Fehler mit ON ERROR GOTO abzufangen. Dann werden sämtliche Fehler wie nicht geschlossene Klammern, Division durch Null und die Verwendung fascher Schlüsselwörter abgefangen, und das Programm könnte dann eine ausagekräftige Fehlermeldung mit Neueingabemöglichkeit realisieren statt sich sang- und klanglos zu beenden.
*** Weitere Formula Solvers
Ein guter Formular Solver stammt von Quinn Tyler Jackson . Diesem Programm speist man eine mathematische Formel als Zeichenkette ein (z.B. "12 + 34^3") ein. Das Ergebnis wird dann - ebenfalls als Zeichenkette ausgespuckt (z.B. "39361") . Hiermit kannst Du bequem z.B. einen wissenschaftlichen Taschenrechner aufbauen.
Der Formula Solver von Quinn Tyler Jackson steht unter Formula.zip auf http://www.qbasic.de in der Rubrik "QBasic -> Download -> Mathe" zum Herunterladen bereit. _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 04.04.2006, 18:06 Titel: |
|
|
Es geht auch Einfach .
Du kannst die Formel in eine Datei speichern mit Namen "temp.bas"
Dann kannst du das ding mit run aufrufen.
Das war Abstrakt, nun konkrett:
Code: | OPEN "temp.bas" FOR OUTPUT AS #1
INPUT "y=", formel$
PRINT #1, "For x=0 to 10"
PRINT #1, " y=" + formel$
PRINT #1, " Print y"
PRINT #1, "next x"
PRINT #1, "End"
CLOSE 1
RUN "temp.bas"
KILL "temp.bas" |
Wobei man das mit CHAIN oder weiteren RUN Befehlen weiter abstimmen kann.
Des weiteren kann man das "Grundgerüst" für die Formel Auswertung (z.B. die Graphen Anzeige) auch in einer Datei lagern und dann diese mit der Formel verknüpfen.
Viel Spass beim Tüfteln.
Edit:/
Thomas war schneller. |
|
Nach oben |
|
 |
Kayon
Anmeldungsdatum: 04.04.2006 Beiträge: 4
|
Verfasst am: 05.04.2006, 13:27 Titel: Danke |
|
|
Vielen Dank für die guten Ideen. Das wird mich auf alle Fälle weiterbringen.
mfg |
|
Nach oben |
|
 |
Kayon
Anmeldungsdatum: 04.04.2006 Beiträge: 4
|
Verfasst am: 08.04.2006, 13:41 Titel: |
|
|
Eine kleine Frage zu den "RUN" Befehl:
In der qb.exe-Hilfe steht das man auch genau angeben kann ab welcher Zeile die *.bas Datei gestartet werden soll, bzw. an einer Marke beginnt.
Ich hab schon alles mögliche versucht entsprechend der dort angegebenen Syntax diesen Befehl so zu verwenden. Aber bis jetzt hat nichts funtioniert.
Oder gibt es eine andere Möglichkeit, von einem anderen Programm, zu einer beleibigen Stelle im Code zurückzukehren? |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 09.04.2006, 09:23 Titel: |
|
|
QBasic1.1 hat Folgendes geschrieben: | Läßt das aktuelle Programm oder ein angegebenes Programm ablaufen.
RUN [{Zeilennummer | Datei$}]
■ Zeilennummer Die Zeilennummer des aktuellen Programms, an der
die Ausführung beginnen soll. Wenn keine Zeilennummer
angegeben wird, beginnt die Ausführung in der ersten
ausführbaren Zeile.
■ Datei$ Der Name der BASIC Quelldatei. QBASIC nimmt an, daß
der Dateiname die Erweiterung .BAS besitzt.
■ RUN schließt alle Dateien und löscht den Programmspeicher vor dem
Laden eines Programms. Verwenden Sie die Anweisung CHAIN, um ein
Programm ohne das Schließen der offenen Dateien zu starten.
Beispiel:
'Es wird angenommen, daß sich das Programm TEST.BAS im Verzeichnis
' \DOS befindet.
RUN "C:\DOS\TEST.BAS" |
QB4.5 hat Folgendes geschrieben: | RUN - a control flow statement that restarts the program currently in
memory, or executes a specified program
Syntax
RUN [{linenumber | filespec}]
■ If the argument is omitted, execution begins at the first executable
statement in the main module of the currently loaded program
■ linenumber explicitly identifies a line where execution of the main
module begins
■ filespec, a string expression, specifies a file to load into memory
and run
See Also ◄CHAIN► |
Wobei:
http://www.it-faq.pl/mskb/48/398.HTM
Zitat: | The RUN <linenumber> option is incorrectly documented on Page 317 of the "Microsoft QuickBasic 4.5: Basic Language Reference" manual for version 4.50 and on Page 303 of the "Microsoft Basic 7.0: Language Reference" manual for Basic PDS versions 7.00 and 7.10. These pages give the following incorrect statements:
Therefore, a RUN statement in a SUB or FUNCTION procedure must point to labels at module level. If no line label is given, execution always starts with the first executable line of the main module. |
Ich versteh nur noch Banhof ...
Das hier geht:
Code: | 10 PRINT "10"
20 PRINT "20"
30 RUN 50
40 PRINT "40"
50 PRINT "50"
60 PRINT "60" |
Wobei ich offengesagt den Sinn nicht erkenne .... |
|
Nach oben |
|
 |
Kayon
Anmeldungsdatum: 04.04.2006 Beiträge: 4
|
Verfasst am: 09.04.2006, 16:56 Titel: |
|
|
Also wenn ich das recht verstehe stimmt es nicht das man den "RUN"-Befehl ab einer bestimmten Zeile laufen lassen kann?
Seltsam. Aber gibt es für dieses Problem irgeneine andere Lösung? |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 09.04.2006, 17:06 Titel: |
|
|
Zitat: | Oder gibt es eine andere Möglichkeit, von einem anderen Programm, zu einer beleibigen Stelle im Code zurückzukehren? |
Hier würde sich CHAIN anbitten.
Mit COMMON deklarist du ein Variabel Namens Marke$.
Vor der Übergabe schreibst du in Marke$ das Label.
Wenn das andere Programm nun die kontrolle übernimmt, machst du eine Weiche, in etwa so:
Code: | IF marke$="start" then
goto start
Elseif marke$="ausgabe" then
goto ausgabe
Elseif marke$="test" then
goto test
End if |
Oder
Code: | Select Case marke$
case "start"
goto start
Case "ausgabe"
goto ausgabe
Case "test"
goto test
End select
|
Wenn man oben noch ein
Code: | marke$=lcase$(marke$) |
macht, spielt die gross und klein Schreibung weniger eine Rolle. |
|
Nach oben |
|
 |
OdinX

Anmeldungsdatum: 29.07.2005 Beiträge: 253 Wohnort: SG Schweiz
|
Verfasst am: 15.04.2006, 17:12 Titel: |
|
|
Kayon hat Folgendes geschrieben: | Also wenn ich das recht verstehe stimmt es nicht das man den "RUN"-Befehl ab einer bestimmten Zeile laufen lassen kann?
Seltsam. Aber gibt es für dieses Problem irgeneine andere Lösung? |
also wenn man die zeile als parameter ans programm weitergibt könnte dieses das auswerten. wär vieleicht ne idee. |
|
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.
|
|