Ruby: ángulos en polígonos regulares
guivaloz
2010-10-12 12:00
Ruby
Creo que todos los que tenemos la gran fortuna de ser padres y a la vez trabajar en el desarrollo de software tendemos a aprovechar las pocas oportunidades para mostrar nuestras habilidades a nuestros hijos y motivarlos a que ellos se incursionen en ésto también. Aunque, no lo niego, también uno mismo sale beneficiado y aprende cosas nuevas con las tareas más sencillas, como la que les narro a continuación.
Así pues, mi hija me solicitó ayuda para calcular los ángulos de los polígonos regulares (triángulo, cuadrado, pentágono, hexágono. etc.). A cada una de estas figuras se le puede medir el ángulo central que se hace a partir del centro hacia dos vértices contiguos. Por otro lado, el ángulo interno es el que hacen dos lados con su vértice.
Después de comprender los conceptos, se puso ella a hacer los cálculos (a lápiz y papel) desde el triángulo (3 lados) hasta el dodecágono (12 lados).
Bien. Llegó el momento de usar el “poder de cómputo” para comprobar las operaciones realizadas. Comenzamos con un programa simple que hace las operaciones matemáticas para el triángulo solamente:
#!/usr/bin/env ruby
n = 3
print "Con #{n} lados, "
a = 360 / n
print "el ángulo central es #{a} "
t = 180 * (n - 2) / n
puts "y el ángulo interno es #{t}"
El texto que entrega es el siguiente…
Con 3 lados, el ángulo central es 120 y el ángulo interno es 60
Todo pinta a que íbamos muy bien. Así que nuestra segunda versión agregamos un bucle de tres (triángulo) a doce (dodecágono) que va cambiando n en cada ciclo y las operaciones las incluímos dentro de las cadenas de texto.
#!/usr/bin/env ruby
(3..12).each do |n|
print "Con #{n} lados, "
print "el ángulo central es #{360 / n} "
puts "y el ángulo interno es #{180 * (n - 2) / n}"
end
Lo que entregó es esto:
Con 3 lados, el ángulo central es 120 y el ángulo interno es 60 Con 4 lados, el ángulo central es 90 y el ángulo interno es 90 Con 5 lados, el ángulo central es 72 y el ángulo interno es 108 Con 6 lados, el ángulo central es 60 y el ángulo interno es 120 Con 7 lados, el ángulo central es 51 y el ángulo interno es 128 Con 8 lados, el ángulo central es 45 y el ángulo interno es 135 Con 9 lados, el ángulo central es 40 y el ángulo interno es 140 Con 10 lados, el ángulo central es 36 y el ángulo interno es 144 Con 11 lados, el ángulo central es 32 y el ángulo interno es 147 Con 12 lados, el ángulo central es 30 y el ángulo interno es 150
¡Pero los resultados no arrojaron decimales! Sabíamos que en el heptágono (siete lados) debían aparecer. Esto ocurre porque si haces operaciones matemáticas con enteros tendrás como resultado un entero.
Así que en nuestra tercera versión hemos agregado el método to_f para convertir cada n a flotante y obligarlo así a que los resultados sean números flotantes:
#!/usr/bin/env ruby
(3..12).each do |n|
print "Con #{n} lados, "
print "el ángulo central es #{360 / n.to_f} "
puts "y el ángulo interno es #{180 * (n.to_f - 2) / n.to_f}"
end
Éste último programa nos entrega los resultados correctos, pero con muchos decimales:
Con 3 lados, el ángulo central es 120.0 y el ángulo interno es 60.0 Con 4 lados, el ángulo central es 90.0 y el ángulo interno es 90.0 Con 5 lados, el ángulo central es 72.0 y el ángulo interno es 108.0 Con 6 lados, el ángulo central es 60.0 y el ángulo interno es 120.0 Con 7 lados, el ángulo central es 51.4285714285714 y el ángulo interno es 128.571428571429 Con 8 lados, el ángulo central es 45.0 y el ángulo interno es 135.0 Con 9 lados, el ángulo central es 40.0 y el ángulo interno es 140.0 Con 10 lados, el ángulo central es 36.0 y el ángulo interno es 144.0 Con 11 lados, el ángulo central es 32.7272727272727 y el ángulo interno es 147.272727272727 Con 12 lados, el ángulo central es 30.0 y el ángulo interno es 150.0
Consultando nuestra documentación aprendimos cómo darle formato a los números flotantes. Esta última versión del programa usa sprintf con parámetros para mostrar cuatro decimales de los números flotantes. Además prefermimos manejar la cantidad de lados en entero en c y la misma cantidad en n pero en flotante.
#!/usr/bin/env ruby
(3..12).each do |c|
print "Con #{c} lados, "
n = Float(c)
print sprintf("el ángulo central es %.4f ", 360 / n)
puts sprintf("y el ángulo interno es %.4f", 180 * (n - 2) / n)
end
Y nos entrega estos resultados:
Con 3 lados, el ángulo central es 120.0000 y el ángulo interno es 60.0000 Con 4 lados, el ángulo central es 90.0000 y el ángulo interno es 90.0000 Con 5 lados, el ángulo central es 72.0000 y el ángulo interno es 108.0000 Con 6 lados, el ángulo central es 60.0000 y el ángulo interno es 120.0000 Con 7 lados, el ángulo central es 51.4286 y el ángulo interno es 128.5714 Con 8 lados, el ángulo central es 45.0000 y el ángulo interno es 135.0000 Con 9 lados, el ángulo central es 40.0000 y el ángulo interno es 140.0000 Con 10 lados, el ángulo central es 36.0000 y el ángulo interno es 144.0000 Con 11 lados, el ángulo central es 32.7273 y el ángulo interno es 147.2727 Con 12 lados, el ángulo central es 30.0000 y el ángulo interno es 150.0000
Mucho mejor. ¡Ah! Y prueben cambiando los valores del rango del bucle para que inicie en 3 y termine en 360.




