Programación General > Trucos

 Contruyendo Tabla Periodica

(1/2) > >>

Enko:
Este post, es la respuesta en base a un mail que me envio Deiv.
La idea de este post, es mostrar y dar algunas ideas de como organizar un proyecto grande de contruccion de una tabla periodica didactica.

Lo primero que se debe considerar, son las clases de los elementos de las tablas periodicas, estos pueden ser metalesy no metales. Asi pues conformariamos un tipo de dato llamado Grupo así:

--- Código: Text --- TGrupo = (gMetal, gNoMetal); //g minuscula quiere decir grupo  A su vez, los dos grandes gurpos se dividen en varios subgrupos; para los metales estan los alcalinos, alcalinos terreos... y para los no metales estan los halogenos, carbanoides, nitrogenoides....
Hay que tener cuidado en no tener asignado un subgrupo a un elemento que pertenece a otro grupo cosa que puede ser hecha usando una propiedad, desgracadiamente siempre uno esta ante el error de asignar un subgrupo metalico incorrecto a un metal,eso solo se puede prevenir prestando mucha atencion :P.

--- Código: Text --- TSubGrupo = (sgAlcalino, sgHalogeno, sgAlcalinoTerreo, sgCarbonoide); //"sg" quiere decir sub_grupo  Asi, para seguir una estructura, nuestra Clase de un Elemento quimico quedaria por ahora en:

--- Código: Text --- TElemento = class   private     FSubGrupo: TSubGrupo;    procedure SetSubGrupo(const Value: TSubGrupo);   public     Grupo: TGrupo;     property SubGrupo: TSubGrupo read FSubGrupo write SetSubGrupo;   end;........procedure TElemento.SetSubGrupo(const Value: TSubGrupo);begin  //EsMetal() es una funcion que devulve true si el subrupo pertenece a los metales...  //hace muchos ifs nada mas :P  if (Grupo=gMetal) and (not EsMetal(Value)) then  begin     ERangeError.Create('Esta asignano a un Metal un subgrupo de un NoMetal!')     Exit;  end   else if (Grupo=gNoMetal) and (EsMetal(Value)) then  begin     ERangeError.Create('Esta asignano a un Metal un subgrupo de un NoMetal!')     Exit;  end;  FSubGrupo := Value;end;  
Ahora vamos con las propiedades necesarias basicas empezando primero por las sencillas:

--- Código: Text --- TElemento = class   private     FSubGrupo: TSubGrupo;    procedure SetSubGrupo(const Value: TSubGrupo);   public     NumeroAtomico: Byte;     MasaAtomica: Single;     PesoAtomico: Single;     Densidad: Single;     PuntoFusion: Single;     PuntoEbullicion: Single;     Simbolo: String[2]; //H, He, Li, Be, B, C, N, O, F, Ne....     Electronegativiad: Single;     Grupo: TGrupo;     property SubGrupo: TSubGrupo read FSubGrupo write SetSubGrupo;   end;  La que me falto es el Nro. Oxidacion o como antes se le decia, el Numero de Valencia.
Este es particular porque son varios numeros segun el elemento, la cantidad de esos numeros puede ser 1,2,3,4, 5 y 0 para los gases inhertes.
El valor ronda entre -3 y  +7
Lo mas facil seria tener un array con 5 elementos y un numero que indique cuantos valores de ese array son validos.

--- Código: Text --- CantidadNrosOxidacion: Byte;NroOxidacion: array[1..5] of ShortInt;  Por ejemplo, el Hidrogeno tiene un solo numero de oxidacion, por eso:
CantidadNrosOxidacion = 1;
NroOxidacion[1] = 1;
El Cloro tiene 5:
CantidadNrosOxidacion = 5;
NroOxidacion[1] = -1;
NroOxidacion[2] = 1;
NroOxidacion[3] = 3;
...
respecto a las terminaciones para la formacion de sales que son oso, ico y lo prefijos  hipo y per
La cosa este respecto de CantidadNrosOxidacion:
Si son 2
entonces para el NroOxidacion[1] se usa iso (el menor si no me equivoco)
y pra NroOxidacion[2] se usa ico
Si son 4
para el NroOxidacion[1] hipo-oso
....esta parte me la salteo, es como en el caso anterior pero con el numero  2,3
para el NroOxidacion[4] per-ico

Como saber con que valencia actua cada elemento?
Con el que quiera, todo depende de las circunstancias de la reaccion quimica, en el caso del hiero el numero oxidacion puede ser 2 o 3 por lo que forma con oxigeno FeO y Fe2O3. Generalmente se forman las dos en distintas proporciones.

cargando datos
Lo mas facil seria tener archivos con los datos para cada elemento quimico, como ejemplo usaremos archivos de text. El titulo del archivo de texto es comodo que sea el numero atomico: 1.xt, 2.txt, 3.txt.....
El contenido seria algo asi (";" representa comentarios):

--- Citar ---;simbolo
He
;grupo: 0 metal, 1 no metal
1
;nro atomico
1
;peso atomico
1.00079
;cantidad numeros oxidacion
1
;nro oxidacion
1
;densidad
0.071
;etc..............

--- Fin de la cita ---
Asi que tendriamos agregar a nuestra clase de TElemento un metodo para cargar datos desde un archivo de texto.

--- Código: Text ---  TElemento = class   private     FSubGrupo: TSubGrupo;    procedure SetSubGrupo(const Value: TSubGrupo);   public     NumeroAtomico: Byte;     MasaAtomica: Single;     PesoAtomico: Single;     Densidad: Single;     PuntoFusion: Single;     PuntoEbullicion: Single;     Simbolo: String[2]; //H, He, Li, Be, B, C, N, O, F, Ne....     Electronegativiad: Single;     Grupo: TGrupo;     property SubGrupo: TSubGrupo read FSubGrupo write SetSubGrupo;     **********     procedure LoadFromFile(const FileName: String);   end;  Ahora simplemente se podria hacer

--- Código: Text --- TTablaPeriodica = classpublic  ........    Elemento: array[1..103] of TElemento; ..........    constructor Create;end; constructor TTAblaPeriodica.Create;begin  inherited Create;  for i:=1 to 103 do      Elemento[i].LoadFromFile(IntToStr(i) + '.txt');end;  Para Aceder a cualquier elemento de la tabla, es mediante el numero atomico:

--- Código: Text --- WriteLn(TAblaPeriodica.Elemento[1].Simbolo); //da como salida: "H" 
PD: Deiv, espero que esto te de una pauta, si siguies teniendo dudas, puedes preguntar tranquilamente en este post, inclusive, si lo deseas, adjunta aqui el PDF que me mandaste con las preguntas.

Saludos

Deiv:
Hola,
A partir del momento seguro, el único que responderá a mis preguntas serás tu Enko, pero sería bueno que muchos se integren sin tenerle miedo a la "Química". Como también pienso que quizá muchos lo verán muy sencillo por lo de POO, en esto ojalá entiendan mi posición de novato en el asunto.

He leido el Truco, y la forma de construir una Tabla periódica. De antemano digo que no me concentraré en crear un componente, primero aprenderé POO con la Tabla y luego recién veremos.

--- Citar ---TGrupo = (gMetal, gNoMetal); //g minuscula quiere decir grupo
--- Fin de la cita ---
¿Y que hay con los Anfóteros? ¿sería otro grupo? = gAnfoteros?


--- Citar ---respecto a las terminaciones para la formacion de sales que son oso, ico y lo prefijos hipo y per
La cosa este respecto de CantidadNrosOxidacion:
Si son 2
entonces para el NroOxidacion[1] se usa oso (el menor si no me equivoco)
y pra NroOxidacion[2] se usa ico
Si son 4
para el NroOxidacion[1] hipo-oso
....esta parte me la salteo, es como en el caso anterior pero con el numero 2,3
para el NroOxidacion[4] per-ico
--- Fin de la cita ---
Aquí 2 preguntitas:
1.- Debemos diferenciar pienso entre terminación y prefijo, en todo caso solo habría 2 terminaciones: "oso" e "ico" y prefijos también 2 = "hipo" y "per", entonces ¿como encarar esta parte? pues "hipo-oso" no es terminación, así como está escrito textualmente. Aquí tal vez sería crear un nuevo array de prefijos?

2.- El caso del Manganeso (que es un Anfótero) trabaja como Metal:
     +2 (oso)  +3 (ico)
    y como No Metal:
     +4 (oso)  +6 (ico)  +7 (per-ico)
     ¿Cómo diferenciaría ese +2 y el +4 en cuanto a terminaciones?

Otra, en cuanto a:

--- Citar ---Lo mas facil seria tener archivos con los datos para cada elemento quimico
--- Fin de la cita ---
¿Tendría digamos 110 archivos .TXT en disco? Imagino que mi Aplicación no se haría muy pesada como cuando pregunté aquella vez de cargar 110 iconos, y me recomendaste cargar un solo BMP bastante largo (uno solo). Tratar con TXT y con BMP o ICO debe ser diferente verdad?
Bueno, también recuerdo que en un de mis post del Foro, pregunté la forma de proteger mis archivos ICO o BMP y me recomendaste encriptarlos ya sea a DAT o encriptar por código. Imagino que para evitar copias, del trabajo que me costará recopilar información de cada uno (al estilo Base de Datos) de los elementos y grabarlos en formato TXT, también debo encriptarlos verdad?

Y otra, No entendí esta parte del código:

--- Citar ---WriteLn(TAblaPeriodica.Elemento[1].Simbolo); //da como salida: "H"
--- Fin de la cita ---
¿Y como sabe el programa que debe mostrar la letra "H" del TXT? y por qué no muestra digamos el "peso atómico"? No sé si me dejo entender, sugeriste crear un TXT con varias filas, ¿Cómo accedo a cada una de las filas del TXT?

Bueno esas son mis primeras preguntas, mientras más lo vaya analizando y lo vaya trabajando la propuesta, vendrán más dudas.

Enko:

--- Citar ---¿Y que hay con los Anfóteros? ¿sería otro grupo? = gAnfoteros?

--- Fin de la cita ---
Eso mismo. Sino, podes usar un Byte para eso y a hacer:

--- Citar ---0: metales
1: no metales
2: anfóteros

--- Fin de la cita ---
En realidad, es mas o menso lo mismo porque si:
Grupo := gMetal, entoces> Ord(Grupo) = 0;
Puedes hechar un vistazo a este link, hay una parte que habla sobre tipos enumerados.

--- Citar ---¿como encarar esta parte? pues "hipo-oso" no es terminación, así como está escrito textualmente. Aquí tal vez sería crear un nuevo array de prefijos?

--- Fin de la cita ---
Segun me lo imagino yo, no hace falta tener ningun prefijo o sufijo para ningun elemento ya que estos, son comunes a todos.
Ejemplo de combinacion del metal Fe con el no metal O:
*)procedure CombinarOxido(Metal: elementoMetalico);
1)Revisas si el elemento pasado como parametro es un metal
2)Revisas cuantos numeros de oxidacion tiene
3)Son 2
4)combinas el menor y le pones el sufijo oso, luego el mayor con el sufijo ico

Si fueran 4 los numeros de oxidacion:
combinas el menor y pones hipo-oso
combinas.....
combinas el mayor  pones per-ico

redondeando los prefijos y sufijos no dependerian del elemento quimico, sino de la rutina que los combina. Claro esta que esta rutina toma en cuanta la candidad de los numeros de oxidacion que tiene el elemento.

PD> Me tengo que ir, en un rato respondo lo dem'as.

Enko:
Lo de los archivos de texto:
Primero: no tienen porque ser archivos de texto, pueden ser archivos de acceso aleatorio con tipo:

--- Código: Text --- Archivo: file of  TipoDatosElemento;  Acceder a 100 archivos de texto, es exactamente igual de engoroso qeu acceder a 100 mapas de bits. Si seguimos con la idea de los archivos de texto, el problema se soluciona tan facil como escribir los datos en un mismo archivo empezando por Hidrogeno, luego Helio, etc....
Lo que cambiaria es la forma de cargar la tabla periodica completa.
Seria algo como:

--- Código: Text --- for i:=1 to 103 dobegin   ReadLn(File, Cadena);   TablaPeriodica[i].Peso := StrToFloat(Cadena);   ReadLn(File, Cadena0;   TablaPerdiodica[i].Densidad := StrToFloat(Cadena);   ....etc....end;  Eso cargaria todos los datos del archivo de texto, a la tabla periodica que es un array de 103 elementos. Por supuesto que en el arhcivo de texto, tienen que estar los datos de los elementos siempre con el mismo orden y ademas consecutivos, es decir, ordenados por el numero atomico.


--- Citar ---WriteLn(TAblaPeriodica.Elemento[1].Simbolo); //da como salida: "H"

--- Fin de la cita ---
Ahi estas accediendo a la tabla periodica, al elemento con el numero atomico 1, es decir Hidrogeno, cuyo simbolo es H.
Eso se puede hacer, una vez que cargaste los datos desde el archivo que los contiene.
Sumpongo uqe es mas comodo tener los datos afuera del codigo fuente, cosa que si un dia tenes que modificar alguno, no tenes que volver a compilar la ejecutable.

Deiv:
Aún voy analizando solo la parte teórica, lástima que no tenga en Casa Internet, me valgo de un CiberCafe para ir a revisar a diario lo que me llegó y lo que tengo que descargar para estudiarlo en casa. Como decía estoy ahora en teoría, y luego empezaré a aplicar programando todo esta parte inicial.

--- Citar ---En realidad, es mas o menso lo mismo
--- Fin de la cita ---
 :D  :D  :rolleyes:

Abajo, creo que no estoy de acuerdo, o entiendo de otra manera:

--- Citar ---Si fueran 4 los numeros de oxidacion:
combinas el menor y pones hipo-oso
combinas.....
combinas el mayor pones per-ico
--- Fin de la cita ---
Voy a tomar como ejemplo al anfótero Manganeso:
menor....mayor.............menor......mayor.. ...máxima
oso..........ico..................oso............ico...........per-ico
+2...........+3...................+4............+6..............+7

y si comparamos con el Cloro:
..................mínima.....menor....mayor.....máxima
hídrico.......hipo-oso......oso.......ico........per-ico
...-1..............+1............+3.........+5...........+7

a.- Primero aún no sé como voy a diferenciar a un anfótero como te hablé esos dobles "oso" y esos dobles "ico", tengo dos menores y dos mayores

b.- El Cloro tendría mínima, entonces ya no hablaríamos de menor, bueno pero, ¿y que mínima colocaría al Manganeso como No Metal?

Por ahora solo esas dudillas, luego me pongo a trabajar con la POO en máquina pronto, vale?
Un saludo

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa