""" Sección Declarativa Descripción: Calcula la diferencia exacta en años, meses y días entre dos fechas. Las fechas se ingresan como números enteros en formato AAAAMMDD. Versión 1: se descomponen ambas fechas Casos de prueba: - Caso 1 (Préstamo de días): Fecha 1: 20230515, Fecha 2: 20240310 -> Diferencia: 9 meses, 24 días. (Se omite el año porque es 0). - Caso 2 (Mes y día de Fecha 2 mayores a Fecha 1): Fecha 1: 20230515, Fecha 2: 20240820 -> Diferencia: 1 años, 3 meses, 5 días. Recursos: - fecha1, fecha2 (int): Fechas ingresadas por el usuario. - anio1, mes1, dia1 (int): Componentes extraídos de la primera fecha. - anio2, mes2, dia2 (int): Componentes extraídos de la segunda fecha. - dif_anios, dif_meses, dif_dias (int): Diferencias calculadas. - mes_anterior, anio_evaluar, dias_mes_anterior (int): Variables para ajustar días negativos. - texto_diferencia (str): Cadena de texto construida dinámicamente para mostrar el resultado. """ # Sección Algorítmica # 1) Prólogo print("--- Calculadora de Diferencia entre Fechas ---") print("Ingrese las fechas como un número entero continuo de 8 dígitos (ej. 20250815 para 15/08/2025).") print("Asegúrese de que la primera fecha sea estrictamente menor a la segunda.\n") fecha1 = int(input("Ingrese la primera fecha (AAAAMMDD): ")) fecha2 = int(input("Ingrese la segunda fecha (AAAAMMDD): ")) # 2) Desarrollo # Extracción de los componentes numéricos usando división entera (//) y módulo (%) anio1 = fecha1 // 10000 mes1 = (fecha1 // 100) % 100 dia1 = fecha1 % 100 anio2 = fecha2 // 10000 mes2 = (fecha2 // 100) % 100 dia2 = fecha2 % 100 # Diferencia directa inicial dif_anios = anio2 - anio1 dif_meses = mes2 - mes1 dif_dias = dia2 - dia1 # Ajuste con estructuras condicionales en caso de días negativos if dif_dias < 0: dif_meses = dif_meses - 1 # Pedimos un mes prestado # Determinamos cuál fue el mes anterior para saber cuántos días pedir mes_anterior = mes2 - 1 anio_evaluar = anio2 if mes_anterior == 0: mes_anterior = 12 anio_evaluar = anio2 - 1 # Asignación de días según el mes anterior usando condicionales múltiples if mes_anterior == 1 or mes_anterior == 3 or mes_anterior == 5 or mes_anterior == 7 or mes_anterior == 8 or mes_anterior == 10 or mes_anterior == 12: dias_mes_anterior = 31 elif mes_anterior == 4 or mes_anterior == 6 or mes_anterior == 9 or mes_anterior == 11: dias_mes_anterior = 30 else: # sólo queda como posibilidad, en orden descendente de probabilidad, de que mes_anterior sea 2 # Lógica condicional para año bisiesto if (anio_evaluar % 4 == 0 and anio_evaluar % 100 != 0) or (anio_evaluar % 400 == 0): dias_mes_anterior = 29 else: dias_mes_anterior = 28 # Sumamos los días prestados por el mes anterior dif_dias = dif_dias + dias_mes_anterior # Ajuste con estructuras condicionales en caso de meses negativos if dif_meses < 0: dif_anios = dif_anios - 1 # Pedimos un año prestado dif_meses = dif_meses + 12 # Sumamos los 12 meses del año # --- Construcción del texto obviando valores en 0 --- # Se introduce el concepto de concatenación condicional de cadenas, un patrón muy común en programación. texto_diferencia = "" if dif_anios > 0: texto_diferencia = texto_diferencia + str(dif_anios) + " años " if dif_meses > 0: texto_diferencia = texto_diferencia + str(dif_meses) + " meses " if dif_dias > 0: texto_diferencia = texto_diferencia + str(dif_dias) + " días" # Por seguridad (en caso de que el usuario ingrese la misma fecha dos veces sin querer) if texto_diferencia == "": texto_diferencia = "0 días" # 3) Epílogo print("\n--- Resultados ---") print(f"Fecha inicial: {dia1:02d}/{mes1:02d}/{anio1}") print(f"Fecha final : {dia2:02d}/{mes2:02d}/{anio2}") # Usamos .strip() opcionalmente para quitar el espacio final, aunque en la terminal casi no se nota print(f"Diferencia : {texto_diferencia.strip()}") input("Pulse Enter para terminar el programa")