Errors in the program to sort a triangle

2

I have some problems and I do not know how to fix it:

1) An equilateral triangle, three equal sides and angles = 60 °, is read as an isosceles triangle (two equal sides).

2) In addition to misprinting, I can not remove this 'NONE'.

3) When the triangle has one of the angles = 90, it is a rectangle. But the program does not recognize.

4) The fourth and last problem is that I do not know how I can restart the program: 'Type S to restart or N to end the program'

Can anyone help me ???

import math


# lado a 
a = int(input('Digite o valor de um dos lados do triângulo '))

# lado b
b = int(input('Digite o valor do outro lado do triângulo '))

# angulo entre a e b
m = int(input('Digite o ângulo entre estes dois lados '))
ab = (m*math.pi)/180

# calculo do lado c
def lado_c ():
    global a,b,c,ab
    c = math.sqrt(a**2 + b**2 - 2*a*b*math.cos(ab))
    return round(c,2)

# angulo entre a e c
def angulo_ac ():
    global a,b,c,ac
    n = ((a**2+c**2)-(b**2))/(2*a*c)
    ac = (math.acos(n)*180)/math.pi 
    return (round(ac,2))

# angulo b e c
def angulo_bc ():
    global a,b,c,bc
    p = ((c**2+b**2)-(a**2))/(2*b*c)
    bc =(math.acos(p)*180)/math.pi
    return (round(bc,2))

# perímetro
def perimetro ():
    global P,a,b,c
    P =(a+b+c)
    return P

# área
def area ():
    global a,b,c,P,A
    p = (a+b+c)/2
    A = float(math.sqrt(p*(p-a)*(p-b)*(p-c)))
    return A

# altura
def altura ():
    global A
    h = (A*2)/c
    return h

# classificação quanto aos lados
def lado_class ():
    global a,b,c,ab
    if a!=b and a!=c and b!=c:
        print ('Escaleno')
    elif ab == 60 and a == b and b == c:
        print ('Equilátero')
    elif a != b and b == c or b !=c and c == a or c !=a and a==b:
        print ('Isósceles')
    return

# classificação quanto aos angulos
def angulo_class ():
    global ab, ac, bc            
    if ab == 90 or bc == 90 or ac == 90:
        print ('Retângulo')
    elif ab < 90 and bc < 90 and ac < 90:
        print ('Acutângulo')
    elif ab > 90 and bc < 90 and ac < 90   or   bc > 90 and ac < 90 and ab < 90    or   ac > 90 and ac < 90 and ab < 90 :
        print ('Obtusângulo')
    return 

#-----------------------------------------------------------------------------
print ('Lado c = '+ str(round(lado_c (),2)))

print ('Ângulo entre a e c '+str(angulo_ac ()))
print ('Ângulo entre b e c '+str(angulo_bc ()))
print('Área = '+str(round(area (),2))+' unidades de área')
print('Perímetro = '+str(round(perimetro(),2))+' unidades de comprimento')
print ('Altura, em relação ao lado c = '+str(round(altura (),2))+' unidades de comprimento')
print(lado_class ())
print (angulo_class ())

> import math

# lado a 
a = int(input('Digite o valor de um dos lados do triângulo '))

# lado b
b = int(input('Digite o valor do outro lado do triângulo '))

# angulo entre a e b
m = int(input('Digite o ângulo entre estes dois lados '))
ab = (m*math.pi)/180

# calculo do lado c
def lado_c ():
    global a,b,c,ab
    c = math.sqrt(a**2 + b**2 - 2*a*b*math.cos(ab))
    return round(c,2)

# angulo entre a e c
def angulo_ac ():
    global a,b,c,ac
    n = ((a**2+c**2)-(b**2))/(2*a*c)
    ac = (math.acos(n)*180)/math.pi 
    return (round(ac,2))

# angulo b e c
def angulo_bc ():
    global a,b,c,bc
    p = ((c**2+b**2)-(a**2))/(2*b*c)
    bc =(math.acos(p)*180)/math.pi
    return (round(bc,2))

# perímetro
def perimetro ():
    global P,a,b,c
    P =(a+b+c)
    return P

# área
def area ():
    global a,b,c,P,A
    p = (a+b+c)/2
    A = float(math.sqrt(p*(p-a)*(p-b)*(p-c)))
    return A

# altura
def altura ():
    global A
    h = (A*2)/c
    return h

# classificação quanto aos lados
def lado_class ():
    global a,b,c,ab
    if a!=b and a!=c and b!=c:
        print ('Escaleno')
    elif ab == 60 and a == b and b == c:
        print ('Equilátero')
    elif a != b and b == c or b !=c and c == a or c !=a and a==b:
        print ('Isósceles')
    return

# classificação quanto aos angulos
def angulo_class ():
    global ab, ac, bc            
    if ab == 90 or bc == 90 or ac == 90:
        print ('Retângulo')
    elif ab < 90 and bc < 90 and ac < 90:
        print ('Acutângulo')
    elif ab > 90 and bc < 90 and ac < 90   or   bc > 90 and ac < 90 and ab < 90    or   ac > 90 and ac < 90 and ab < 90 :
        print ('Obtusângulo')
    return 

