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:

mehr als zwei Zahlen ..?

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



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 03.08.2012, 14:51    Titel: mehr als zwei Zahlen ..? Antworten mit Zitat

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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 338

BeitragVerfasst am: 03.08.2012, 16:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 03.08.2012, 16:28    Titel: Antworten mit Zitat

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 zwinkern )

und 1+3 = 4 != 1+2*3 = 1+6=7 wie du sicher bemerkt hast zwinkern

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 03.08.2012, 16:29    Titel: Antworten mit Zitat

SpionAtom war schneller, aber weil ich jetzt so lange an dem Beitrag geschrieben habe, poste ich ihn auch. grinsen

===============================

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 zwinkern


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
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 03.08.2012, 16:30    Titel: Antworten mit Zitat

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 zwinkern

(zugegeben, bei komplexeren Dingen, Klammern oder gar XML könnte es etwas anspruchsvoller werden zwinkern )
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 338

BeitragVerfasst am: 03.08.2012, 16:35    Titel: Antworten mit Zitat

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 zwinkern
_________________
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
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 03.08.2012, 16:35    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 04.08.2012, 11:56    Titel: Antworten mit Zitat

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 durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 04.08.2012, 14:22    Titel: Antworten mit Zitat

Das Programm, das ich oben gepostet habe, macht Punkt vor Strich. lächeln

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



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 04.08.2012, 15:14    Titel: Antworten mit Zitat

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