Aplicar el teorema de Pitágoras



Versión: 2.x, 3.x

Introducción

La finalidad de este artículo es desarrollar y explicar paso a paso un pequeño programa que, dados los datos necesarios, resuelva el teorema de Pitágoras. Básicamente lo que éste explica es que la hipotenusa de un triángulo rectángulo al cuadrado es igual a la suma de los dos catetos, ambos al cuadrado. La fórmula sería la siguiente:

Hipotenusa² = Cateto A² + Cateto B²

Triángulo Rectángulo

Basado en esta fórmula, el programa será capaz de aplicar el teorema dados dos valores, calculando el tercero.

Requisitos

Para poder aplicar el teorema no se necesita más que algunas sentencias condicionales y, lo más importante, las funciones para ejecutar la potenciación y radicación. Con respecto a la primera, puede lograrse realizando base**exponente. Por ejemplo:

>>> 5**2
25
>>> 8**2
64

Con respecto a la radicación, utilizaremos la función sqrt del módulo math, que realiza la raíz cuadrada del número indicado:

>>> from math import sqrt
>>> sqrt(25)
5.0
>>> sqrt(64)
8.0

Aplicación

Vamos a desarrollar el script paso por paso, los cuales explicaré con detalle. El código se va mostrando de manera ordenada. Al final del artículo puedes encontrar el programa completo.

1

Para comenzar, creamos un nuevo archivo (yo lo he llamado pitagoras.py) y añadimos las siguientes líneas:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

La primera para indicarle al sistema cómo interpretar nuestro archivo. La segunda, indica la codificación.

2

Importar la función necesaria para realizar la radicación.

from math import sqrt

3

Queremos que nuestra aplicación corra tanto en Python 2 como en Python 3. En base a los recursos que vamos a utilizar, esto no parece ser un problema. Pero, como debemos solicitar que el usuario ingrese datos vía la entrada estándar, como ya sabrás, la función raw_input ha sido renombrada a input en Python 3. Añadiremos el siguiente código:

try:
    input = raw_input
except NameError:
    pass

De esta manera aseguramos que en ambas versiones la función input sea la misma. En Python 2 se reemplazará por raw_input. En Python 3, como raw_input ya no se encuentra, será lanzada una excepción del tipo NameError, por lo que se utilizará la función input original.

4

El programa solicitará la entrada de datos numéricos, por lo tanto, necesitamos una función que se encargue de verificar el tipo de cada uno de ellos y, de ser necesario, volver a preguntar.

def get_numeric_value(prompt):
    """
    Requests a numeric value from the standard input.
    Returns None if no value was inserted.
    """

El parámetro prompt indica la cadena que será pasada a la función input para solicitar la entrada. Es necesario que la función vuelva a preguntar si no se ha indicado un valor numérico. Por último, si no se ha insertado ningún valor, debe retornar None.

    while True:
        value = input(prompt)
        if not value:
            return None
        try:
            value = int(value)
        except ValueError:
            print("Debe ingresar un valor numerico. "
                  "Vuelva a intentarlo.")
        else:
            break
    return value

La excepción ValueError será lanzada por la función int al intentar convertir un valor erróneo. Nótese los paréntesis al utilizar print, para mantener la compatibilidad entre las versiones.

5

Requerimos de una función que imprima el dibujo del triángulo rectángulo con sus respectivos valores:

def get_triangle(a=None, b=None, h=None):
    """
    Returns a triangle string, with the specified values.
    """

Donde a y b son los catetos y h es la hipotenusa. En donde no se ha especificado un valor, se utilizará el carácter «?»:

    return r"""
    |\
    | \
    |  \ h
  a |   \
    |    \
    |_ _ _\
      b
    
    a = %s
    b = %s
    h = %s""" % ("?" if a is None else a,
                 "?" if b is None else b,
                 "?" if h is None else h)

La r al comienzo de la cadena es necesaria para que el carácter «\» sea interpretado como tal.

