Ir al contenido


Foto

Ayuda para elaborar un algoritmo para una tabla de calculo


  • Por favor identifícate para responder
26 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 marzo 2011 - 10:16

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

Como estoy proximo a ser papá de nuevo, estando mi esposa en el materno le hice el calculo, y las demas embarazadas tambien quisieron que se los hiciera, en esos dias, de 24 que se lo hice solo falló en 1

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
...

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 




delphi
  1. var
  2.   Form1: TForm1;
  3.   Padre, Madre  :array[1..25] of TDateTime;
  4.   Desde, Hasta  :TDateTime;
  5.   Sexo          :string;
  6.  
  7.  
  8. procedure TForm1.BitBtn1Click(Sender: TObject);
  9. var
  10.   i        :Integer;
  11.   Ap, Am  :Word;
  12.  
  13. begin
  14.   //***** Inicialzar las variables *****
  15.   Padre[1]:=StrToDate(FechPadre.Text); Madre[1]:=StrToDate(FechMadre.Text);
  16.   Ap:=YearOf(Padre[1]);                Am:=YearOf(Madre[1]);
  17.   for i:=2 to 25 do
  18.   begin
  19. //edt1.Text:=edt1.Text+' - '+IntToStr(Ap);
  20. //edt2.Text:=edt2.Text+' - '+IntToStr(Am);
  21.     Ap:=Ap + 5;
  22.     Am:=Am + 4;
  23.     Padre[i]:=RecodeYear(Padre[1], Ap);
  24.     Madre[ i ]:=RecodeYear(Madre[1], Am);
  25.   end;
  26.  
  27.   //***** Llenar la tabla *****
  28.   if YearOf(Padre[1]) < YearOf(Madre[1]) then
  29.     begin
  30.       Desde:=Padre[1];
  31.       Hasta:=Madre[1];
  32.       Listado.Cells[2,1]:='Varón';
  33.     end
  34.   else
  35.     begin
  36.       Desde:=Madre[1];
  37.       Hasta:=Padre[1];
  38.       Listado.Cells[2,1]:='Hembra';
  39.     end;
  40.   Listado.Cells[0,1]:=DateToStr(Desde);
  41.   Listado.Cells[1,1]:=DateToStr(Hasta);
  42.  
  43.   for i:=2 to 25 do
  44.   begin
  45.     Desde:=Hasta;
  46.  
  47.     if Hasta > Padre then
  48.       begin
  49.         Sexo:='Hembra';
  50.       end
  51.     else
  52.       if Hasta < Padre then
  53.         begin
  54.         Sexo:='Varón';
  55.         end
  56.       else
  57.         if Hasta < Padre then Sexo:='??';
  58.  
  59.     if Hasta = Madre then
  60.       Hasta:=Padre[i+1]
  61.     else
  62.       Hasta:=Madre[i+1];
  63.  
  64. //      if Hasta < Padre[i+1] then
  65. //        begin
  66. //          Hasta:=Madre[i+1];
  67. //          Sexo:='Hembra';
  68. //        end
  69. //      else
  70. //        begin
  71. //          Hasta:=Padre[i+1];
  72. //          Sexo:='Varón';
  73. //        end;
  74.  
  75.     Listado.Cells[0,i]:=DateToStr(Desde);
  76.     Listado.Cells[1,i]:=DateToStr(Hasta);
  77.     Listado.Cells[2,i]:=Sexo;
  78.   end;
  79. end;
  80. [/i]


  • 0

#2 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 31 marzo 2011 - 09:29

Vaya que parece que no es solo para mi para quien esta complicada la tarea  :|

...
  • 0

#3 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 31 marzo 2011 - 10:18

Es que no explicas como se haria a mano en un caso concreto, con lo que es dificil saber que cosa es correcta en tu codigo y que no... aparte de eso, la verdad es que esta un poco liado todo, seguramente sabiendo como se hace "a boli" te podamos dar un algoritmo simplificado y abandonar directamente el que ahora usas.

Aun sin saber lo que ha de hacer el algoritmo, veo dos problemas basicos en tu codigo y tu idea:

1) Este trozo de codigo no tiene sentido, la segunda parte nunca se alcanzara:



delphi
  1.     if Hasta < Padre then
  2.         begin
  3.         Sexo:='Varón';
  4.         end
  5.       else
  6.         if Hasta < Padre then Sexo:='??'; //Esta linea no tiene sentido



Por otro lado, veo que generas una lista de años en los que cambia de ciclo el padre y la madre, y guardas 25 de ellos.

El problema conceptual que le veo a eso es que luego asumes que la fecha de cambio i-esima del padre va a ser cercana a la i-esima de la madre, y eso no es asi, algunas veces necesitaras un periodo desde padre[ i ] hasta madre[ i-2 ] por ejemplo, y eso te ocurre mas cuando mas te alejas de las fechas de nacimiento.

Como siempre comparas padre[ i ] con madre[ i ] supongo que tu algoritmo esta mal diseñado, no es tal como tu lo harias a mano.

Yo empezaria por hacer una unica lista de fechas + p/m segun sea padre o madre, podria ser un stringlist con cada linea creada como '2001-12-01-P' de forma que el orden alfabetico = orden por fechas y ademas la lista se ordena solita por fecha. Una vez creada, la ordenas y a continuacion imprimirias cada linea como desde fecha[ i ] hasta fecha[ ì+1 ], y luego decides el sexo segun antes tubiese hombre o mujer y este cambio de fecha[ i ] sea por cambio de ciclo del padre o de la madre.

Sacar la fecha de la linea del stringlist no es complicado, solo usarias recortes de texto del tipo Copy(SL.Item[ i ],1,4) -esto te daria el año, por ejemplo.

Visto asi, todo se simplifica mucho, deberia quedarte todo mas pequeño que ahora.
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 31 marzo 2011 - 12:33

Ciertamente el método de cálculo no se entiende. Partiendo de la base de que el sexo del hijo depende mas del padre que de la madre, pues es el espermatozoo el que aportará el cromosoma X o Y. El ovocito siempre contiene un X. Las gónadas no se renuevan. Los ovocitos están en el ovario desde el mismísimo desarrollo de la madre, no se generan durante la vida. El esperma, sin embargo, se crea continuamente desde que el padre alcanza su edad adulta.


En definitiva, no está claro el método de cálculo, los incrementos en las fechas, las tablas de las mismas y para que sirven. Parece un asunto mas empírico que científico. Quizás por eso...


Quizás si aclares el método, sea mas sencilla la ayuda. :)




Saludos.
  • 0

#5 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 01 abril 2011 - 07:18

Bueno primero explicaré un poco en que se basa el metodo
Se sabe que el hombre tiene los cromosomas XY y la mujer XX, que por supuesto, esto no es lo que cambia
Lo que se renueva son las celulas de los gametos, que mantienen los mismos cromosomas, esta renovación es igual a la de todas las celulas del cuerpo, por eso es que crecemos y nos desarrollamos, por ejemplo: las celulas de la piel son las que mas rapido se renuevan que lo hacen constantemente
Tambien se sabe que el sexo lo determina el hombre al aportar un cromosoma X o Y
Pero, y que determina cual de los 2 cromosoma será el que aportará el hombre?
Pues en ese caso lo que lo determina es el progenitor que tenga las gonadas mas jovenes

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


Me estoy dando cuenta que el algoritmo que uso no es el correcto, pues no sale bien

Sergio con respecto a la linea que dices tienes razon, eso fue por un copia y pega que se me quedo, en realidad la condicion sobra, el else es para cuando son los 2 iguales
Pero aun arreglando es linea tampoco sirve

Voy a analizar tu idea y aplicarla a ver si encuentro la solucion


  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 01 abril 2011 - 07:36

Pa ver, en verdad este es un metodo valido???
Por ejemplo tomando estas dos fechas de nacimiento:  1978 para el padre y 1984 para la madre
[table]  [tr]  [td]

      [table][tr]    [td]                Padre[/td]    [td]                              Madre[/td]  [/tr]  [tr]    [td]

1978

[/td]    [td]

1984

[/td]  [/tr]  [tr]    [td]

1983

[/td]    [td]

1988

[/td]  [/tr]  [tr]    [td]

1988

[/td]    [td]

1992

[/td]  [/tr]  [tr]    [td]

1993

[/td]    [td]

1996

[/td]  [/tr]  [tr]    [td]

1998

[/td]    [td]

2000

[/td]  [/tr]  [tr]    [td]

2003

[/td]    [td]

2004

[/td]  [/tr]  [tr]    [td]

2008

[/td]    [td]

2008

[/td]  [/tr]  [tr]    [td]

2013

[/td]    [td]

2012

[/td]  [/tr]  [tr]    [td]

2018

[/td]    [td]

2016

[/td]  [/tr][/table]
[/td]  [/tr]  [/table]


Si la fecha de nacimiento es 2011, cual seria el sexo??
En este caso si se quiere tener hembra habria que esperar hasta el 2017????
  • 0

#7 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 01 abril 2011 - 09:57

Bueno, como dije antes ningun metodo es 100% efectivo, pero este es bastante preciso
Lo he aplicado bastantes veces y en los 2 casos que me ha fallado es porque las dos fechas de renovacion estan muy cerca en el mismo año, pero bueno que sea un 90 o 95% efectivo se puede aceptar
Me dices que la fecha de nacimiento es el 2011, pero esa no es la fecha que se coge, es la fecha de embarazo, es decir, habria que restarle el tiempo de gestación a la fecha de nacimiento

En ese caso como los dos cambian en el 2008, hay que tener la fecha exacta, tambien el dia y el mes
El sexo lo determina el de la fecha mas reciente

Despues del 2008:
...
Del 2012 al 2013 Hembra
del 2013 al 2016 Varon
del 2016 al 2018 Hembra
...

El mes de cambio es el dia del cumpleaños


Y la tabla que quiero hacer es para mostrar esos resultados
  • 0

#8 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 01 abril 2011 - 10:03

Bueno anotale otra falla, jejeje, segun eso el mio sera hembra, pero salio machito jajaja (b) (b)
  • 0

#9 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 01 abril 2011 - 10:13

Bueno anotale otra falla, jejeje, segun eso el mio sera hembra, pero salio machito jajaja (b) (b)


y cuales son las fechas exactas de:
Nacimiento del padre
Nacimiento de la madre
Fecha de embarazo, o de la ultima menstruacion antes de embarazarse

Sin eso no te puedo decir nada entre 2008 y 2011

  • 0

#10 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 01 abril 2011 - 10:16

P= 05/11/1978    M= 15/05/1984      FUR= 30/08/2010

:D:D:D
  • 0

#11 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 01 abril 2011 - 10:42

Pues no falló  (y)

Desde el 05/11/2008 hasta el 15/05/2012 es varon y el 30/08/2010 esta en ese rango

Tu cambiaste en el mes 11 despues que ella en el mes 5, por tanto prevalece el padre desde el 05/11/2008


  • 0

#12 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 01 abril 2011 - 01:28

Si explicas como sacas el calculo podria tratar de entender el proceso, es realmente lo que quisiera :D:D

Explicalo paso a paso como si fuera un niño de primaria de donde sale que hasta el 05 2012 es varon
  • 0

#13 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 01 abril 2011 - 02:45

Pues en mayo del 2012 es el cumpleaños de la madre y es donde renueva las gonadas por tocarle 4 años despues del 2008

Para tu caso:

Padre                Madre
----------------------------------
05/11/1978      15/05/1984
05/11/1983      15/05/1988
05/11/1988      15/05/1992
...                      ...

  05/11/2008      15/05/2008
  05/11/2013      15/05/2012
  05/11/2018      15/05/2016

Fecha de concepcion: 30/08/2010

  Lo que hay que hacer (calculo a mano) es ver de que fecha anterior esta mas cerca el 30/08/2010
- 08/2010 esta mas cerca de 11/2008 que de 05/2008
- 11/2008 es la fecha del padre por tanto es varon


Para el caso de lo que quiero hacer, es poner los rangos en una tabla, y con tu caso de ejemplo seria

