20191318 《Python程序设计》实验二报告
课程:《Python程序设计》
班级: 1913
姓名: 王泽文
学号:20191318
实验教师:王志强
实验日期:2020年4月11日
必修/选修: 公选课
1. 实验内容
- 设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
- 考核基本语法、判定语句、循环语句、逻辑运算等知识点
2. 实验过程及结果
- 对于一个计算器,其拥有的功能很重要。因此,我首先想到的是实现加减乘除、求模和幂函数这几个简单的功能。这几个功能也比较简单,容易实现
代码如下
# 加法 def add(a, b): return a + b # 减法 def minus(a, b): return a - b # 乘法 def mul(a, b): return a * b # 除法 def div(a, b): if b == 0: print("Error") else: return a / b # 求模 def mod(a, b): return a % b # 幂运算 def power(a, b): return a ** b print("1:加法 2:减法 3:乘法 4:除法 5:求模 6:幂运算 ") s = int(input("请输入运算方法:")) n1 = float(input("请输入第一个数:")) n2 = float(input("请输入第二个数:")) print("结果为:") if s == 1: print(add(n1, n2)) if s == 2: print(minus(n1, n2)) if s == 3: print(mul(n1, n2)) if s == 4: print(div(n1, n2)) if s == 5: print(mod(n1, n2)) if s == 6: print(power(n1, n2))
一个拥有基本功能的计算器完成了。
效果如图
- 在实现计算器的基本功能后,我继续思考,能不能进行多次计算,即计算一段表达式。于是我进行上网查询,发现可以使用
eval()
函数来进行运算,但也了解到eval()
函数的使用可能会有安全性的问题。
代码如下
# 表达式运算 def test(date): result = eval(date) return result print("支持加减乘除和求模(%)与幂函数(**) 示例:3+4-(3-2)**2") m = input("请输入表达式:") print("结果为:", test(m))
效果如图
- 作为一个理科生,仅有简单的计算功能怎么能满足呢,于是,我想加入一些高级的功能,如三角函数、开方等。而这些更高级的功能,简单的代码已经很难实现,于是,就要引入Python中的
math
函数库。
代码如下
import math print("1:对数函数 2:开方 3:向下取整 4:向上取整 5:弧度转换角度 6:角度转换弧度 7:正弦函数 8:余弦函数 9:正切函数 10:最大公约数") s = int(input("请输入运算方法:")) if s == 1: print("对数运算") n3 = float(input("请输入运算数:")) n4 = float(input("请输入底数:")) print("结果为:", math.log(n3, n4)) elif s == 10: print("最大公约数") n5 = float(input("请输入第一个运算数:")) n6 = float(input("请输入第二个运算数:")) print("结果为:", math.gcd(n5, n6)) elif 2 <= s <= 9: n7 = float(input("请输入运算数(三角函数仅输入弧度制pi前的系数):")) if s == 2: print("开方运算 结果为:", math.sqrt(n7)) if s == 3: print("向下取整 结果为:", math.trunc(n7)) if s == 4: print("向上取整 结果为:", math.ceil(n7)) if s == 5: print("弧度转换角度 结果为:", math.degrees(n7)) if s == 6: print("角度转换弧度 结果为:", math.radians(n7)) if s == 7: print("正弦函数 结果为:", math.sin(math.pi*n7)) if s == 8: print("余弦函数 结果为:", math.cos(math.pi*n7)) if s == 9: print("正切函数 结果为:", math.tan(math.pi*n7))
效果如图
- 所需功能均已实现,接下来就是整合到一起了,使用
while
循环实现计算器的多次使用,再用if语句进行功能选择。
当需要退出时使用break
elif i == 0: break
代码如下
while True:
print("计算器")
i = int(input("基本运算输1,表达式运算输2,高级功能输3,输0退出
请输入:"))
if i == 1:
print("1:加法 2:减法 3:乘法 4:除法 5:求模 6:幂运算
")
s = int(input("请输入运算方法:"))
n1 = float(input("请输入第一个数:"))
n2 = float(input("请输入第二个数:"))
print("结果为:")
if s == 1:
print(add(n1, n2))
if s == 2:
print(minus(n1, n2))
if s == 3:
print(mul(n1, n2))
if s == 4:
print(div(n1, n2))
if s == 5:
print(mod(n1, n2))
if s == 6:
print(power(n1, n2))
elif i == 2:
print("支持加减乘除和求模(%)与幂函数(**)
示例:3+4-(3-2)**2")
m = input("请输入表达式:")
print("结果为:", test(m))
elif i == 3:
print("1:对数函数 2:开方 3:向下取整 4:向上取整 5:弧度转换角度 6:角度转换弧度 7:正弦函数 8:余弦函数 9:正切函数 10:最大公约数")
s = int(input("请输入运算方法:"))
if s == 1:
print("对数运算")
n3 = float(input("请输入运算数:"))
n4 = float(input("请输入底数:"))
print("结果为:", math.log(n3, n4))
elif s == 10:
print("最大公约数")
n5 = float(input("请输入第一个运算数:"))
n6 = float(input("请输入第二个运算数:"))
print("结果为:", math.gcd(n5, n6))
elif 2 <= s <= 9:
n7 = float(input("请输入运算数(三角函数仅输入弧度制pi前的系数):"))
if s == 2:
print("开方运算
结果为:", math.sqrt(n7))
if s == 3:
print("向下取整
结果为:", math.trunc(n7))
if s == 4:
print("向上取整
结果为:", math.ceil(n7))
if s == 5:
print("弧度转换角度
结果为:", math.degrees(n7))
if s == 6:
print("角度转换弧度
结果为:", math.radians(n7))
if s == 7:
print("正弦函数
结果为:", math.sin(math.pi*n7))
if s == 8:
print("余弦函数
结果为:", math.cos(math.pi*n7))
if s == 9:
print("正切函数
结果为:", math.tan(math.pi*n7))
elif i == 0:
break
效果如图
代码链接
- 在实现想要的功能后,我还想让我的计算器更加美观,于是我加入窗口化的运行。
- 引入
tkinter
进行窗口化设计。在窗口化时简单的功能可以合并到表达式的计算中去。
- 高级功能整合到菜单栏或新开一个窗口
- 一个计算器的编写就完成了
代码链接https://gitee.com/python_programming/wzw20191318/blob/2d5c7ef6ddf562d44afaf4bc7c6525afd921511b/计算器gui.py
3. 实验过程中遇到的问题和解决过程
- 计算三角函数时为弧度制,使用不方便
解决方法:在计算时引入
math.pi
进行处理
- 在使用
eval()
函数时能运行命令行,有安全风险
解决方法:在调用函数前先检查是否有非法字符
- 在tkinter中设置按钮时无法正常调用函数
解决方法:在要调用的函数前再用
lambda:
调用b1 = ttk.Button(win0, text='关闭', command=lambda: win0.destroy()) b1.grid(column=0, row=1)
4. 思考和感悟
- 在编写代码之前要对自己希望实现的功能和效果有大致的认识,逻辑也需要较为清楚。
参考资料
math库学习https://www.cnblogs.com/xiaoyh/p/9791670.html
https://blog.csdn.net/weixin_42795087/article/details/89931944
https://www.cnblogs.com/mxh1099/p/5386529.html