Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 17, 2020 16:52:20

medusa_01
Зарегистрирован: 2020-11-14
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Расчет даты

Доброго времени суток. Только начал изучать 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, 'марта')
Однако, я где-то ошибся. Перепроверка ничего не дает (на данный моменнт не достаточно знаний), а дальше идти не могу - надо понять ошибку. При вычислении даты подсчет даты идет с ошибкой для 2020 года -4 дня, т.е 8 апреля. Я понимаю - все это ерунда, но я должен понять. Подскажите пожалуйста. Спасибо.

Офлайн

#2 Ноя. 17, 2020 17:58:02

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

Расчет даты

 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, ' марта')

Онлайн

#3 Ноя. 18, 2020 16:17:36

medusa_01
Зарегистрирован: 2020-11-14
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Расчет даты

xam1816
xam1816
, Большое спасибо. Я понял. У меня был этот алгоритм, но я его не правильно записал в конце. Там в низу было описание :
“Дата Пасхи по новому стилю: 22 + d + e марта или d + e − 9 апреля.
Если d = 29 и e = 6, то вместо 26 апреля будет 19 апреля
Если d = 28, e = 6 и (11M + 11) mod 30 < 19, то вместо 25 апреля будет 18 апреля ”
И я естественно попытался закодировать то, что кодировать было не надо(((
 # Вычисляем дату католической пасхи
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, 'апреля')
Ну, как понимаете, при попытке вычислить дату, припадаемую на март, у меня получался апрель с отрицательным значением. Большое спасибо.

Офлайн

#4 Дек. 13, 2020 20:31:15

medusa_01
Зарегистрирован: 2020-11-14
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Расчет даты

.доброго времени суток. я решил не плодить сообщения, тем более, что интересны они только мне, скорее всего. Нужна подсказка в следующем вопросе:
Есть квадратное уравнение вычисление которого сводится к следующему коду

 # 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)

Вопрос в следующем - как можно в данный код и можно ли вообще включить условие при котором уравнение приобретает вид линейного, когда А=0? Я не понимаю. как прописать данный момент в данном коде. Если посчитаете вопрос не важным - нет проблем. просто подскажите где можно получить пояснения по данному вопросу. буду рад любой помощи. Спасибо.

Офлайн

#5 Дек. 13, 2020 22:48:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Расчет даты

medusa_01
как можно в данный код и можно ли вообще включить условие при котором уравнение приобретает вид линейного, когда А=0?
Сразу после ввода коэффициентов в консоли, перед какими-либо вычислениями с ними, проверь через if, равно ли A нулю. Если A не равно нулю, то всё это должно вычисляться и выводиться как квадратное уравнение. Если A равно нулю, то всё это должно вычисляться и выводиться как линейное уравнение. Получится в целом большой код. Но ты его напиши, чтобы видеть, как выглядит правильный код, к которому не применены приёмы упрощения.

Когда сделаешь полный код, тогда можно уже будет изучать приёмы упрощения кода (приёмы борьбы со “сложностью кода”).

И потом ты придёшь вот к этому
  
>>> 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)

Офлайн

#6 Дек. 15, 2020 18:54:03

medusa_01
Зарегистрирован: 2020-11-14
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Расчет даты

py.user.next
Получится в целом большой код. Но ты его напиши, чтобы видеть, как выглядит правильный код, к которому не применены приёмы упрощения.

Когда сделаешь полный код, тогда можно уже будет изучать приёмы упрощения кода (приёмы борьбы со “сложностью кода”).

Черт. Сказать, что у меня дух перехватило - не сказать ничего.

Сразу после ввода коэффициентов в консоли, перед какими-либо вычислениями с ними, проверь через if, равно ли A нулю. Если A не равно нулю, то всё это должно вычисляться и выводиться как квадратное уравнение. Если A равно нулю, то всё это должно вычисляться и выводиться как линейное уравнение. Получится в целом большой код. Но ты его напиши, чтобы видеть, как выглядит правильный код, к которому не применены приёмы упрощения.

Пытаюсь писать, но честно говоря получается коряво - нехватка знанаий. Надеюсь пока. За науку - СПАСИБО.)))

Прошло 2 часа. Я написал кок. который вы роекомендовали. Все, вроде бы, считается но меня терзают смутные сомнения))) Не могли бы вы проверить и поправить если я что-то не то сделал? Вот код:
 # а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)

Собственно меня смущает вычисление условия. когда А<0.
Your text to link here…
Не могу сообразить - как отсечь все после второго знака после запятой. Спасибо.

Отредактировано medusa_01 (Дек. 15, 2020 20:22:26)

Офлайн

#7 Дек. 15, 2020 23:06:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Расчет даты

medusa_01
Не могли бы вы проверить и поправить если я что-то не то сделал?
Да, неправильно. У тебя два раза вычисляется квадратное уравнение. Повторяется код.

Если A != 0 (а это либо меньше нуля, либо больше нуля), то должно вычисляться квадратное уравнение и должны выводится результаты. Там может быть два корня, может быть один корень, а может быть два комплексных корня (в школе обычно пишут “действительных корней нет”).
Если A = 0, то должно вычисляться линейное уравнение и должен выводится его результат. Там только один корень.

Вот для начала это напиши.

(На самом деле, там больше всяких вариантов. При A = 0 и B = 0, например, количество корней может быть вообще бесконечно, так как уравнение общего вида превращается в 0 * x^2 + 0 * x + C = 0 => 0 * x = -C. Так что, если C = 0, то ответ будет x принадлежит множеству (-inf, +inf), где inf - infinity (бесконечность). Если же C != 0, то решений вообще нет, так как, например, при C = -1 уравнение общего вида примет вид 0 * x^2 + 0 * x + (-1) = 0 => 0 * (x^2 + x) = 1 => x^2 + x = 1/0 => x^2 + x = inf, что является неопределённым.)

Напиши хотя бы правильно без заморочек с математикой. Когда программируешь (разрабатываешь что-то, создаёшь с нуля), приёмы программирования есть всегда, а математика есть не всегда. Поэтому нужно учиться приёмам программирования как можно больше. Так что на математике не заостряйся, она не поможет тебе в трудную минуту. Другими словами, знание всех вариантов вычисления квадратного уравнения не поможет тебе написать программу, которая предлагает ввести коэффициенты и сразу для них выводит правильный ответ, который можно сразу брать и использовать дальше. Где-то в дальнейшем только понадобится математика. Но когда ты до неё дойдёшь, умеешь ты программировать или не умеешь, будет иметь решающее значение в том, будешь ли ты её использовать или не будешь, так как неспособность ничего написать в плане вменяемого кода нивелирует и знание того, как что-то решается математически.

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)

Офлайн

#8 Дек. 16, 2020 01:08:21

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

Расчет даты

мой вариант

 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()

Онлайн

#9 Дек. 16, 2020 07:19:36

medusa_01
Зарегистрирован: 2020-11-14
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Расчет даты

xam1816
мой вариант

Большое спасибо. Просто я только вникаю в процесс написания программ и мне очень важно понять, как э\то пишется правильно. Если я просто скопирую готовый ответ, то чем я буджу отличаться от
else:
print(“\nВы обезьяна,прощайте”)# если ввел не число
return
А обезьяной быть не хочется. Собственно книга по которой я учусь может не совсем та, что надо, хотя Рика Гаско хвалят. Правда мне приходится кроме обучения еще по ходу самиому менять запись кода, т.к. версия Python не совсем новая в новой версии A != 0, а у него A <> 0. Мелочь, но не приятно. Видно, что вы давно программируете. Я из Вашего кода сейчас полнял не все. Ну например, import math - Вы подключили модуль математических вычислений. А что делает строка def incomplete_quadratic_equation - для меня уже проблема. Если не затруднит, может сможете расшифровать свой код и превратить примата в человека? )))))) Спасибо.

Офлайн

#10 Дек. 16, 2020 07:21:55

medusa_01
Зарегистрирован: 2020-11-14
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Расчет даты

py.user.next
Да, неправильно. У тебя два раза вычисляется квадратное уравнение. Повторяется код.

Если A != 0 (а это либо меньше нуля, либо больше нуля), то должно вычисляться квадратное уравнение и должны выводится результаты. Там может быть два корня, может быть один корень, а может быть два комплексных корня (в школе обычно пишут “действительных корней нет”).
Если A = 0, то должно вычисляться линейное уравнение и должен выводится его результат. Там только один корень.

Вот для начала это напиши.

Спасибо, буду стараться.

Отредактировано medusa_01 (Дек. 17, 2020 20:14:29)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version