een String naar formule om zetten en uit rekenen

Status
Niet open voor verdere reacties.

raymondhvh

Gebruiker
Lid geworden
31 okt 2008
Berichten
131
Hallo. ik zit nu al heel de dag uren lang met een probleem.
ik moet als opdracht een visual basic reken machine maken die formules kan berekenen.
ik heb dit geprobeerd op veel manieren maar ik kan geen simpele / goede oplossing bedenken.
bij google vind ik wel wat manieren maar die zijn met C# import of j# of microsoft script control.

de formule die ik wil uitreken is bijvoorbeeld een textbox met :
2*5^8
of zelfs
2*(5^8)

nu vraag ik me af of dit uberhoubt mogelijk is met visual basic
ik heb veel dingen geprobeerd maar niks is het waard om hier te plakken / dat jullie iets kunnen verbeteren

jullie hulp word ERG gewaardeerd! :cool::cool:
 
Bedankt dat was wel wat ik zocht. alleen kan ik het natuurlijk niet zomaar jatten zonder het te snappen. (voor een opdracht)
ik vind het zelf een redelijk groot / moeilijke omweg maar dit is volgens mij wel de enige manier. bedankt voor het helpen:thumb: dan sluit ik hierbij de vraag als niemand het korter kan coderen :o
 
Ik kan me wel een topic herinneren dat over hetzelfde ging, alleen weet ik niet meer hoe dat is opgelost.
Misschien kun je daar eens naar zoeken.
 
hmm ik zal even kijken het moet blijkbaar toch kunnen ...
dit is wat ik dacht :

[CPP]''string in textbox
'' split string like : (546, *, 3, -, (,2, /, 5,),)
'' detect () somehow and put apart


'' detect if number or operator
'' calculate (2/5) using operators as operators = as preint
''calculate integer = 546 * 3 - preint..

''result = 1637,6
[/CPP]
ik heb dit gevonden het werkt!
nu even goed studeren hoe...
[CPP] Public Function RefactoredCalculateInput(ByVal input As String) As String
''start by trimming the input
Dim inputSum As String = input.Replace(" ", "")

While inputSum.Contains("*")
Dim operatorIndex As Integer = inputSum.IndexOf("*"c)

Dim replaceStartIndex As Integer = 0

For i As Integer = operatorIndex - 1 To 0 Step -1
If IsOperator(inputSum.Substring(i, 1)) Then
replaceStartIndex = i + 1
Exit For
End If
Next

Dim secondlength As Integer = inputSum.Length - (operatorIndex + 1)
For i As Integer = operatorIndex + 1 To inputSum.Length - 1
If IsOperator(inputSum.Substring(i, 1)) Then
secondlength = i - (operatorIndex + 1)
Exit For
End If
Next

Dim replaceLength As Integer = secondlength + 1 + (operatorIndex - replaceStartIndex)

Dim x As Integer = Convert.ToInt32(inputSum.Substring(replaceStartIndex, Math.Max(1, operatorIndex - replaceStartIndex)))
Dim y As Integer = Convert.ToInt32(inputSum.Substring(operatorIndex + 1, secondlength))

inputSum = inputSum.Replace(inputSum.Substring(replaceStartIndex, replaceLength), (x * y).ToString())
End While

Return inputSum
End Function

[/CPP]
vrij lastig.. iemand die dit goed begrijpt wat er gebeurt?

ik heb de code voor mezelf wat simpeler gemaakt door zo veel mogelijk er uit te gooien:
edit : OEPS nu doet die geen meervoudige berekeningen meer :o
[CPP]
Dim inputSum As String = input.Replace(" ", "")
''multiply
While inputSum.Contains("*") ''check for multi operator
Dim operatorIndex As Integer = inputSum.IndexOf("*"c) '' dim location of the operator. as integer and look for * as an char not as string
Dim replaceStartIndex As Integer = 0
Dim secondlength As Integer = inputSum.Length - (operatorIndex + 1)
Dim replaceLength As Integer = secondlength + 1 + (operatorIndex - replaceStartIndex)
Dim x As Integer = Convert.ToInt32(inputSum.Substring(replaceStartIndex, Math.Max(1, operatorIndex - replaceStartIndex))) ''convert found numbers into intgers
Dim y As Integer = Convert.ToInt32(inputSum.Substring(operatorIndex + 1, secondlength))
inputSum = inputSum.Replace(inputSum.Substring(replaceStartIndex, replaceLength), (x * y).ToString()) ''calculate sum
End While
Return inputSum '' returns made sum to textb
[/CPP]

