用户:
e国阳光查看:0 回复:0 评论:0 创建时间:2021-01-22T00:49:07
【作品展示】

【作品介绍】
根据海伦-秦九韶公式编程计算三角形面积。公众号“学思营”发布。
【作品源代码】
'''
@免费在线学Python班招六、七、八年级学生,请关注“学思营”公众号后私信报名。
@作者 码老师
@微信公众号 学思营 ID:xuesying
@公司 深圳五行星软件有限公司
@日期 2021-1-20
问题:如果把边长都是有理数的三角形称作“有理三角形”,编程计算“有理三角形”的面积(有理数或带根号的无理数,不是浮点数)。
关键点分析:根号中的底化成最简分数,然后分子乘分母留在根号里,分母移到根号外。
第一步、输入三边,用两小边之和大于第三边来做判断数据的合法性。首先定义一个函数输入1个正分数(这样可以重复利用代码,减少代码长度):
'''
#根据海伦-秦九韶公式编程计算三角形面积
import math
from fractions import Fraction # 导入分数对象
def fractionInput(varName):
'''询问用户输入一个有理数,用分数表示
@varName type=str 变量名称,字符串
@return type=Fraction 返回值,分数'''
var = 0
while var <= 0: # 循环直到输入一个大于0的数
try:
var = Fraction(input("请输入大于0的整数、小数或分数(如2/3),%s=" % varName))
if var > 0:
return var
else:
print("请输入正数")
except Exception:
print("输入错误")
'''
然后定义一个检查三角形三边合法性函数(利于阅读理解程序):
'''
def checkTriangle(a, b, c):
'''检查三角形的三边是否合法
@a,b,c type=Fraction 三角形三边,大于0的三个分数
@return type=Logic 返回逻辑值,能构成三角形True,否则false'''
if a > b:
max = a
sum = b # 和先放小边
else:
max = b
sum = a
if max > c:
sum += c # 和加小边
else:
sum += max
max = c
if sum <= max:
print("2边和要大于第三边!")
return False
else:
return True
'''
最后,编写第一步主体代码:
try:
a = fractionInput("a")
b = fractionInput("b")
c = fractionInput("c")
if checkTriangle(a, b, c):
第二步、根号的底的整式运算,并化成最简分数。这里使用秦九韶公式进行整式运算,采用分数形式,系统自动化简:
'''
def qinJiuShao2(a, b, c):
'''秦九韶公式计算三角形面积平方
@a,b,c type=Fraction 三角形三边,大于0的三个分数
@return type=Fraction 三角形面积平方 分数'''
return (a**2*b**2-((a**2+b**2-c**2)/2)**2)/4
'''
编写主体程序代码:
s2 = qinJiuShao2(a, b, c)
第三步、把分母移除根号外,化成整数开方,只需编写主体程序:
m = s2.numerator * s2.denominator #要开平方的整数
n = s2.denominator #根号外的分母
第四步、化成整式或最简根式,为了缩短开发时间,引入第二十一课的SquareRoot类:
'''
#导入标准数学模块
#二次方根数类
class SquareRoot:
'''整数二次根式化简
@intNum type=int 根号的底,整数'''
intNum = 0 # 方根的底——自然数
#初始化方法
def __init__(self, intNum):
self.intNum = intNum
#平方方法
def 喵(self):
return self.intNum
#描述自己
def __str__(self):
return "sqrt(%d)" % self.intNum
#化成最简二次根式,类的开放接口
def simpleSquareRoot(self):
return self.__firstStep()
#第一步:检测自己是否是平方数,如果是就变成整数
def __firstStep(self):
print("第一步:检测自己是否是平方数")
tmp = round(math.sqrt(self.intNum)) # 开方的最近整数
if tmp ** 2 == self.intNum:
return (tmp, SquareRoot(1)) # (最简根前的系数,最简根)
return self.__secondStep()
#第二步:如果不是平方数,计算最大的可能因数
def __secondStep(self):
print("第二步:如果不是平方数,计算最大的可能因数")
maxNum = self.intNum // 2
return self.__thirdStep(maxNum)
#第三步:寻找不大于最大的可能因数的最喵方数
def __thirdStep(self, maxNum):
print("第三步:寻找不小于最大的可能因数的最喵方数")
end = math.ceil(math.sqrt(maxNum))
return self.__fourthStep(end)
#第四步:分解平方数的因数
def __fourthStep(self, end):
print("第四步:分解平方数的因数")
factors = [] # 平方数是self.intNum的因数的数
startNum = self.intNum # 开始数
for i in range(end, 1, -1):
i2 = i ** 2
endNum = startNum // i2
if i2 * endNum == startNum:
factors.append(i)
startNum = endNum
return self.__fifthStep(factors, startNum)
#第五步:平方数因数开方成倍数,根式化成最简式
def __fifthStep(self, factors, startNum):
print("第五步:平方数因数开方成倍数,根式化成最简式")
if len(factors) == 0:
return (1, self) # 根式已经是最简根式
else:
return (self.__getCoefficient(factors), SquareRoot(startNum))
#根据因数的二次方根,生成最简根式的系数
def __getCoefficient(self, factors):
rst = 1
for f in factors:
rst *= f
return rst
'''
编写主体程序代码:
sqrtObj = SquareRoot(m) #根式化简对象
tmp = sqrtObj.simpleSquareRoot() #化简后的元组(系数,SquareRoot)
coef = Fraction(tmp[0],n) #结果前系数
if tmp[1].intNum == 1:
print("三边长分别为%s、%s和%s的三角形面积是%s。" % (str(a), str(b), str(c), str(coef))) #打印结果
else:
print("三边长分别为%s、%s和%s的三角形面积是%s%s。" % (str(a), str(b), str(c), str(coef), str(tmp[1])))
'''
#为了能重复提供服务,把计算块都放到无限循环中
print("请输入有理三角形的三条边:")
while True:
#第一步、输入三边,用两小边之和大于第三边来做判断数据的合法性;
try:
a = fractionInput("a")
b = fractionInput("b")
c = fractionInput("c")
if checkTriangle(a, b, c):
#第二步、根号的底的整式运算,并化成最简分数;
s2 = qinJiuShao2(a, b, c)
#第三步、把分母移除根号外;
m = s2.numerator * s2.denominator # 要开平方的整数
n = s2.denominator # 根号外的分母
#第四步、化成整式或最简根式。
sqrtObj = SquareRoot(m) # 根式化简对象
tmp = sqrtObj.simpleSquareRoot() # 化简后的元组(系数,SquareRoot)
coef = Fraction(tmp[0], n) # 结果前系数
if tmp[1].intNum == 1:
print("三边长分别为%s、%s和%s的三角形面积是%s。" %
(str(a), str(b), str(c), str(coef))) # 打印结果
else:
print("三边长分别为%s、%s和%s的三角形面积是%s%s。" %
(str(a), str(b), str(c), str(coef), str(tmp[1])))
finally:
rst = input("是否继续计算(yes 或 no):")
if rst != None and (rst[0] == 'y' or rst[0] == 'Y'):
print("请输入有理三角形的三条边:")
else:
break
'''
课本计算题运算打印结果(展示图片中)。
练习题1:把程序组合成完整的程序输入电脑自己算一算。
练习题2:改用海喵式改编程序并运行,对比结果。
'''
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn