Calculated
Author: legend
Added: 9. huhtikuuta 2011 kello 23.05
Edited: 15. huhtikuuta 2011 kello 22.19
Category: Matematiikka
Description
Laskee laskun, erikoisuutena on se, että sille syötetään merkkijono! Btw. Muistaakseni olen tehnyt tämän jonkun toisen samanlaisen pohjalta =D
Code
Select all1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | Dim aika
aika = Timer()
For i=1 To 500
calculated("((5+2)*(9-3))^2 / 5")
Next i
Print Timer()-aika + " sekuntia"
Print "Vastaus:" + calculated("((5+2)*(9-3))^2 / 5")
WaitKey
'Laskeen laskun
'Esim. calculated("(4+4)*2")
Function calculated(lasku$)
Lasku = Replace(Lasku," ","") 'puhdistettaan koodirivi
Lasku = Replace(Lasku,")(",")*(") 'selkennetäään
Dim Asc_code
Asc_code = MakeMEMBlock(Len(Lasku))'esitellään muuttujia
Dim Sulkeet As Byte
Dim sulkeetA As Byte
Dim sulkeetK As Byte
SulkeetA = 255 '"nollataan muuttuja"
For i=1 To Len(lasku)'käydään sulkeet läpi
PokeByte Asc_code, i, Asc(Mid(lasku,i,1)) 'tallennetaan muuttujat
If PeekByte(Asc_code,i) = 40 'jos sulkeet on kiinne
Sulkeet + 1
sulkeetA = Min(i,SulkeetA)
ElseIf PeekByte(Asc_code,i) = 41 'jos sulkeet on auki
Sulkeet - 1
If Sulkeet = 0 'kun on otettu oikeat sulkeet
sulkeetK = i
Lasku = StrInsert(Lasku,SulkeetK,Str(calculated(Mid(Lasku,SulkeetA+1,SulkeetK-SulkeetA-1)))) 'lasketaan sulkeiden sisältö
Lasku = StrRemove(Lasku,SulkeetA,SulkeetK-SulkeetA+1) 'postetaan vanhat sulkeet
ResizeMEMBlock Asc_code,Len(Lasku)'muutettaan muistipala oikean kokoiseksi
For i=SulkeetA To Len(lasku)
PokeByte Asc_code, i, Asc(Mid(lasku,i,1)) 'tallenetaan ne
Next i
i=SulkeetA
SulkeetA = 255
SulkeetK = 0
EndIf
EndIf
Next i
'esitellään muuttujia
Dim Operator As Short 'tallenetaan *+.. merkki
Dim Code As Byte 'korvaa Asc_coden
Dim Numero1# 'Vasemman puoleinen luku
Dim Numero2# 'Oikean puoleinen luku
Dim Operator_sijainti As Short 'Sen merkin sijainti
Dim Numero1_sijainti As Short 'numeroiden sijainti
Dim Numero2_sijainti As Short
Dim Vastaus$ 'laskun vastaus
For Lasku_järjestys = 1 To 3 'käydään laskemisen jätjestyksessä laskut
For i=1 To Len(lasku)
code = PeekByte(Asc_code,i) 'sievenetään muuttujia
If Lasku_järjestys = 1 'etsitään oikea operaattori
If code = 94
Operator = code
EndIf
ElseIf Lasku_järjestys = 2
If code = 42 Or code = 47
Operator = code
EndIf
Else
If code = 43 Or code = 45
Operator = code
EndIf
EndIf
If Operator > 0 'jos on laskettavaa
Operator_sijainti = i
For Numero1_sijainti = Operator_sijainti-1 To 1 Step -1 'etsittän ensimmäinen luku
code = PeekByte(Asc_code,Numero1_sijainti)
If (code < 48 Or code > 57) And code <> 46
Exit
EndIf
Next Numero1_sijainti
Numero1_sijainti+1
numero1 = Float(Mid(lasku,Numero1_sijainti,Operator_sijainti-Numero1_sijainti))
For Numero2_sijainti = Operator_sijainti+1 To Len(lasku) 'etsitään toinen luku
code = PeekByte(Asc_code,Numero2_sijainti)
If (code < 48 Or code > 57) And code <> 46
Exit
EndIf
Next Numero2_sijainti
Numero2_sijainti+1
numero2 = Float(Mid(lasku,Operator_sijainti+1,Numero2_sijainti-Operator_sijainti))
'lasketaan vastaus
If Operator = 43 '+
Vastaus = Str(numero1 + numero2)
ElseIf Operator = 45 '-
Vastaus = Str(numero1 - numero2)
ElseIf Operator = 42 '*
Vastaus = Str(numero1 * numero2)
ElseIf Operator = 47 '/
Vastaus = Str(numero1 / numero2)
ElseIf Operator = 94 '^
Vastaus = Str(numero1 ^ numero2)
EndIf
Lasku = StrRemove(Lasku,Numero1_sijainti,(Numero2_sijainti-Numero1_sijainti)-1)
Lasku = StrInsert(Lasku,Numero1_sijainti-1,Vastaus) 'merkataan ne lausekkeeseen
ResizeMEMBlock Asc_code,Len(Lasku)
For i=Numero1_sijainti To Len(lasku)
PokeByte Asc_code, i, Asc(Mid(lasku,i,1)) 'tallennetaan muuttujat
Next i
Operator = 0
i=numero1_sijainti
EndIf
Next i
Next Lasku_järjestys
Return Float(Lasku) 'palauttetaan vastaus
DeleteMEMBlock Asc_code 'poistetaan muuttuja
EndFunction
|
Comments
No comments. You can be first!
Leave a comment
You must be logged in to comment.