nu nog met haakjes werken..
 
Laatst bewerkt:
Als je de code even langs gaat (evt. met breakpoints) kun je precies zien wat er gebeurt.
Ik kan nu niet uitgebreid de code becommentariëren, omdat er functies worden aangeroepen die niet hier staan.

Bovendien is het leesbaarder om code-tags te gebruiken:

[cpp]int i = 1;
void x{
}
[/cpp]
 
ik denk dat ik het al redelijk vat. het is al weer een tijd geleden dat ik VB programmeerde
dit is btw de functie die er aangeroepen word:

[CPP]Public Function IsOperator(ByVal input As String) As Boolean
Return input.Equals("/") OrElse input.Equals("*") OrElse input.Equals("-") OrElse input.Equals("+")
End Function[/CPP]

en idd ik zag die tag niet staan :rolleyes:
 
Heb je hier wat aan?

[cpp]''//Controleer of de gegeven string een rekenkundige operator is
Public Function IsOperator(ByVal input As String) As Boolean
Return input.Equals("/") OrElse input.Equals("*") OrElse input.Equals("-") OrElse input.Equals("+")
End Function

Public Function RefactoredCalculateInput(ByVal input As String) As String
''//Verwijder alle spaties
Dim inputSum As String = input.Replace(" ", "")

''//Eerst vermenigvuldigingen uitrekenen
While inputSum.Contains("*")
''//operatorindex
Dim operatorIndex As Integer = inputSum.IndexOf("*"c)
Dim replaceStartIndex As Integer = 0

''//vanaf de geselecteerde operator tot aan het eerste karakter
For i As Integer = operatorIndex - 1 To 0 Step -1
''//Als het karakter een operator is, wordt de startindex
''//verandert naar de index van het geselecteerde karakter + 1
If IsOperator(inputSum.Substring(i, 1)) Then
replaceStartIndex = i + 1
Exit For
End If
Next

''//lengte van de tekst na de geselecteerde operator
Dim secondlength As Integer = inputSum.Length - (operatorIndex + 1)
''//alles tussen de geselecteerde operator en het einde
For i As Integer = operatorIndex + 1 To inputSum.Length - 1
''//Als er nog een operator is, wordt de secondlength de
''//lengte tussen de eerste en tweede operator
If IsOperator(inputSum.Substring(i, 1)) Then
secondlength = i - (operatorIndex + 1)
Exit For
End If
Next

''//de gegevens uit eerdere operaties worden gebruikt om het uit te rekenen
''//net zolang alle *-operators zijn afgehandeld
Dim replaceLength As Integer = secondlength + 1 + (operatorIndex - replaceStartIndex)

Dim x As Integer = Convert.ToInt32(inputSum.Substring(replaceStartIndex, Math.Max(1, operatorIndex - replaceStartIndex)))
Dim y As Integer = Convert.ToInt32(inputSum.Substring(operatorIndex + 1, secondlength))

inputSum = inputSum.Replace(inputSum.Substring(replaceStartIndex, replaceLength), (x * y).ToString())
End While

Return inputSum
End Function[/cpp]
 
Zeker bedankt!:cool:
weet je toevallig ook hoe ik dit zo kan veranderen dat die ook rekening houd met haakjes?
 
Laatst bewerkt:
Ik heb een andere broncode gevonden. Veel beter!
PxTLiqP.png


Kijk hier: http://www.codeproject.com/articles/3886/a-math-expression-evaluator
 
Dan moeten we wel zelf een 'haakjesparser' schrijven.
En welke foutmeldingen krijg je precies? Het zou best kunnen dat er code wordt gebruikt die nog niet werd ondersteund door VB2005.
 
Dan moeten we wel zelf een 'haakjesparser' schrijven.
En welke foutmeldingen krijg je precies? Het zou best kunnen dat er code wordt gebruikt die nog niet werd ondersteund door VB2005.

Bedankt voor al je hulp. maar het is (voorlopig) niet meer nodig.
ben al bij de volgende opdracht.:d
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan