一応、少数点ありの計算もできる様になりましたが、
あと少しなんですが、どなたかご助力下さい。
【問題点】
例として、「10/2*3」をあげて説明しますと、この計算では掛け算と割り算だけ
なので、10/2=5で、5*3=15と左→右に計算すると思います。
(Excelで計算しても、答えは15になります)
なんですが、このプログラム(パクリ&改造)だと、右→左に計算してしまい、
答えが、1.6666・・・となってしまいます・・・。
(カッコなしなのに、10/(2*3)と同じ結果に・・・)
※「10+2*3」とかの計算では、掛け算割り算を優先して計算する動きにはなるん
ですが、割り算同士とか、掛け算割り算などでは、奥から計算してしまうので、
どうにかExcelの様に、左→右の計算にしたい。
そこで、申し訳ありませんが、どなたか修正して頂けないでしょうか?
よろしくお願いします。
[ここをクリックすると内容が表示されます]
すみませんが、修正して頂ける方、よろしくお願いします。コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
dentaku_DestroyObjects()
PostQuitMessage(0)
End Sub
Dim s[1024] As Byte
Dim s_end As Long
Dim s_i As Long
Dim c As Byte
'Dim d4 As Long
Function read_s() As Byte
If s_end <= s_i then
read_s = 0
Else
read_s = s[s_i]
s_i++
End If
End Function
Sub MainWnd_CB_Ans_Click()
Dim ans As Double
Dim ansStr[100] As Byte
s_end = GetWindowText( GetDlgItem( hMainWnd, EditBox1), s, 1024 )
s_i = 0
c = read_s()
ans = expr()
lstrcpy( ansStr, Str$(ans) )
SetWindowText( GetDlgItem( hMainWnd, EditBox2), ansStr )
End Sub
Function expr() As Double
Dim d1 As Double
Dim d3 As Double
d1 = term()
If c = Asc("+") Then
c = read_s()
d3 = expr()
expr = d1 + d3
ElseIf c = Asc("-") Then
c = read_s()
d3 = expr()
expr = d1 - d3
ElseIf c = Asc("*") Then
c = read_s()
d3 = expr()
expr = d1 * d3
ElseIf c = Asc("/") Then
c = read_s()
d3 = expr()
expr = d1 / d3
ElseIf c = Asc("^") Then
c = read_s()
d3 = expr()
expr = d1 ^ d3
Else
expr = d1
End If
End Function
Function term() As Double
Dim d1 As Double
Dim d2 As Double
Dim d3 As Double
If c = Asc("(") Then
c = read_s()
d2 = expr()
c = read_s()
term = d2
ElseIf Asc("0") <= c And c <= Asc("9") Then
d1 = num()
If c = Asc("*") Then
c = read_s()
d3 = term()
term = d1 * d3
ElseIf c = Asc("/") Then
c = read_s()
d3 = term()
term = d1 / d3
ElseIf c = Asc("^") Then
c = read_s()
d3 = term()
term = d1 ^ d3
Else
term = d1
End If
End If
End Function
Function num() As Double
Dim vst As String
Dim v As Double
v = 0
'debug
Do
'数値の抽出中止条件
If c = Asc("+") Or c = Asc("-") Or c = Asc("*") Or c = Asc("/") Or _
c = Asc("^") Or c = Asc(")") Or c = Asc("") Then
Exit Do
End If
'数値の抽出
If c <> Asc(".") Then
vst = vst & Str$( c - Asc("0"))
v = Val(vst)
c = read_s()
Else
vst = vst & "."
c = read_s()
End If
Loop
num = v
End Function