第4章 科学计算器
随着电子技术的发展,计算器的功能越来越强大,精度越来越高,性能越来越好,可以实现复杂的科学计算,Windows系统也自带了一个功能强大的计算器。本章要设计一个科学计算器,除了基本的四则运算之外,还有三角与反三角、对数与反对数、乘方与幂运算等。
4.1 需求分析
科学计算器除了具有普通计算器的标准功能之外,还具有很多其他数据计算功能。本章设计的科学计算器包括以下功能。
(1)具有小数点后10位以上的精度。
(2)可以直接输出随机数、圆周率、自然对数的底数和重力加速度等常用常数。
(3)可以输入0~9、00、小数点等数字或数学符号,并能对数字取反。
(4)能够计算加、减、乘、除四则运算。
(5)可以计算倒数、平方、立方、开方和任意乘方或幂指运算,以及阶乘运算。
(6)能够计算以10为底的对数和自然对数,以及自然对数为底的幂运算。
(7)具有三角与反三角函数的计算功能,并能在角度、弧度和梯度之间进行换算。
(8)可以将数据记录到内存中,并能将输入的数据和内存中的数据进行四则运算。
(9)能够实现数据的统计计算,包括和、平均值和方差。
(10)可以对计算或输入的结果进行复制,也能通过粘贴方式向计算器输入数字。图4-1为科学计算器的界面图。
图4-1 科学计算器界面图
4.2 技术要点
本章设计的科学计算器具有开关功能,该功能是使用OptionButton控件实现的,分别是On和Off按钮。OptionButton控件可以实现“两者必,居其一”的功能,通过设置其Style属性,该控件的外观可以与CommandButton控件相同。2nd按钮用于选择二次功能,该按钮是CheckBox控件,其设置与OptionButton控件相同。
Back按钮是后退,CE按钮是清除屏幕和内存中的所有数据,C按钮是清除屏幕中的数据。
Deg、Rad和Grd按钮用于切换角度单位表示方法。Deg按钮表示度数、Rad按钮表示弧度、Grd按钮表示梯度。
Sin、Cos和Tan按钮是用于计算三角与反三角函数的。三角与反三角功能的切换是通过2nd按钮实现的。当3个按钮显示Sin、Cos和Tan时,计算三角函数。当3个按钮显示ArcSin、ArcCos和ArcTan时,计算反三角函数。角度单位的切换是由Deg、Rad和Grd按钮实现的。
MR按钮用于向内存中记录数据,MC按钮用于清除内存中的数据。M+、M-、M×和M/分别表示对内存中的数据进行加减乘除计算的运算符。
1/x、x^2、x^3、x^y、和e(x)按钮分别用于计算各种乘方和幂指运算。n!按钮用于计算阶乘。
Sta、Ave、Sum、s和Dat按钮用于统计计算。Sta按钮用于启动或关闭统计功能。Dat按钮用于输入统计数据,这些统计数据列在ListBox控件中。
Rnd、π、e和g按钮分别用于输入随机数、圆周率、自然对数的底数和重力加速度。
Log按钮用于计算以10为底的对数。Ln按钮用于计算自然对数。
+/-按钮用于对屏幕中的数据取反。00按钮可以连续输入两个0。使用0~9和00按钮输入数字时,需要分清是连续输入还是清除后输入两种情况。输入小数点时,也有类似的注意点。
此外,计算器的显示屏是Label控件,可以防止用户对其误输入。
4.3 系统结构
本章设计的科学计算器主要使用CommandButton、CheckBox和OptionButton控件作为按钮,Label控件作为显示屏。创建一个新的工程,添加一个Form窗体,根据图4-1在该Form窗体上添加相应控件。工程的对象及其属性值,如表4-1所示。
表4-1 工程的对象及其属性值
(续表)
此外,还要为Form窗体添加一个菜单栏,用于实现数据的复制和粘贴功能,Form窗体的菜单栏列表如表4-2 所示。其中,“编辑”菜单项为不可见,“复制”和“粘贴”菜单项为可见。
表4-2 菜单栏列表
4.4 实现过程
根据运算功能的不同,大致可以将科学计算器程序分为变量声明和初始化、清除数据、数据输入、四则运算、乘方和幂指运算、对数运算、阶乘运算、三角与反三角函数运算、内存中的数字运算、统计计算和数据复制与粘贴等。
4.4.1 程序初始化
在设计具体的计算程序之前,需要声明很多变量,并进行程序的初始化。在科学计算器程序中,各种计算功能都涉及一些存储变量,需要在通用代码段进行声明。程序代码如程序清单4-1所示。
清单4-1变量声明
1. Private strCalculateType As String '存放运算类型 2. Private blnCalFlag As Boolean '标记是否已经输入加数、或减数等 3. 4. Private dblNum1 As Double '存放被加数、或被减数、或被乘数、或被除数等 5. Private dblNum2 As Double '存放加数、或减数、或乘数、或除数等 6. 7. Private dblMemo As Double '内存中的数 8. 9. Private dblSum As Double '统计中计算的和 10. Private dblAve As Double '统计中计算的平均值 11. Private dbls As Double '统计中计算的方差 12. 13. Private dblAngle As Double '三角计算中的角度 14. 15. Const pi=3.1415926536 '常数π 16. Const e=2.7182818285 '自然对数的底数 17. Const g=9.86 '重力加速度
程序说明:第1~2行声明的变量用于标记运算的类型和判断数字的输入情况,第4~11行声明的变量用于存放运算中的临时值或中间结果,第13行的变量用于存储三角和反三角函数计算中的角度的不同表示方法,第15~17行声明了三个常用的常数。
科学计算器程序中主要通过Label和CammandButton控件实现用户操作的。在程序加载的时候,需要初始化其中的部分控件,以及程序清单4-1 中声明的变量。程序代码如程序清单4-2所示。
清单4-2初始化控件和变量
1. Private Sub Form_Load() 2. Dim i As Integer 3. 4. '初始化显示屏和关闭按钮 5. lblScreen="0" 6. lblScreen.BackColor=vbBlack 7. optOff.Value=True 8. 9. '初始化运算符类型和标记变量 10. strCalculateType="" 11. blnCalFlag=False 12. 13. '初始化内存变量 14. dblMemo=0 15. 16. '初始化统计计算的控件及其变量 17. For i=1 To 4 18. cmdStatistic.Item(i).Enabled=False
19. Next 20. lstStatistic.Visible=False 21. dblSum=0 22. dblAve=0 23. dbls=0 24. 25. '初始化角度控件及其变量 26. cmdAngle.Item(0).FontBold=True 27. cmdAngle.Item(1).FontBold=False 28. cmdAngle.Item(2).FontBold=False 29. cmdAngle.Item(0).FontItalic=True 30. cmdAngle.Item(1).FontItalic=False 31. cmdAngle.Item(2).FontItalic=False 32. dblAngle=pi/180 33. End Sub
程序说明:上述程序段主要是根据不同的计算功能来初始化控件和变量的,第26~32行初始化角度控件及其变量。角度的度量分为度数、弧度和梯度三种,三者之间存在固定的数学关系,系统默认的角度单位是度数。
4.4.2 清除数据
计算器通常都具备数据清除功能,最常用的是清除屏幕数据。本章设计的计算器具有3种清除数据的功能,分别是清除屏幕数据、清除屏幕和内存中的数据、输入错误时后退逐个清除数字。程序代码如程序清单4-3所示。
清单4-3清除数据
1. Private Sub cmdClear_Click(Index As Integer) '清除数据 2. Select Case Index 3. Case 0 '清除屏幕数据 4. lblScreen="0" 5. Case 1 '清除所有数据 6. dblMemo=0 7. lblScreen="0" 8. strCalculateType="" 9. blnCalFlag=False 10. Case 2 '后退 11. If(lblScreen<>"")Then 12. lblScreen=Mid(lblScreen,1,Len(lblScreen)-1) 13. End If 14. blnCalFlag=True 15. End Select 16. End Sub
程序说明:第3行是清除屏幕数据,第4~9行是清除所有数据,包括屏幕和内存变量中的数据。第11~14行是通过If判断语句逐个清除数字,实现后退功能。
在科学计算器的界面中,清除屏幕数据对应的是C按钮,清除所有数据对应的是CE按钮,后退对应的是Back按钮。
4.4.3 数据输入
计算器的数据输入主要分为数字输入、常数输入、小数点输入和数据取反。程序代码如程序清单4-4所示。
清单4-4数据输入
1. Private Sub cmdNumber_Click(Index As Integer) '数字输入 2. If lblScreen="0"Then 3. lblScreen="" 4. End If 5. 6. If blnCalFlag=False Then 7. If Index=10 Then 8. lblScreen="00" 9. Else 10. lblScreen=CStr(Index) 11. End If 12. blnCalFlag=True 13. Else 14. If Index=10 Then 15. lblScreen=lblScreen+"00" 16. Else 17. lblScreen=lblScreen+CStr(Index) 18. End If 19. End If 20. End Sub 21. 22. Private Sub cmdConstNums_Click(Index As Integer) '常数输入 23. Select Case Index 24. Case 0'输出随机数 25. Randomize 26. lblScreen=Rnd 27. Case 1'输出pi 28. lblScreen=pi 29. Case 2'输出e 30. lblScreen=e 31. Case 3'输出g 32. lblScreen=g 33. End Select 34. 35. blnCalFlag=False 36. End Sub 37. 38. Private Sub cmdPoint_Click() '输入小数点
39. If blnCalFlag=True Then 40. If InStr(1,lblScreen,".")=0 Then 41. If lblScreen<>""Then 42. lblScreen=lblScreen+"." 43. Else 44. lblScreen="0." 45. End If 46. End If 47. Else 48. If blnCalFlag=False Then 49. lblScreen="0." 50. blnCalFlag=True 51. End If 52. End If 53. End Sub 54. 55. Private Sub cmdPlusMinus_Click() '数字取反 56. lblScreen=Val(lblScreen)*-1 57. End Sub
程序说明:第1~20行用于实现数字输入,包括0~9和00。数字的输入有两种情况:一种是数字的连续输入,如输入一个3位数;另一种是得到计算结果后重新输入其他数字,此时即使没有按清除按钮,也需要清除屏幕重新输入数字。第22~36行是常用常数输入,第38~53行是小数点输入。小数点输入也分为两种情况:一种是在数字输入过程中输入小数点,那么如果该数字中没有小数点就输入一个小数点,如果已有小数点就不响应用户输入;另一种是计算得到结果后,此时如果没有按清除按钮,就要输入“0.”。第56行通过乘于-1的方法对当前的数据取反,从执行结果来看,就是输入“+/-”号。
4.4.4 四则运算
四则运算涉及两个运算数,在输入四则运算符号的时候,需要记录该运算类型和第一个运算数。程序代码如程序清单4-5所示。
清单4-5四则运算
1. Private Sub cmdArithmetic_Click(Index As Integer) '四则运算 2. Select Case Index 3. Case 0'输入加法 4. cmdEqual_Click 5. strCalculateType="+" 6. dblNum1=Val(lblScreen) 7. Case 1'输入减法 8. cmdEqual_Click 9. strCalculateType="-" 10. dblNum1=Val(lblScreen) 11. Case 2'输入乘法 12. cmdEqual_Click
13. strCalculateType="*" 14. dblNum1=Val(lblScreen) 15. Case 3'输入除法 16. cmdEqual_Click 17. strCalculateType="/" 18. dblNum1=Val(lblScreen) 19. End Select 20 End Sub
程序说明:第4行是在输入“+”号之前先调用计算程序计算现有结果,第5行需要使用strCalculateType变量记录计算类型“+”,第6 行是记录被加数,减、乘和除的处理方法是相同的。
科学计算器中很多都是单个运算数的计算,使用等于号计算结果的一般是四则运算和任意次乘方或幂指运算,该运算涉及两个运算数。程序代码如程序清单4-6所示。
清单4-6等于号计算结果程序
1. Private Sub cmdEqual_Click() 2. dblNum2=Val(lblScreen) 3. 4. If strCalculateType="/"Then 5. lblScreen=dblNum1/dblNum2 6. ElseIf strCalculateType="*"Then 7. lblScreen=dblNum1*dblNum2 8. ElseIf strCalculateType="-"Then 9. lblScreen=dblNum1-dblNum2 10. ElseIf strCalculateType="+"Then 11. lblScreen=dblNum1+dblNum2 12. ElseIf strCalculateType="x^y"Then 13. lblScreen=dblNum1^dblNum2 14. End If 15. 16. strCalculateType="" 17. blnCalFlag=False 18. End Sub
程序说明:第2行是记录运算的第2个运算数,第4~11行是计算四则运算的结果,第13 行是计算乘方或幂指运算结果。计算结束后,需要通过第16~17 行的程序初始化用于记录运算情况的变量。
4.4.5 乘方和幂指运算
本章将倒数、平方、立方和平方根等运算都放在乘方和幂指运算功能块中实现。程序代码如程序清单4-7所示。
清单4-7乘方和幂指运算
1. Private Sub cmdPower_Click(Index As Integer)
2. Dim dblTemp As Double 3. dblTemp=Val(lblScreen) 4. 5. Select Case Index 6. Case 0 '求倒数 7. If Val(lblScreen)<>0 Then 8. lblScreen=1/dblTemp 9. Else 10. lblScreen="ERR" 11. End If 12. Case 1 '求平方 13. lblScreen=dblTemp^2 14. Case 2 '求立方 15. lblScreen=dblTemp^3 16. Case 3 '求y次方 17. strCalculateType="x^y" 18. dblNum1=Val(lblScreen) 19. Case 4 '求平方根 20. If Val(lblScreen)>=0 Then 21. lblScreen=Sqr(dblTemp) 22. Else 23. lblScreen="ERR" 24. End If 25. Case 5 '求e的x次方 26. lblScreen=Exp(dblTemp) 27. End Select 28. 29. blnCalFlag=False 30. End Sub
程序说明:第6~11行是求倒数,需要注意的是要将除数为0区分开来。第12~15行是求平方和立方,比较简单。第16~18行是求任意数的任意次乘方或幂,这是涉及两个运算数的计算,需要将第一个运算数记录下来,通过按等于号按钮来计算结果。第19~24行是求平方根,要注意区分被开方的数不小于0。第25~26行是计算以自然对数的底数为底的指数。
4.4.6 对数运算
常用的对数运算有两种,分别是以10为底的对数和自然对数。程序代码如程序清单4-8所示。
清单4-8对数运算
1. Private Sub cmdLog_Click(Index As Integer) '求对数 2. Select Case Index 3. Case 0 '求10为底的对数 4. If Val(lblScreen)>0 Then 5. lblScreen=Log(Val(lblScreen))/Log(10) 6. Else
7. lblScreen="ERR" 8. End If 9. Case 1 '求自然对数 10. If Val(lblScreen)>0 Then 11. lblScreen=Log(Val(lblScreen)) 12. Else 13. lblScreen="ERR" 14. End If 15. End Select 16. 17. blnCalFlag=False 18. End Sub
程序说明:第11行是计算自然对数,直接使用Log函数即可实现。第5行是计算以10为底的对数,是通过计算自然对数进行转换实现的。
4.4.7 阶乘运算
阶乘是一种整数的连乘运算,可以通过For循环语句来实现。程序代码如程序清单4-9所示。
清单4-9阶乘运算
1. Private Sub cmdN_Click() '求n的阶乘 2. Dim i As Integer 3. Dim lngSum As Long 4. 5. lngSum=1 6. 7. If Val(lblScreen)>=1 Then 8. For i=1 To Int(Val(lblScreen)) 9. lngSum=lngSum*i 10. Next 11. lblScreen=lngSum 12. Else 13. lblScreen="ERR" 14. End If 15. 16. blnCalFlag=False 17. End Sub
程序说明:第8~10行就是通过For循环语句计算阶乘,从1一直乘到输入的整数。本段程序将用户输入的数据自动转换为整数,负数没有阶乘运算。
4.4.8 三角与反三角函数运算
计算三角及其反三角函数的按钮是相同的,其不同的功能是通过2nd这个二次功能按钮加以实现的。三角与反三角函数运算中的另一个需要注意的地方就是角度的表示方法,不同的表示,得到的结果之间存在一定的数学联系。程序代码如程序清单4-10所示。
清单4-10三角与反三角函数运算
1. Private Sub chk2nd_Click() '设置二次功能键 2. If optOn.Value=True Then 3. If chk2nd.Value=1 Then '设置计算反三角函数 4. cmdSin.Caption="ArcSin" 5. cmdCos.Caption="ArcCos" 6. cmdTan.Caption="ArcTan" 7. Else '设置计算三角函数 8. cmdSin.Caption="Sin" 9. cmdCos.Caption="Cos" 10. cmdTan.Caption="Tan" 11. End If 12. End If 13. End Sub 14. 15. Private Sub cmdAngle_Click(Index As Integer) '角度转换 16. Select Case Index 17. Case 0 18. cmdAngle.Item(0).FontBold=True 19. cmdAngle.Item(1).FontBold=False 20. cmdAngle.Item(2).FontBold=False 21. cmdAngle.Item(0).FontItalic=True 22. cmdAngle.Item(1).FontItalic=False 23. cmdAngle.Item(2).FontItalic=False 24. dblAngle=pi/180 25. Case 1 26. …… 27. dblAngle=1 28. Case 2 29. …… 30. dblAngle=pi/200 31. End Select 32. End Sub
程序说明:第3~6行是2nd按钮按下时计算反三角函数,第7~10行是2nd按钮弹上时计算三角函数。2nd按钮事实上是CheckBox控件,通过设置其Style属性即可将其设置为ConnandButton控件的外观。第17~24行是设置角度的表示方法为度数,此时需要将度数、弧度和梯度的按钮控件进行一些设置,以示区分,并要计算角度系数变量。第26行和第29 行中的省略号省略了弧度和梯度时的按钮控件进行设置,其设置方法与第18~24 行相似。
三角函数的计算包括正弦、余弦和正切三种,反三角函数的计算包括反正弦、反余弦和反正切三种,三种三角函数与反三角函数的程序设计思路和方法是相似的。程序代码如程序清单4-11所示。
清单4-11正弦与反正弦函数运算
1. Private Sub cmdSin_Click() '求sin或arcsin 2. '求Sin 3. If chk2nd.Value=0 Then 4. lblScreen=Sin(dblAngle*Val(lblScreen)) 5. 6. '求arcsin 7. Else 8. Select Case Val(lblScreen) 9. Case 1 10. lblScreen=pi/2/dblAngle 11. Case-1 12. lblScreen=-pi/2/dblAngle 13. Case Else 14. If Val(lblScreen)>-1 And Val(lblScreen)<1 Then 15. lblScreen=Atn(Val(lblScreen)/Sqr(1-Val(lblScreen)^2))_ 16. /dblAngle 17. Else 18. lblScreen="ERR" 19. End If 20. End Select 21. End If 22. 23. blnCalFlag=False 24. End Sub
程序说明:第4行是计算正弦函数,直接使用Sin函数即可,Sin函数默认的角度单位是弧度。因此,在计算的时候,需要乘上一个角度系数,该系数由变量dblAngle表示,在程序清单4-2和4-10中都对该变量进行了相应赋值。第8~20行根据反三角函数的自变量范围对反三角函数进行分段计算。同时,在计算结果中要除以角度系数dblAngle。
本段程序只给出了正弦与反正弦函数运算的代码。余弦与反余弦、正切与反正切的程序代码设计与本段代码相似,在此就不详细列出来了,读者可以参考光盘中的源程序。
4.4.9 内存中的数字运算
计算器一般都可以在内存中记录一个数据,并能对内存中的数据进行四则运算。内存中的数字运算是通过特有的加减乘除按钮实现的,因而不影响普通计算,也不受其他运算影响,本章也设计了内存中的数字运算功能。程序代码如程序清单4-12所示。
清单4-12内存中的数字运算
1. Private Sub cmdMemory_Click(Index As Integer) '内存中的数字运算 2. Select Case Index 3. Case 0 4. dblMemo=dblMemo+Val(lblScreen) 5. Case 1
6. dblMemo=dblMemo-Val(lblScreen) 7. Case 2 8. dblMemo=dblMemo*Val(lblScreen) 9. Case 3 10. If Val(lblScreen)<>0 Then 11. dblMemo=dblMemo/Val(lblScreen) 12. Else 13. lblScreen="ERR" 14. End If 15. Case 4 16. lblScreen=Str(dblMemo) 17. prev=Val(lblScreen) 18. Case 5 19. dblMemo=0 20. End Select 21. 22. blnCalFlag=False 23. End Sub
程序说明:第2~20行通过Select选择语句实现向内存中记录数字,以及对内存中数字进行加减乘除四则运算。其计算的方法与普通四则运算相同,只是其中的一个运算数存储在内存中。
4.4.10 统计计算
统计计算是科学计算器的一项基本功能之一。本章设计的计算器程序也具有统计计算功能,能够通过列出输入的统计数据计算和、平均数和方差。程序代码如程序清单4-13所示。
清单4-13统计计算
1. Private Sub cmdStatistic_Click(Index As Integer) '统计计算 2. Dim i As Integer 3. Dim dbls2 As Double 4. 5. Select Case Index 6. Case 0 '启动和关闭统计计算 7. If lstStatistic.Visible=True Then 8. For i=1 To 4 9. cmdStatistic.Item(i).Enabled=False 10. Next 11. frmMain.Height=8250 12. lstStatistic.Visible=False 13. lstStatistic.Clear 14. frmMain.Height=7000 15. dblSum=0 16. dblAve=0 17. dbls=0 18.
19. lblScreen="0" 20. Else 21. If optOn.Value=True Then 22. For i=1 To 4 23. cmdStatistic.Item(i).Enabled=True 24. Next 25. lstStatistic.Visible=True 26. lstStatistic.Clear 27. frmMain.Height=8300 28. End If 29. End If 30. Case 1 '计算平均值 31. If lstStatistic.ListCount>0 Then 32. dblAve=dblSum/lstStatistic.ListCount 33. lblScreen=dblAve 34. End If 35. Case 2 '计算和 36. lblScreen=dblSum 37. Case 3 '计算均方差 38. dbls2=0 39. If lstStatistic.ListCount>1 Then 40. For i=0 To lstStatistic.ListCount-1 41. dbls2=dbls2+(Val(lstStatistic.List(i))-dblAve)^2 42. Next 43. dbls=Sqr(dbls2/(lstStatistic.ListCount-1)) 44. lblScreen=dbls 45. Else 46. lblScreen="ERR" 47. End If 48. Case 4 '输入统计数据 49. lstStatistic.AddItem lblScreen 50. dblSum=dblSum+Val(lblScreen) 51. dblAve=dblSum/lstStatistic.ListCount 52. lblScreen="0" 53. End Select 54. End Sub
程序说明:第7~19行是关闭统计计算功能。第21~29行是启动统计计算功能。启动统计计算功能时,计算器会展开一个列表控件,该列表控件可以查看已经输入的统计数据。第30~36行就是直接输出统计数据的和与平均数。第40~44行是通过For循环语句计算方差。第49行是将输入的统计数据在列表控件中列出来。第50~51行分别在数据输入的时候计算和,以及平均数。如此,在用户按下Sum和Ave按钮的时候直接将此处的结果显示出来,而不要使用循环语句重新计算。
与和计算和平均数计算不同,方差的计算是使用For循环语句实现的,而没有在数据输入时进行计算。原因是每次数据输入都可能导致平均数的变化,没有必要每次都要使用循环语句进行计算。
4.4.11 数据复制与粘贴
Windows系统自带的计算器在菜单栏中设计了“复制”与“粘贴”功能,实现计算结果的复制与计算数据的粘贴输入。本章通过弹出式菜单的形式,为计算器设计“复制”与“粘贴”功能。程序代码如程序清单4-14所示。
清单4-14数据编辑
1. Private Sub lblScreen_MouseDown(Button As Integer,_ 2. Shift As Integer,X As Single,Y As Single) 3. If Button=2 And optOn.Value=True Then 4. PopupMenu mnuEdit 5. End If 6. End Sub 7. 8. Private Sub mnuCopy_Click() 9. Clipboard.SetText lblScreen,vbCFRTF 10. End Sub 11. 12. Private Sub mnuPaste_Click() 13. lblScreen=Clipboard.GetText(vbCFRTF) 14. End Sub
程序说明:第1~6行是在屏幕上右击鼠标时,弹出“复制”与“粘贴”菜单,第8~10行是执行复制功能,第12~14行是执行粘贴功能。