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:

Eingabe einer Funkton

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



Anmeldungsdatum: 04.04.2006
Beiträge: 4

BeitragVerfasst am: 04.04.2006, 16:56    Titel: Eingabe einer Funkton Antworten mit Zitat

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



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 04.04.2006, 17:29    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 04.04.2006, 18:04    Titel: Dazu habe ich mir für die QB-MonsterFAQ Folgendes vorgemerkt Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 04.04.2006, 18:06    Titel: Antworten mit Zitat

Es geht auch Einfach zwinkern.

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kayon



Anmeldungsdatum: 04.04.2006
Beiträge: 4

BeitragVerfasst am: 05.04.2006, 13:27    Titel: Danke Antworten mit Zitat

Vielen Dank für die guten Ideen. Das wird mich auf alle Fälle weiterbringen.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kayon



Anmeldungsdatum: 04.04.2006
Beiträge: 4

BeitragVerfasst am: 08.04.2006, 13:41    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 08.04.2006, 21:27    Titel: Selbstmodifizierender Code Antworten mit Zitat

Hatte dazu früher einmal einen Usenet-Artikel veröffentlicht:

http://groups.google.com/group/comp.lang.basic.misc/msg/caf5586a7e28da5c

War damals noch für den QB-Vorgänger GW-BASIC. Dort klappt das Ganze mit CHAIN meines Wissens wesentlich besser.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 09.04.2006, 09:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kayon



Anmeldungsdatum: 04.04.2006
Beiträge: 4

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

Also wenn ich das recht verstehe stimmt es nicht das man den "RUN"-Befehl ab einer bestimmten Zeile laufen lassen kann? verwundert

Seltsam. Aber gibt es für dieses Problem irgeneine andere Lösung?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 09.04.2006, 17:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OdinX



Anmeldungsdatum: 29.07.2005
Beiträge: 253
Wohnort: SG Schweiz

BeitragVerfasst am: 15.04.2006, 17:12    Titel: Antworten mit Zitat

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? verwundert

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. 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