Microsoft Small Basic

Program Listing: rbt673
' Calculation by the formula by NaochanON

gui()
Controls.ButtonClicked=Onbutton


Sub Onbutton
'cal="1234.556*98-876/56+(766/87-67/34)*85-654" ' = 120897.7359
'cal="(23.54-98/(-27*36+51)*265-15)+1356/(23-25*32)/3 +65.32" ' =101.4759.....
cal= Controls.GetTextBoxText(box1)
CNT=0
For i=1 To Text.GetLength(cal)
If Text.GetSubText(cal,i,1)=")" Then
CNT=CNT+1
EndIf
EndFor
For kk=1 To CNT
rP= Text.GetIndexOf(cal,")") ' right ")" point
rightcal=Text.GetSubTextToEnd(cal,rP+1) ' *265-15)+1356/(23-25*32)/3 +65.32
leftcal= Text.GetSubText(cal,1,rP-1) ' (23.54-98/(-27*36+51
For i=Text.GetLength(leftcal) To 0 step -1
If Text.GetSubText(leftcal,i,1)="(" Then
lP=i ' Left "(" point
i=0
EndIf
EndFor
midcal= Text.GetSubText(cal,lp+1,rP-lP-1) ' formula in the ( )
ChartoVal()
Multidevide()
TWresult()
Plusminus()
Markchange()
cal= leftcal+rightcal
EndFor
midcal=cal
ChartoVal()
Multidevide()
TWresult()
Plusminus()
controls.SetTextBoxText(box2,"= "+res) ' show Result
endsub

Sub Markchange
leftcal=text.Append(Text.GetSubText(leftcal,1,lP),res)
For j= lP To 0 Step -1
If res<0 And Text.GetSubText(leftcal,j,1)="-" Then ' -/(- or -*(-
leftcal= Text.Append(Text.GetSubText(leftcal,1,j-1)+"+",Text.GetSubTextToEnd(leftcal,j+1))
leftcal= Text.Append(Text.GetSubText(leftcal,1,lP-1),Text.GetSubTextToEnd(leftcal,lP+2))
j=0
ElseIf res<0 And Text.GetSubText(leftcal,j,1)="+" Then ' +/(- or +*(-
leftcal= Text.Append(Text.GetSubText(leftcal,1,j-1)+"-",Text.GetSubTextToEnd(leftcal,j+1))
leftcal= Text.Append(Text.GetSubText(leftcal,1,lP-1),Text.GetSubTextToEnd(leftcal,lP+2))
j=0
ElseIf (res>0 And Text.GetSubText(leftcal,j,1)="-") or (res>0 And Text.GetSubText(leftcal,j,1)="+") Then
leftcal= Text.Append(Text.GetSubText(leftcal,1,lP-1),Text.GetSubTextToEnd(leftcal,lP+1)) ' -/(+ or +*(+
j=0
endif
EndFor
If lP=1 Then
leftcal=Text.GetSubTextToEnd(leftcal,lP+1)
EndIf
EndSub

Sub ChartoVal
NN=0
MM=0
VL=""
Mark="+-*/"
Len= Text.GetLength(midcal)
For i=1 To Len
V= Text.GetSubText(midcal,i,1)
If Text.IsSubText(Mark,V)="False" And V<>" " Then
Vl=text.Append(Vl,V)
ElseIf Text.IsSubText(Mark,V)="True" then
NN=NN+1
Val[NN]=VL
VL=""
MM=MM+1
Function[MM]=V
endif
EndFor
NN=NN+1
Val[NN]=VL ' last value
EndSub

Sub Multidevide
For k=1 To MM
If Function[k]="/" Then
res=Val[K]/Val[K+1] ' A / B
Val[K+1]=res
Val[K]=""
Function[k]=""
ElseIf Function[k]="*" Then
res=Val[K]*Val[K+1] ' C*D
Val[K+1]=res
Val[K]=""
Function[k]=""
endif
EndFor
endsub

Sub TWresult
Newmidcal=""
For L=1 To NN
Newmidcal=Newmidcal+Val[L]+Function[L]
EndFor
endsub

Sub Plusminus
Len= Text.GetLength(Newmidcal)
NN=0
MM=0
VL=""
For i=1 To Len
V= Text.GetSubText(Newmidcal,i,1)
If Text.IsSubText("+-",V)="False" Then
Vl=text.Append(Vl,V)
ElseIf Text.IsSubText("+-",V)="True" then
NN=NN+1
NewVal[NN]=VL ' if start mark is "-" then NewVal[1]="" , NewFunction[1]="-"
VL=""
MM=MM+1
NewFunction[MM]=V
endif
EndFor
NN=NN+1
NewVal[NN]=VL ' last value
'----------------------------------------------------------------------------------------
res=0
NewFunction[0]="+" ' if start function is NULL
For j=MM To 0 Step -1
If NewFunction[j]="+" Then
res=res+newval[j+1]
ElseIf NewFunction[j]="-" Then
res=res-newval[j+1]
EndIf
EndFor
EndSub

Sub gui
GraphicsWindow.BackgroundColor="DarkGreen"
GraphicsWindow.Width=800
GraphicsWindow.Height=200
GraphicsWindow.FontSize=20
GraphicsWindow.BrushColor="Yellow"
GraphicsWindow.DrawText(10,40,"Formula")
GraphicsWindow.DrawText(10,120,"Result")
GraphicsWindow.BrushColor="Navy"
box1= Controls.AddMultiLineTextBox(100,20)
Controls.SetSize(box1,675,50)
GraphicsWindow.BrushColor="Red"
box2= Controls.AddMultiLineTextBox(100,100)
Controls.SetSize(box2,675,50)
btn= Controls.AddButton("Calc",100,160)
EndSub