目录
作业基本信息
这个作业属于哪个课程 | 2301-计算机学院-软件工程 |
这个作业要求在哪里 | 软件工程实践第一次作业 |
这个作业的目标 | 完成一个具有可视化界面的计算器。 |
Gitcode项目地址 | 软工第一次作业 |
其他参考文献 | 单元测试和回归测试 |
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 15 | 15 |
• Estimate | • 估计这个任务需要多少时间 | 1370 | 1465 |
Development | 开发 | 150 | 250 |
• Analysis | • 需求分析 (包括学习新技术) | 90 | 90 |
• Design Spec | • 生成设计文档 | 15 | 15 |
• Design Review | • 设计复审 | 15 | 15 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 25 |
• Design | • 具体设计 | 100 | 130 |
• Coding | • 具体编码 | 200 | 160 |
• Code Review | • 代码复审 | 200 | 170 |
• Test | • 测试(自我测试,修改代码,提交修改) | 150 | 150 |
Reporting | 报告 | 150 | 180 |
• Test Repor | • 测试报告 | 200 | 200 |
• Size Measurement | • 计算工作量 | 50 | 50 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 15 | 15 |
合计 | 1370 | 1465 |
功能实现
1.基础计算功能
- 加减乘除,清除,退格
2.特殊附加功能
- 弧度角度转换
- 三角函数
- 反三角函数
- 幂运算,开根号
- 阶乘
解题思路描述
相比于HTML、CSS,我本次更倾向于使用Python语言完成此次任务,首先是对于Python比较熟悉,其次是Python提供的tkinter库功能强大,基本能够满足计算器可视化界面的功能要求,并且代码量并不大。思路包括以下几个关键步骤:
- 创建GUI界面:首先,使用tkinter库创建计算器的用户界面。通过创建窗口、输入框和各种按钮,来构建用户界面。
- 设计按钮和功能:决定计算器界面上需要哪些按钮,以及每个按钮的功能。这些按钮包括数字、基本运算符(加、减、乘、除)、特殊运算符(开根号、对数、幂运算)、三角函数、反三角函数、等号、清除按钮等。
- 按钮点击事件:为每个按钮定义点击事件处理函数。这些处理函数将根据按钮的不同执行不同的操作,如添加数字到输入框、执行计算、清除输入等。
- 计算逻辑:实现计算逻辑,包括解析用户输入的表达式、进行数学计算,并将结果显示在输入框中。本次作业使用Python的内置eval()函数来执行基本的数学运算,极大减少了代码量。
- 错误处理:添加错误处理机制,以处理用户可能输入的无效表达式或错误操作。使用try-except语句来捕获异常并显示错误消息。
- 美化界面:美化计算器界面,设置按钮颜色、字体样式、窗口大小等,以提高用户体验。
- 测试和调试:在编写完代码后,进行测试和调试,确保计算器的各个功能正常工作。
问题一 可视化界面设计(接口实现过程)
如何设计可视化界面?
-
创建主窗口:使用
tkinter
库创建一个主窗口,设置窗口的标题和大小。 -
输入框设计:在主窗口中创建一个输入框,用于显示用户输入的表达式和计算结果。设置输入框的样式、宽度和位置。
root = tk.Tk() root.title("non的计算器") # 设置背景颜色和字体 root.geometry('500x380+100+100') root.configure(bg='#f0f0f0') font_style = ("Helvetica", 20) result_var = tk.StringVar() result_var.set('') entry = tk.Entry(root, width=30, font=font_style, bd=10) entry.grid(row=0, column=0, columnspan=7, padx=10, pady=20)
-
按钮设计:设计各种按钮,包括数字按钮、运算符按钮、功能按钮(如等号、清除按钮)以及特殊功能按钮(如三角函数、对数、开根号、幂运算等)。按钮可以用
tk.Button
创建,设置按钮的文本、样式和点击事件。 -
布局管理:使用布局管理器(如
grid
、pack
、place
)来安排输入框和按钮的位置和大小。通常,数字按钮和运算符按钮可以使用网格布局排列,使界面整齐。设置按钮的颜色、字体样式、边框宽度等,以提高界面的可视吸引力。你可以使用font
、bg
、fg
等选项来自定义按钮的样式。#其余功能按钮 button_plus = tk.Button(root, text="+", command=lambda: click_button('+'), **button_style, bg='#ee82ee') button_minus = tk.Button(root, text="-", command=lambda: click_button('-'), **button_style, bg='#ee82ee') button_multiply = tk.Button(root, text="*", command=lambda: click_button('*'), **button_style, bg='#ee82ee') button_divide = tk.Button(root, text="/", command=lambda: click_button('/'), **button_style, bg='#ee82ee') button_dot = tk.Button(root, text=".", command=lambda: click_button('.'), **button_style, bg='#6495ed') button_clear = tk.Button(root, text="AC", command=clear_entry, **button_style, bg='#6495ed') button_equals = tk.Button(root, text="=", command=equals, **button_double_style, bg='#6495ed') button_sqrt = tk.Button(root, text="√", command=lambda: click_button('math.sqrt('), **button_style, bg='#e6e6fa') button_delete = tk.Button(root, text="DEL", command=delete_last_char, **button_style, bg='#6495ed') button_open_parenthesis = tk.Button(root, text="(", command=lambda: click_button('('), **button_style, bg='#6495ed') button_close_parenthesis = tk.Button(root, text=")", command=lambda: click_button(')'), **button_style, bg='#6495ed') button_sin = tk.Button(root, text="sin", command=lambda: click_button('math.sin('), **button_style, bg='#e6e6fa') button_cos = tk.Button(root, text="cos", command=lambda: click_button('math.cos('), **button_style, bg='#e6e6fa') button_tan = tk.Button(root, text="tan", command=lambda: click_button('math.tan('), **button_style, bg='#e6e6fa') button_pi = tk.Button(root, text="π", command=lambda: click_button('3.141592653589'), **button_style, bg='#6495ed') button_factorial = tk.Button(root, text="!", command=lambda: click_button('math.factorial('), **button_style, bg='#e6e6fa') button_e = tk.Button(root, text="e", command=lambda: click_button('2.718281828459'), **button_style, bg='#6495ed')
-
按钮事件绑定:为每个按钮绑定相应的点击事件处理函数。这些事件处理函数将在用户点击按钮时执行相应的操作,例如将按钮文本添加到输入框、执行计算、清除输入等。
lambda可以使我们在任何地方创建一个没有名字的单行函数。这个东西能在GUI里面帮到我们很大的忙,使我们的函数控制器能传递参数。
问题二 内在逻辑设计(接口实现过程)
如何设计内在逻辑?
-
按钮点击事件处理:为不同类型的按钮(数字、运算符、功能)分别编写事件处理函数。在这些函数中,根据按钮类型执行相应的操作。例如,数字按钮应将数字添加到输入框,运算符按钮应处理运算符的输入,功能按钮应执行特定的数学功能。
-
计算逻辑:设计计算逻辑,用于解析用户输入的表达式并执行数学运算。你可以使用Python的
eval()
函数来执行基本的数学运算,但要小心处理错误情况,例如用户输入无效表达式的情况。#使用equal函数 def equals(): entry.delete(0, tk.END) opt = result_var.get() try: result = eval(opt) result_var.set(str(result)) except: result = "ERROR" result_var.set(str(result)) entry.insert(tk.END, str(result))
-
错误处理:在计算逻辑中添加错误处理机制,以处理可能的异常情况。例如,如果用户输入无效表达式,可以弹出错误消息框。
-
特殊功能实现:对于包含三角函数、对数、幂运算、开根号等特殊功能,需要编写相应的数学函数或调用Python的数学库来实现这些功能。
-
结果显示:将计算结果显示在输入框中,以便用户查看。结果应在计算完成后更新。
-
清除功能:实现清除按钮的功能,允许用户清除输入框的内容。
#清除输入栏
def clear_entry():
result_var.set('')
entry.delete(0, tk.END)
#清除输入的最后一个字符
def delete_last_char():
current_text = entry.get()
if current_text:
new_text = current_text[:-1]
entry.delete(0, tk.END)
entry.insert(tk.END, new_text)
关键代码已在上面展示,不再赘述,详情可见Gitcode。
程序的异常处理与亮点
使用try-except语句来捕获异常并显示错误消息。其错误信息包含多种情况:除数为0、左右括号不匹配等等,对不符合规范的计算表达式进行检查,提高了程序的性能。
try
...
except
...
程序的亮点在于对计算器的多功能基本达到,附加功能齐全,在实现加、减、乘、除、归零基本操作的基础上,进一步实现次方、幂、三角函数等操作,是具有科学计算的计算器。且可视化界面对用户十分友好,按键布局、质感较好,很符合一个计算器的形象。
单元测试
利用unittest
库进行单元测试,通常用 assertEqual()
等 assert
断言语句进行验证。
测试代码如下:
class Test(unittest.TestCase):
def test_one(self):
result_var.set('3+4-7+8*9-6/3')
equals()
self.assertEqual(result_var, '70')
def test_two(self):
result_var.set('math.sin(pi)')
equals()
self.assertEqual(result_var, '0')
def test_three(self):
result_var.set('pow(2,10)')
equals()
self.assertEqual(result_var, '1024')
def test_multiplication(self):
result_var.set('math.sqrt(2*2)')
equals()
self.assertEqual(result_var, '2.0')
if __name__ == '__main__':
unittest.main()
分四个测试点进行测试,得到如下测试结果:
心得体会
这次我是第一次接触到开发这种具有可视化界面的程序软件,收获很多。开发的方式有很多种,开发语言也不尽相同,因此要在开始着手之前计划好使用哪种方案和开发软件。在开始编写代码之前,确保你对计算器的需求有清晰明确的了解。不同的计算器可能有不同的功能,所以要确保你知道你要开发的计算器需要支持哪些操作。计算器通常涉及到数学运算,因此可以利用Python的数学库(如math
模块)来简化数学计算的实现。最好使用手头可以直接用的,比较好上手的库函数或者软件,可以减少代码量,提高程序效率。