Пожалуйста, помогите решить задачу на Python

Задача: Запросите у пользователя дату в виде номера дня и номера месяца. Определите время года (зима, весна, лето, осень) и номер квартала (Например, "3.7 - лето, 3-ий квартал"). Обработайте возможные ошибки пользователя при вводе. Вот примерный код который я написал:

try:
    day = int(input("Введите номер дня: "))
    month = int(input("Введите номер месяца: "))
    if (day < 1 or day > 31) or (month < 1 or month > 12):
        print("Ошибка! Некорректная дата.")
    else:
            if month in [12, 1, 2]:
                season = "зима"
            elif month in [3, 4, 5]:
                season = "весна"
            elif month in [6, 7, 8]:
                season = "лето"
            else:
                season = "осень"
                if month in [1, 2, 3]:
                    quarter = 1
                elif month in [4, 5, 6]:
                    quarter = 2
                elif month in [7, 8, 9]:
                    quarter = 3
                else:
                    quarter = 4
                    print(f"{day}.{month} - {season}, {quarter}-й квартал")
except ValueError:
                        print("Ошибка! Введите числа.")

Он ничего не выводит. Что не так? Помогите


Ответы (2 шт):

Автор решения: Алексей Р

В данном случае дело в отступах, которые имеют значение для python.

try:
    day = int(input("Введите номер дня: "))
    month = int(input("Введите номер месяца: "))
    if (day < 1 or day > 31) or (month < 1 or month > 12):
        print("Ошибка! Некорректная дата.")
    else:
        if month in [12, 1, 2]:
            season = "зима"
        elif month in [3, 4, 5]:
            season = "весна"
        elif month in [6, 7, 8]:
            season = "лето"
        else:
            season = "осень"
        if month in [1, 2, 3]:     # подвинуть влево
            quarter = 1            # подвинуть влево
        elif month in [4, 5, 6]:   # подвинуть влево
            quarter = 2            # подвинуть влево
        elif month in [7, 8, 9]:   # подвинуть влево
            quarter = 3            # подвинуть влево
        else:                      # подвинуть влево
            quarter = 4            # подвинуть влево 
        print(f"{day}.{month} - {season}, {quarter}-й квартал") # подвинуть влево
except ValueError:
    print("Ошибка! Введите числа.")
Введите номер дня: 3
Введите номер месяца: 7
3.7 - лето, 3-й квартал

Код можно сократить, использовав арифметику вместо сопоставления номеров месяцев с кварталами и сезонами, а также сделать поточнее проверку корректности дней в месяцах:

try:
    day = int(input("Введите номер дня: "))
    month = int(input("Введите номер месяца: "))

    if not (1 <= month <= 12 and 1 <= day <= [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1]):
        print("Ошибка! Некорректная дата.")
    else:
        quarter = (month - 1) // 3 + 1
        season = ['весна', 'лето', 'осень', 'зима'][(month - 3) // 3]
        print(f"{day}.{month} - {season}, {quarter}-й квартал")
except ValueError:
    print("Ошибка! Введите числа.")
Введите номер дня: 1
Введите номер месяца: 3
1.3 - весна, 1-й квартал
→ Ссылка
Автор решения: MarianD

Ваша программа в целом правильня, я исправил в ней только 2 вещи:

import sys

try:
    day = int(input("Введите номер дня: "))
    month = int(input("Введите номер месяца: "))
except ValueError:
    print("Ошибка! Введите числа.")
    sys.exit(1)
    
if (day < 1 or day > 31) or (month < 1 or month > 12):
    print("Ошибка! Некорректная дата.")
else:
    if month in [12, 1, 2]:
        season = "зима"
    elif month in [3, 4, 5]:
        season = "весна"
    elif month in [6, 7, 8]:
        season = "лето"
    else:
        season = "осень"

if month in [1, 2, 3]:
    quarter = 1
elif month in [4, 5, 6]:
    quarter = 2
elif month in [7, 8, 9]:
    quarter = 3
else:
    quarter = 4
print(f"{day}.{month} - {season}, {quarter}-й квартал")
  1. Блок try-except я ограничил только на проверку, если пользователь ввел целые числа, потому что другие проверки у вас прямо в последующих командах.

    И естественно в случае ошибки после вывода сообщения о ней я окончил программу вызовом функции sys.exit(1). (Ненулевое значение параметра сообщает вызываещему процессу - или операционной системе - что это не нормальный конец.)

  2. Я исправил отступы для определения номера квартала.

    В вашей программе эта часть была прямо в ветви else, которая вычислила время года как осень, и потому для остальных времен номер квартала не выводился.

→ Ссылка