Programación General > Pascal
Calcular Edad A Partir De Fechas.
thot_ohm:
Creo que ya dí con lo que era. Mira a ver:
--- Código: Text --- if (Actual.Mes > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio; if (Actual.Mes < Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1; if (Nacimiento.Mes = Actual.Mes) then if (Actual.Dia >= 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 > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio; if (Actual.Mes < Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1; if (Nacimiento.Mes = Actual.Mes) then if (Actual.Dia >= 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 > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia >= 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 > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia >= Nacimiento.Dia) then Datos.Edad:= Actual.Anio - Nacimiento.Anio else Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1; {if (Actual.Mes > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1; if (Actual.Mes < Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio; if (Nacimiento.Mes = Actual.Mes) then if (Actual.Dia >= 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 > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio -1else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia >= 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 > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anioelse if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia >= 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 >= 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 > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia >= 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 > Nacimiento.Mes) then Datos.Edad:= Actual.Anio - Nacimiento.Anio else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia >= Nacimiento.Dia) then Datos.Edad:= Actual.Anio - Nacimiento.Anio else if (Nacimiento.Mes = Actual.Mes) and (Actual.Dia < Nacimiento.Dia) then Datos.Edad:= Actual.Anio - Nacimiento.Anio - 1 else if (Nacimiento.Mes < 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
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa