R
The result code for exercise is as followsMethods have been separated to avoid overloading the main method, I know that there are several ways to solve the problem, but this is the one that has occurred to me.public class Edad {
//declaramos las variables de enteros y las inicializamos a cero
static int anos = 0, meses = 0, dias = 0;
//método main
public static void main(String[] args){
//creamos un array para recibir la fecha actuals llamando al método
int[] fecha_act = metodoObtenerFechaActual();
//almacenamos los valores del array en variables
int a_act = fecha_act[0];
int m_act = fecha_act[1];
int d_act = fecha_act[2];
//creamos el array que recibe la fecha del cumpleaños llamar al método y enviando el año actual por parámetro
int[] fecha_nac = metodoPedirFecha(a_act);
//almacenamos los valores del array en variables
int a_nac = fecha_nac[0];
int m_nac = fecha_nac[1];
int d_nac = fecha_nac[2];
//se imprime la fecha de nacimiento
System.out.println("------------Fecha de Nacimiento------------");
System.out.println(d_nac + " / " + m_nac + " / " + a_nac);
//se imprime la fecha actual
System.out.println("------------Fecha Actual------------------");
System.out.println(d_act + " / " + m_act + " / " + a_act);
//años es igual a año actual menos año nacimiento
anos = a_act - a_nac;
//meses año anterior = 12 (meses) menos el mes de nacimiento
//aquí calculamos los meses que han pasado con posterioridad al cumpleaños dentro del año anterior
int m_ano_ant = 12 - m_nac;
//calculamos la diferencia del mes actual con el mes del cumple
meses = m_act - m_nac;
//en días ponemos el valor del dia de hoy
dias = d_act;
//creamos la variables inicializadas a cero
int dias_aux = 0;
int d_mes_ant = 0;
//evaluamos que mes actual sea menor que mes de nacimiento y ...
//que dia actual sea mayor que dia de nacimiento
if ((m_act < m_nac) & (d_act < d_nac)) {
//si cumple la evaluación restamos un año
anos--;
//meses igual a meses del año anterior más mes actual menos 1
meses = (m_ano_ant + m_act) - 1;
//recibimos el resultado de llamar al método que calcula los días enviando fecha cumpleaños y fecha actual por parámetro
dias_aux = metodoCalculaDias(a_nac, m_nac, d_nac, a_act, m_act, d_act);
//el resultado anterior lo sumamos al día de hoy y lo almacenamos en la variable días
dias = d_act + dias_aux;
}
//si no se cumple la anterior condición
//evaluamos que mes actual sea mayor que mes de nacimiento y ...
//día actual mayor que día de nacimiento
else if ((m_act < m_nac) & (d_act > d_nac)) {
//si se cumple, restamos un año
anos--;
//sumamos meses del año anterior más meses actuales y lo almacenamos en meses
meses = m_ano_ant + m_act;
//calculamos días, que serán dias actuales menos día de nacimiento
dias = d_act - d_nac;
}
//si mes actual mayor que mes de nacimiento y ...
//día actual igual a día de nacimiento
else if ((m_act < m_nac) & (d_act == d_nac)) {
//restamos un año
anos--;
//meses igual a meses del año anterior más meses actuales
meses = m_ano_ant + m_act;
//días igual a día actual menos día de nacimiento
dias = d_act - d_nac;
}
//si los meses coindiden y el día actual es menor al de nacimiento
else if ((m_nac == m_act) & (d_act < d_nac)){
//años igual a años
anos = anos;
//meses igual a meses actuales menos mes de nacimiento
meses = m_act - m_nac;
//días igual a dia de nacimiento menos día actual
dias = d_nac - d_act;
}
//si coinciden los meses y el día actual es mayor que el día de nacimiento
else if ((m_nac == m_act) & (d_act > d_nac)){
//años igual a años
anos = anos;
//meses igual a meses actuales menos mes de nacimiento
meses = m_act - m_nac;
//días igual a día actual menos día de nacimiento
dias = d_act - d_nac;
}
//si coinciden meses y días
else if ((m_nac == m_act) & (d_act == d_nac)){
anos = anos;
meses = m_act - m_nac;
dias = d_act - d_nac;
System.out.println("¡¡¡ Felicidades, es tu cumple !!!");
}
//mes actual mayor que mes de nacimiento y ...
//día de nacimiento mayor que día actual
else if ((m_act > m_nac) & (d_nac > d_act)) {
anos = anos;
meses--;
dias_aux = metodoCalculaDias(a_nac, m_nac, d_nac, a_act, m_act, d_act);
dias = d_act + dias_aux;
}
//mes actual mayor que mes de nacimiento y ...
//día de nacimiento mayor que día actual
else if ((m_act > m_nac) & (d_nac < d_act)) {
anos = anos;
meses = meses;
dias = d_act - d_nac;
}
//mes actual mayor a mes de nacimiento y ...
//día de nacimiento igual a día actual
else if ((m_act > m_nac) & (d_nac == d_act)) {
anos = anos;
meses = meses;
dias = d_act - d_nac;
}
//si la variable de meses del año anterior y día actual tienen valores superiores a cero
if ((d_mes_ant > 0) & (d_act > 0)){
//días igual a la suma de los valores de ambas variables
dias = d_mes_ant + d_act;
}
//llamamos al método para imprimir los resultado y enviamos por parámetro los valores de años, meses y días
metodoImprimirResultado(anos, meses, dias);
}
//método que calcula los días y recibe por parámetro las fechas del cumple y la actual
public static int metodoCalculaDias(int a_nac, int m_nac, int d_nac, int a_act, int m_act, int d_act){
//variable para almacenar los días del mes anterior
int d_mes_ant = 0;
//variables para los meses
int ene = 1;
int feb = 2;
int mar = 3;
int abr = 4;
int may = 5;
int jun = 6;
int jul = 7;
int ago = 8;
int sep = 9;
int oct = 10;
int nov = 11;
int dic = 12;
//-----------variables para los años bisiestos-------------
int b_24 = 2024;
int b_28 = 2028;
int b_32 = 2032;
int b_36 = 2036;
int b_40 = 2040;
//si el mes actual es un més de 31 días salvo marzo
if ((m_act == ene) || (m_act == may) || (m_act == jul) || (m_act == ago) || (m_act == oct) || (m_act == dic)) {
//restamos a 30 días que tendrá el mes anterior los días de la fecha de nacimiento
d_mes_ant = 30 - d_nac;
}
//si el mes actual es un més de 30 días
else if ((m_act == abr) || (m_act == jun) || (m_act == sep) || (m_act == nov)){
//el mes anterior será de 31 días, y restamos a esos días los días de la fecha de nacimiento
d_mes_ant = 31 - d_nac;
}
//si el mes actual es marzo y el año es bisiesto
else if ((m_act == mar) & ((a_act == b_24) || (a_act == b_28) || (a_act == b_32) || (a_act == b_36) || (a_act == b_40))){
//restamos los días de la fecha de nacimiento a 29 días
d_mes_ant = 29 - d_nac;
}
//si no es año bisiesto y es el mes de marzo
else if (m_act == mar){
//rstamos los días de nacimiento a 28 días
d_mes_ant = 28 - d_nac;
}
//retornamos el array del resultado
return d_mes_ant;
}
//método que pide la fecha de nacimiento
public static int[] metodoPedirFecha(int a_act){
//instanciamos la clase escaner
Scanner teclado = new Scanner(System.in);
//creamos un array para almacenar las fechas
int[] fecha_nac = new int[3];
//creamos tres bucles do while para que itere mientras no reciba el dato adecuado para los años, los meses y los días respectivamente y almacena el resultado en el array
do{
System.out.println("Ingrese su año de nacimiento: ");
fecha_nac[0] = teclado.nextInt();
if ((fecha_nac[0] < 1900) & (fecha_nac[0] > a_act)){
System.out.println("El año introducido " + fecha_nac[0] + " no es válido");
}
//que itere mientras el dato dado por teclado no sea un número entre 1900 y el año actual
}while ((fecha_nac[0] < 1900) & (fecha_nac[0] > a_act));
do{
System.out.println("Ingrese su mes de nacimiento: ");
fecha_nac[1] = teclado.nextInt();
if ((fecha_nac[1] < 1) & (fecha_nac[1] > 12)){
System.out.println("Recuerde que el año tiene 12 meses y " + fecha_nac[1] + " no es un mes válido");
}
//que itere mientras el dato dado por teclado no sea un número entre 1 y 12
}while ((fecha_nac[1] < 1) & (fecha_nac[1] > 12));
do{
System.out.println("ingrese su día de nacimiento: ");
fecha_nac[2] = teclado.nextInt();
if ((fecha_nac[0] < 1) & (fecha_nac[0] > 31)){
System.out.println("Un mes tiene un máximo de 31 días, " + fecha_nac[2] + " no es un día válido");
}
//que itere mientras el dato dado por teclado no sea un número entre 1 y 31
}while ((fecha_nac[0] < 1) & (fecha_nac[0] > 31));
//retornamos el array
return fecha_nac;
}
//método que obtiene la fecha actual y devuelve un array con los datos de la misma
public static int[] metodoObtenerFechaActual(){
//declaramos el array con los datos
int[] fecha_act = new int[3];
//creamos un objeto date de la clase Date
Date date = new Date();
//obtenemos los datos y los almacenamos en el array
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
fecha_act[0] = localDate.getYear();
fecha_act[1] = localDate.getMonthValue();
fecha_act[2] = localDate.getDayOfMonth();
//retornamos el array
return fecha_act;
}
//método que imprime los resultado que recibe por parámetro
private static void metodoImprimirResultado(int anos, int meses, int dias) {
System.out.println("---------------Edad-----------------------");
//condicionantes para formatear la salida en función de los resultados
//si es un año, cero meses y algún día ó ...
//es un año, algún més y cero días
if (((anos == 1) & (meses == 0) & (dias != 0)) ||
((anos == 1) & (meses != 0) & (dias == 0))){
System.out.print("Tienes " + anos + " años, y ");
}
//si es un año
else if (anos == 1){
System.out.println("");
System.out.print("Tienes " + anos + " año, ");
}
//si no es cero y tampoco 1 y meses y días son cero
else if ((anos != 0) & (anos != 1) & (meses == 0) & (dias == 0)){
System.out.print("Tienes " + anos + " años");
}
//si no es cero, no es uno, meses es cero y días diferente de cero
else if ((anos != 0) & (anos != 1) & (meses == 0) & (dias != 0)){
System.out.print("Tienes " + anos + " años y ");
}
//años diferente de cero y de uno
else if ((anos != 0) & (anos != 1)){
System.out.print("Tienes " + anos + " años, ");
}
//años sea cero
else if (anos == 0){
System.out.print("Tienes ");
}
//meses 1 y días 0
if ((meses == 1) & (dias == 0)){
System.out.print(meses + " mes");
}
//meses 1 y días distinto a cero
else if ((meses == 1) & (dias != 0)){
System.out.print(meses + " mes y ");
}
//meses igual a cero
else if (meses == 0){
System.out.print("");
}
//meses distinto a cero y uno y días igual a cero
else if ((meses != 0) & (meses != 1) & (dias == 0)){
System.out.print(meses + " meses");
}
//meses distinto a cero y uno
else if ((meses != 0) & (meses != 1)){
System.out.print(meses + " meses y ");
}
//si días igual a uno
if (dias == 1){
System.out.print(dias + " dia");
}
//si dias igual a cero
else if (dias == 0){
System.out.print("");
}
//si días distinto a cero y uno
else if ((dias != 0) & (dias != 1)){
System.out.print(dias + " dias");
}
//dos líneas en blanco
System.out.println("");
System.out.println("");
}
}