问题是用户给了3个边并标识出三角形,如等边形,等腰和斜角。这是我的编码,我不知道为什么给任何总是显示“无效”的面。我认为这在逻辑上是错误的,但我不知道。
puts "please input the length of 3 sides:"
a = gets.chomp.to_i
b = gets.chomp.to_i
c = gets.chomp.to_i
if a + b <= c
puts "invalid"
elsif a <= 0 || b <= 0 || c <= 0
puts "invalid"
else
if a == b && b == c
puts"equilateral triangle"
elsif a == b
puts"isosceles triangle"
else
puts"scalene triangle"
end
end
答案 0 :(得分:1)
您的代码始终显示“无效”的事实使我认为输入是在一行中传递的,而不是在单独的行中传递的。例如,当输入为:
50 50 50
与其在所有三个变量中获得50,不如在a中获得50,在b,c中获得0。这是因为gets
占据整行而不是一个值。
在这种情况下,这就是您需要的:
a, b, c = gets.split.map{ |value| value.to_i }
答案 1 :(得分:-1)
跳过用户输入,由于我无法重现该错误(即使Unihedron找到了修复程序),因此逻辑仍然存在问题。
当输入为a = 1000, b = 1, c = 1
时,结果为"scalene triangle"
,但应返回"invalid"
。我建议在修复以下。
让我们将输入存储在一个数组中(已经转换为整数或浮点数):
sides = [a, b, c]
首先,您需要检查所有方面是否都是积极的:
sides.all? { |x| x > 0 }
然后,检查两侧的和是否大于另一侧:
sides.combination(2).map{ |x| x.sum }.zip(sides.reverse).all? { |xy, z| xy > z }
最后(我想念什么吗?),要选择三角形面额,您可以使用sides.uniq结果使用散列来访问它:
triangle_kinds = {1 => 'equilateral', 2 => 'isosceles', 3 => 'scalene'}
triangle_kinds[sides.uniq.size]