  | 
					
						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: 395
 
  | 
		
			
				 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: 4713 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: 395
 
  | 
		
			
				 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: 4713 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: 4713 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.
  | 
   
 
     |