#-----------------------------------------------------------------------------
print ('Lado c = '+ str(round(lado_c (),2)))

print ('Ângulo entre a e c '+str(angulo_ac ()))
print ('Ângulo entre b e c '+str(angulo_bc ()))
print('Área = '+str(round(area (),2))+' unidades de área')
print('Perímetro = '+str(round(perimetro(),2))+' unidades de comprimento')
print ('Altura, em relação ao lado c = '+str(round(altura (),2))+' unidades de comprimento')
print(lado_class ())
print (angulo_class ())

I also posted the code here (it's best to view it): link

    
asked by anonymous 10.06.2017 / 10:29

1 answer

1
The questions 1 and 3 can be answered by analyzing their variables and the returns of their functions. In an example where I define one side of the triangle as 50, another side as 50 and the angle between them of 60 °, I will get as a response from your script:

a: 50                         # Valor do lado a - int
b: 50                         # Valor do lado b - int
c: 49.99999999999999          # Valor do lado c não arredondado
m: 60                         # Ângulo ab (graus) - int
ab: 1.0471975511965976        # Ângulo ab (radianos) não arredondado
ac: 60.00000000000001         # Ângulo ac (graus) não arredondado
bc: 60.00000000000001         # Ângulo bc (graus) não arredondado
lado_c: 50.0                  # Valor do lado c arredondado ---- Retorno de função
angulo_ac: 60.0               # Ângulo ac (graus) arredondado ---- Retorno de função
angulo_bc: 60.0               # Ângulo bc (graus) arredondado ---- Retorno de função

From this data you can see why your functions return with some errors. When parsing the side_class () function, we have:

def lado_class ():
    global a,b,c,ab
    if a != b and a != c and b != c:
    """ Comparação a, b e c.
        Sua variável c não está arredondada, o que vai influenciar na sua comparação.
    """
        print ('Escaleno')
    elif ab == 60 and a == b and b == c:
    """ Comparação a, b e c + análise do ângulo ab.
        Novamente sua variável c não está arredondada.
        A variável ab está definida como o ângulo entre a e b em RADIANOS,
        porém você compara ela com o valor em graus.
    """
        print ('Equilátero')
    elif a != b and b == c or b !=c and c == a or c != a and a == b:
    """ Comparação a, b e c.
        Novamente o mesmo problema com a variável c.
    """
        print ('Isósceles')
    return

The same problem will be repeated in its function angulo_class (), but with other variables. I always recommend knowing the return of all your variables, even if it's just for testing.

To fix this problem you have two options: Adjust your comparisons or modify their functions.

# Opção 1. Ajuste dos condicionais.
if a != b and a != lado_c() and b != lado_c():
    (...)

# Opção 2. Ajuste das funções.
def lado_c ():
    """ Arredonde a variável c, e não apenas o retorno da função. 
        NOTA: Lembre-se que arredondar c irá influenciar
        os próximos cálculos que o utilizarem.
    """
    global a,b,c,ab
    c = round(math.sqrt(a**2 + b**2 - 2*a*b*math.cos(ab)))   
    return c

Regarding Question 2 : None is the empty return of the function that follows the very form you wrote your functions. I will work with only one of them, but the reasoning is the same for both.

def lado_class():
    global a,b,c,ab
    if a != b and a != c and b != c:
        print ('Escaleno')
    elif ab == 60 and a == b and b == c:
        print ('Equilátero')
    elif a != b and b == c or b != c and c == a or c != a and a == b:
        print ('Isósceles')
    return    # <----- Essa é a linha que está definindo o retorno vazio.

You have two options to fix this. The first is to change the return of your function to:

def lado_class():
    global a,b,c,ab
    if a != b and a != c and b != c:
        return 'Escaleno'     # Nesse caso o retorno será 'Escaleno'.
    elif ab == 60 and a == b and b == c:
        return 'Equilátero'   # Nesse caso o retorno será 'Equilátero'.
    elif a != b and b == c or b != c and c == a or c != a and a == b:
        return 'Isósceles'    # E finalmente aqui o retorno será 'Isósceles'.

Writing this way the function will not give the print when it is used and will only return the indicated value. In this case, if you want to give a print on the return of the function you will write:

print(lado_class())

If you do not want to modify its function you can use it by yourself. No need for print:

angulo_class()

So you will not print the None return of your function. Since you have already programmed the print inside the function, there is no need to give a print in the return of it.

At a glance: When defining a function, be aware of when to use return and print. ( doc return ; doc. print )

Question 4: I would put everything into a while, but I do not know if that's the best way to do it. The while runs your script until you give it the condition to stop ( doc while ).

Example with while:

import math

repetir = True

while repetir is True:

    ##### Seu script aqui #####

    consulta_repet = input('Deseja repetir? (S/N)')
    comando_ok = False

    while comando_ok is False:
        if consulta_repet.lower() == 's':
            repetir = True
            comando_ok = True
        elif consulta_repet.lower() == 'n':
            repetir = False
            comando_ok = True
        else:
            consulta_repet = input('Comando não entendido. Deseja repetir? (S/N)')
    
13.06.2017 / 15:34