木材材积计算
大三暑期,曾和同学一起接手一个林场的木材管理系统项目。主要功能是实现木材批量入库、木材材积计算以及各月报表打印等功能,其中在批量入库时动态实现材积的计算。应客户要求,使用VB+SQL进行项目的开发。在此,仅对材积公式的计算这方面进行讲述。
由于木材材积计算时,主要以L--检尺长(m)、D--检尺径(cm)二元参数决定V--材积(m³)。因此材积计算可以转换为二元N次方程的计算。依据数据结构教材中将涉及到的中缀表达式转换为后缀表达式后通过数字字符串转换为数值实现后缀表达式计算的系列已知算法,关键在于在中缀表达式转换为后缀表达式前将D、L用数值代换。代码如下:
'**********************************
'将D,L用数值代换
'**********************************
Public Function YunSuan(St As String, L As Single, D As Integer) As Double --St为含有D、L的字符串,L,D分别为检尺长和检尺径
Dim Lsit, Dsit As Integer
Dim Ls, rs As String
Dim le, i As Integer
Lsit = 0: Dsit = 0
While (Lsit < Len(St)) --遍历St字符串,获得'L'所在位置
Lsit = InStr(Lsit + 1, St, "L")
If Lsit Then --将检尺长L插入字符'L'所在位置
Ls = Left(St, Lsit - 1)
rs = Right(St, Len(St) - Lsit)
St = Ls + Format(Str(L), "0.0") + rs
Else
Lsit = Len(St)
End If
Wend
While (Dsit <> Len(St))
Dsit = InStr(Dsit + 1, St, "D") 以同样的方法获取'D'所在位置并将其替换
If Dsit Then
Ls = Left(St, Dsit - 1)
rs = Right(St, Len(St) - Dsit)
St = Ls + Format(Str(D), "0.0") + rs
Else
Dsit = Len(St)
End If
Wend
le = Len(Trim(St))
ReDim e(le + 1)
For i = 1 To le --将替换后的字符串存放在数组中,并以'#'为结束符
e(i - 1) = Mid(St, i, 1)
Next i
e(i) = "#"
Call PostFix(e, f) --调用PostFix函数,实现中缀表达式转换为后缀表达式
YunSuan = EvalPost(f) --EvalPost函数,实现后缀表达式的计算
End Function
注:前陣子才發現,原來關於這個替換,直接使用REPLACE這個函數就OK了,狂汗!
附:其他函数代码