Форум сайта python.su
Доброго времени суток. Только начал изучать Python и при кодировании алгоритма столкнулся с проблемой. Алгоритм такой:
Алгоритм вычисления даты католической Пасхи
Y-год.
G=+1 (G - золотое число в метоновом цикле);
C=+1 (если Y не кратен 100, то С - номер века);
X=-12] (поправка на то, что три из четырёх лет кратных 100 не високосны);
Z=-5] (синхронизация с лунной орбитой, год не кратен лунному месяцу);
D=-X-10 (в марте день ?D mod 7 будет воскресенье);
E = (основание или эпакта - указывает на день наступления полнолуния);
Если (E=24) или (E=25 И G>11) то увеличить E на 1;
N=44-E (N-е марта - день календарного полнолуния);
Если N < 21 то увеличить N на 30;
N=N+7-;
Если N > 31 то дата Пасхи (N-31) апреля иначе дата Пасхи N марта.
Я ввел данные так:
# Вычисляем дату католической пасхи Y = int(input('Введите год - ')) # G - золотое число в метоновом цикле G = (Y % 19) + 1 # если Y не кратен 100, то С - номер века C = (Y // 100) + 1 # поправка на то, что три из четырёх лет кратных 100 не високосны X = (3 * C//4) - 12 # синхронизация с лунной орбитой, год не кратен лунному # месяцу Z = ((8 * C +5) // 25) - 5 # в марте день ?D mod 7 будет воскресенье D = (5 * Y // 4) - X - 10 # основание или эпакта - указывает на день наступления # полнолуния E = ((11 * G + 20 + Z - X) % 30) # Если (E=24) или (E=25 И G>11) то увеличить E на 1 if E==24: E = ((11 * G + 20 + Z - X) % 30) + 1 if E==25 and G>11: E = ((11 * G + 20 + Z - X) % 30) + 1 # N-е марта - день календарного полнолуния N = 44 - E # N < 21 то увеличить N на 30 if N<21: N = (N + 7 - ((D + N) % 7)) + 30 if N>31: z1 = N - 31 print('В этом году Пасха будет праздноваться ', z1, 'апреля') else: z2 = N print('В этом году Пасха будет праздноваться ', z2, 'марта')
Офлайн
Y = int(input("Введите год полностью,я хочу:")) A = Y % 19 B = Y % 4 C = Y % 7 K = Y // 100 P = (13+8*K)//25 Q = K//4 M = (15-P+K-Q)%30 N = (4+K - Q)%7 D = (19*A+M)%30 E = (2*B+4*C+6*D+N)%7 if D + E > 9: print(D+E-9,' апреля') else: print(22+D+E, ' марта')
Онлайн
xam1816, Большое спасибо. Я понял. У меня был этот алгоритм, но я его не правильно записал в конце. Там в низу было описание :
xam1816
# Вычисляем дату католической пасхи x = int(input('Введите год - ')) a = x % 19 b = x % 4 c = x % 7 k = x // 100 print('k = ', k) p = ((13 + 8*k) // 25) q = k // 4 M = (15 - p + k - q) % 30 N = (4 + k - q) % 7 d = (19*a + M) % 30 e = (2*b + 4*c + 6*d + N) % 7 if 28 == d == 29 and e == 6 and (11*M + 11) % 30 < 19: z1 = 22 + d + e print('В этом году Пасха будет праздноваться ', z1, 'марта') else: z2 = d + e - 9 print('В этом году Пасха будет праздноваться ', z2, 'апреля')
Офлайн
.доброго времени суток. я решил не плодить сообщения, тем более, что интересны они только мне, скорее всего. Нужна подсказка в следующем вопросе:
Есть квадратное уравнение вычисление которого сводится к следующему коду
# ax*x + bx +c = 0 A = int(input('A = ')) B = int(input('B = ')) C = int(input('C = ')) dis = B**2 - 4*A*C if dis > 0: x1 = (-B + dis**0.5) / (2*A) x2 = (-B - dis**0.5) / (2*A) result = 'два корня' elif dis == 0: x1 = (-B) / (2*A) x2 = x1 result = 'один корень' else : # дискриминант меньше нуля x1 = 0 x2 = 0 result = 'корней нет' print ('a =', A,'b =', B,'c =', C) print (result) print ('x1 =', x1, 'x2 =', x2)
Офлайн
medusa_01Сразу после ввода коэффициентов в консоли, перед какими-либо вычислениями с ними, проверь через if, равно ли A нулю. Если A не равно нулю, то всё это должно вычисляться и выводиться как квадратное уравнение. Если A равно нулю, то всё это должно вычисляться и выводиться как линейное уравнение. Получится в целом большой код. Но ты его напиши, чтобы видеть, как выглядит правильный код, к которому не применены приёмы упрощения.
как можно в данный код и можно ли вообще включить условие при котором уравнение приобретает вид линейного, когда А=0?
>>> def input_koef(): ... a = float(input('a=')) ... b = float(input('b=')) ... c = float(input('c=')) ... return (a, b, c) ... >>> def eval_square(a, b, c): ... print('Вычисляю квадратное с коэффициентами {} {} {}'.format(a, b, c)) ... >>> def eval_linear(a, b): ... print('Вычисляю линейное с коэффициентами {} {}'.format(a, b)) ... >>> def main(): ... a, b, c = input_koef() ... if a != 0: ... eval_square(a, b, c) ... else: ... eval_linear(b, c) ... >>> main() a=1 b=2 c=3 Вычисляю квадратное с коэффициентами 1.0 2.0 3.0 >>> main() a=0 b=2 c=3 Вычисляю линейное с коэффициентами 2.0 3.0 >>>
Отредактировано py.user.next (Дек. 13, 2020 22:48:35)
Офлайн
py.user.next
Получится в целом большой код. Но ты его напиши, чтобы видеть, как выглядит правильный код, к которому не применены приёмы упрощения.
Когда сделаешь полный код, тогда можно уже будет изучать приёмы упрощения кода (приёмы борьбы со “сложностью кода”).
Сразу после ввода коэффициентов в консоли, перед какими-либо вычислениями с ними, проверь через if, равно ли A нулю. Если A не равно нулю, то всё это должно вычисляться и выводиться как квадратное уравнение. Если A равно нулю, то всё это должно вычисляться и выводиться как линейное уравнение. Получится в целом большой код. Но ты его напиши, чтобы видеть, как выглядит правильный код, к которому не применены приёмы упрощения.
# аx*x + bx +c = 0 A = int(input('A = ')) B = int(input('B = ')) C = int(input('C = ')) if A > 0: # квадратное уравнение dis = B**2 - 4*A*C if dis > 0: x1 = (-B + dis**0.5) / (2*A) x2 = (-B - dis**0.5) / (2*A) result = 'два корня' elif dis == 0: x1 = (-B) / (2*A) x2 = x1 result = 'один корень' else : # дискриминант меньше нуля x1 = 0 x2 = 0 result = 'корней нет' elif A == 0: x1 = (-C) / B x2 = x1 result = 'один корень' else : # квадратное уравнение dis = B**2 - 4*A*C x1 = (-B + dis**0.5) / (2*A) x2 = (-B - dis**0.5) / (2*A) result = 'два корня' print ('a =', A,'b =', B,'c =', C) print (result) print ('x1 =', x1, 'x2 =', x2)
Отредактировано medusa_01 (Дек. 15, 2020 20:22:26)
Офлайн
medusa_01Да, неправильно. У тебя два раза вычисляется квадратное уравнение. Повторяется код.
Не могли бы вы проверить и поправить если я что-то не то сделал?
medusa_01В переменной ты хранишь число максимально точно, а при выводе просто указываешь, сколько знаков после плавающей точки выводить
Не могу сообразить - как отсечь все после второго знака после запятой.
>>> x = 1.23456789 >>> >>> print('x = {:.0f}'.format(x)) x = 1 >>> >>> x 1.23456789 >>> >>> print('x = {:.1f}'.format(x)) x = 1.2 >>> >>> x 1.23456789 >>> >>> print('x = {:.3f}'.format(x)) x = 1.235 >>> >>> x 1.23456789 >>> >>> print('x = {:.6f}'.format(x)) x = 1.234568 >>> >>> x 1.23456789 >>> >>>
Отредактировано py.user.next (Дек. 15, 2020 23:29:37)
Офлайн
мой вариант
import math # функция для неполного кв.уравнения def incomplete_quadratic_equation(a,b,c): if a != 0 and b == 0 and c != 0: if -c / a >= 0: x = math.sqrt(-c / a) return x, -x else: return False elif a != 0 and b != 0 and c == 0: x1 = 0 x2 = -b/a return x1, x2 else: return 0.0 #функция для полного кв.уравнения def quadratic_equation(a, b, c): D = b ** 2 - 4 * a * c if D < 0: return False elif D == 0: x = (-b + math.sqrt(D)) / 2 * a return x else: x1 = (-b + math.sqrt(D)) / 2 * a x2 = (-b - math.sqrt(D)) / 2 * a return x1, x2 def main(): # вступление print('Программа решает квадратное уравнение типа ax*x+bx+c = 0\n:)') result = None #обработка введенных данных num_list = [] for i in 'a','b','c': string = input(f'Введите число {i}: ') if string.lstrip('-').isdigit(): # проверяет является ли строка числом num_list.append(float(string)) # приведение к float else: print(":(\nВы обезьяна,прощайте")# если ввел не число return a,b,c = num_list if (a,b,c) ==(0,0,0): print("0(\nДо свидания") return print(f'Уравнение {a}x*x+{b}x + {c} = 0\n') # определение уравнения(полное\неполное if a != 0: if b == 0 or c == 0: result = incomplete_quadratic_equation(a,b,c) else: result = quadratic_equation(a,b,c) else: pass # здесь функция линейного уравнения,ее пока нет # вывод результата на экран if isinstance(result,tuple): print(f'имеет два корня {result}') elif isinstance(result,float): if result == 0: print(result) else: print(f'имеет один корень {result}') else: print('не имеет корней') if __name__ == '__main__': main()
Онлайн
xam1816
мой вариант
else:А обезьяной быть не хочется. Собственно книга по которой я учусь может не совсем та, что надо, хотя Рика Гаско хвалят. Правда мне приходится кроме обучения еще по ходу самиому менять запись кода, т.к. версия Python не совсем новая в новой версии A != 0, а у него A <> 0. Мелочь, но не приятно. Видно, что вы давно программируете. Я из Вашего кода сейчас полнял не все. Ну например, import math - Вы подключили модуль математических вычислений. А что делает строка def incomplete_quadratic_equation - для меня уже проблема. Если не затруднит, может сможете расшифровать свой код и превратить примата в человека? )))))) Спасибо.
print(“\nВы обезьяна,прощайте”)# если ввел не число
return
Офлайн
py.user.next
Да, неправильно. У тебя два раза вычисляется квадратное уравнение. Повторяется код.
Если A != 0 (а это либо меньше нуля, либо больше нуля), то должно вычисляться квадратное уравнение и должны выводится результаты. Там может быть два корня, может быть один корень, а может быть два комплексных корня (в школе обычно пишут “действительных корней нет”).
Если A = 0, то должно вычисляться линейное уравнение и должен выводится его результат. Там только один корень.
Вот для начала это напиши.
Отредактировано medusa_01 (Дек. 17, 2020 20:14:29)
Офлайн