ihr habt ja bald Ostern - hier gibt es sowas nicht.
Ich wünsche Euch jedenfalls schon mal schöne Feiertage.
Ich habe eine Frage.
Ich habe mir auf die Schnelle eine Konsole geschrieben. Thema: Numerische Ermittlung der Nullstellen einer Funktion anhand des REGULA FALSI Verfahrens. ( Für die die ihr Wissen nochmal auffrischen wollen hier ein interesanter Link mit Animation wie das Verfahren funktioniert: http://de.wikipedia.org/wiki/Regula_Falsi)
Ich weiss, es ist nicht die beste Programmierung mit den vielen GOTO / GOSUB etc., aber der Code ist ja nicht allzulange und ich will es später komplett sauber in einer WINDOWS-Ausführung mit Prozeduren schreiben (mit Funktionswertausgaben, graphische Darstellung der Funktion, Simpson Formel etc.).
Hier ist der Code:
Code: Alles auswählen
;Nullstellenberechnung nach Regula Falsi
OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle ("Nullstellenberechnung nach Regula Falsi")
ConsoleColor(15,0)
Neueingabe1:
;Neueingabe der Werte
ClearConsole()
ConsoleLocate(3,3):Print ("Eingabe vom unterem X-Wert= "):xus.s = Input()
ConsoleLocate(3,4):Print ("Eingabe vom oberem X-Wert = "):xos.s = Input()
ConsoleLocate(3,5):Print ("maximale Abweichung (Format:0.001,kein Komma!) von der Y-Achse= "):gs.s = Input()
xul.l=Val(xus.s)
xol.l=Val(xos.s)
gf.f=ValF(gs.s); oder als Wert 0.0001 eingeben (max. zulässige Y-Standartabweichung )
ConsoleLocate (3,20):Print("Weiter mit Return Taste")
Repeat
x.s = Inkey()
Until Left(x.s, 1) = Chr(13);Abfrage für Returntaste
ClearConsole()
Goto Start
Schleife1:
If x1f.f>=xol.l:Goto Abruchbedingung:EndIf
xul.l=x1f.f
Start:
x2f.f=xul.l
x1f.f=xul.l+1
x2s.s=StrF(x2f.f)
x1s.s=StrF(x1f.f)
;PrintN(x2s.s+" "+x1s.s) ;zur Kontrolle der Schleife
xf.f=x1f.f
Gosub Formel
y1f.f=yf.f
xf.f=x2f.f
Gosub Formel
y2f.f=yf.f
If y1f.f*y2f.f > 0 :Goto Schleife1:EndIf;keine Nullstelle zwischen x1 und x2
losungl.l=1; Nullstelle gefunden
Schleife2:
x3f.f=x1f.f-(((x2f.f-x1f.f)*y1f.f)/(y2f.f-y1f.f))
xf.f=x3f.f
Gosub Formel
If Abs(yf.f)<gf.f:Goto Nullstellenausgabe:EndIf
x2f.f=xf.f
y2f.f=yf.f
Goto Schleife2
Nullstellenausgabe:
xs.s=StrF(xf.f)
ys.s=StrF(yf.f)
PrintN("Nullstelle bei X= "+xs.s+" mit einer Y-Abweichung von "+ys.s)
Goto Schleife1
Abruchbedingung:
If losungl.l=1:Goto Losung:Else :Goto Keine_Losung:EndIf
Losung:
ConsoleLocate(3,20):Print("Bei Neustart bitte Returntaste druecken, sonst 1 eingeben zum Beenden ")
e.s=Input()
If e.s = "1":Goto Ende:Else:Goto Neueingabe1:EndIf
Keine_Losung:
ConsoleLocate(3,5):Print("Keine Nullstelle im angegebenen Bereich gefunden")
ConsoleLocate(3,20):Print("Bei Neustart bitte Returntaste druecken, sonst 1 eingeben zum Beenden ")
e.s=Input()
If e.s = "1":Goto Ende:Else:Goto Neueingabe1:EndIf
Ende:
End
Formel:
yf.f=Pow(xf.f,3)+2*Pow(xf.f,2)-3*xf.f+2
Return
Ihr könnt es ja gut benutzen, da ihr ja die Funktion ganz am Schluss vom Programm "von Hand" nach bestimmten Regeln ( auch in Excel benötigt man die richtige Syntax ) eingeben könnt und sowieso PureBasic habt.
Aber wie kann ich es anstellen in einer xxx.exe, daß man die Funktion in enem Gadget eingibt und dann das Ganze nach der eingegebenen ( in der richtigen Syntax natürlich ) Funktion berechnet wird ( wie z.B. in Excel oder meinem alten Taschenrechner )?
Irgendwie hat es wohl mit Parser zu tun, oder? Aber was ich gefunden habe funktionier ja nicht bei allen Berechnungen ( Klammer, Winkel,-Wurzel,-etc. Funktionen).
Hat da jemand eine Idee wie man das in PureBasic lösen könnte, es würde mir reichen wenn es nur unter WINDOWS laufen würde ( vielleicht auch eine API? )?
Vielen Dank schon mal im Vorraus und nochmal schöne Feiertage mit hoffentlich sonnigem Wetter beim Eiersuchen.