软件工程实践作业1-计算器


作业基本信息

这个作业属于哪个课程https://bbs.csdn.net/forums/ssynkqtd-05
这个作业要求在哪里https://bbs.csdn.net/topics/617294583
这个作业的目标实现一个具有图形化界面的计算器
学号102102154
姓名董奇

Gitcode项目地址

https://gitcode.net/2303_79914559/project1

PSP表格

PSP预估耗时(分钟)实际耗时(分钟)
计划2030
•估计这个任务需要多少时间2030
开发460580
•需求分析1520
•生成设计文档2530
•设计复审2020
•代码规范2020
•具体设计5060
•具体编码150180
•代码复审3050
•测试150200
报告80110
•测试报告4060
•计算工作量1010
•事后总结,并提出过程改进计划3040
合计560720

解题思路描述

1.语言选择:
本次作业要求的实现一个具有图形化界面的计算器,考虑到UI布局,便利性等多方面需求后,决定选择有丰富的库支持的Python
2.编程思路:
可以导入tkinter和math模块分别用于创建图形界面和进行数学运算,然后可以创建一个display对象,用于用户输入和输出…

代码和功能展示

代码

import tkinter as tk
import math

window = tk.Tk()
window.title("计算器")
window.geometry("300x500")

display = tk.Entry(window, font=("Arial", 20), justify="right")
display.pack(fill="x", padx=10, pady=10)

current_input = ""

def update_display():
   global display, current_input
   display.delete(0, "end")
   display.insert(0, current_input)

def on_number_click(number):
   global current_input
   current_input += str(number)
   update_display()

def on_operator_click(operator):
   global current_input
   if current_input and not current_input[-1] in "+-*/^":
       current_input += operator
       update_display()


def on_dot_click():
   global current_input
   if not current_input or current_input[-1] in "+-*/^":
       current_input += "0."
   elif "." not in current_input:
       current_input += "."
   update_display()

def on_clear_click():
   global current_input
   current_input = ""
   update_display()

def on_delete_click():
   global current_input
   if current_input:
       current_input = current_input[:-1]
       update_display()

def on_equal_click():
   global current_input
   if current_input and not current_input[-1] in "+-*/^":
       try:
           expression = current_input.replace("^", "**")
           result = round(eval(expression), 2)
           current_input = str(result)
           update_display()
       except:
           current_input = ""
           display.delete(0, "end")
           display.insert(0, "错误")

def on_bracket_click(bracket):
   global current_input
   current_input+=bracket
   update_display()

def on_trig_click(trig):
   global current_input
   current_input += trig+'('
   update_display()

button_frame = tk.Frame(window)
button_frame.pack(fill="both", expand=True)

buttons = [
   ("C", on_clear_click),
   ("DEL", on_delete_click),
   ("(", lambda:on_bracket_click('(')),
   (")", lambda:on_bracket_click(')')),
   ("7", lambda: on_number_click(7)),
   ("8", lambda: on_number_click(8)),
   ("9", lambda: on_number_click(9)),
   ("/", lambda: on_operator_click("/")),
   ("4", lambda: on_number_click(4)),
   ("5", lambda: on_number_click(5)),
   ("6", lambda: on_number_click(6)),
   ("*", lambda: on_operator_click("*")),
   ("1", lambda: on_number_click(1)),
   ("2", lambda: on_number_click(2)),
   ("3", lambda: on_number_click(3)),
   ("-", lambda: on_operator_click("-")),
   (".", on_dot_click),
   ("0", lambda: on_number_click(0)),
   ("=", on_equal_click),
   ("+", lambda: on_operator_click("+")),
   ("sin", lambda: on_trig_click("math.sin")),
   ("cos", lambda: on_trig_click("math.cos")),
   ("tan", lambda: on_trig_click("math.tan")),
   ("^", lambda: on_operator_click("^"))
]

row = 0
col = 0

for text, func in buttons:

   button = tk.Button(button_frame, text=text, font=("Arial", 15), width=5, height=2, bg="white", fg="black",
                      command=lambda f=func: f())

   button.grid(row=row, column=col, padx=5, pady=5)

   col += 1
   if col == 4:
       row += 1
       col = 0

window.mainloop()

功能展示

①加减乘除:
在这里插入图片描述
②三角函数和次方:
在这里插入图片描述

性能改进

第一版计算器无法进行三角函数和次方运算,并且无法让三角函数作为一个整体与其他数字一起进行加减乘除等计算,后续查阅资料,通过

单元测试

代码展示

import unittest
import calculator 

class TestCalculator(unittest.TestCase):

 def test_add(self):
       self.assertEqual(calculator.add(1, 2), 3.0)
       self.assertEqual(calculator.add(0, 0), 0.0)

  def test_subtract(self):
       self.assertEqual(calculator.subtract(5, 3), 2.0)
       self.assertEqual(calculator.subtract(0, 0), 0.0)

   def test_multiply(self):
       self.assertEqual(calculator.multiply(2, 4), 8.0)
       self.assertEqual(calculator.multiply(0, 0), 0.0)

   def test_divide(self):
       self.assertEqual(calculator.divide(10, 2), 5.0)
       self.assertEqual(calculator.divide(0, 1), 0.0)

if __name__ == "__main__":
   unittest.main()

异常处理

except:
           # 如果发生异常,则清空当前输入,并在显示框中显示"错误"
           current_input = ""
           display.delete(0, "end")
           display.insert(0, "错误")

效果展示:
在这里插入图片描述

心得体会

这次作业已经是一次相对简单的项目开发,但是仍旧花费了大量的时间。
本次经历让我切实体验了一次项目开发的全过程。通过这次的作业,真正体会到项目开发的不容易,开发过程中会遇到许许多多的错误,与一开始美好的设想会有很大的出入,编程的思路也会随着查阅资料的过程不断改变,不断优化。
在这次完成作业的过程中,学到了很多关于GUI编程以及用户交互的知识,受益良多,收获颇丰。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值