C/Visual C - Nelek/programaQuimica

 
Vista:

Nelek/programaQuimica

Publicado por Nelek/programaQuimica (5 intervenciones) el 05/12/2007 16:54:53
Hola Nelek. Muchas gracias por contestar. Mira te aclaro lo que me pasa, esque empecé con una filosofía y acabé con otra. Ahora tengo claro, según me han explicado, que tengo que usar programación modular (supongo que me entiendes, quiero decir usar varias funciones ( no hacerlo todo en main). Tampoco les gusta que gaste cosas que no he dado en clase. En clase he dado FILE* , fopen(archivo.txt), fscanf, fprintf, fgets, vectores de enteros, cadenas de caracteres, punteros (ejemplos int *p, int a=3; p=&a; *p=3), matrices multi-dimensionales (char matriz[a][b][c]....etc. ]Mira, te pongo el enunciado del ejercicio:

El alumno deberá implementar un programa que permita reconocer com-
puestos y determinar si están correctamente formulados. Para ello deberá soli-
citar una cadena e identificar los elementos, sus valencias y comprobar que la
reacción ha sido correctamente realizada.
El ejercicio se estructura en varios niveles que determinan la dificultad. Esto
no implica que se le deba proporcionar al programa información adicional (p.e,
indicar que es un óxido áacido).
1. Reconocimiento de óxidos áacidos y báasicos.
2. Reconocimiento de áacidos oxáacidos e hidruros.
3. El programa permite la introduccióon de los elementos sin necesidad de
especificar las valencias en el caso de que sean 1 (p.e. HClO).
4. El programa permite especificar elementos en cualquier orden (p.e. ClOH).
5. El programa permite introducir valencias para elementos entre paréntesis
(p.e. S(HO2)2 ).

Bueno, pues dicho esto, te explico por si no sabes de química. Para empezar, los elementos se combinan con fórmulas simbólicas y luego tienen un nombre. Cada elemento que se combina tiene un símbolo, de una o dos letras en mi caso. "Na" es sodio, "N" es nitrógeno, etc.
Ésto básicamente te está diciendo que el programa tiene que reconocer la fórmula que tú le escribas como el nombre asignado que tiene. Para ello debe solicitar una cadena con el nombre del compuesto que quieres identificar (la fórmula) y decirte el nombre, su valencia y decirte si lo que tú le has dicho está bien o mal (como yo lo voy a comparar con los datos de un archivo, si no encuentra ninguna fórmula en el fichero igual a la que le he dado, estará mal formulado porque yo se las he dado todas.

1.Características de óxidos ácidos y básicos: tienen dos elementos, y como cada elemento tiene sólo una letra mayúscula, el compuesto tiene dos letras mayúsculas. Además, una de ellas siempre es la letra O, que puede ir seguida de un número: si se combinan por ejemplo un nitrógeno con dos oxígenos, tendré NO2. Como ves, cuando uno de los elementos sólo aparece como uno, no se pone N1, se pone N.
Yo quiero, por ejemplo con un gets, que lea lo que yo escribo. Por ejemplo, NO2, que identifique dentro de la fórmula todo hasta llegar a la O (sin contarla) y ésta es la regla de formulación:
Si el último carácter antes de la O es un número, y el siguiente después de la O es otro, escribe Óxido de(esto va siempre) y luego busca en un fichero que he creado, el símbolo N(sin contar números, o sea, si yo pongo N2O, sólo cuenta el N. Si pongo Na2O4, que cuente sólo Na. O sea, el primer/los dos primeros carácteres antes de la O o el número que haya antes de la O, en caso de que haya.)., y en el fichero eso, que habrán todos los símbolos tal como te los he explicado (N, Na, etc) al lado separados con un espacio o con una coma, los nombres. Pues pondrá "Óxido de (el nombre que haya al lado del símbolo) [y aquí irá ente paréntesis ( ), un numero, que se elige por el siguiente algoritmo. Si detrás del primer elemento como te he dicho, había un número, y después del O también, pondrá el que está después del O. Si después del O no hay, multiplicará el que tiene el primer elemento por dos. Y si no hay numero en ninguno, entre paréntesis irá un 2.

El siguiente es básicamente lo mismo, aplicando otro algoritmo para poner los 'números'. Así que si sé hacer el primero, supongo que sabré hacer el segundo. El tres también creo que lo sabré hacer. El cuarto es lo mismo, sólo que ahora al buscar el elemento tendrá que ser, para el caso 1 que son del tipo NaO, ahora podrán ser ONa, O2Na, O sea, que ya no podremos buscar los números como "el que va antes de la O", sino como "el que va después del elemento". Y el elemento será "la letra mayúscula y (si hay, las que vayan detrás y sin número(si hay)), que van antes o después de la O). Y para el caso 2, será lo mismo pero ahora "las que no son ni H ni O ni los posibles números que van detrás de H || O. EL 5 es lo mismo, pero poniendo un 1 multiplicado por el número a la derecha del paréntesis a todos los 1 de los elementos dentro del paréntesis) y luego calculando como si no hubiera parentesis.

Bueno, voy a intentar hacer algo. Si lo lees, porfavor intenta ayudarme en lo que puedas, que no me dejan volver a casa hasta que lo acabe, y a este paso hasta el sábado no podré ir. Yo también intento hacerlo, iré actualizando la página para ver si has puesto algo. Gracias. Ah, y si prefieres hablar por msn avisame (por aquí, no por privado, aunque me envíes el msn por privado, avísame por aquí). Muchas gracias, esque estoy bastante desesperado, porque lo tengo que entregar el Lunes.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Nelek/programaQuimica

Publicado por Nelek (816 intervenciones) el 06/12/2007 10:42:44
A ver te voy a ir comentando cosas, por desgracia hace muuuucho que no uso C puro, asi que puede que se me mezcle algo del C++ o del VC++. Creo que lo mejor que puedo hacer es ayudarte a pensar y que tu mismo hagas el programa.

Lo de pedir la formula y guardarla en un char* supongo que lo debes tener claro.

Una vez guardado, para discriminar letras de numeros existen una funcion "isalpha" que te indica si es un numero o no. Con ello podras ir mirando cada uno de las posiciones de tu cadena, si te da false, es una letra, la guardas en un temporal, si te da true es un numero, por lo que lo que hayas guardado antes debe de ser un elemento quimico (o de una o de dos letras). En el caso de que no haya valencias y quieras comprobar si la letra es una mayuscula o una minuscula, entonces tendras que comprobar su valor ascii. No recuerdo los numeros exactamente, ni tengo la tabla al alcance, pero la cosa esta en que la "a" es (por ejemplo) 37 y la "A" es el numero 65, entonces los valores mayores que "a" y menores que "A" son letras minusculas y los valores mayores que "A" y menor o igual que "Z" son letras mayusculas. Eso tambien te puede servir para separar los elementos y poder decir Oxido de... "Elemento identificado".

Para saber si es un oxido o un hidruro o cualquier otro compuesto, puedes saber el tamanyo del char* con sizeof (cadena), como es un puntero, puedes hacerlo de dos maneras. O ir desde el principio hasta el final separando entre "Elemento nominal_1 (Oxigeno)", "Elemento nominal_2 (hidrogeno)", "elemento identificativo (los demas, es decir, el que da el nombre)" con lo que te dije arriba del numero o de las mayusculas. O puedes ir directamente al final.
Ten en cuenta que tu puntero char* apunta a la primera letra de la cadena y el sizeof te dice como de larga es la cadena (sin contar el del final). Asi que es posible hacer:
char* formula [10];
//guardas la formula introducida

char* temp;
temp = formula + sizeof (formula) - 1;
//si no se me ha ido la cabeza esto deberia apuntarte a la ultima letra de la formula

Si tienes todas las posibles formulas que has de comprobar en un fichero, entonces puedes tomar la formula introducida entera, guardarla en una variable y hacer un bucle para ir buscando por el fichero a ver si la encuentras en el. El fichero lo deberias escribir con simbolos especiales para separar formulas, o con una formula por linea (segun que comandos del FILE controles mejor).
Si lo pones todo en una linea (aunque sean mas lineas por la extension me refiero a que no haya retorno de carro = "enters" = " " por ningun lado), entonces puedes hacerlo como:
- posicionarte en el principio del fichero y la guardas para tener el "desde"
- Empieza el bucle
- buscas el caracter separador de formulas (espacio, coma, punto y coma...)
- tomas la posicion y la guardas para tener el "hasta"
- te posicionas en "desde" y lees el fichero por una extension de "hasta" - "desde"
- Comparas en un IF, si lo leido coincide con la formula buscada, haces un break (no es necesario el ELSE porque si no coincide no interrumpes asi que sigues con lo siguiente)
- tomas la posicion actual (que debe de ser "hasta", donde esta el separador), le sumas uno para apuntar al principio de la siguiente formula y la guardas en "desde"
(con esto ya podria estar listo, el bucle volveria a empezar, esta vez con la siguiente formula).

El bucle puedes hacerlo con un:
do {
// lo de arriba
} while (posicion en el fichero != final del fichero)

Para lo de las valencias 1, no te queda mas remedio que usar la diferenciacion entre mayusculas y minusculas. Si hay dos mayusculas seguidas, ya sabes que es un 1 lo que hay entre medio. Una de dos, o se lo anyades tu... o lo dejas asi.

Para lo de los elementos en cualquier orden... no te queda mas narices que ir recorriendo la cadena para separar los elementos. Las formulas trivalentes (no recuerdo si era ese el nombre cuando hay tres elementos) de los acidos son siempre iguales, primero el hidrogeno, luego el elemento identificativo y por ultmo el oxigeno. Entonces, lo unico que has de hacer es discriminar las H y las O, encontrar su elemento identificativo y montar la formula por ti mismo.
Es decir:
- comienza bucle
- leo una letra de la cadena
- IF ( (letra != H) && (letra != O) && (isalpha (letra) == 0) )
- tienes el elemento en cuestion
- lo guardas
- haces break
- aumentas la posicion en 1 para apuntar a la siguiente letra

aqui puedes usar un do { ... } while (letra != "") o un for (int i = 0; i < sizeof (formula); i++) como gustes

Lo de los parentesis, es una mezcla de todo esto anterior.

Espero que te sirva lo que te he dicho. Ya me comentas. Por desgracia no puedo actualizar la pagina todo lo que me gustaria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Nelek/programaQuimica

Publicado por kikonenko (5 intervenciones) el 06/12/2007 14:31:44
Ok, voy a probar. He estado estudiando un poco lo de las matrices multidimensionales, porque me comentó el profesor que me harán falta y es lo que peor llevo, lo de las dimensiones dinámicas con punteros y cosas del tipo ***p (con tres asteriscos)....
Voy a intentar seguir esos pasos, aunque veo alguna cosa que creo que tendré que modificar como que si dos letras van seguidas, el numero de la primera es 1. Porque entonces, si tengo FeO, donde es en realidad Fe2O2, pero que como son los dos con 2, se simplifica y se quedan en 1, 1, tendré que comprobar que el O no lleve nada, y si no lleva multiplicar el número 1 del Fe por 2, o si es FeO2(esto no existe) sería en realidad Fe2O4, pero como son los dos pares se simplifica, pues ahí tendría que ver si el O lleva un número (lleva el 2) y multiplicarlo por el 1 del Fe (FeO2). ... Bueno voy a ver que tal. Y gracias por contestarme nelek, eres de gran ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Nelek/programaQuimica

Publicado por Nelek (816 intervenciones) el 07/12/2007 09:33:36
La verdad es que es un tanto "tocapelotas" el ejercicio. Espero que te vaya bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar