Programación General > Pascal

 Calcular Edad A Partir De Fechas.

<< < (3/4) > >>

thot_ohm:
Creo que ya dí con lo que era. Mira a ver:


--- Código: Text ---   if (Actual.Mes &#62; Nacimiento.Mes) then    Datos.Edad:= Actual.Anio - Nacimiento.Anio;   if (Actual.Mes &#60; Nacimiento.Mes) then    Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1;   if (Nacimiento.Mes = Actual.Mes) then    if (Actual.Dia &#62;= Nacimiento.Dia) then      Datos.Edad:= Actual.Anio - Nacimiento.Anio    else Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1;  
Sugerencias bien recibidas...

Enko:

--- Cita de: "thot_ohm" --- Creo que ya dí con lo que era. Mira a ver:


--- Código: Text ---   if (Actual.Mes &#62; Nacimiento.Mes) then    Datos.Edad:= Actual.Anio - Nacimiento.Anio;   if (Actual.Mes &#60; Nacimiento.Mes) then    Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1;   if (Nacimiento.Mes = Actual.Mes) then    if (Actual.Dia &#62;= Nacimiento.Dia) then      Datos.Edad:= Actual.Anio - Nacimiento.Anio    else Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1;  
Sugerencias bien recibidas...
--- Fin de la cita ---
si es cierto, me faltó considerar que es lo que pasa si el mes es mayor pero el día no ya que, aún así, como el mes es mayor cumplió los años...... :rolleyes:

--- Código: Text ---   if (Actual.Mes &#62; Nacimiento.Mes) then       Datos.Edad:= Actual.Anio - Nacimiento.Anio  else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia &#62;= Nacimiento.Dia) then      Datos.Edad:= Actual.Anio - Nacimiento.Anio  else       Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1;  
Creo que ahí ya debe bastar. El caso cuando el mes actual es menor que el de nacimiento encaja en el ultimo  ELSE.

thot_ohm:
Gracias Enko, pero el error persiste cuando trato de calcular la edad de alguien que haya nacido el día anterior o el posterior a la fecha actual.

Por ejemplo, calculo la edad de alguien nacido el 13/06/1985 me dice que tiene 20 años y si le pongo a calcular de alguien nacido el 15/06/1985 dice que tiene 19 años.

Tu código es más limpio que el mío y lo he seguido mentalmente para revisarle la lógica y lo veo perfecto (a no ser que sea mi lógica la que está mal  :blink: ).

Te envío adjunto a éste mensaje el código del programa completo por si lo quieres compilar y probarlo tu mismo a ver si yo estoy haciendo algo mal.

De nuevo gracias!


--- Código: Text --- program corocoras; uses dos, crt; type  TFecha = record    Anio: word;    Mes: word;    Dia: word;  end;   TDatos = record    Nombre: string;    Edad: integer;    Grado: byte;    Prom: real;  end; var  Datos: TDatos;  Archivo: File of TDatos; procedure calculaedad;  var    dds: word;    Nacimiento, Actual: TFecha;   begin  getdate(Actual.Anio, Actual.Mes, Actual.Dia, dds);  writeln ('La fecha actual es: ', Actual.Dia, '/', Actual.Mes, '/', Actual.Anio);  write ('D¡a: ');  readln (Nacimiento.Dia);  write ('Mes: ');  readln (Nacimiento.Mes);  write ('A¤o: ');  readln (Nacimiento.Anio);   if (Actual.Mes &#62; Nacimiento.Mes) then     Datos.Edad:= Actual.Anio - Nacimiento.Anio  else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia &#62;= Nacimiento.Dia) then    Datos.Edad:= Actual.Anio - Nacimiento.Anio  else      Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1;   {if (Actual.Mes &#62; Nacimiento.Mes) then    Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1;   if (Actual.Mes &#60; Nacimiento.Mes) then    Datos.Edad:= Actual.Anio - Nacimiento.Anio;   if (Nacimiento.Mes = Actual.Mes) then    if (Actual.Dia &#62;= Nacimiento.Dia) then      Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1    else Datos.Edad:= Actual.Anio - Nacimiento.Anio;}  end; procedure obtenernotas;   var    i: byte;    key: char;    Notas: Array[1..10] of real;    SumNotas: real;  begin  i:= 0;  repeat    i:= i + 1;    write ('Intoduzca la nota: ');    readln (Notas[i]);    SumNotas:= SumNotas + Notas[i];    write ('¨Desea introducir otra nota? (s/n): ');    readln (key);    if i = 10 then write ('Ya se tienen 10 notas del alumno');  until (key = 'n') or (key = 'N') or (i = 10);  Datos.Prom:= SumNotas / i;  write ('El promedio es ', Datos.Prom);  readln;  end; procedure obtenerdatos;  begin  clrscr;  write ('Introduzca el nombre: ');  readln (Datos.Nombre);  writeln ('Fecha de nacimiento: ');  calculaedad;  write ('Grado: ');  readln (Datos.Grado);  write ('Notas: ');  obtenernotas;  end; procedure almacenardatos;  begin  end; begin  obtenerdatos;  almacenardatos;  writeln ('Nombre: ' ,Datos.Nombre);  writeln ('Edad: ' ,Datos.Edad);  writeln ('Grado: ' ,Datos.Grado);  writeln ('Notas: ' ,Datos.Prom);  readln;end.  

Enko:

--- Citar ---Por ejemplo, calculo la edad de alguien nacido el 13/06/1985 me dice que tiene 20 años y si le pongo a calcular de alguien nacido el 15/06/1985 dice que tiene 19 años.

--- Fin de la cita ---
Entonces poniendo al reves los -1 debería funcionar  :rolleyes:

Me equivoque, Van al reves los -1, así si funciona:


--- Código: Text --- if (Actual.Mes &#62; Nacimiento.Mes) then  Datos.Edad:= Actual.Anio - Nacimiento.Anio -1else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia &#62;= Nacimiento.Dia) then  Datos.Edad:= Actual.Anio - Nacimiento.Anio -1else  Datos.Edad:= Actual.Anio - Nacimiento.Anio;  
Si el mes actual es mayor que el mes del nacimiento es porque no cumplió los años y hay que restarle un 1 :rolleyes:

thot_ohm:

--- Citar ---Si el mes actual es mayor que el mes del nacimiento es porque no cumplió los años y hay que restarle un 1

--- Fin de la cita ---

Si el mes actual es mayor al mes de nacimiento es porque SÍ cumplió años. Esto es lo que me tiene frikie. En ese caso quedaría así (digo yo  :unsure: ):


--- Código: Text --- if (Actual.Mes &#62; Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anioelse if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia &#62;= Nacimiento.Dia) then Datos.Edad:= Actual.Anio - Nacimiento.Anio -1else Datos.Edad:= Actual.Anio - Nacimiento.Anio;  
Ahora bien, en ésta parte del código:

--- Código: Text --- else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia &#62;= Nacimiento.Dia) then Datos.Edad:= Actual.Anio - Nacimiento.Anio -1  evalúa que si el mes de nacimiento es igual al actual y el día de nacimiento es MAYOR o IGUAL al actual le reste -1 a la resta del año actual menos el año de nacimiento. Es decir, que no ha cumplido años. Pero sí habría cumplido años si éste condicional es cierto  :blink: , por lo que no habría que restarle 1.

Si seguimos con la parte final del condicional:

--- Código: Text --- else Datos.Edad:= Actual.Anio - Nacimiento.Anio;  se está evaluando que si no se cumple (que el mes de nacimiento sea igual al mes actual y que el dia actual sea mayor o igualal día de nacimiento) no le reste 1. Es decir que sí habría cumplido años ¿?.

¿No es esto incorrecto?

Tal como acabo de analizar el código, tal como estaba estaría bien:

--- Código: Text --- if (Actual.Mes &#62; Nacimiento.Mes) then      Datos.Edad:= Actual.Anio - Nacimiento.Anio else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia &#62;= Nacimiento.Dia) then     Datos.Edad:= Actual.Anio - Nacimiento.Anio else      Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1;  
Ahora bien, que te parece si anidamos otro condicional. Algo así:

--- Código: Text --- if (Actual.Mes &#62; Nacimiento.Mes) then      Datos.Edad:= Actual.Anio - Nacimiento.Anio else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia &#62;= Nacimiento.Dia) then     Datos.Edad:= Actual.Anio - Nacimiento.Anio else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia &#60; Nacimiento.Dia) then     Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1 else if (Nacimiento.Mes &#60; Actual.Mes) then     Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1  
Voy a correrlo y posteo los resultados a ver si funcionó.

No me canso de darte las gracias por la ayuda. Y disculpa el fastidio  :(

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa