 |
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 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 15.03.2005, 18:57 Titel: Einfacher, komplizierter Gleichungsrechner |
|
|
Mir kam letztens eine simple Idee, die in der Tat mehr als primitiv ist, die aber schwer oder fast gar nicht zu realsieren ist.
Ich wollte einen linearen Gleichungsrechner errichten. Das Prinzip, wie ich herangehen wollte ist höchst einfach, ich nutze einfach die hohe Rechengeschwindigkeit des PCs:
Beispielaufgabe:
X + 9 = 24 (X = 15)
Also müsste das Programm etwa so aussehen:
10 LINKS = X + 9
20 RECHTS = 24
30 X# = 0
41 Do Until X#=10000
42 If LINKS = RECHTS Then Goto 10
43 LINKS = X + 9
44 RECHTS = 24
45 X# = X# + 0.00
46 Loop
50 Print "Linke Seite: "; LINKS
60 Print "Rechte Seite: "; RECHTS
70 Print "X=";X#
So ist das System. In der Form funktioniert das auch, bloß müsste in diesem Falle der Benutzer die Zeichenkette X + 9 selbst eingeben (im Editor). Denn würde ich folgendes machen:
Input "Linke Seite", LINKS, dann rechnet das Programm sofort einen Wert aus.
Beispiel: Ich gebe jetzt X + 9 ein, es sei jetzt X standartgemäß 0 und daraus würde sich ergeben, dass LINKS 9 wäre. LINKS soll aber weiterhin den Term X + 9 beinhalten, denn mit diesem Term wird ja gerechnet.
Jetzt könnte ich das auch so lösen: Input "Linke Seite", LINKS$
Anschließend könnte ich den String$ mit VAL in eine Zahl umwandeln, dabei wird der Term aber auch nicht beibehalten, auch hier kommt nur eine Zahl heraus (wenn überhaupt).
Hat jemand eine Idee, wie man diesen Konflikt umgehen kann? Ich finde es blöd, wenn ich meine Gleichungen statt in einer Programmeingabe im nackten Editor eingeben muss, nur weil es anders nicht geht.  |
|
Nach oben |
|
 |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 15.03.2005, 19:55 Titel: |
|
|
vielleicht hilft dir ja dieser link http://forum.qbasicnews.com/viewtopic.php?t=8614. du findest dort zwei math expression parser, beide in freebasic geschrieben. bis auf ein paar underlines in variablen namen sollte das dingens aber auch ohne probleme in qbasic/vbdos/pds laufen.
zu deinem problem hier ein möglicher lösungsansatz.
du hast zwei strings die der benutzer eingibt. der erste ist die linke seite, der zweite dir rechte
line input "linke seite:", leftterm
line input "rechte seite:", rightterm
des weiteren wirst du ws. einen string einlesen lassen der die variablen definiert. z.B. x = 15
line input "variable definitionen::", vardefs
als erstes parsed du den vardefs string und speicherst welcher bezeichner ( x z.B.) welchen wert besitzt. z.B. in einen type wie folgt
type variable
name as string * 200
value as double
end typ
jedes mal wenn du also in vardefs eine definition der form <variablenname> = <variablenwert> findest erzeugst du eine variable vom typen variable (d'oh) und speicherst den gefundenen Wert und den namen in der struktur ab.
als nächstes nimmst du den leftside string und ersetzt jedes vorkommen eins variablen namens mit dem wert den du in vardefs gefunden hast. das selbe für den rightside string. die strings enthalten jetzt nur noch zahlen und operatoren.
alles was du jetzt noch tun mußt ist beide strings durch einen der oben im link beschriebenen parser zu jagen und die werte zu vergleichen.
vielleicht hilft dir das ja _________________ Yagl - yet another gameprogramming library |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 15.03.2005, 19:58 Titel: |
|
|
Das Problem hatte ich auch mal.
Lass den User die Gleichung eingeben, und speicheren sie dann als .BAS
Datei ab. In sie schreibst du die Berechnung, und lässt das Programm das
Ergebnis abspeichern.
Bsp: [KEINE GARANTIE!!]
Code: |
REM MAIN.BAS
CLS
LINE INPUT "Linker Teil der Gleichung 1: "; Gleichung1l$
LINE INPUT "Linker Teil der Gleichung 2: "; Gleichung2l$
LINE INPUT "Rechter Teil der Gleichung 1: "; Gleichung1r$
LINE INPUT "Rechter Teil der Gleichung 2: "; Gleichung2r$
OPEN "MATH.BAS" FOR OUTPUT AS #1
PRINT #1, "REM MATH.BAS"
PRINT#1, "DIM a, b, c, d, xx AS INTEGER"
PRINT #1, " xx = 1 : REM Startwert"
PRINT #1, "DO"
PRINT #1, "a = "; Gleichung1l$
PRINT #1, "b = "; Gleichung1r$
PRINT #1, "c = "; Gleichung2l$
PRINT #1, "d = "; Gleichung2r$
PRINT #1, "xx = xx + 1"
PRINT #1, "LOOP UNTIL (a = b) AND (c = d)"
PRINT #1, ""
PRINT #1, "OPEN " + CHR$(34) + "LOES.DAT" + CHR$(34) + " FOR OUTPUT AS #1
PRINT #1, "PRINT #1, xx"
PRINT #1, "CLOSE #1"
PRINT #1, "RUN MAIN.BAS"
CLOSE #1
RUN "MATH.BAS"
OPEN "LOES.DAT" FOR INPUT AS #1
INPUT #1, Loesung
CLOSE #1
PRINT
PRINT " Lösung --> "; Loesung
PRINT
END
|
Müsste eigentlich klappen.
Den Startwert in Zeile 3 von MATH.BAS müsste man ggf. noch anpassen.
EDIT: Manno, da wal wieder jemand schneller als ich....
jb |
|
Nach oben |
|
 |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 15.03.2005, 20:05 Titel: |
|
|
OK, danke für den Trost...
jb |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 16.03.2005, 16:59 Titel: Bezügl.Formellöser habe ich folgendes für die MonFAQ notiert |
|
|
Bezügl.Formellöser habe ich folgendes für die MonFAQ notiert...
--------------------------------------------------------------------------------
Frage deutsch
~~~~~~~~~~~~~~
Wie berechne ich einen als String vorliegenden Formelausdruck?
((Ergänzung der bestehenden Frage "Formelparser" oder "Formellöser"))
Question English
~~~~~~~~~~~~~~
How to ?
Antwort 1
~~~~~~~~~
[ von Thomas Antoni und Olaf Deters, 26.1.2004 - 27.1.2004 ]
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:
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 um:
'*****************************************************************
' 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.
-------------------------------------------------------------------------------- _________________ +++ 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 |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 16.03.2005, 17:10 Titel: |
|
|
Jetzt bin ich aber stolz, auch jemand anders ist auf die Idee mit
der externen .BAS-Datei gekommen
jb |
|
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.
|
|