# AP3 - A1.
def hora_valida(hora, minuto):
    """
    Verifica se uma hora e um minuto são valido.
    
    Args:
        hora: Um valor inteiro representando a hora.
        minuto: Um valor inteiro representando o minuto.
    Returns:
        True se a hora for um numero inteiro entre 0 (inclusive) e 24 (exclusive),
        e o minuto um valor inteiro entre 0 (inclusive) e 60 (exclusive).
        Retorna False caso contrario.
    """
    return 0 <= hora < 24 and 0 <= minuto < 60

# Exemplo de uso:
print(hora_valida(23,59))
print(hora_valida(24, 60))
print(hora_valida(0, 0))
print(hora_valida(12, 30))
print(hora_valida(-1, 10))
print(hora_valida(10, 60))
print(hora_valida(10.5, 30))
print(hora_valida(10, 30.5))

# AP3 - A2.
def soma_minutos(hora, minuto, periodo):
    """
    Soma um periodo em minutos a uma hora e minutos validos.
    Args:
        hora: Um valor inteiro representando a hora (0-23).
        minuto: Um valor inteiro representando o minuto (0-59).
        periodo: Um valor inteiro representando o periodo em minutos a ser somado.
    Returns:
        Uma tupla contendo a nova hora e o novo minuto após a soma do periodo.
        A hora volta a 0 quando 24:00 é ultrapassado.
    """
    total_minutos = hora * 60 + minuto + periodo
    nova_hora = (total_minutos // 60) % 24
    novo_minuto = total_minutos % 60
    return (nova_hora, novo_minuto)

# Exemplo de uso:
print(soma_minutos(20, 20, 120))
print(soma_minutos(23, 30, 120))
print(soma_minutos(23, 45, 90))
print(soma_minutos(10, 0, 30))
print(soma_minutos(10, 30, 0))
print(soma_minutos(0, 0, 1440))
print(soma_minutos(12, 0, 60))

# AP3 - B1.
def bissexto(ano):
    """
    Verifica se um ano é bissexto.
    Args:
        ano: Um valor inteiro representando o ano.
    Returns:
        True se o ano for bissexto, False caso contrario.
    """
    return (ano % 4 == 0 and ano % 100 != 0) or ano % 400 == 0
def dias_no_mes(mes, ano):
    """
    Retorna o numero de dias em um determinado mês e ano.
    
    Args:
        mes: Um valor inteiro representando o mes (1-12).
        ano: Um valor inteiro representando o ano.
    Returns:
        O numero de dias no mes especificado.
    """
    if mes in (1, 3, 5, 7, 8, 10, 12):
        return 31
    elif mes == 2:
        return 29 if bissexto(ano) else 28
    else:
        return 30
def data_valida(ano, mes, dia):
    """
    Verifica se uma data é valida.
    
    Args:
        ano: Um valor inteiro representando o ano.
        mes: Um valor inteiro representando o mes (1-12).
        dia: Um valor inteiro representando o dia.
    Returns:
        True se a data for valida, false caso contrario.
    """
    if not (isinstance(ano, int) and isinstance(mes, int) and isinstance(dia, int)):
        return False
    if not (1<= mes <= 12):
        return False
    if not (1 <= dia <= dias_no_mes(mes, ano)):
        return False
    return True

def nr_dias_passados(ano, mes, dia):
    """
    Calcula o numero de dias passados desde o inicios do ano até a data especificada.
    Args:
        ano: Um valor inteiro representando o ano.
        mes: Um valor inteiro representando o mes (1-12).
        dia: Um valor inteiro representando o dia.
    Returns:
        O numero de dias passados desde o inicio do ano, exclusivo o dia especificado.
        Retorna None se a data não for valida.
    """
    if not data_valida(ano, mes, dia):
        print("Data Invalida!")
        return None
    dias_passados = 0
    mes_atual = 1
    while mes_atual < mes:
        dias_passados += dias_no_mes(mes_atual, ano)
        mes_atual += 1
    return dias_passados
# Exemplo de uso:
print(nr_dias_passados(2025, 2, 1))
print(nr_dias_passados(2024, 3, 15))
print(nr_dias_passados(2023, 12, 31))
print(nr_dias_passados(2024, 2, 29))
print(nr_dias_passados(2024, 2, 30))
print(nr_dias_passados(2024, 13, 10))
print(nr_dias_passados(2024, 2, 'a'))

# AP3 - B2.
def bissexto(ano):
    """
    Verifica se um ano é bissexto.
    
    Args:
        ano: Um valor inteiro representando o ano.
    Returns:
        True se o ano for bissexto, False caso contrario.
    """
    return (ano % 4 == 0 and ano % 100 != 0) or ano % 400 == 0
def dias_no_mes(mes, ano):
    """
    Retorna o numero de dias em um determinado mes e ano.
    Args:
        mes: Um valor inteiro representando o mes (1-12).
        ano: Um valor inteiro representando o ano.
    Returns:
        o numero de dias no mes especificado.
    """
    if mes in(1, 3, 5, 7, 8, 10, 12):
        return 31
    elif mes == 2:
        return 29 if bissexto(ano) else 28
    else:
        return 30
def data_valida(ano, mes, dia):
    """
    Verifica se uma data é valida.
    Args:
        ano: Um valor inteiro representando ano.
        mes: um valor inteeiro representando o mes (1-12).
        dia: Um valor inteiro representando o dia.
    
    Returns:
        True se a data for valida, false caso contrario.
    """
    if not (isinstance(ano, int) and isinstance(mes, int) and isinstance(dia, int)):
        return False
    if not (1 <= mes <= 12):
        return False
    if not (1 <= dia <= dias_no_mes(mes, ano)):
        return False
    return True
def nr_dias_em_falta(ano, mes, dia):
    """
    Calcula o numero de deias que faltam para terminar o ano, incluindo o dia especificado.
    Args:
        ano: Um valor inteiro representando o ano.
        mes: um valor inteiro representando o mes (1- 12).
        dia: Um valor inteiro representando o dia.
    Returns:
        O numero de dias que faltam para terminar o ano, incluindo o dia especificado.
        Retorna None se a data não for valida.
    """
    if not data_valida(ano, mes, dia):
        print("Data Invalida")
        return None
    dias_falta = 0
    mes_atual = mes
    while mes_atual <= mes:
        if mes_atual == mes:
            dias_falta += dias_no_mes(mes_atual, ano) - dia +1
        else:
            dias_falta += dias_no_mes(mes_atual, ano)
        mes_atual += 1
    return dias_falta
# Exemplo de uso:
print(nr_dias_em_falta(2025, 2, 1))
print(nr_dias_em_falta(2024, 3, 15))
print(nr_dias_em_falta(2023, 12, 31))
print(nr_dias_em_falta(2024, 2, 29))
print(nr_dias_em_falta(2024, 2, 30))
print(nr_dias_em_falta(2024, 13, 10))
print(nr_dias_em_falta(2024, 2, 'a'))      
            
# AP3 - B3.
from datetime import date
def duracao_periodo(ano1, mes1, dia1, ano2, mes2, dia2):
    """
    Calcula o numero de dias entre duas datas.

    Args:
        ano1: Ano da primeira data.
        mes1: Mes da primeira data.
        dia1: Dia da primeira data.
        ano2: Ano da segunda data.
        mes2: Mes da segunda data.
        dia2: Dia da segunda data.
    Returns:
        O numero de dias entre duas data, excluindo a segunda data.
        Retorna None se alguma das datas for invalida.
    """
    try:
        data1 = date(ano1, mes1, dia1)
        data2 = date(ano2, mes2, dia2)
    except ValueError:
        print("Erro: uma ou ambas as datas são invalidas")
        return None
    if data1 > data2:
        data_antiga = data2
        data_recente = data1
    else:
        data_antiga = data1
        data_recente = data2
    delta = data_recente - data_antiga
    return delta.days
# Exemplo de uso:
print(duracao_periodo(2025, 2, 1, 2024, 12, 28))
print(duracao_periodo(2023, 13, 1, 2024, 1, 1))   # Data Invalida
print(duracao_periodo(2025, 1, 1, 2025, 1, 1))
print(duracao_periodo(2024, 2, 29, 2024, 3, 1))   # Exemplo de um ano bissexto

# AP3 - B4.
def calcula_juros_acumulados(saldo_inicial, taxa_juro_messal, num_meses):
    """
    Calcula o saldo acumulado em uma conta bancaria apos um certo numero de meses, 
    considerando um taxa de juro mesal fixa. 
    
    Args:
        saldo_inicial: O saldo inicial da conta bancaria.
        taxa_juro_messal: A taxa de juro mesal (0.05 para 5%).
        num_meses: O numero de meses durante os quais os juros serão acumulados.
        
        
    Returns:
        O saldo acumulado apos o numero de meses especificado.
    """
    saldo_atual = saldo_inicial
    for _ in range (num_meses):
        saldo_atual *= (1 + taxa_juro_messal)
    return round (saldo_atual, 3)
# Exemplo de uso:
print(calcula_juros_acumulados(1000, 0.05, 6))

# AP3 - B5.
def calcula_media():
    """
    Pede um conjunto de valores ao utilizador e calcula a média.
    Se não for introduzido qualquer valor, devolve None.
    """
    print("Introduza cada um dos valores para o calculo da media. Para terminar")
    print("introduza -1.")

    valores = []
    while True:
        try:
            valor = float(input("Introduza o novo valor: "))
            if valor == -1:
                break
            valores.append(valor)
        except ValueError:
            print("Por favor, introduza um número válido.")

    if not valores:
        return None
    else:
        return sum(valores) / len(valores)

# Exemplo de utilização:
media = calcula_media()
if media is not None:
    print(f"{media:.5f}")
else:
    print(media)

# AP3 - B6.
def determina_maior():
    """Pede um conjunto de valores e determina o maior deles.
    Se não for introduzido qualquer valor, devolve None.
    """
    print("Introduza cada um dos valores do conjunto. Para terminar introduza -1.")
    maior = None
    while True:
        try:
            valor = int(input("Introduza o novo valor: "))
            if valor == -1:
                break
            if maior is None or valor > maior:
                maior = valor
        except ValueError:
            print("Por favor, introduza um número inteiro.")
    return maior

print(determina_maior())
        
# AP3 - A9.
def faz_marcacao_especialidade(hora_inicio, minuto_inicio):
    """
    Permite marcar consultas médicas por especialidade, apresentando o horario de atendimento.
    
    Args:
        hora_inicio (int): A hora de inicio da atividade (0-23).
        minuto_inicio (Int): O minuto de início da atividade (0-59)
    """
# AP3 - A1.
# AP3 - A1.
# AP3 - A1.
# AP3 - A1.

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: