Уведомления

Группа в Telegram: @pythonsu

#1 Июль 28, 2014 07:42:25

Symfo
Зарегистрирован: 2014-07-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Формула Герона

Начинаю изучать 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 дает тот же результат.
Объясните, плз, почему так происходит, и как исправить?

Офлайн

#2 Июль 28, 2014 08:14:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Формула Герона

Потому что не может быть треугольника со сторонами 3,4,8
Сумма двух любых сторон треугольника всегда больше третьей.
Тут у тебя получается отрицательное значение p - 8.



Офлайн

#3 Июль 28, 2014 08:17:14

Symfo
Зарегистрирован: 2014-07-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Формула Герона

Спасибо! Пора поспать

Офлайн

#4 Июль 28, 2014 14:28:13

Symfo
Зарегистрирован: 2014-07-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Формула Герона

Вот, дописал проверки на длины сторон треугольника и на их количество, чтобы лучше запомнить чего и сколько у него бывает
Все вроде работает, но наверняка что-то реализовано криво. Что тут можно было сделать проще или правильнее?
Занялся программированием дня 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()

Офлайн

#5 Июль 28, 2014 15:26:48

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Формула Герона

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-ами?



Офлайн

#6 Июль 28, 2014 16:40:45

Symfo
Зарегистрирован: 2014-07-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Формула Герона

Спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version