20191113 2019-2020-2 《Python程序设计》实验二报告
课程:《Python程序设计》
班级:1911
姓名:林紫欣
学号:20191113
实验教师:王志强
实验日期:2020年4月12日
必修/选修: 公选课
1.实验内容
- 设计并完成一个完整的应用程序——计算器。包含:
- 简单四则运算
- 取模运算
- 求简单三角函数
- 求一个数的n次方
- 求一个数的阶乘
- 解一元二次方程(复数域上)
- 统计运算(包括求和、平均值、极差、方差、标准差)
- 练习基本语法、判定语句、循环语句、逻辑运算等知识
2. 实验过程及结果
明确目的
参考手中所拥有的高级计算器,按照自己的能力水平确定所要做的计算器包含的功能。
-
简单四则运算
混合四则运算难度系数过大,目前对知识掌握的熟练程度并不能支持我进行编程。
-
取模运算
-
求简单三角函数
-
求一个数的n次方
-
求一个数的阶乘
-
解一元二次方程(复数域上)
-
统计运算(包括求和、平均值、极差、方差、标准差)
设计思路
选择将各种逻辑运算编辑成为函数,最后进行整体的计算机框架组装。
由于期望所编程序略智能化、有良好的用户体验,在输入错误数据时给予提示,并且能够使用户重新输入而非从头开始。while语法的使用不可避免。
同时,运行计算器之后将会进行相关功能选择,if 语句亦是常用的大头。
-
简单三角函数运算
日常输入常以角度为主,Python算法要求弧度制,需先将输入角度化为弧度制,后进行计算。
-
解一元二次方程
在复数域上解一元二次方程包含了实数域上解一元二次方程,但因表示法的不同,应把二者区分开来。
-
统计运算
统计运算中求和作为求平均值的基础,求方差作为求标准差的基础。可以适当进行排序,以求简化计算。
编码、调试、运行过程
简单四则运算
- 最初版本,将每一个运算写成函数,再在计算器框架内进行调用,但这样造成代码冗余,没有必要。
def add(a,b): # 加法运算
return a+b
def sub(a,b): # 减法运算
return a-b
def mul(a,b): # 乘法运算
return a*b
def div(a,b): # 除法运算,使用前需判断除数是否为0
return a/b
- 加强版本,改进了初级版的缺点,但是还是没法给用户较好的体验,如果输错功能数字则需从初始界面开始。
def ari():
print("1.二元加法运算\n2.二元减法运算\n3.二元乘法运算\n4.二元除法运算\n")
temp = int(input("请依照所要使用的功能输入相应的数字序号:"))
if temp == 1 or temp == 2 or temp == 3:
x = float(input("请输入第一个操作数:"))
y = float(input("请输入第二个操作数:"))
if temp == 1:
print(x + y)
elif temp == 2:
print(x - y)
else:
print(x * y)
elif temp == 4:
x = float(input("请输入被除数:"))
y = float(input("请输入除数:"))
while y == 0:
print("输入错误!除数不能为0!")
y = float(input("请重新输入除数:"))
print(x / y)
- 最终版,添加了while循环,解决如果输入的相应功能数字有误的问题。
def ari():
'''四则运算'''
print("1.二元加法运算\n2.二元减法运算\n3.二元乘法运算\n4.二元除法运算\n")
temp = 233
while temp != 1 and temp != 2 and temp != 3 and temp != 4:
temp = int(input("请依照所要使用的功能输入相应的数字序号:"))
if temp == 1 or temp == 2 or temp == 3:
x = float(input("请输入第一个操作数:"))
y = float(input("请输入第二个操作数:"))
if temp == 1:
print(x + y)
elif temp == 2:
print(x - y)
else:
print(x * y)
elif temp == 4:
x = float(input("请输入被除数:"))
y = float(input("请输入除数:"))
while y == 0:
print("输入错误!除数不能为0!")
y = float(input("请重新输入除数:"))
print(x / y)
else:
print("相应功能数字序号输入有误!")
print("1.二元加法运算\n2.二元减法运算\n3.二元乘法运算\n4.二元除法运算\n")
- 运行结果展示
取模运算
- 汲取了四则运算的教训,加上运算简单,编起来很是容易。
def mol():
'''取模运算'''
x = int(input("请输入整数被除数:"))
y = int(input("请输入整数除数:"))
while y == 0:
print("输入错误!除数不能为0!")
y = int(input("请重新输入整数除数:"))
print(x % y)
- 运行结果展示
求简单的三角函数
- 将六种运算分为两类,先以sin和asin为例,打出简单的代码,进行运行调试。
import math
x = float(input("请以角度制输入角度:"))
x = x/180 * math.pi
print(math.sin(x))
x = float(input("请输入相应数值:"))
print('%.2f' % math.degrees(math.asin(x)))
- 以sin和asin的相关代码为模板,进行组装,最后类似简单四则运算进行填充。
def act():
'''求简单三角函数'''
print("\n1.求正弦\n2.求余弦\n3.求正切\n4.求反正弦\n5.求反余弦\n6.求反正切")
temp = 233
while temp != '1' and temp != '2' and temp != '3' and temp != '4' and temp != '5' and temp != '6':
temp = input("请依照所要使用的功能输入相应的数字序号:")
if temp == '1' or temp == '2' or temp == '3':
x = float(input("请以角度制输入角度:"))
x = x / 180 * math.pi
if temp == '1':
print('%.2f' %math.sin(x))
elif temp == '2':
print('%.2f' %math.cos(x))
elif temp == '3':
print('%.2f' %math.tan(x))
elif temp == '4' or temp == '5' or temp == '6':
x = float(input("请输入相应数值,答案将以角度制呈现:"))
if temp == '4':
if -1 <= x and x <= 1:
print('%.2f' % math.degrees(math.asin(x)))
else:
print("无解!")
elif temp == '5':
x = float(input("请输入相应数值(-1≤x≤1):"))
if -1 <= x and x <= 1:
print('%.2f' % math.degrees(math.acos(x)))
else:
print("无解!")
elif temp == '6':
x = float(input("请输入相应数值:"))
print('%.2f' % math.degrees(math.atan(x)))
else:
print("相应功能数字序号输入有误!")
- 运行结果展示
求一个数的n次方
- 和取模运算一样代码简单,编码过程中并没有遇到障碍。
def nqo():
'''求一个数的n次方'''
a = float(input("请输入底数:"))
while a == 0:
print("输入错误!底数不能为0!")
a = int(input("请重新输入底数:"))
n = float(input("请输入指数:"))
print(math.pow(a,n))
- 运行结果展示
求一个数的阶乘
- 一开始不知道有相关的阶乘函数,对其进行了如下编码。
def fac(n): # 阶乘运算
t = 1
for i in range(1,n+1):
t = t * i
return t
- 发现math库里头的函数又多又实用,对阶乘运算进行重新编码。
def fac():
'''求一个数的阶乘 '''
n = int(input("请输入一个整数:"))
print(math.factorial(n))
- 运行结果展示
解一元二次方程
- 解一元二次方程由于不同情况输出不同的值,在这里用了返回值语句,本打算在计算框架中使用输出语句,但意外的发现,返回值可以直接输出。因此对在返回值行对返回结果进行了格式设置。
def qua():
'''解一元二次方程'''
print('*' * 7 + "解一元二次方程 ax^2 + bx + c = 0" + '*' * 7)
a = float(input("请输入a:"))
b = float(input("请输入b:"))
c = float(input("请输入c:"))
d = b*b - 4*a*c
if d>=0:
x1 = (-b+math.sqrt(d)) / (2*a)
x2 = (-b-math.sqrt(d)) / (2*a)
if d==0:
return "有唯一的解:X = "+str(x1)
else:
return "X1 = "+str(x1)+'\t'+"X2 = "+str(x2)
else:
x1 = str(-b/(2*a)) + '+' + str(math.sqrt(-d)/(2*a)) + 'i'
x2 = str(-b/(2*a)) + '-' + str(math.sqrt(-d)/(2*a)) + 'i'
return "X1 = "+x1+'\t'+"X2 = "+x2
- 运行结果展示
统计运算
- 为了进行数据的存储使用了列表,为了对数据进行计算,使用了for 循环。
x = int(input("输入数据个数:"))
y = []
print("请输入数据:")
for i in range(x):
temp = [float(input())]
y += temp
- 按照先前所分析的思路将代码编码出,并结合需要编码相关提示语句与循环结构。
def sta():
'''统计运算'''
x = int(input("输入数据个数:"))
y = []
print("请输入数据:")
for i in range(x):
temp = [float(input())]
y += temp
print("\n1.求和\n2.求平均值\n3.求极差\n4.求方差\n5.求标准差")
temp = 233
while temp != '1' and temp != '2' and temp != '3' and temp != '4' and temp != '5':
temp = input("请依照所要使用的功能输入相应的数字序号:")
s = 0
for i in range(x):
s = s + y[i]
var = 0
for i in range(x):
var = var + (s / x - y[i]) ** 2
var = var / x
if temp == '1':
print(s)
elif temp == '2':
print(s / x)
elif temp == '3':
print(max(y) - min(y))
elif temp == '4':
print(var)
elif temp == '5':
print(math.sqrt(var))
else:
print("相应功能数字序号输入有误!")
- 运行结果展示
计算器框架编码
- 对以上函数进行组装,并加入相关提示语句。为循环,加入while语句,并以“-1”作为程序结束标志。
#计算机功能框架
print('*'*5+"欢迎使用计算器!"+'*'*5)
print("本计算器提供的功能有:")
print("1.简单二元四则运算")
print("2.取模运算")
print("3.求简单三角函数")
print("4.求一个数的n次方")
print("5.求一个数的阶乘")
print("6.解一元二次方程")
print("7.统计运算")
print("-1.退出程序")
t = 233
while t!='-1':
t = input("\n请依照所要使用的功能输入相应的数字序号:")
if t=='1':
ari()
elif t=='2':
mol()
elif t=='3':
act()
elif t=='4':
nqo()
elif t=='5':
fac()
elif t=='6':
print(qua())
elif t=='7':
sta()
elif t=='-1':
exit(0)
else:
print("相应功能数字序号输入有误!")
print("\n是否再次计算?")
print("本计算器提供的功能有:")
print("1.二元四则运算")
print("2.取模运算")
print("3.求简单三角函数")
print("4.求一个数的n次方")
print("5.求一个数的阶乘")
print("6.解一元二次方程")
print("7.统计运算")
print("-1.退出程序")
- 运行结果展示
- 循环
- 终止
完整代码展示——码云地址
3. 实验过程中遇到的问题和解决过程
-
问题1:对math.degrees的用法并不熟悉,导致使用错误。
问题1解决方案:查阅相关资料,得知这个函数的用法:从弧度制转化为角度制。若要使角度制变为弧度制应该 x = x/180 * math.pi
-
问题2:在进行求简单三角函数代码编写时,展现出的答案格式不够美观;同时反三角函数类有些答案不对。
问题2解决方案:对答案进行格式限制,同时在输入提示语句中加入输入数值大小限制,同时若输入的数值不在提供范围内,输出“无解!”。
-
问题3:计算器循环结构若想终止,总会将“是否再次运行……”之类不想让其输出的信息输出。
-
问题3解决方案:在结构框架中加入
elif t=='-1': exit(0)
其他(感悟、思考等)
- 编码代码是学习一门特别有效的方法,应用使得所有死在纸面上的知识鲜活起来,使得学习更有获得感。
- 每一个程序的设计都需要不断的测试与改进。纵使只是一个小小的计算器程序也有许多东西需要考虑,需要涉及。
- 每次编程前都应该对目的、思路进行一个具体的描述与设计,这样可以保证编程的顺利与相对高效。