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:

Einfacher, komplizierter Gleichungsrechner

 
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
Leader4



Anmeldungsdatum: 20.01.2005
Beiträge: 99
Wohnort: Leipzig

BeitragVerfasst am: 15.03.2005, 18:57    Titel: Einfacher, komplizierter Gleichungsrechner Antworten mit Zitat

Mir kam letztens eine simple Idee, die in der Tat mehr als primitiv ist, die aber schwer oder fast gar nicht zu realsieren ist. grinsen

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. traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 15.03.2005, 19:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 15.03.2005, 19:58    Titel: Antworten mit Zitat

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.... weinen

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 15.03.2005, 20:04    Titel: Antworten mit Zitat

nicht weinen hehe. is ja auch ein ganz anderer ansatz deine version daher gleich hilfreich
_________________
Yagl - yet another gameprogramming library
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 15.03.2005, 20:05    Titel: Antworten mit Zitat

OK, danke für den Trost... zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 16.03.2005, 16:59    Titel: Bezügl.Formellöser habe ich folgendes für die MonFAQ notiert Antworten mit Zitat

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



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 16.03.2005, 17:10    Titel: Antworten mit Zitat

Jetzt bin ich aber stolz, auch jemand anders ist auf die Idee mit
der externen .BAS-Datei gekommen cool zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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