Отождествление треугольника с if / else - PullRequest
0 голосов
/ 18 ноября 2018

Вопрос - пользователь дает 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 голосов
/ 18 ноября 2018

Пропуск пользовательских вводов, поскольку я не могу воспроизвести ошибку (даже если 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 }

Наконец (я что-то упустил?), Чтобы выбрать деноминацию треугольника, вы можете использовать хеш, получая доступ к нему по сторонам. Результат:

triangle_kinds = {1 => 'equilateral', 2 => 'isosceles', 3 => 'scalene'}
triangle_kinds[sides.uniq.size]


Использовали следующие методы над массивом (перечислимым):
0 голосов
/ 18 ноября 2018

Тот факт, что ваш код всегда печатает «неверно», заставляет меня думать, что ввод передается в одной строке, а не в отдельных. Например, когда ввод:

50 50 50

вместо 50 во всех трех переменных вы получите 50 в a и 0 в b, c. Это связано с тем, что gets принимает целую строку вместо одного значения.

В таком случае это то, что вам нужно:

a, b, c = gets.split.map{ |value| value.to_i }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...