Найти - Пользователи
Полная версия: Формула Герона
Начало » Python для новичков » Формула Герона
1
Symfo
Начинаю изучать Python, написал программку для расчета площади треугольника по формуле Герона.
def geron(a, b, c):
    p = (a+b+c)/2
    print ('Полупериметр =', p )
    s = (p*(p-a)*(p-b)*(p-c))**0.5
    return s
inputs = [3,4,8], [7,8,9], [5,3,2]
for n in inputs:
    S = geron(n[0], n[1], n[2])
    print ('Площадь =',S, '\n')
На выходе получается вот такая странная штука, в зависимости от исходных данных получается либо комплексное число, либо float, либо 0
Полупериметр = 7.5
Площадь = (4.705835796207353e-16+7.685213074469699j)

Полупериметр = 12.0
Площадь = 26.832815729997478

Полупериметр = 5.0
Площадь = 0.0
sqrt из match дает тот же результат.
Объясните, плз, почему так происходит, и как исправить?
FishHook
Потому что не может быть треугольника со сторонами 3,4,8
Сумма двух любых сторон треугольника всегда больше третьей.
Тут у тебя получается отрицательное значение p - 8.
Symfo
Спасибо! Пора поспать
Symfo
Вот, дописал проверки на длины сторон треугольника и на их количество, чтобы лучше запомнить чего и сколько у него бывает
Все вроде работает, но наверняка что-то реализовано криво. Что тут можно было сделать проще или правильнее?
Занялся программированием дня 4 назад. Так что это то пока моя самая большая программа
def geron(a, b, c):
    p = (a+b+c)/2
    print ('Полупериметр =', p )
    s = (p*(p-a)*(p-b)*(p-c))**0.5
    print ('Площадь =',s, '\n')
    return s
def y_n(qwes):
    ch = input(qwes)
    while ch.lower() not in ('y', 'n'):
        ch = input("выберете y/n\n")
    return ch.lower()
def test(a,b,c):
    ttt = (a, b, c)
    sor = sorted(ttt)
    if sor[2] >= sor[0]+sor[1]:
        print('Это не треугольник, идиот :)')
        main()
    else:
        geron(a, b, c)
def main():
    abc = input('Введите длины сторон треугольника через пробел\n').split()
    for i in range(len(abc)):
        abc[i] = int(abc[i])
    if len(abc) != 3:
        print('У треугольника 3 стороны ;)')
        main()
    a = abc[0]
    b = abc[1]
    c = abc[2]
    test(a, b, c)
    ans = y_n('Посчитать еще один треугольник?\n')
    if ans == 'y':
        main()
    elif ans == 'n':
        print('Удачи!')
        exit(0)
main()
FishHook
1. Постарайтесь разделить логику различных функций. Например, зачем функции main определять валидность треугольника? Пусть это делает функция расчета площади треугольника. Зачем функция main вообще знает о существовании какой-то функции test и нафиг она нужна? Представьте, что Вы пишите отдельный модуль для вычисления площадей фигур и в вашей программе, которая использует этот модуль есть сотня фигур. Как тогда будет выглядеть main?
2.
a = abc[0]
b = abc[1]
c = abc[2]
test(a, b, c)

Плохо, так лучше

test(*a)

3.
if ans == 'y':
Ну нафига? Опять одна функция лезет в логику другой. Пусть ans возвращает True/False. Если Вы сами будете использовать чужую функцию, хотелось бы Вам, чтобы она возвращала какие-то магические зашифрованные литералами значения, которые потом пришлось бы распознавать if-ами?

Symfo
Спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB