Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda para elaborar un algoritmo para una tabla de calculo (https://www.clubdelphi.com/foros/showthread.php?t=73113)

JoAnCa 01-04-2011 15:46:18

Ayuda para elaborar un algoritmo para una tabla de calculo
 
Hola a todos
Existe un calculo para predecir el sexo del futuro bebe basado en las fechas de nacimiento de los padres, y la renovacion de las gonadas cada 5 años para el padre y cada 4 para la madre, aunque no es 100% exacto (ningun metodo de este tipo lo es), pero es bastante preciso
Para no tener que hacerlo a mano, quise automatizarlo, pero aunque el calculo es bastante facil, el problema se me presento al ubicar las fechas en una tabla

La tabla debe salir algo como esto:

Desde Hasta Sexo
02/05/1971 17/12/1976 Varon
17/12/1976 02/15/1981 Hembra
...

Ahora, el calculo a mano, como lo hago es haciendo una lista con los años de cada uno, sumandodole 4 o 5 respectivamente
Despues comparo la fecha de embarazo con la fecha mas cercana de los dos, y la que mas cerca este (por debajo) es la que determina el sexo

Ejemplo:
Padre Madre
1980 1984
1985 1988
1990 1992
1995 1996

Fecha de embarazo 1991

En este caso 1991 esta mas cerca de 1990 que de 1988 (siempre se compara con fechas pasadas) por tanto sera varon

Pero a mano es facil con solo mirarlo, llevarlo a una tabla es lo complicado
En una tabla no solo sirve para saber el sexo del bebe por nacer, tambien serviria para planificar el sexo de los hijos antes de concebirlos

Hasta ahora esto es lo que hecho, pero solo me salen bien los 2 primeros rangos, a partir del 3ro me salen todos iguales
Por supuesto que este metodo no debe ser el correcto, por eso necesito la ayuda de uds para ver como ubico los rangos en la tabla

Código Delphi [-]

var
  Form1: TForm1;
  Padre, Madre   :array[1..25] of TDateTime;
  Desde, Hasta   :TDateTime;
  Sexo           :string;
 
 
procedure TForm1.BitBtn1Click(Sender: TObject);
 var
   i        :Integer;
   Ap, Am   :Word;
 
begin
  //***** Inicialzar las variables *****
  Padre[1]:=StrToDate(FechPadre.Text); Madre[1]:=StrToDate(FechMadre.Text);
  Ap:=YearOf(Padre[1]);                Am:=YearOf(Madre[1]);
  for i:=2 to 25 do
   begin
//edt1.Text:=edt1.Text+' - '+IntToStr(Ap);
//edt2.Text:=edt2.Text+' - '+IntToStr(Am);
    Ap:=Ap + 5;
    Am:=Am + 4;
    Padre[i]:=RecodeYear(Padre[1], Ap);
    Madre[ i ]:=RecodeYear(Madre[1], Am);
   end;
 
  //***** Llenar la tabla *****
  if YearOf(Padre[1]) < YearOf(Madre[1]) then
    begin
      Desde:=Padre[1];
      Hasta:=Madre[1];
      Listado.Cells[2,1]:='Varón';
    end
  else
    begin
      Desde:=Madre[1];
      Hasta:=Padre[1];
      Listado.Cells[2,1]:='Hembra';
    end;
  Listado.Cells[0,1]:=DateToStr(Desde);
  Listado.Cells[1,1]:=DateToStr(Hasta);
 
  for i:=2 to 25 do
   begin
    Desde:=Hasta;
 
    if Hasta > Padre then
      begin
        Sexo:='Hembra';
      end
    else
      if Hasta < Padre then
        begin
         Sexo:='Varón';
        end
      else
        Sexo:='??';
 
    if Hasta = Madre then
      Hasta:=Padre[i+1]
    else
      Hasta:=Madre[i+1];
 
     Listado.Cells[0,i]:=DateToStr(Desde);
     Listado.Cells[1,i]:=DateToStr(Hasta);
     Listado.Cells[2,i]:=Sexo;
   end;
end;

Chris 01-04-2011 18:24:29

Viendo rápidamente tu código, creo que has mal implementado el algoritmo. Te voy a proporcionar una pseudo implementación basada en lo que he entendido. Me parece que nos has enseñado algo muy interesante hoy :)

Código Delphi [-]
type
    TSexo = (sexMujer, sexVaron, sexDesconocido);
...

function DeterminarSex(FNacimientoMadre: TDate; FNacimientoPadre: TDate; FechaConcepcion: TDate): TSexo;
var
    I: Integer;
    FechasGonadas: Array of Array[(sexMujer, sexVaron)] of TDate;
    MenorDiferencia: Integer;
    MDiff, VDIff: Integer;
begin
    // calculamos fechas de renovación de las Gonadas
    I := 0;
    MenorDiferencia := High(Integer);

    while not ((YearOf(FNacimientoMadre) + (4 * (I - 1)) >= YearOf(FechaConcepcion)) and
               (YearOf(FNacimientoPadre) + (5 * (I - 1)) >= YearOf(FechaConcepcion))) do
    begin
        SetLength(FechasGonadas, Length(FechasGonadas) + 1);
        FechasGonadas[i][SexMujer] := IncYear(FNacimientoMadre, 4 * (I +1));
        FechasGonadas[i][SexVaron] := IncYear(FNacimientoPadre, 5 * (I +1));

        // calculamos la fecha de concepción más cercana a una renovación
        MDiff := DaysBetween(FechaConcepcion, FechasGonadas[i][SexMujer]);
        VDIff := DaysBetween(FechaConcepcion, FechasGonadas[i][SexVaron]);

        if MDiff < 0 then MDiff := (MDiff * -1);
        if VDIff < 0 then VDIff := (VDIff * -1);

        // guardamos la diferencia más cercana conocida
        if Min(MDiff, VDIff) < MenorDiferencia then
            MenorDiferencia := Min(MDiff, VDIff);

        // comparamos cúal de ambos sexos tiene menor diferencia
        if MDiff = Min(MDiff, VDIff) then
            if MDiff <= MenorDiferencia then
                Result := TSexo(sexMujer);

        if VDIff = Min(MDiff, VDIff) then
            if VDIff <= MenorDiferencia then
                Result := TSexo(sexVaron);

        Inc(I);
    end;
end;

Saludos,
Chris

rretamar 01-04-2011 18:46:18

No sabía eso de la "estimación" del sexo del bebé. Cada día una novedad. :o

JoAnCa 01-04-2011 19:55:05

Gracias Chris
Probare el codigo que me das, despues te comento como me fue ;)

JoAnCa 01-04-2011 22:13:49

Chris, estuve probando el codigo pero me surgen 2 dudas

- como es que se llama a esa funcion, a quien le asigno el resultado
- todavia no se como llenar la tabla

gatosoft 01-04-2011 22:54:06

Otra alternativa, si solo quieres saber si es hembra o varon (sin generar la tabla), sería formulando:

Código Delphi [-]
 Diferencia := (Trunc((AñoObjetivo-AñoPadre)/5) * 5 + AñoPadre) - (Trunc((AñoObjetivo-AñoMadre)/5) * 5 + AñoMadre);

Si la diferencia es positiva es Varon, si es negativa, es hembra, si es cero, significa que ambos "estrenan gónadas ese año", asi que tu decides... finalmente pienso que estamos hablando de probabilidades, no creo que sea algo exacto...

Un saludo,

--agregado---

obviamente estamos habalndo de valores lógicos, por ejemplo, ambos padres deben haber nacido para la fecha objetivo, la madre mas joven tenia como 10 años, y la mas vieja tal vez 60... que se yo.

JoAnCa 04-04-2011 15:01:05

Resuelto
 
Chris
Analizando bien tu coditgo, solo me sirve para dadas las fechas me diga si es hembra o varon
y lo que necesito es una tabla, para buscar el rango de fechas para cada sexo

Al final, encontre una solución, tal vez este codigo pueda ser optimizado un poco, pero así funciona ya

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
 var
   i,j     :Integer;
   Ap, Am  :Word;

begin
  //***** Inicialzar las variables *****
  Padre[1]:=StrToDate(FechPadre.Text); Madre[1]:=StrToDate(FechMadre.Text);
  Ap:=YearOf(Padre[1]);
  Am:=YearOf(Madre[1]);
  for i:=2 to 50 do
   begin
     Ap:=Ap + 5;
     Am:=Am + 4;
     Padre[i]:=RecodeYear(Padre[1], Ap);
     Madre[i]:=RecodeYear(Madre[1], Am);
   end;

  //***** Definir por cual progenitor empieza *****
  if YearOf(Padre[1]) <= YearOf(Madre[1]) then
    begin
      Desde:=Padre[1]; Hasta:=Madre[1];
      Prim:=Padre;     Seg:=Madre;
      SexoP:='Varón';  SexoS:='Hembra';
    end
  else
    begin
      Desde:=Madre[1]; Hasta:=Padre[1];
      Prim:=Madre;     Seg:=Padre;
      SexoP:='Hembra'; SexoS:='Varón';
    end;

  //***** Crear la tabla de calculo *****
  for i:=1 to 50 do
   begin
    if Odd(i) then
     begin
       for j:=1 to 50 do
        begin
          if (Desde < Seg[j]) then
            begin
              Hasta:=Seg[j];
              Sex:=SexoP;
              Break;
            end;
        end;
     end
    else
     begin
       for j:=1 to 50 do
        begin
          if Desde < Prim[j]    then
            begin
              Hasta:=Prim[j];
              Sex:=SexoS;
              Break;
            end;
        end;
     end;
     Listado.Cells[0,i]:=DateToStr(Desde);
     Listado.Cells[1,i]:=DateToStr(Hasta);
     Listado.Cells[2,i]:=Sex;
     Desde:=Hasta;
   end;
end;


La franja horaria es GMT +2. Ahora son las 04:27:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi