Está en la página 1de 2

def print_decorator(func):

def wrapper(*args, **kwargs):


print("Antes de llamar al método:", func.__name__)
result = func(*args, **kwargs)
print("Después de llamar al método:", func.__name__)
return result
return wrapper

class Triangulo:
def __init__(self, lado1=3, lado2=3, lado3=3):
self.lado1 = self.validar_lado(lado1)
self.lado2 = self.validar_lado(lado2)
self.lado3 = self.validar_lado(lado3)

def __repr__(self):
return f"[Triángulo: lado1: {self.lado1}, lado2: {self.lado2}, lado3:
{self.lado3}]"

def validar_lado(self, lado):


if isinstance(lado, int) and 3 <= lado <= 9:
return lado
raise ValueError("Los lados del triángulo deben ser enteros en el rango [3,
9]")

@print_decorator
def existencia(self):
if (self.lado1 + self.lado2 > self.lado3) and (self.lado1 + self.lado3 >
self.lado2) and (
self.lado2 + self.lado3 > self.lado1):
return True
return False

@print_decorator
def calculaAngulos(self):
import math
angulo1 = math.degrees(
math.acos((self.lado2 ** 2 + self.lado3 ** 2 - self.lado1 ** 2) / (2 *
self.lado2 * self.lado3)))
angulo2 = math.degrees(
math.acos((self.lado1 ** 2 + self.lado3 ** 2 - self.lado2 ** 2) / (2 *
self.lado1 * self.lado3)))
angulo3 = 180 - angulo1 - angulo2
return [angulo1, angulo2, angulo3]

@print_decorator
def es_escaleno(self):
if self.lado1 != self.lado2 and self.lado1 != self.lado3 and self.lado2 !=
self.lado3:
return True
return False

@print_decorator
def es_acutangulo(self):
angulos = self.calculaAngulos()
if all(angulo < 90 for angulo in angulos):
return True
return False
@print_decorator
def calculaPerimetro(self):
return self.lado1 + self.lado2 + self.lado3

@print_decorator
def calculaArea(self):
semiperimetro = self.calculaPerimetro() / 2
area = (semiperimetro * (semiperimetro - self.lado1) * (semiperimetro -
self.lado2) * (
semiperimetro - self.lado3)) ** 0.5
return round(area, 2)

def main():
triangulos = []

with open("triangulos.txt", "r") as archivo:


lineas = archivo.readlines()
for i in range(0, len(lineas), 2):
lado1, lado2, lado3 = map(int, lineas[i].split())
triangulo = Triangulo(lado1, lado2, lado3)
triangulos.append(triangulo)

cantidad_existente = sum(triangulo.existencia() for triangulo in triangulos)


cantidad_area_intervalo = sum(
16 <= triangulo.calculaArea() <= 25 for triangulo in triangulos if
triangulo.existencia())
cantidad_escaleno = sum(triangulo.es_escaleno() for triangulo in triangulos if
triangulo.existencia())
cantidad_no_acutangulo = sum(
not triangulo.es_acutangulo() for triangulo in triangulos if
triangulo.existencia())
promedio_perimetros = sum(
triangulo.calculaPerimetro() for triangulo in triangulos if
triangulo.existencia()) / cantidad_existente
perimetros_superiores_20 = [triangulo for triangulo in triangulos if
triangulo.existencia() and
triangulo.calculaPerimetro() > 20]

print("Cantidad de triángulos existentes:", cantidad_existente)


print("\nCantidad de triángulos existentes con área en el intervalo [16, 25]:",
cantidad_area_intervalo)
print("\nCantidad de triángulos existentes que son escalenos:",
cantidad_escaleno)
print("\nCantidad de triángulos existentes que no son acutángulos:",
cantidad_no_acutangulo)
print("\nPromedio de los perímetros de los triángulos que existen:
{:.2f}".format(promedio_perimetros))
print("\nTriángulos existentes cuyos perímetros superan el valor 20:")
for triangulo in perimetros_superiores_20:
print(repr(triangulo))

if __name__ == "__main__":
main()

También podría gustarte