20. Григорианский календарь в порядковый.
Условие:
Нужно написать программу, которая будет принимать на ввод: год, месяц, дату.
Ранее уже была программа про високосный год. Использовать её для написания модуля, в котором будет производится проверка существования введённой даты и вычисление порядкового номера дня в году для этой даты.
В итоге, мы вводим данные о дате, программа обращается к внешней функции в модуле и выдаёт нам порядковый номер дня в году.
Код:
import my_lib # импорт самописной библиотеки
# ввод данных
while True:
try:
year = input("%75s" % "Введите год (в формате 2023): ")
year = int(year)
month = input("%75s" % "Введите месяц (в формате 3, 7, 12): ")
month = int(month)
day = input("%75s" % "Введите число месяца (в формате 3, 19, 28, 31): ")
day = int(day)
result = my_lib.true_date(year, month, day) # кортеж из 2 элементов, результат функции из самописной библиотеки, первый элемент это флаг проверки существуте дата или нет (True/False), а второй элемент это порядковый номер даты в году
if result[0]:
digit = result[-1]
break
else:
print("%74s" % "Вы ввели не существующую дату.")
except:
print("%74s" % "Вы ввели не цифры.")
print("%74s" % "Порядковый номер:", digit)
Код библиотеки:
# возвращает кортеж с двумя элементами, где первый элемент - это True или False (определяет существует такая дата или нет), а второй элемент - это порядковый номер дня в году для кокретной даты
def true_date(year, month, day):
dict_1 = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31} # словарь для обычного года
dict_2 = {1: 31, 2: 29, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31} # словарь для високосного года
if ((year % 4 == 0 and year % 100 != 0) or (year % 100 == 0 and year % 400 == 0)) and (month in dict_2) and (1 <= day <= dict_2[month]): # проверка даты, если год високосный (раньше такая задача встречалась, называется високосный год)
flag = True # флаг, если год прошёл проверку на существование даты
number = 0 # будем копить сюда порядковый номер дня в году
for a, b in dict_2.items(): # обойдем словарь в цикле и накопим порядковый номер пока будет удовлетворять условие
if a < month:
number += b
elif a == month:
number += day
elif (((year % 4 == 0 and year % 100 != 0) or (year % 100 == 0 and year % 400 == 0)) == False) and (month in dict_2) and (1 <= day <= dict_1[month]): # повторение, только для другого словаря
flag = True
number = 0
for a, b in dict_1.items():
if a < month:
number += b
elif a == month:
number += day
else: # этот блок, когда дата не прошла проверку, т.е. не существует
flag = False
number = 0
return (flag, number) # возвращаем кортеж, первый элемент которого является флагом прошла дата проверку на существование или нет, а второй элемент это порядковый номер дня для этой даты в году.