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)                                                                                                                                           # возвращаем кортеж, первый элемент которого является флагом прошла дата проверку на существование или нет, а второй элемент это порядковый номер дня для этой даты в году.