Login Register
Frontpage Code library Pastebin

Calculated

Author: legend
Added: 9.4.2011 23:05
Edited: 15.4.2011 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 all
  1
  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.