(vb课程设计)表达式计算器设计报告
表达式计算器课程设计报告,VB, 编号,21
表达式计算器设计报告
学院 材料学院
材料074班 学号 072018 姓名 姜枭特 成绩
一、设计思路
1.要达到的目的
?输入一个简单的四则运算公式,能够正确进行运算并输出最后结果。
?支持运算符的优先级,对于同一级别运算,按先算左边,后算右边的顺序。
?支持平方、多种常用数学函数的混合运算。
?支持对括号的运算处理,包括多括号及括号嵌套。
?能够输出详细的运算过程及每一步运算的结果。
2.关键问题的解决
?建立一个名为f1的函数,单独对一个只含四则运算符以及平方符号的表达式进行运算,其值作为f1的值。 ?在函数中先设置一个数组D()分离操作数和运算符,并分别储存。
?通过Mid函数和if语句判断”-“是负数含义还是减法运算符含义,同时处理了”+-*/^”与”-“放在一起的情况。 根据各运算符的优先级通过DO循环分别计算结果,并重新整理数组并储存,最后做加减运算,并实现对于
。 同一级别运算,先算左边,后算右边,最后将值赋给f1
?再建立一个名为f2的函数,进行括号运算操作,通过Instr和InstrRev函数以及Mid函数提取出括号内的函数,建立新的表达式,再调用f1计算新表达式的值。通过以上循环实现多括号以及括号嵌套的运算。 ?通过DO循环,利用Instr、Mid函数提取函数括号内的表达式,调用f1进行计算,再将其值进行函数运算,再将运算值与其他部分拼接,实现abs()、sqr()等多函数的计算。
?通过ListBox控件,用多个AddItem语句实现各运算步骤的详细输出。
?通过查找和判断进行边界情况的讨论,使其更加人性化。
二、模块之间的调用关系,或程序流程图
表达式计算器课程设计报告,VB, 编号,21
用户输入表达式
查找数学函数 输出
ListBox 调用f1函数
ListBox 得到新的表达式 输出
查找完毕
调用f2函数
ListBox 输出 查找括号并调用f1函数
得到新的表达式
得到结果
三、部分程序关键源代码及注释
Public Function f1(ByVal Exp As String) As String '构造函数对只含四则运算符以及平方符号的表达式进行运算
Dim a As Integer, Num As Integer, D() As String, b As String, i As Integer, p As Integer, k As Integer
p = 0 '原符号位
Num = 0
b = Exp
For i = 2 To Len(b)
Select Case Mid(b, i, 1)
Case "+", "-", "*", "/", "^" '如果当前位和原符号位相邻,则判断为负数,而不是减法运算符
If i - p > 1 Then
Num = Num + 2
ReDim Preserve D(0 To Num) '分离操作数和运算符
D(Num - 1) = Mid(b, p + 1, i - p - 1)
D(Num) = Mid(Exp, i, 1)
p = i
Else
If Mid(b, i, 1) <> "-" Then
f1 = "F" '标记”F”,使ListBox显示"非法表达式,请重新输入"
Exit Function
End If
End If
Case Else
End Select
Next i
Num = Num + 1
表达式计算器课程设计报告,VB, 编号,21
ReDim Preserve D(0 To Num) '储存最后一项
D(Num) = Mid(b, p + 1)
'先计算平方:
Do
a = 0 '记录算式中有无平方号
For i = 2 To Num - 1 Step 2
If D(i) = "^" Then
If D(i - 1) < 0 Then
D(i - 1) = "-" & CStr(Val(D(i - 1)) ^ Val(D(i + 1)))
Else
D(i - 1) = CStr(Val(D(i - 1)) ^ Val(D(i + 1)))
End If
Num = Num – 2 '整理
For k = i To Num
D(k) = D(k + 2)
Next
u = "" '输出计算步骤
For j = 1 To Num
u = u & D(j)
Next
List1.AddItem CStr(u)
a = 1
Exit For
End If
Next
Loop Until a = 0
再计算乘除:
Do
a = 0 '记录算式中有无乘除号
For i = 2 To Num - 1 Step 2
If D(i) = "*" Or D(i) = "/" Then
If D(i) = "*" Then
D(i - 1) = CStr(Val(D(i - 1)) * Val(D(i + 1)))
End If
If D(i) = "/" Then
If Val(D(i + 1)) <> 0 Then
D(i - 1) = CStr(Val(D(i - 1)) / Val(D(i + 1)))
Else '除数为零
f1 = "F"
Exit Function
End If
End If
Num = Num – 2 '整理
For k = i To Num
D(k) = D(k + 2)
Next
e = ""
表达式计算器课程设计报告,VB, 编号,21
For j = 1 To Num
e = e & D(j)
Next
List1.AddItem CStr(e)
a = 1
Exit For
End If
Next
Loop Until a = 0
'做加减运算:
If Num > 1 Then
For i = 2 To Num Step 2
If D(i) = "+" Then
D(1) = CStr(Val(D(1)) + Val(D(i + 1)))
x = D(1)
For j = i + 2 To Num
x = x & D(j)
Next
List1.AddItem CStr(x)
Else
D(1) = CStr(Val(D(1)) - Val(D(i + 1)))
x = D(1)
For j = i + 2 To Num
x = x & D(j)
Next
List1.AddItem CStr(x)
End If
Next
End If
f1 = D(1)
Public Function f2(ByVal Exp As String) As String '构造函数,处理括号内的运算
Dim a As Integer, c As String, b As String, p1 As Integer, p2 As Integer
b = Exp
Do
p1 = InStrRev(b, "(", -1, vbTextCompare)
If p1 > 0 Then
p2 = InStr(p1, b, ")", vbTextCompare)
If p2 > p1 Then
If p1 > 1 Then
Select Case Mid(b, p1 - 1, 1)
Case "+", "-", "*", "/", "^", "(" '讨论边界情况
a = 1
Case Else
f2 = "F"
Exit Function
End Select
End If
表达式计算器课程设计报告,VB, 编号,21
If p2 < Len(b) Then
Select Case Mid(b, p2 + 1, 1)
Case "+", "-", "*", "/", "^", ")" '讨论边界情况
a = 1
Case Else
f2 = "F"
Exit Function
End Select
End If
c = Mid(b, p1 + 1, p2 - p1 - 1) '提取括号内的表达式
c = f1(c) '计算括号内的表达式的值
If c <> "F" Then
b = Left$(b, p1 - 1) + c + Mid$(b, p2 + 1) '构造新的表达式
Else '非法表达式
f2 = "F"
Exit Function
End If
Else '括号不配对
f2 = "F"
Exit Function
End If
Else
a = 0
End If
Loop Until a = 0
f2 = f1(b)
End Function
计算几种常用函数:
Do
c = 0
p = InStr(1, Text1.Text, "abs", vbTextCompare)
If p <> 0 Then
m = InStr(p, Text1.Text, ")", vbTextCompare)
n = Mid(Text1.Text, p + 4, m - p - 4) '提取函数括号内的表达式 c = f1(n) '调用f1计算
q = Abs(c)
Text1.Text = Left$(Text1.Text, p - 1) & q & Mid$(Text1.Text, m + 1)
List1.AddItem CStr(Text1.Text) '输出步骤
Else
c = 1
End If
Loop Until c = 1
输出:
If f2(Text1.Text) = "F" Then List1.AddItem "非法表达式,请重新输入"
Else
List1.Clear
表达式计算器课程设计报告,VB, 编号,21 Text2.Text = f2(Text1.Text)
End If
If Text1.Text = "" Then
List1.AddItem "请输入表达式", 0
End If
四、设计
的完善及目前存在的问题
1(设计方案要完善的地方
?更多的特殊情况需要讨论,如不完整的表达式以及中文的判别。
?函数括号内的表达式能支持更加复杂的表达式。
?能支持更多的数学函数和运算符。
?界面应该更加人性化。
2. 目前存在的问题
?对有些不完整表达式不能进行很好的判断。
?函数括号内的表达式不能带有括号,不能函数嵌套。
?只支持特定的数学函数。
五、本次设计的收获及心得体会
?本次设计更多的还是基于课本上的知识,所以学好课本上的知识才是硬道理。 ?虽然课题的难度较大,但只要充分发挥人的主观能动性,专心思考问题,还是能找到出路的。 ?查阅相关资料,请教老师及同学,从中都能获得知识和经验,而且省下了不少时间。 ?更重要的是在设计中一些掌握了比较深层的技术和技巧,能举一反三,为以后的应用做好准备。 ?及时发现自己的不足,以后应更加努力,多涉及编程的领域,掌握一门相关的技术。 六、对该题目和VB设计的意见和建议
1. 对该题目的意见和建议
本次题目所主要涉及的领域比较少,技术性比较单一,除了对字符串的操作比较耐人寻味以外,没有更加新颖和创新的方面,
所以本题目的扩展方向还有很多,能创新的地方还有不少。希望下次能对要求有所创新,比如对控件的使用,使其界面更加人性化,以及增设更多的功能。
2(对本次设计的意见和建议
1.VB设计时最好能提供更多有关的有针对性的书籍资料,以方便设计者在短期之内能有所建树。 2.由于时间的限制,限制了设计者更多的创新机会,如有条件,最好增加设计的时间。 3.增加学生和老师的交流,老师尽可能多的提供多种解决方案,既使设计者有路可寻,也能开阔视野。