def R3(dia_siguiente): anio = dia_siguiente[0] mes = dia_siguiente[1] dia = dia_siguiente[2] dias_meses = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ] #Los días que posee cada mes en orden de izquierda a derecha if (requerimiento_0.R0(dia_siguiente)): #Validar la tupla ingresada if (requerimiento_2.R2(dia_siguiente) ): # Se valida que sea una fecha válida if ( requerimiento_1.R1(anio) ): #Si es año bisiesto se cambia la cantidad de días de Febrero en la lista dias_meses[1] += 1 if (dia != dias_meses[mes - 1]): return (anio, mes, dia + 1) #Si el día no es el último del mes else: if (mes == 12): return (anio + 1, 1, 1 ) #Si es el último día del mes de diciembre else: return ( anio, mes + 1, 1 ) #Si es el último día del mes que no sea Febrero ni Diciembre else: return "No es una fecha válida" else: return "No es una fecha válida"
def R6(imprimir_3x4): meses_dict = { # Diccionario con los meses y la cantidad dias respectivamente "Enero": 31, "Febrero": 28, "Marzo": 31, "Abril": 30, "Mayo": 31, "Junio": 30, "Julio": 31, "Agosto": 31, "Septiembre": 30, "Octubre": 31, "Noviembre": 30, "Diciembre": 31 } dias = ("D", "L", "K", "M", "J", "V", "S") print("Calendario del año " + str(imprimir_3x4) + " D.C") lista_meses = [] item_mes = [] dia_inicial = requerimiento_5.R5( imprimir_3x4) # Obtener el dia en el que empieza el dia de enero if (type(dia_inicial) is not int): # Validar el tipo de dato del año ingresado return "Año inválido" if ( requerimiento_1.R1(imprimir_3x4) ): # Verificar si el año ingresado es bisiesto. Si es, se añade +1 dia al mes de febrero meses_dict["Febrero"] = meses_dict.get("Febrero") + 1 for _mes, cant_dias in meses_dict.items( ): # Iterar sobre el diccionario de meses y sus cantidades de dias respectivos lista_temp = [] for _dia in dias: # Ingresar los dias de la semana en cada mes lista_temp.append(_dia) item_mes.append(lista_temp) temp_ceros = dia_inicial lista_temp = [] while temp_ceros != 0: # Anadir espacios vacios acorde al dia inicial del mes lista_temp.append(" ") temp_ceros -= 1 for _dia in range(1, cant_dias + 1): # Recorrer los dias segun la cantidad respectiva lista_temp.append(_dia) dia_inicial += 1 if ( dia_inicial == 7 ): # Si es el dia final de la semana, insertar lista con la cantidad de 7 dias, luego se inicia en [] item_mes.append(lista_temp) lista_temp = [] dia_inicial = 0 temp_ceros = dia_inicial while temp_ceros != 7: # Ingresar ceros en la matriz acorde al dia de inicio lista_temp.append(" ") temp_ceros += 1 item_mes.append(lista_temp) if (len(item_mes) != 7): # Para que todos los meses sean de tamaño 7. item_mes.append([" ", " ", " ", " ", " ", " ", " "]) lista_meses.append(item_mes) item_mes = [] imprimir_R6(lista_meses, imprimir_3x4)
def dia_inicio_mes(año, mes): if (isinstance(año, int) and isinstance( mes, int)): #Se valida que las entradas sean números enteros if ( año > 1582 ): #Se valida que el año pertenezca al calendario Gregoriano(año>1582) if ( mes > 0 and mes < 13 ): #Se valida que el mes pertenezca al rango válido (1≤ mes ≤12) retorno = requerimiento_5.calcularDoomsday( (año, mes, 1) ) #Se calcula el primer día del mes en el año indicado y se almacena en una variable a ser retornada if (requerimiento_1.R1(año) and mes == 2): #Si es año bisiesto se resta uno al resultado if retorno == 0: #Si es año bisiesto y "retorno=0" retorna el 6 para indicar que es sábado return 6 else: #Si es año bisiesto y "retorno!=0" se resta 1 a la variable "retorno" retorno -= 1 return retorno else: return "El mes ingresado debe pertenecer al rango válido (1≤ mes ≤12)" else: return "El año no pertenece al claendario Gregoriano. Debe ser mayor a 1582" else: return "Los datos ingresados deben ser números enteros"
def calcularDoomsday(fecha): TablaMeses = [0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5] #Valores según cada mes necesarios para la fórmula TablaSiglos = [6, 4, 2, 0] #Valores según cada siglo necesarios para la fórmula PrimeraTabla = [0, 3, 4, 0, 1, 4, 5, 0, 2, 5] #Valores necesarios para la fórmula SegundaTabla = [0, 1, 2, 3, 5, 6, 0, 1, 3, 4, 5, 6] #Valores necesarios para la fórmula siglo = fecha[0] // 100 PrimerDigitoAnio = ( fecha[0] % 100 - fecha[0] % 10) // 10 #Primer digito del año sin contar los primeros 2 SegundoDigitoAnio = (fecha[0] % 10 ) #Segundo dígito del año sin contar los primeros 2 if (fecha[1] == 1 or fecha[1] == 2): if (requerimiento_1.R1( fecha[0])): #Si es año bisiesto se utiliza un -1 en la fórmula TablaMeses[0] -= 1 if (esPar(PrimerDigitoAnio) == False ): #Si PrimerDigitoAnio es impar, se suma 2 al SegundoDigitoAnio SegundoDigitoAnio += 2 return (fecha[2] + TablaMeses[fecha[1] - 1] + (TablaSiglos[siglo % 4]) + PrimeraTabla[PrimerDigitoAnio] + SegundaTabla[SegundoDigitoAnio]) % 7 #Formula utilizada
def R2(fecha_es_valida): # Se asume el formato: (año, mes, día) meses_dict = { # Diccionario con los meses y la cantidad dias respectivamente "enero": 31, "febrero": 28, "marzo": 31, "abril": 30, "mayo": 31, "junio": 30, "julio": 31, "agosto": 31, "septiembre": 30, "octubre": 31, "noviembre": 30, "diciembre": 31 } anio = fecha_es_valida[ 0] # Asignacion de los valores de la tupla en variables mes = fecha_es_valida[1] dia = fecha_es_valida[2] if (requerimiento_1.R1(anio) ): # Comprobar si el año es bisiesto, si sucede meses_dict["febrero"] = meses_dict.get( "febrero") + 1 # .. se suma +1 dia al mes de febrero if ((mes < 1) or (mes > 12)): # Verificar que el mes ingresado esté entre 1 y 12 return False if ((dia < 1) or (dia > list(meses_dict.values())[mes - 1]) ): # Verificar que los dias ingresados sean acorde al mes, return False # .. se pasa el diccionario de meses en forma lista conteniendo # .. los valores (cantidad de días), luego se obtiene por medio return True # .. de un indice el valor respectivo acorde al mes ingresado
def dias_entre(f1, f2): if ((requerimiento_0.R0(f1) == True) and (requerimiento_0.R0(f2) == True)): # verificar el formato de las fechas if ( (requerimiento_2.R2(f1) == True) and (requerimiento_2.R2(f2) == True) ): # se comprueba de acuerdo al calendario gregoriano, el mes y los dias respectivos if (f1EsFechaMenor(f1, f2) != True): # si f1 no es menor, pasa a ser la menor temp = f2 f2 = f1 f1 = temp dias_meses = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ] # días de cada mes, en orden de izquierda a derecha diasTranscurridos = 0 nuevoF1 = list( f1) # convertir las tuplas en listas para editar valores nuevoF2 = list(f2) banderaBisiesto = False # validar el incremento del mes febrero en los años bisiestos cada 4 años while (sonFechasIguales(nuevoF1, nuevoF2) != True): # la idea es hacer f1 la misma fecha que f2 if ((nuevoF1[2] - 1) == dias_meses[nuevoF1[1] - 1] ): # si estoy en el ultimo dia - 1 del mes nuevoF1[2] = 1 # el dia inicia en 1 if (nuevoF1[1] < 12): # si no estoy en el numero de mes maximo nuevoF1[1] += 1 # se incrementa el mes en 1 else: nuevoF1[1] = 1 # pero si estoy en el mes 12 nuevoF1[0] += 1 # el mes empezará en 1 if ( requerimiento_1.R1(nuevoF1[0]) == True ): # si es año bisiesto se suma 1 al mes de febrero dias_meses[1] += 1 banderaBisiesto = True # el año siguiente disminuye 1 dia a febrero. elif ( banderaBisiesto != False ): # *Solo entra al condicional cuando un año atras hubo un bisiesto dias_meses[1] -= 1 banderaBisiesto = False nuevoF1[2] += 1 # se incrementa el dia en + 1 diasTranscurridos += 1 # cuenta global de los dias transcurridos return diasTranscurridos else: print( "Alguna fecha presenta valores incorrectos de acuerdo al calendario gregoriano" ) else: print("Alguna fecha presenta un error de formato")
def dia_semana(fecha): if ( fecha[0] > 1582 ): #Se verifica que el año pertenezca al calendario Gregoriano(año>1582) if (requerimiento_2.R2(fecha)): #Se verifica que sea un fecha válida retorno = requerimiento_5.calcularDoomsday( fecha ) #Se calcula el día de la semana que es la fecha ingresada if (requerimiento_1.R1(fecha[0]) and fecha[1] == 2): #Se verifica si el año es bisiesto if retorno == 0: #Si es año bisiesto y "retorno=0" retorna el 6 para indicar que es sábado return 6 else: #Si es año bisiesto y "retorno!=0" se resta 1 a la variable "retorno" retorno -= 1 return retorno else: return "La fecha ingresada no es válida" else: return "El año no pertenece al claendario Gregoriano. Debe ser mayor a 1582"
def fecha_futura(tupla, dias): # Se asume el formato: (año, mes, día) dias_meses = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ] #Los días que posee cada mes en orden de izquierda a derecha anioTupla = tupla[0] mesTupla = tupla[1] diaTupla = tupla[2] if (requerimiento_0.R0(tupla)): #Validar la tupla ingresada if (requerimiento_2.R2(tupla)): # Se valida que sea una fecha válida if ((type(dias) is int) and dias > 0): # Validar que sea un número natural positivo if ( requerimiento_1.R1(anioTupla) ): #Si es año bisiesto se cambia la cantidad de días de Febrero en la lista dias_meses[1] += 1 if (diaTupla <= dias_meses[mesTupla - 1] - dias): return (anioTupla, mesTupla, diaTupla + dias ) #Si el día no es el último del mes else: diaNuevo = diaTupla + dias #Dia incrementado para la nueva fecha indiceMes = mesTupla - 1 # Mes actual anioNuevo = anioTupla # Año actual while (diaNuevo > dias_meses[indiceMes]): diaNuevo -= dias_meses[ indiceMes] # Restar los días de cada mes indiceMes += 1 if (indiceMes == 12): indiceMes = 0 anioNuevo += 1 if (mesTupla == 12): return (anioNuevo, indiceMes + 1, diaNuevo ) #Si es el último día del mes de diciembre else: return ( anioNuevo, indiceMes + 1, diaNuevo ) #Si es el último día del mes que no sea Febrero ni Diciembre else: return "La cantidad de días debe ser un número natural positivo" else: return "No es una fecha válida" else: return "No es una fecha válida"
def R4(dias_desde_primero_enero): if ((requerimiento_0.R0(dias_desde_primero_enero)) and (requerimiento_2.R2(dias_desde_primero_enero))): anio = dias_desde_primero_enero[0] mes = dias_desde_primero_enero[1] dia = dias_desde_primero_enero[2] dias_meses = [31,28,31,30,31,30,31,31,30,31,30,31] #Los dias que posee cada mes en orden de izquierda a derecha cantidad_dias = 0 for i in range(mes- 1): #Sumar todos los dias desde enero hasta mes anterior cantidad_dias += dias_meses[i] i += 1 cantidad_dias += dia - 1 #Sumarle la cantidad de dias que han pasado completamente en el mes actual if(2 < mes and requerimiento_1.R1(anio)): #Si es anio bisiesto y mes mayor a febrero cantidad_dias += 1 print(cantidad_dias) else: print("Error en el formato de fecha indicado")