gpt4 book ai didi

python - Python 中的直角锐角三角形和钝角三角形

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:37 26 4
gpt4 key购买 nike

我正在尝试编写一个三角形程序的代码,提示用户输入任意6个坐标,程序确定三角形是锐角三角形、钝角三角形、直角三角形、不等边三角形、等边三角形、等腰三角形。它还计算程序的面积和周长,并确定 6 个坐标是否构成三角形。我成功地完成了程序的大部分内容,但在编写代码来确定三角形是锐角、直角还是钝角时遇到困难。这是我的直角三角形、锐角三角形和钝角三角形的代码。我的主要问题是,当程序运行时,无论我输入什么坐标,它总是给我答案“急性”。我已经尝试过右坐标和钝坐标,但我仍然变得敏锐。我觉得我的逻辑有问题。

def right(x1, y1, x2, y2, x3, y3):
# Using Pythagoras theorem
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC

if (largest) ** 2 == ((var1 ** 2 + (var2) ** 2)):
return True
else:
return False

对于钝角

def obtuse(x1, y1, x2, y2, x3, y3):
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
if (largest) ** 2 > ((var1) ** 2 + (var2) ** 2):
return True
else:
return False

对于急性

def acute(x1, y1, x2, y2, x3, y3):
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
largest = max(sideAB, sideBC, sideAC)
var1 = min(sideAB, sideBC, sideAC)
if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC
if (largest) ** 2 < ((var1) ** 2 + (var2) ** 2):
return True
else:
return False

有人可以纠正/即兴修改我的代码,以便它确定正确、敏锐和迟钝的衡量标准吗?谢谢!

这是我的 sideLength 函数

def sideLength(x1, y1, x2, y2):

length = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
return length


# Using the min function to find out the shortest side.

def findAllSides(vertices):

x1 = vertices[0][0]
y1 = vertices[0][1]
x2 = vertices[1][0]
y2 = vertices[1][1]
x3 = vertices[2][0]
y3 = vertices[2][1]

sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)
lst=[sideAB, sideAC, sideBC]

return lst

最佳答案

如果你想让你的代码更简洁,你可以在一个函数中完成主要计算:

(不要重复自己!)

def typeObtuseRightAcute(x1, y1, x2, y2, x3, y3):
#no idea if this is a good value but works for example
#and should be low enough to give right answers for all but crazy close triangles
epsilon=10**-8
# Using Pythagoras theorem
sideAB = sideLength(x1, y1, x2, y2)
sideBC = sideLength(x2, y2, x3, y3)
sideAC = sideLength(x3, y3, x1, y1)

#use this instead
[var1,var2,largest] = sorted([sideAB, sideBC, sideAC])



if abs((largest) ** 2-((var1 ** 2 + (var2) ** 2)))<epsilon:
return "right"
elif (largest) ** 2 > ((var1 ** 2 + (var2) ** 2)):
return "obtuse"
else:
return "acute"

def acute(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="acute"

def right(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="right"

def obtuse(x1,y1,x2,y2,x3,y3):
return typeObtuseRightAcute(x1,y1,x2,y2,x3,y3)=="obtuse"

但我认为这个问题应该在代码审查中提出,而不是在这里,因为你的代码可以工作,而你只是想知道如何更好地编写它(我相信?)

编辑

发现错误:

    if sideAB != largest and sideAB != var1:
var2 = sideAB
elif sideBC != largest and sideBC != var1:
var2 = sideBC
else:
var2 = sideAC

如果两条短边长度相同,并且 AC 是最长的一条边,这部分代码就会出错。

发生以下情况:

假设 AC 最大,并且 AB = var1

第一个 if 失败,因为 AB==var1

第二个 if 失败,因为 BCAB 具有相同的长度

-> var2 被分配了 AC 并且你有错误的一面!

将我的代码更改为正确的。要么使用该函数,要么在每个函数中更改它。 (不确定sorted()在python 3中是否以同样的方式工作......尝试一下^^)

编辑2:更改了相等性检查,因为 float 很痛苦 -_-

关于python - Python 中的直角锐角三角形和钝角三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36093517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com