Desde            Hasta            Sexo
05/11/1978      15/05/1984  Varon
15/05/1984      05/11/1988    Hembra
05/11/1988      15/05/1992    Varon
15/05/1992      05/11/1993    Hembra
05/11/1993      15/05/1996    Varon
....

Se comienza por la fecha de nacimiento del mas viejo (Tu) hasta la fecha del mas nuevo (ella)
Despues de la fecha de ella hasta la siguiente  fecha mas proxima tuya
Despues de esa fecha tuya hasta la
siguiente fecha mas proxima de ella
y asi sucesivamente hasta la cantidad de años que desees

  • 0

#14 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 01 abril 2011 - 03:04

Pues el sistema que te comente vale perfectamente, te reuso tu ejemplo:

05/11/1978      15/05/1984    Varon
15/05/1984      05/11/1988    Hembra
05/11/1988      15/05/1992    Varon
15/05/1992      05/11/1993    Hembra
05/11/1993      15/05/1996    Varon
...

Esto la cambio conceptualmente asi:

Desde 05/11/1978 Varon
Desde 15/05/1984 Hembra
Desde 05/11/1988 Varon
Desde 15/05/1992 Hembra
Desde 05/11/1993 Varon
...

Y en delphi quedaria asi de simple:



delphi
  1. SL:= TStringList.create;
  2. //Cargo las fechas de cambio...
  3. SL.Add('1978/11/05-V');
  4. SL.Add('1984/05/15-H');
  5. SL.Add('1988/11/05-V');
  6. SL.Add('1992/05/15-H');
  7. SL.Add('1993/11/05-V');
  8. ...
  9. //Añado la fecha de la concepcion:
  10. SL.Add('2010/08/30-?');
  11. //Ordeno todo por fecha...
  12. SL.Order; //Esto es de memoria
  13. //Localizo donde ha ido a parar la fecha de la concepcion...
  14. i:= SL.IndexOf('2010/08/30-?');
  15. //Tomas el anterior y miras a ver si ponia H o V...
  16. Sexo:= Copy(SL[i-1], 12, 1); //'V' o 'H'


  • 0

#15 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 abril 2011 - 04:10

Lo que se renueva son las celulas de los gametos...


...Tambien se sabe que el sexo lo determina el hombre al aportar un cromosoma X o Y
Pero, y que determina cual de los 2 cromosoma será el que aportará el hombre?
Pues en ese caso lo que lo determina es el progenitor que tenga las gonadas mas jovenes



Pues no entiendo el método pues las premisas son erróneas.  ^o|

Los espermatozoos se renuevan a diario, sin ciclos. Los ovocitos no se renuevan nunca, se nace con un número fijo, lo que hacen es madurar uno o varios por cada ciclo menstrual. La ovulación suele ser de uno solo.


Saludos.
  • 0

#16 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 02 abril 2011 - 08:53

escafandra, se refiere a la renovacion de las celulas del cuerpo, y aunque en el caso de ciertas celulas, no existe renovacion y son celulas "para toda la vida" -en ese apartado entran las neuronas y tambien las gonadas: nacemos con un numero fijo- seguramente la teoria se refiera a las celulas que "acompañan", las ennvolturas o lo que sea... de todas fromas, la consulta era sobre un algoritmo, lo demas es una curiosidad que solo se sabe si funciona o no estadisticamente, y a el le ha funcionado bastante bien.

Si quereis podemos aportar todos datos de conocidos y ver si la cosa funciona o no, y luego, si funciona, ya se le buscaría una explicación!

Respecto del algoritmo en si, el que propuse ayer es muy mejorable, no se necesita ninguna lista de fechas para nada: Calculas la edad del padre al engendrarse el hijo, y le quitas 4 años hasta que esa edad sea <=4, y listo, esa es la edad de las gonadas de papa!

Usando estos datos:
P= 05/11/1978    M= 15/05/1984      FUR= 30/08/2010

Lo dejaria asi en delphi:



