猫史档案馆


【Python作品分享】第二十九课 根据海伦-秦九韶公式编程计算三角形面积【教程贴】

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


【作品展示】

center_image

 

【作品介绍】

根据海伦-秦九韶公式编程计算三角形面积。公众号“学思营”发布。

 

【作品源代码】

'''
@免费在线学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


回复

上一页1 页 / 共 0下一页