第一次软件工程作业实践

计算器的设计

1.实验要求

这个作业属于哪个课程<2301-计算机学院-软件工程社区-CSDN社区云>
这个作业要求在哪里<软件工程实践第一次作业-CSDN社区>
这个作业的目标        

<

  1. 给出PSP表格
  2. 解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的过程。
  3. 设计与实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(展示出项目关键代码),并解释思路,以及独到之处。
  4. 程序性能改进。记录在改进程序性能上所花费的时间,描述你改进的思路。
  5. 单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。将单元测试得到的测试覆盖率截图,发表在博客中;描述应该如何优化覆盖率?
  6. 结合在构建之法中学习到的相关内容,撰写解决项目的心路历程与收获。
其他参考文献

​​​​​​

Python 基础实战100例·第4期:自制简易计算器_哔哩哔哩_bilibili

python语言基础--如何制作简易的计算器_哔哩哔哩_bilibili

花了一周终于整理好了!全网最全Python tkinter教程!包含所有知识点!轻松做出好看的tk程序!_哔哩哔哩_bilibil​​​​​​i

python(tkinter)案例教学:制作-计算器(上)界面编写_哔哩哔哩_bilibili
【Python】全网最干货 tkinter 开发案例合集,持续更新..._哔哩哔哩_bilibili
Python-Tkinter图形化界面设计(详细教程 )_tkinter界面设计-CSDN博客

 

【Python案例】Python tkinter 制作一个经典的登录界面和点击事件_python tkinter界面设计-CSDN博客
[Python] math库的使用_python math-CSDN博客
捋一捋Python中的数学运算math库(上篇)_雷学委的博客-CSDN博客


...............

 

2.解题思路

1.用tkinter添加各种按键

2.为数字赋予按键意义

3.添加等函数

4.添加清除一位以及全部清除函数

5.设置按键反馈,按下去的必须进行输出到结果栏

6.以上就是完成了一个简易计算器的程序

7.在简易计算器上面添加一个math库,为简易计算器添加各种按键,使之可以进行三角函数,乘方,开方的运算,让其变为一个科学计算器

3.关键代码展示

实现简易计算器功能

第一步,要先自定义一个计算器的背景,方便后边进行tkinker的按键添加

#102101117刘建鑫  简单计算器
import tkinter as tk

root=tk.Tk()
root.title('102101117计算器')#计算器名称
root.geometry('295x280+640+180')#边距,位置

root.attributes("-alpha",0.9)#设置透明度

font=('楷书',20)#设置字体
font_1=('宋体',16)#设置按键字体

第二步,添加结果栏

#显示最新状态,就是结果栏
result_num=tk.StringVar()
result_num.set('')#初始结果为空

tk.Label(root,
         textvariable=result_num, font=font, height=2,
         width=20,justify=tk.LEFT,anchor=tk.SE
         ).grid(row=1,column=1,columnspan=4
                )#网格布局

第三步,添加各种按键

#接下来是按键,总第二行
button_clear=tk.Button(root,text='AC',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#AC按键
button_back=tk.Button(root,text='<-',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#回退
button_chu=tk.Button(root,text='/',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#除
button_cheng=tk.Button(root,text='*',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#乘

#设置按键类型,按键位置以及按键间隔,第二行
button_clear.grid(row=2,column=1,padx=4,pady=2)
button_back.grid(row=2,column=2,padx=4,pady=2)
button_chu.grid(row=2,column=3,padx=4,pady=2)
button_cheng.grid(row=2,column=4,padx=4,pady=2)


#接下来是按键,总第三行
button_7=tk.Button(root,text='7',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#7按键
button_8=tk.Button(root,text='8',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#8
button_9=tk.Button(root,text='9',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#9
button_jian=tk.Button(root,text='-',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#-

#设置按键类型,按键位置以及按键间隔,总第三行
button_7.grid(row=3,column=1,padx=4,pady=2)
button_8.grid(row=3,column=2,padx=4,pady=2)
button_9.grid(row=3,column=3,padx=4,pady=2)
button_jian.grid(row=3,column=4,padx=4,pady=2)

#接下来是按键,总第四行
button_4=tk.Button(root,text='4',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#4按键
button_5=tk.Button(root,text='5',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#5
button_6=tk.Button(root,text='6',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#6
button_jia=tk.Button(root,text='+',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#+

#设置按键类型,按键位置以及按键间隔,总第四行
button_4.grid(row=4,column=1,padx=4,pady=2)
button_5.grid(row=4,column=2,padx=4,pady=2)
button_6.grid(row=4,column=3,padx=4,pady=2)
button_jia.grid(row=4,column=4,padx=4,pady=2)

#接下来是按键,总第五行
button_1=tk.Button(root,text='1',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#1按键
button_2=tk.Button(root,text='2',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#2
button_3=tk.Button(root,text='3',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#3
button_deng=tk.Button(root,text='=',width=5,height=3,font=font_1,relief=tk.FLAT,bg='#7FFF00')#=

#设置按键类型,按键位置以及按键间隔,总第五行
button_1.grid(row=5,column=1,padx=4,pady=2)
button_2.grid(row=5,column=2,padx=4,pady=2)
button_3.grid(row=5,column=3,padx=4,pady=2)
button_deng.grid(row=5,column=4,padx=4,pady=2,rowspan=2)

#接下来是按键,总第6行
button_0=tk.Button(root,text='0',width=12,font=font_1,relief=tk.FLAT,bg='#00FFFF')#0按键
button_dian=tk.Button(root,text='.',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#.

#设置按键类型,按键位置以及按键间隔,总第6行
button_0.grid(row=6,column=1,padx=4,pady=2,columnspan=2)
button_dian.grid(row=6,column=3,padx=4,pady=2)

完成上述部分,这个程序的雏形就出现了

第四步,添加按键函数

#添加按键函数
def click_button(x):
    print('x:\t',x)
    result_num.set(result_num.get()+x)#方便输入数据

#添加等函数
def deng():
    opt_str=result_num.get()
    result = eval(opt_str)
    result_num.set(str(result))

#添加全部清除函数
def clear():
    result_num.set('')

#添加清除一位函数
def back():
    current_text = result_num.get()
    result_num.set(current_text[:-1])

完成以上步骤,这个程序基本快做完了

第五步,设置按键反馈,将按键输入到结果栏

#设置按键响应
button_1.config(command=lambda:click_button('1'))
button_2.config(command=lambda:click_button('2'))
button_3.config(command=lambda:click_button('3'))
button_4.config(command=lambda:click_button('4'))
button_5.config(command=lambda:click_button('5'))
button_6.config(command=lambda:click_button('6'))
button_7.config(command=lambda:click_button('7'))
button_8.config(command=lambda:click_button('8'))
button_9.config(command=lambda:click_button('9'))
button_0.config(command=lambda:click_button('0'))
button_dian.config(command=lambda:click_button('.'))
button_jia.config(command=lambda:click_button('+'))
button_jian.config(command=lambda:click_button('-'))
button_cheng.config(command=lambda:click_button('*'))
button_chu.config(command=lambda:click_button('/'))

第六步,进行特殊按键的处理,比如清除键等于键,这种按键不会输出到结果栏但是会有相应的作用

#进行计算反馈
button_deng.config(command=deng)
button_clear.config(command=clear)
button_back.config(command=back)

完成以上步骤,这个简易计算器就实现了

实现科学计算器功能

第一步,将简易 计算器的代码复制过来,重新设置布局

#102101117刘建鑫  科学计算器
import tkinter as tk
import math#调用math库进行三角函数的计算

root = tk.Tk()
root.title('102101117计算器')  # 计算器名称
root.geometry('295x360+640+180')  # 边距,位置
root.attributes("-alpha", 0.9)  # 设置透明度

font = ('楷书', 20)  # 设置字体
font_1 = ('宋体', 16)  # 设置按键字体

# 显示最新状态,就是结果栏
result_num = tk.StringVar()
result_num.set('')  # 初始结果为空

tk.Label(
    root,
    textvariable=result_num,
    font=font,
    height=2,
    width=20,
    justify=tk.LEFT,
    anchor=tk.SE
).grid(row=1, column=1, columnspan=4)  # 网格布局

第二步,为sin,cos,tan等按键添加入简易计算器中,重新排布,使之变得美观

# 接下来是按键,总第3行
button_sin = tk.Button(root, text='sin', width=5, font=font_1, relief=tk.FLAT, bg='#7FFF00')  # sin
button_cos = tk.Button(root, text='cos', width=5, font=font_1, relief=tk.FLAT, bg='#7FFF00')  # cos
button_tan = tk.Button(root, text='tan', width=5, font=font_1, relief=tk.FLAT, bg='#7FFF00')  # tan
button_chu = tk.Button(root, text='/', width=5, font=font_1, relief=tk.FLAT, bg='#7FFF00')  # 除

# 设置按键类型,按键位置以及按键间隔,第3行
button_sin.grid(row=3, column=1, padx=4, pady=2)
button_cos.grid(row=3, column=2, padx=4, pady=2)
button_tan.grid(row=3, column=3, padx=4, pady=2)
button_chu.grid(row=3, column=4, padx=4, pady=2)

# 接下来是按键,总第4行
button_gen = tk.Button(root, text='√', width=12, font=font_1, relief=tk.FLAT, bg='#7FFF00')  # 开方根号
button_kai = tk.Button(root, text='平方', width=12, font=font_1, relief=tk.FLAT, bg='#7FFF00')  # 平方

第三步,为sin等新按键重新设计函数,使之对三角函数和pi进行特殊处理

    # 对三角函数和π进行特殊处理
    #检查是否为三角函数,并且将输入值转换为弧度
    if x in ['sin', 'cos', 'tan']:
        try:
            angle = float(current_text)
            if x == 'sin':
                result_num.set(math.sin(math.radians(angle)))
            elif x == 'cos':
                result_num.set(math.cos(math.radians(angle)))
            elif x == 'tan':
                result_num.set(math.tan(math.radians(angle)))
        except ValueError:
            result_num.set('Error')
    elif x == 'π':
        result_num.set(math.pi)#对pi进行处理,使pi为π
    elif x == '√':
        result_num.set(math.sqrt(float(current_text)))
    elif x == '平方':
        result_num.set(float(current_text) ** 2)
    else:
        result_num.set(current_text + str(x))  # 方便输入数据

第四步,为等函数添加error,这样是防止出现会报错的情况

# 添加等函数
def deng():
    opt_str = result_num.get()
    try:
        result = eval(opt_str)
        result_num.set(str(result))
    except Exception:#数据错误会输出error
        result_num.set('Error')

第五步,为新按键设置按键响应

button_sin.config(command=lambda: click_button('sin'))
button_cos.config(command=lambda: click_button('cos'))
button_tan.config(command=lambda: click_button('tan'))
button_pi.config(command=lambda: click_button('π'))
button_gen.config(command=lambda: click_button('√'))
button_kai.config(command=lambda: click_button('平方'))

其余保持不变,这样,一个简易计算器就转变为科学计算器了,多了计算三角函数,平方 ,开方的计算

4.效果展示

简易计算器展示

简易计算器

科学计算器效果展示

科学计算器

5.psp表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划10001300
• Estimate• 估计这个任务需要多少时间500450
Development开发8001000
• Analysis• 需求分析 (包括学习新技术)200300
• Design Spec• 生成设计文档100150
• Design Review• 设计复审6075
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)100100
• Design• 具体设计4060
• Coding• 具体编码300300
• Code Review• 代码复审6060
• Test• 测试(自我测试,修改代码,提交修改)80120
Reporting报告6090
• Test Repor• 测试报告5080
• Size Measurement• 计算工作量3050
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2045

合计10001500

7.性能改进

我这个程序代码有点繁琐,这个按钮在设计的时候其实好像是可以直接设计,把每一行的按钮符号都写出来好像也是可以的,这样可以减少代码量。

8.单元测试

暂时没学会,手动测试的结果显示没啥问题。

9.心路历程

刚开始我看到这个题目的时候,第一反应是想去找vs2022写一个MFC的一个c++代码,后面我就开始学习MFC,但是实在是太多了,我就把这个放弃了。后面又看到了使用windows窗口程序的c++程序,我这个vs不知道为啥不能创建c++的windows窗口程序,只能创建c#的,但是c#我都没学过这也放弃了;后面我又尝试了html+css+js,这个我也是从头开始学的,但是时间太赶了,如果我慢慢学肯定代码没法写。所以,我最后把目标转到python上边,这个有很多库函数可以使代码变得容易理解。所以后面我就慢慢查资料,看视频然后最后做了个python文件。毕竟这是第一次做项目,我看这个单元测试是真的看不懂,也不会写单元测试,只能自己手测一下,感觉没有什么大问题。

文件说是要把python打包成exe文件,我这个也找过了,说是要用命令行pip install pyinstall,但是我这个电脑根本用不了,所以这个打包文件就没有做,实在是不会做。只能说第一次做并没有什么经验,需要学习的地方还有很多,还需要继续努力。

10.github项目源代码

https://github.com/junfeibai/jisuanqi/blob/main/calculator.py(简易计算器)

https://github.com/junfeibai/jisuanqi/blob/main/Desmos.py(科学计算器)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值