delphi
  1. function Sexo(FechaPadre, FechaMadre, FechaHijo: TDate): string;
  2. var
  3.   EdadPadre, EdadMadre: double;
  4. begin
  5.   //Edades en años (1 año = 365.25 dias)
  6.   EdadPadre:= round(DaysBetween(FechaPadre, FechaHijo) / 365.25);
  7.   EdadMadre:= round(DaysBetween(FechaMadre, FechaHijo) / 365.25);
  8.   //Al padre le voy quitando años de 5 en 5... y obtengo edad gonadas
  9.   while EdadPadre>=5 do
  10.     EdadPadre:= EdadPadre-5;
  11.   //A la madre le voy quitando años de 4 en 4... y obtengo edad gonadas
  12.   while EdadMadre>=4 do
  13.     EdadMadre:= EdadMadre-4;
  14.   //La menor edad gana...
  15.   if EdadPadre<EdadMadre then result:= 'V' else result:= 'H';
  16. end;



Ah! Y si no queremos el while podemos calcularlo de un golpe tambien:



delphi
  1. function Sexo(FechaPadre, FechaMadre, FechaHijo: TDate): string;
  2. var
  3.   EdadPadre, EdadMadre: double;
  4. begin
  5.   //Edades en años (1 año = 365.25 dias)
  6.   EdadPadre:= round(DaysBetween(FechaPadre, FechaHijo) / 365.25);
  7.   EdadMadre:= round(DaysBetween(FechaMadre, FechaHijo) / 365.25);
  8.   //Al padre le voy quitando años de 5 en 5... y obtengo edad gonadas
  9.   EdadPadre:= Trunc(EdadPadre) mod 5 + Frac(EdadPadre);
  10.   //A la madre le voy quitando años de 4 en 4... y obtengo edad gonadas
  11.   EdadMadre:= Trunc(EdadMadre) mod 4 + Frac(EdadMadre);
  12.   //La menor edad gana...
  13.   if EdadPadre<EdadMadre then result:= 'V' else result:= 'H';
  14. end;



El truco es que si tienes 36.12 años, Trunc(36.12) te da 36 y 36 mod 5 te da el resto de dividir por 5, es decir, 1. Luego le sumas la parte fraccional, Frac(36.12) que es el 0.12, y obtienes 1.12, lo mismo que con el while de antes.

Eso si, si el padre tubiese 35 años exactos, un algoritmo te da una edad de 5, y el segundo una edad de 0... pero bueno, ese dia es cuando se renueva, así que sería cuestion de "horas" tomar un valor o el otro..... acabo de cambiar el while > por while >= y así los dos dan los mismos resultados!
  • 0

#17 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 02 abril 2011 - 10:01

Pues a mi me ha funcionado bien con los calculos que hice.  (y)






  • 0

#18 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 abril 2011 - 01:48

escafandra, se refiere a la renovacion de las celulas del cuerpo, y aunque en el caso de ciertas celulas, no existe renovacion y son celulas "para toda la vida"...  ... de todas fromas, la consulta era sobre un algoritmo, lo demas es una curiosidad que solo se sabe si funciona o no estadisticamente, y a el le ha funcionado bastante bien.


Tienes razón. No importa si se renuevan o no las células, el caso es un algoritmo que haga lo que pide.

Tu solución me parece muy acertada.  (y)




Saludos.
  • 0

#19 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 03 abril 2011 - 03:41

pues el calculo ha fallado con un amigo mio

fecha padre 09/03/1980
fecha madre 17/10/1989
fecha nacimiento del bebe= 21/07/2010  fecha gestacion seria 21/10/2009

el tiene dos bebes mas con su anterior esposa
madre 02/07/1980
hijo1    nacimiento 14/09/2003  gestacion  14/12/2002
hijo2  nacimiento  23/06/2008  gestacion  23/09/2007

que hay mal porque en todos los casos dio hembra  y todos son varones

que paso?

  • 0

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 abril 2011 - 04:34

Y si será el padre ?????? :D :D :D, perdón, perdón, no puede aguantar la broma :)

Porque no intentas con una familia que tenga hijos hombres y mujeres, es posible que la comparación la estés haciendo al revés.

Salud OS

  • 0




IP.Board spam blocked by CleanTalk.