用if / else标识三角形

时间:2018-11-18 00:43:16

标签: ruby

问题是用户给了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

2 个答案:

答案 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]


在数组上使用了以下方法(可枚举):