Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tabla de Contenido
Descripcin del proyecto............................................................................ 2
Objetivos........................................................................................................ 2
Objetivo General........................................................................................... 2
Objetivos Especficos.................................................................................... 3
Alcance del Proyecto................................................................................... 3
Descripcin de las estructuras de datos utilizados en el proyecto.....3
Caractersticas de una Lista de Doble Enlace...............................................3
Programacin Esttica VS Programacin Dinmica...............................3
Paso a paso del proceso del programa.....................................................4
Conclusiones............................................................................................... 12
Dificultades................................................................................................. 13
Recomendaciones y sugerencias.............................................................13
Cdigo fuente.............................................................................................. 14
Bibliografa.................................................................................................. 32
Nombre de la estructura.
Cantidad de Carbonos.
Cantidad de Hidrgenos.
Cantidad de Oxgenos.
Nombre Cientfico o Comercial.
Informacin relevante.
Objetivos
Objetivo General
Crear una aplicacin de Qumica Orgnica para acceder a su
informacin de forma instantnea, que muestre todas y cada
Objetivos Especficos
Comprender el funcionamiento de una Lista Doblemente
Enlazada.
Crear las clases (PrincipalQuimica, NodoQuimica,
ListaQuimica, Cuenta) con sus respectivos atributos y
mtodos para crear objetos que lleguen a interactuar
entre s.
Verificar el correcto funcionamiento del programa.
Donde:
Nombre
=
nombre de la estructura qumica.
NumCarbonos = cantidad de carbonos de la estructura
qumica.
NumHidrogenos = cantidad de hidrgenos de la estructura
qumica.
NumOxigenos = cantidad de oxgenos de la estructura
qumica.
Informacion = informacin relevante de la estructura
qumica.
Numero = nmero de la estructura qumica otorgado por el
programa.
Mtodo Aadir.Este mtodo permite crear la lista con datos (estructuras
qumicas) precargados por el programador en forma de pila.
Para crear el primer nodo de la lista
Paso 1:
Paso 2:
Crear el nuevo nodo con los
respectivos datos de la estructura. El campo nmero ser
llenado automticamente por el programa.
mvil
Paso
con
3: Enlazar inicio y
el nuevo nodo.
Paso
primer nodo con el segundo nodo.
3:
Enlazar
el
Mtodo insertar.El mtodo insertar est destinado para el usuario. Mediante este
mtodo el usuario puede insertar una estructura qumica (nodo)
Para
del primer nodo de la lista
Conclusiones
Se puede asegurar que se logr alcanzar el objetivo del proyecto con
gran xito. Esta primera versin del programa FunChemestry
cumple con los siguientes requisitos:
Todas las estructuras creadas por el programador se
encuentran
correctamente
almacenadas,
teniendo
las
siguientes caractersticas en cada estructura (nodo):
Nombre de la estructura.
Cantidad de Carbonos.
Cantidad de Hidrgenos.
Cantidad de Oxgenos.
Nombre Cientfico o Comercial.
Informacin relevante.
En este programa el usuario debe acceder a una cuenta para
poder realizar la insercin de un nuevo nodo, la eliminacin y
modificacin de un nodo cualquiera.
El usuario puede insertar un nuevo nodo en cualquier parte de
la lista de estructuras.
El usuario puede eliminar un nodo cualquiera existente en la
lista.
El usuario puede modificar un nodo existente en la lista.
Dificultades
Las dificultades que se presentaron en el programa son las
siguientes:
Atrapar los posibles errores cometidos por el usuario que se
lleguen a presentar durante la ejecucin del programa.
En el mtodo insertar se presentaron algunas dificultades
como ser: la verificacin del ndice que ingrese el usuario
debe ser vlido para el programa.
En el caso que no exista una lista precargada por el
programador, el primer nodo que cree el usuario ser el primer
nodo de la lista. Si el usuario desea posicionar un nodo antes
del primer nodo se debe validar con el ndice = 1 para que el
programa logre incorporar el nuevo nodo antes del primero de
la lista. Para insertar un nodo que exceda la cantidad de
estructuras creadas previamente fue necesario condicionar el
mtodo para lograrlo.
En los mtodos eliminar y modificar fue necesario contar la
cantidad de estructuras creadas, porque si se obtena el valor
de
0 estructuras creadas ambos mtodos no lograran
ejecutarse y el programa entrara en un error.
Es importante resaltar que en los mtodos eliminar y modificar
el ndice que introduce el usuario debe pertenecer a un nodo ya
existente, caso contrario se generara un error.
Realizar el juego tambin presento sus desafos, como hacer la
coincidencia del nodo del campo con la respuesta introducida
Recomendaciones y sugerencias
Para mejorar y optimizar el programa en sus siguientes versiones se
tiene las siguientes recomendaciones:
Brindarle al nodo un campo donde el usuario logre introducir la
cadena de la estructura qumica que desea.
Que el programa cuente de forma automtica la cantidad de
carbonos, oxgenos e hidrgenos. Incluso que almacene otros
elementos qumicos de la cadena y los contabilice.
Mostrar la cadena de la estructura en una imagen.
Minimizar la cantidad de lneas de cdigo.
Proporcionar una interfaz grfica para el programa.
Atrapar errores generados por el usuario en cadenas de texto.
Cdigo fuente
Cdigo fuente de la Clase: ListaQuimica
import java.util.Scanner;
public class ListaQuimica {
//Para comenzar debemos crear dos atributos para los Nodos de la Lista.
//Estos nodos los usaremos como punteros para que puedan desplazarse
//por la lista y asi poder realizar distintas operaciones.
//El atributo (puntero) inicio se mantendra siempre en el primer nodo de la lista.
//es decir sera la cabeza de la lista.
//El atributo (puntero) movil se desplazara a lo largo de la lista.
private NodoQuimica inicio;
private NodoQuimica movil;
//En el constructor inicializamos los punteros en NULL.
ListaQuimica() {
inicio = null;
movil = null;
}
//Este metodo permite crear una lista con datos precargados (que se encuentran
en el MAIN)
//en seis diferentes campos de cada Nodo.
//Los respectivos campos son: nombre de la estructura quimica, numero de
carbonos,
3
//numero de hidrogenos, numero de oxigenos, nombre cientifico de la estructura
(si es que la tiene)
//e informacion relevante.
public void anadir(String nombre, int numCarbonos, int numHidrogenos, int
numOxigenos, String nombreCientifico,
String informacion) {
NodoQuimica nuevo = new NodoQuimica();
// Cargar con datos el nuevo nodo.
nuevo.nombre = nombre;
nuevo.numCarbonos = numCarbonos;
nuevo.numHidrogenos = numHidrogenos;
nuevo.numOxigenos = numOxigenos;
nuevo.nombreCientifico = nombreCientifico;
nuevo.informacion = informacion;
nuevo.preguntado = false;
nuevo.ant = null;
nuevo.sig = null;
nuevo.numero = 1;
de la lista.
ultimo nodo.
3
// El metodo mostrar sirve para mostrar en la consola todos los nodos
precargados ya creados.
public void mostrar() {
if (inicio == null)
System.out.println("\nLa lista esta vacia.\n");
else {
//Creamos un puntero auxiliar que recorra todos los nodos de
lista para mostrarlos.
NodoQuimica aux = inicio;
while (aux != null) {
System.out.println(aux.numero + ")");
System.out.println("El nombre de la estructura es: "
aux.nombre);
System.out.println("Numero
de
carbonos:
"
aux.numCarbonos);
System.out.println("Numero
de
hidrogenos:
"
aux.numHidrogenos + " ");
System.out.println("Numero
de
oxigenos:
"
aux.numOxigenos + " ");
System.out.println("Nombre
Cientifico:
"
aux.nombreCientifico + " ");
System.out.println("Informacion
relevante:
"
aux.informacion + " ");
System.out.println("-----------------------");
la
+
+
+
+
+
+
aux = aux.sig;
System.out.println();
}
}
vez.
3
}
public void mostrarPrimero() {
movil = inicio;
mostrarUno();
}
public void siguiente() {
if (movil.sig != null) {
movil = movil.sig;
mostrarUno();
} else {
System.out.println("No existe un siguiente.");
}
}
public void anterior() {
if (movil.ant != null) {
movil = movil.ant;
mostrarUno();
} else {
System.out.println("No existe un anterior.");
}
}
//Metodo destinado para el usuario
public void insertar(String nombre, int numCarbonos, int numHidrogenos, int
numOxigenos, String nombreCientifico,
String informacion, double indice) {
//Verificar que el indice es un numero mayor a cero
if (indice <= 0 ) {
System.out.println("Advertencia: Indice invalido");
System.out.println("
Verificar
que
el
indice
agregado es mayor a cero y no excede la cantidad predeterminada de estructuras.");
} else {
NodoQuimica nuevo = new NodoQuimica();
// Cargar con datos el nuevo nodo
nuevo.nombre = nombre;
nuevo.numCarbonos = numCarbonos;
nuevo.numHidrogenos = numHidrogenos;
nuevo.numOxigenos = numOxigenos;
nuevo.nombreCientifico = nombreCientifico;
nuevo.informacion = informacion;
nuevo.preguntado = false;
nuevo.ant = null;
nuevo.sig = null;
nuevo.numero = 1;
if (inicio == null) {
3
inicio = nuevo;
movil = nuevo;
} else if(indice == 1) {
inicio.ant = nuevo;
nuevo.sig = inicio;
inicio = nuevo;
movil = nuevo;
}
else if (indice > 1 && indice < cantidadNodos()) {
NodoQuimica ultimo = inicio;
NodoQuimica anterior = inicio;
while(ultimo.numero != indice){
anterior = ultimo;
ultimo = ultimo.sig;
}
ultimo.ant = nuevo;
nuevo.sig = ultimo;
nuevo.ant = anterior;
anterior.sig = nuevo;
}
else if(indice > cantidadNodos()){
NodoQuimica buscarultimo = inicio;
while(buscarultimo.sig != null){
buscarultimo = buscarultimo.sig;
}
nuevo.ant = buscarultimo;
buscarultimo.sig = nuevo;
}
int i = 0;
NodoQuimica aux = inicio;
while(aux != null){
i++;
aux.numero = i;
aux = aux.sig;
}
}
3
}
else{
}
return contador;
anterior.sig = null;
}
int i = 0;
NodoQuimica aux = inicio;
while(aux != null){
i++;
aux.numero = i;
aux = aux.sig;
}
}
public void modificarNombre(int indice, String newnombre){
}
public void modificarnumOxigenos (int indice, int newnumOxigenos){
3
if (indice <= 0 || indice > cantidadNodos()) {
System.out.println("Advertencia: Indice invalido");
System.out.println("\n Verificar que el indice agregado es mayor a
cero y no excede la cantidad predeterminada de estructuras.\n");
} else {
NodoQuimica aux = inicio;
}
public void modificarNombreCientifico (int indice, String newnombrecientifico)
{
if (indice <= 0 || indice > cantidadNodos()) {
System.out.println("Advertencia: Indice invalido");
System.out.println("\n Verificar que el indice agregado es mayor a
cero y no excede la cantidad predeterminada de estructuras.\n");
} else {
NodoQuimica aux = inicio;
while (aux.numero != indice){
aux = aux.sig;
}
aux.nombreCientifico = newnombrecientifico;
}
}
public void modificarInformacion (int indice, String newInformacion){
if (indice <= 0 || indice > cantidadNodos()) {
System.out.println("Advertencia: Indice invalido");
System.out.println("\n Verificar que el indice agregado es mayor a
cero y no excede la cantidad predeterminada de estructuras.\n");
} else {
NodoQuimica aux = inicio;
while (aux.numero != indice){
aux = aux.sig;
}
aux.nombre = newInformacion;
}
3
int nodoAzar = (int)(Math.random() * numeroNodos);
movil = inicio;
for(int i = 0; i < nodoAzar; i++){
movil = movil.sig;
}
}while(movil.preguntado == true);
movil.preguntado = true;
}
proxima!");
if ( respuestaInt == movil.numCarbonos ) {
System.out.println("Respuesta correcta! Felicidades!");
return 1;
}
else {
System.out.println("Respuesta incorrecta. Suerte para la
}
return 0;
proxima!");
if(respuestaInt == movil.numHidrogenos){
System.out.println("Respuesta correcta! Felicidades!");
return 1;
}
else{
System.out.println("Respuesta incorrecta. Suerte para la
}
return 0;
3
System.out.println(movil.numOxigenos);
respuestaInt = teclado.nextInt();
if(respuestaInt == movil.numOxigenos){
System.out.println("Respuesta correcta! Felicidades!");
return 1;
}
else{
System.out.println("Respuesta incorrecta. Suerte para la
proxima!");
return 0;
de:
"
respuestaString = teclado.nextLine();
teclado.nextLine();
if(respuestaString.equals( movil.nombreCientifico)){
System.out.println("Respuesta correcta! Felicidades!");
return 1;
}
else{
System.out.println("Respuesta incorrecta. Suerte para la
proxima!");
return 0;
}
} else if(preguntaAzar== 4){
System.out.println("A que familia pertenece esta estructura: " +
movil.nombre);
System.out.println(movil.informacion);
respuestaString = teclado.nextLine();
teclado.nextLine();
if(respuestaString.equals( movil.informacion)){
System.out.println("Respuesta correcta! Felicidades!");
return 1;
}
else{
System.out.println("Respuesta incorrecta. Suerte para la
proxima!");
return 0;
}
return 0;
}
public void ponerCamposPreguntadosEnFalse( ){
3
NodoQuimica aux = inicio;
while (aux != null){
aux.preguntado = false;
aux = aux.sig;
}
}
public void game() {
int puntaje = 0;
ponerCamposPreguntadosEnFalse( );
for(int i = 0 ; i < 10 ; i++ ) {
seleccionarNodoGame( );
int puntos = seleccionarPreguntaGame( );
puntaje = puntaje + puntos;
}
System.out.println( "Haz conseguido " + puntaje + " puntos de las 10
preguntas" );
ms!");
3
estructura.anadir("4-etil-6-isopropilnonano", 14, 30, 0, "No tiene nombre
cientifico", "Alcano");
estructura.anadir("3-isopropil-5-metil-2-hexeno", 10, 20, 0, "No tiene
nombre cientifico", "Alqueno");
estructura.anadir("6-bromo-4-sec-butil-1-octeno", 12, 24, 0, "No tiene
nombre cientifico", "Alqueno");
estructura.anadir("6-ter-butil-7-cloro-5-propil-e-hepteno", 14, 28, 0, "No
tiene nombre cientifico", "Alqueno");
estructura.anadir("5-etil-3-isobutil-2-octeno", 14, 28, 0, "No tiene nombre
cientifico", "Alqueno");
estructura.anadir("6-bromo-4-sec-butil-1-hexeno", 10, 19, 0, "No tiene
nombre cientifico", "Alqueno");
estructura.anadir("3-n-butil-5-cloro-1-heptino", 11, 19, 0, "No tiene
nombre cientifico", "Alquino");
estructura.anadir("etino", 2, 2, 0, "Aceitileno", "Alquino");
estructura.anadir("4-metil-2-hexino", 7, 12, 0, "No tiene nombre
cientifico", "Alquino");
estructura.anadir("4,8-dimetil-5-neopentil-6-vinil-3-nonen-1-dino", 18, 30,
0, "No tiene nombre cientifico",
"Alquino");
estructura.anadir("5-etinil-2,4-dimetil-1,3-octadien-7-ino", 12, 14, 0, "No
tiene nombre cientifico",
"Alquino");
estructura.anadir("4-alil-3,7-dietil-6-vinil-3,6-nonadien-1,8-diino", 18, 22,
0, "No tiene nombre cientifico",
"Alquino");
estructura.anadir("sec-butilciclobutano", 8, 18, 0, " No tiene nombre
cientifico", "Ciclicos Alifaticos");
estructura.anadir("Biciclopentano", 9, 18, 0, "No tiene nombre cientifico",
"Ciclicos Alifaticos");
estructura.anadir("7-ter-butil-1-etil-3-metil-1,5-coclooctadieno", 15, 31, 0,
"No tiene nombre cientifico",
"Ciclicos Alifaticos");
estructura.anadir("1-(3-butenil)-3-metil-1-ciclobuteno", 9, 15, 0, "No tiene
nombre cientifico",
"Ciclicos Alifaticos");
estructura.anadir("4-etinil-7-neopentil-2-vinil-1,3,5-cicloheptatrieno", 16,
26, 0,
"No tiene nombre cientifico", "Ciclicos Alifaticos");
do {
if (menuActual == 0) {
menuPrincipal();
opcion = teclado.next().charAt(0);
switch (opcion) {
case 'm':
estructura.mostrar();
break;
case 'u':
3
estructura.mostrarPrimero();
menuActual = 1;
break;
case 'p':
menuActual = 2;
break;
case 'i':
menuActual = 3;
break;
case 'c':
break;
default:
System.out.println("\nOpcion invalida. Ingresar otra
por favor.");
}
} else if (menuActual == 1) {
if (estructura.cantidadNodos() != 0){
menuMostrarUno();
opcion = teclado.next().charAt(0);
switch (opcion) {
case 'a':
estructura.anterior();
break;
case 's':
estructura.siguiente();
break;
case 'b':
menuActual = 0;
break;
default:
System.out.println("\nOpcion
invalida.
else{
System.out.println("Antes
operacion debe crear nuevos nodos para llenar la lista.");
menuActual = 0;
}
} else if (menuActual == 2) {
if(estructura.cantidadNodos()!= 0){
menuMostrarGame();
de
realizar
esta
opcion = teclado.next().charAt(0);
switch (opcion){
case 'c':
estructura.game();
break;
case 'b':
menuActual = 0;
break;
default:
System.out.println("\nOpcion
invalida.
}
System.out.println("Antes de iniciar el juego debe
menuActual = 0;
} else if (menuActual == 3) {
menuCuenta();
String usuario = teclado.next();
String contrasena = teclado.next();
if (cuenta.verificarCuenta(usuario, contrasena) == true) {
menuActual = 4;
}
else{
menuActual = 0;
}
} else if (menuActual == 4) {
if (estructura.cantidadNodos() != 0){
menuUsuario();
opcion = teclado.next().charAt(0);
switch (opcion) {
case 'i':
System.out.print("Ingresar el nombre de la
nueva cadena: ");
carbonos: ");
Hidrogenos: ");
Oxigenos: ");
de
de
de
3
int numOxigenos = teclado.nextInt();
System.out.print("Ingresar
el
nombre
cientifico: ");
teclado.nextLine();
String informacion = teclado.nextLine();
int indice;
do{
System.out.println("Ingresar un indice
try{
indice = teclado.nextInt();
}
catch(Exception errorAtrapado){
System.out.println("Debe
indice= -1;
teclado.nextLine();
}
} while(indice <= 0);
estructura.insertar(nombre,
numHidrogenos, numOxigenos, nombreCientifico, informacion, indice);
break;
numCarbonos,
case 'e':
int indices;
do{
System.out.println("Ingresar el indice
try{
indices = teclado.nextInt();
}
catch(Exception errorAtrapado){
System.out.println("Debe
indices= -1;
teclado.nextLine();
}
} while(indices <= 0);
estructura.eliminar(indices);
break;
case 'm':
int indicess;
do{
de la estructura que desea modificar:");
System.out.println("Ingresar el indice
try{
indicess = teclado.nextInt();
}
catch(Exception errorAtrapado){
System.out.println("Debe
indicess= -1;
teclado.nextLine();
}
} while(indicess <= 0);
menuModificar();
opcion = teclado.next().charAt(0);
if(opcion == 'a'){
System.out.print("Ingresar el nuevo
int
nuevonumCarbonos
teclado.nextInt();
estructura.modificarCarbonos(indicess,nuevonumCarbonos);
int
nuevonumHidrogenos
teclado.nextInt();
estructura.modificarnumHidrogenos(indicess, nuevonumHidrogenos);
int
nuevonumOxigenos
teclado.nextInt();
estructura.modificarnumOxigenos(indicess,nuevonumOxigenos);
String
teclado.next();
nuevonombreCientifico
estructura.modificarNombreCientifico(indicess,nuevonombreCientifico);
nueva
teclado.nextLine();
String
nuevaInformacion
teclado.nextLine();
estructura.modificarInformacion(indicess,nuevaInformacion);
}
}
else{
menuUsuarioListaVacia();
opcion = teclado.next().charAt(0);
cadena: ");
switch (opcion) {
case 'i':
System.out.print("Ingresar el nombre de la nueva
String nombre = teclado.next();
System.out.print("Ingresar el numero de carbonos:
");
Hidrogenos: ");
de
3
System.out.print("Ingresar informacion relevante:
");
teclado.nextLine();
String informacion = teclado.nextLine();
int indice;
do{
el nuevo nodo:");
introducir
indice= -1;
teclado.nextLine();
}
} while(indice <= 0);
estructura.insertar(nombre,
numHidrogenos, numOxigenos, nombreCientifico, informacion, indice);
break;
}
}
}
System.out.println();
} while (opcion != 'c');
System.out.println("Gracias por usar FunChemestry");
teclado.close();
}
public static void menuPrincipal() {
System.out.println("FunChemestry");
System.out.println("----------");
System.out.println("(m) Mostrar Todas Las Estructuras");
System.out.println("(u) Mostrar una estructura");
System.out.println("(p) Play Game");
System.out.println("(i) Ingresar a la Cuenta");
System.out.println("(c) Cerra app");
System.out.println("Elija una opcion: ");
}
public static void menuMostrarUno() {
System.out.println("(a) Anterior Estructura");
System.out.println("(s) Siguiente Estructura");
System.out.println("(b) Menu principal");
}
public static void menuCuenta() {
numCarbonos,
3
System.out.println("Ingrese
el
nombre
de
usuario
luego
la
contrasea");
}
public static void menuUsuario() {
System.out.println("(i) Insertar un nuevo nodo");
System.out.println("(e) Eliminar un nodo");
System.out.println("(m) Modificar un nodo");
System.out.println("(b) Menu principal");
}
public static void menuUsuarioListaVacia (){
System.out.println("Ingrese por teclado la latra i.");
System.out.println("(i) Insertar un nuevo nodo");
}
public static void menuModificar(){
System.out.println("Ingrese la opcion que desea modificar:");
System.out.println("(a) Nombre de la estructura");
System.out.println("(b) Cantidad de Carbonos");
System.out.println("(c) Cantidad Hidrogenos");
System.out.println("(d) Cantidad Oxigenos");
System.out.println("(e) Nombre cientifico");
System.out.println("(f) Informacion Relevante");
System.out.println("(g) Menu anterior");
}
public static void menuMostrarGame(){
System.out.println("MiniQuizz");
System.out.println("En este juego usted debe reponder 10 preguntas
generadas al azar. " +
"Con cada pregunta correcta se incrementa un punto. Se realizaran 10
preguntas. Exito!");
System.out.println("(c) Comenzar el juego");
System.out.println("(b) Menu principal");
}
}
3
NodoQuimica ant;
NodoQuimica sig;
}
String
Bibliografa
http://edatosucb.galeon.com/Exposiciones.htm
http://samirspindola.blogspot.com/2011/04/memoria-estatica-ydinamica.html
http://estructura-quique.blogspot.com/2012/10/estructuraestatica-y-estructura.html
Programacin en Java, autor: Luis Joyanes Aguilar.
&&