Utilizando a linguagem de programação orientada a objetos de sua preferência, crie uma classe para representar datas usando três atributos: o dia, o mês, e o ano. Sua classe deve ter um construtor que inicializa os três atributos e verifica a validade dos valores fornecidos. Inclua também a possibilidade de construir o objeto sem parâmetros que inicializa a data com a data atual fornecida pelo sistema operacional. Forneça uma operação para avançar uma data para o dia seguinte.

Passo 1

Beleza, vamos lá! A gente precisa criar uma classe para representar datas usando programação orientada a objetos (OOP). Isso inclui três atributos: dia, mês e ano. Vamos usar uma linguagem de programação como Python para isso. O que vamos precisar é:
  • Entender como criar uma classe com atributos.
  • Fazer um construtor que inicializa esses atributos e verifica se os valores são válidos.
  • Permitir que a classe seja criada sem parâmetros, usando a data atual do sistema.
  • Adicionar um método para avançar a data para o dia seguinte.

Passo 2

Primeiro, vamos criar a estrutura básica da classe chamada Data. Em OOP, uma classe é como um molde para criar objetos. Cada objeto terá dia, mês e ano como características.
class Data:
    def __init__(self, dia, mes, ano):
        self.dia = dia
        self.mes = mes
        self.ano = ano

Passo 3

Agora, precisamos adicionar a verificação para garantir que os valores de dia, mês e ano são válidos. Por exemplo, o mês deve estar entre 1 e 12, e o dia deve ser apropriado para o mês (como não ter 30 de fevereiro).
Vamos criar um método dentro da classe para validar a data:
    def valida_data(self):
        # Verifica se o mês está entre 1 e 12
        if self.mes < 1 or self.mes > 12:
            return False
        # Número de dias em cada mês
        dias_no_mes = [31, 29 if self.ano % 4 == 0 else 28, 31, 30, 31, 30,
                      31, 31, 30, 31, 30, 31]
        if self.dia < 1 or self.dia > dias_no_mes[self.mes - 1]:
            return False
        return True

Passo 4

Vamos atualizar o construtor para usar esse método de validação. Se a data for inválida, vamos levantar um erro.
    def __init__(self, dia=None, mes=None, ano=None):
        if dia is None and mes is None and ano is None:
            # Inicializa com a data atual
            from datetime import date
            hoje = date.today()
            self.dia = hoje.day
            self.mes = hoje.month
            self.ano = hoje.year
        else:
            self.dia = dia
            self.mes = mes
            self.ano = ano
            if not self.valida_data():
                raise ValueError("Data inválida")

Passo 5

Agora, vamos adicionar o método para avançar a data para o dia seguinte. Precisamos considerar se é o último dia do mês ou do ano.
    def avancar_um_dia(self):
        dias_no_mes = [31, 29 if self.ano % 4 == 0 else 28, 31, 30, 31, 30,
                      31, 31, 30, 31, 30, 31]
        if self.dia < dias_no_mes[self.mes - 1]:
            self.dia += 1
        else:
            self.dia = 1
            if self.mes < 12:
                self.mes += 1
            else:
                self.mes = 1
                self.ano += 1

Resposta

class Data:
    def __init__(self, dia=None, mes=None, ano=None):
        if dia is None and mes is None and ano is None:
            from datetime import date
            hoje = date.today()
            self.dia = hoje.day
            self.mes = hoje.month
            self.ano = hoje.year
        else:
            self.dia = dia
            self.mes = mes
            self.ano = ano
            if not self.valida_data():
                raise ValueError("Data inválida")
    
    def valida_data(self):
        if self.mes < 1 or self.mes > 12:
            return False
        dias_no_mes = [31, 29 if self.ano % 4 == 0 else 28, 31, 30, 31, 30,
                      31, 31, 30, 31, 30, 31]
        if self.dia < 1 or self.dia > dias_no_mes[self.mes - 1]:
            return False
        return True
    
    def avancar_um_dia(self):
        dias_no_mes = [31, 29 if self.ano % 4 == 0 else 28, 31, 30, 31, 30,
                      31, 31, 30, 31, 30, 31]
        if self.dia < dias_no_mes[self.mes - 1]:
            self.dia += 1
        else:
            self.dia = 1
            if self.mes < 12:
                self.mes += 1
            else:
                self.mes = 1
                self.ano += 1

# Exemplo de uso:
# data = Data(28, 2, 2023)
# data.avancar_um_dia()
# print(data.dia, data.mes, data.ano)  # Saída: 1 3 2023

Exercícios relacionados