|
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 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 03.08.2012, 14:51 Titel: mehr als zwei Zahlen ..? |
|
|
ich habe hier folgendes programm heute geschrieben und musste feststellen dass ich es irgendwie nicht hinbekomme mehr als zwei zahlen ausrechnen zu lassen egal was ich versucht habe .. könntet ihr mir eine hilfe stellung geben?
Code: |
Declare Function Get_number_left(ByRef aufgabe As String, byref operatoren As string) As Integer
Declare Function Get_number_right(ByRef aufgabe As String, byref operatoren As string) As Integer
Declare Function math (ByRef get_op As String) As double
Print math ("10+10*3")
sleep
Function math (ByRef get_op As String) As Double
If InStr(get_op, "+") Then math = Get_number_left(get_op, "+") + Get_number_right(get_op, "+")
if InStr(get_op, "-") Then math = Get_number_left(get_op, "-") - Get_number_right(get_op, "-")
If InStr(get_op, "*") Then math = Get_number_left(get_op, "*") * Get_number_right(get_op, "*")
If InStr(get_op, "/") Then math = Get_number_left(get_op, "/") / Get_number_right(get_op, "/")
End Function
Function Get_number_left(ByRef aufgabe As String, byref operatoren As string) As Integer
Dim As string zahl1
Dim As Double zahl3
Dim As Integer position
Do
position = InStr(position+1,aufgabe, operatoren)
If InStr(aufgabe, operatoren) Then
zahl1 = left(aufgabe, position-1)
zahl3 = Val(zahl1)
EndIf
Loop Until Len(aufgabe)
return zahl3
End Function
Function Get_number_right(ByRef aufgabe As String, byref operatoren As string) As Integer
Dim As String zahl2
Dim As Double zahl4
Dim As Integer position, anzahl = 1
Do
position = InStr(position+1,aufgabe, operatoren)
If InStr(aufgabe, operatoren) Then
zahl2 = right(aufgabe, position+1)
zahl4 = Val(zahl2)
EndIf
Loop Until Len(aufgabe)
Return zahl4
End Function
|
für jede hilfe bin ich wie immer dankbar |
|
Nach oben |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 338
|
Verfasst am: 03.08.2012, 16:19 Titel: |
|
|
Was du vorhast, nennt sich parsen, und das ist kein Thema für Anfänger. Dazu müsste man schon fortgeschritten sein.
Vielleicht hilft dir ja dieses Beispiel:
http://de.wikipedia.org/wiki/Parser#Beispiel
Oder hier was ausm Blitzforum:
http://www.blitzforum.de/forum/viewtopic.php?p=402833#402833 _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Zuletzt bearbeitet von SpionAtom am 03.08.2012, 16:29, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 03.08.2012, 16:28 Titel: |
|
|
tipp: lass dir doch mit print mal ausgeben, was GetNumberLeft bzw -Right zurückliefern.
bei "1 + 2 * 3" z.B. wird das "+" gefunden
GetNumberLeft wird val("1")=1 zurückgeben, super.
GetNumberRight wird val("3")=3 zurückgeben
also "math = 1+3"
(dann wird noch das mal gefunden und anderer Müll zurückgeliefert, aber Müll bleibt Müll )
und 1+3 = 4 != 1+2*3 = 1+6=7 wie du sicher bemerkt hast
versuche doch, getNumberLeft/Right in "getExpressionLeft/Right" zu ändern, die statt einer Zahl einen String zurückliefern
im falle von "1 + 2 * 3" also: "1" und "2*3"
dann wende math() auf beide strings an, und erweitere math() so, dass es val(derstring) zurückliefert, wenn es keinen operator mehr finden kann
es soll also folgendes passieren:
math("1+2*3") wird ausgewertet zu:
math("1") + math("2*3) und das wird ausgewertet zu
1 + math("2")*math("3") und das wird ausgewertet zu
1 + (2*3) = 7
-> passt
(und jetzt überlege dir noch, was passiert, wenn du nicht erst auf strichrechenarten und dann auf punktrechenarten, sondern andersrum prüfst, kommt dann immernoch dasselbe raus? warum(nicht)?) _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 03.08.2012, 16:29 Titel: |
|
|
SpionAtom war schneller, aber weil ich jetzt so lange an dem Beitrag geschrieben habe, poste ich ihn auch.
===============================
Zitat: | dass ich es irgendwie nicht hinbekomme mehr als zwei zahlen ausrechnen zu lassen |
Du meinst etwas wie "2+3+4"?
Ich würde das rekursiv versuchen - erstes "+" suchen und die linke Seite mit der rechten Seite addieren, wobei beide Seiten zuerst wieder nach Rechenzeichen durchsucht werden.
Code: | function math(get_op as string) as double
dim as integer zeichenSuchen = instr(get_op, "-")
if zeichenSuchen then return math(left(get_op, zeichenSuchen-1)) - math(mid(get_op, zeichenSuchen+1))
' Wenn kein "-" gefunden wurde, geht die Suche weiter ...
zeichenSuchen = instr(get_op, "+")
if zeichenSuchen then return math(left(get_op, zeichenSuchen-1)) + math(mid(get_op, zeichenSuchen+1))
' Wenn kein "+" gefunden wurde, geht die Suche weiter ...
zeichenSuchen = instr(get_op, "/")
if zeichenSuchen then return math(left(get_op, zeichenSuchen-1)) / math(mid(get_op, zeichenSuchen+1))
' Wenn kein "/" gefunden wurde, geht die Suche weiter ...
zeichenSuchen = instr(get_op, "*")
if zeichenSuchen then return math(left(get_op, zeichenSuchen-1)) * math(mid(get_op, zeichenSuchen+1))
' Wenn kein "*" gefunden wurde, müsste der String eine Zahl darstellen
return val(get_op)
end function |
Mal so als Anregung. Der Code tut noch nicht so ganz das was er soll (probiere mal ein bisschen herum), aber das zu korrigieren ist die wirkliche Schwierigkeit des Berechnungs-Parsers
edit: Kommentare korrigiert _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Zuletzt bearbeitet von nemored am 03.08.2012, 16:39, insgesamt 3-mal bearbeitet |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 03.08.2012, 16:30 Titel: |
|
|
SpionAtom hat Folgendes geschrieben: | Was du vorhast, nennt sich parsen, und das ist kein Thema für Anfänger. Dazu müsste man schon fortgeschritten sein.
Vielleicht hilft dir ja dieses Beispiel:
http://de.wikipedia.org/wiki/Parser#Beispiel |
quak, so ein matheparser ist nicht schwer und durchaus für den fortgeschrittenen Anfänger geeignet
(zugegeben, bei komplexeren Dingen, Klammern oder gar XML könnte es etwas anspruchsvoller werden ) _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 338
|
Verfasst am: 03.08.2012, 16:35 Titel: |
|
|
Wenn man wirklich nur einfache Terme hat und alle Prioritäten vernachlässigen kann, dann ja, dann darf der fortgeschrittene Anfänger sich daran versuchen _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 03.08.2012, 16:35 Titel: |
|
|
XML ist sehr einfach zu parsen. Da finde ich Rechenausdrücke wesentlich schwieriger; man denke z. B. auch an "5-3-1". _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 04.08.2012, 11:56 Titel: |
|
|
danke für die ganzen antworten und anregungen..aber irgendwie bekomme ich's trotzdem dem noch nich hin, hab aber auch heute erst weiter herum probiert.Meine Idee war ja nun dass ich versuche dass programm die punkt vor strichrechnung ein zu trichtern aber auch dass klappt nich so ganz weil ich da garnich wüsste wie ich anfangen soll |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 04.08.2012, 14:22 Titel: |
|
|
Das Programm, das ich oben gepostet habe, macht Punkt vor Strich.
(aber nicht links vor rechts) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 04.08.2012, 15:14 Titel: |
|
|
na ich glaub ich lasse es erstmal sein, und versuch mich zu einem späteren zeitpunkt nochmal daran .. bisher aber ist es so dass ich nich wirklich durchblicke, aber trotzdem nochmal an alle einen dickes danke |
|
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.
|
|