6

Es momento de crear la función principal, la cual se encargará de solicitar los datos, aplicar el teorema e imprimir los resultados. En este paso realizaremos lo primero.

def main():
    print(get_triangle())
    print("\nDeje en blanco el valor que desconoce.\n")

Esto imprimirá un triángulo en pantalla con todos su valores como incógnitas.

    a = get_numeric_value("a: ")
    b = get_numeric_value("b: ")
    
    if a is None or b is None:
        h = get_numeric_value("h: ")
    else:
        h = None

A continuación solicitamos los catetos y la hipotenusa (a, b y h respectivamente). A partir de la cuarta línea se verifica si ya se han indicado dos valores; de ser así, no pregunta por el tercero.

    if (bool(a) + bool(b) + bool(h)) < 2:
        print("Debe especificar, al menos, dos valores.")
        return 0

Por último verificamos que se hayan ingresado, al menos, dos valores.

7

Es momento de aplicar el teorema. Antes de eso, hay que determinar cuál es la incógnita.

    if h is None:
        h = sqrt(a**2 + b**2)

Si el valor desconocido es la hipotenusa, se ejecuta la fórmula tradicional h² = a² + b². Una vez resuelto el término de la derecha, la potencia de la hipotenusa pasa como una raíz que se aplica al primer resultado (a² + b²).

    elif a is None:
        a = sqrt(h**2 - b**2)

Si es el cateto A o cateto 1, se pasa la suma del cateto B al término izquierdo como una resta, se resuelve, y luego se aplica la raíz proveniente del cateto A, que se encontraba como una potencia en el término derecho.

    elif b is None:
        b = sqrt(h**2 - a**2)

Por último, si la incógnita es el cateto B, el procedimiento es igual al del cateto A, con la diferencia de que sus lugares se intercambian.

8

Una vez aplicado el teorema, se imprime el resultado en pantalla y finaliza la función:

    print("")
    print(get_triangle(a, b, h))
    
    return 0

9

Finalmente, el programa sólo debe ejecutarse como un script, llamando a la función principal:

if __name__ == '__main__':
    main()

Código completo

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from math import sqrt

try:
    input = raw_input
except NameError:
    pass

def get_numeric_value(prompt):
    """
    Requests a numeric value from the standard input.
    Returns None if no value was inserted.
    """
    while True:
        value = input(prompt)
        if not value:
            return None
        try:
            value = int(value)
        except ValueError:
            print("Debe ingresar un valor numerico. "
                  "Vuelva a intentarlo.")
        else:
            break
    return value

def get_triangle(a=None, b=None, h=None):
    """
    Returns a triangle string, with the specified values.
    """
    return r"""
    |\
    | \
    |  \ h
  a |   \
    |    \
    |_ _ _\
      b
    
    a = %s
    b = %s
    h = %s""" % ("?" if a is None else a,
                 "?" if b is None else b,
                 "?" if h is None else h)

def main():
    print(get_triangle())
    print("\nDeje en blanco el valor que desconoce.\n")
    
    a = get_numeric_value("a: ")
    b = get_numeric_value("b: ")
    
    if a is None or b is None:
        h = get_numeric_value("h: ")
    else:
        h = None
    
    if (bool(a) + bool(b) + bool(h)) < 2:
        print("Debe especificar, al menos, dos valores.")
        return 0
    
    if h is None:
        h = sqrt(a**2 + b**2)
    elif a is None:
        a = sqrt(h**2 - b**2)
    elif b is None:
        b = sqrt(h**2 - a**2)
    
    print("")
    print(get_triangle(a, b, h))
    
    return 0

if __name__ == '__main__':
    main()



2 comentarios.

  1. Hola, al probar tu codigo en la version 3.7.4 de Python lo ejecuto y me salen algunos problemas de identacion, los corrijo y no imprene ni solicita nada, me gusta tu explicacion porque grafica el teorema

Deja un comentario