02 diciembre, 2010

SYSTEMS A LA ACCIÓN!!


Bueno compañeros, uno de los grandes motivos por los cuales estamos presentando este Blog es porque vamos a presentarles cómo hemos resuelto uno caso de estudio del "Aula Virtual", pues este tiene unos grandes requerimientos de información y además necesita tener bien organizados esta información, por el cual necesita de un Software para satisfacer dichas necesidades.





Para una mejor comprensión a continuación les mostraremos el caso con sus respectivos requerimientos de información.

"Caso de Estudio "Aula Digita@l" 

Registro Digit@l
Aula Digita@l es un instituto de formación técnica, que opera desde el año 2000 en la zona norte del país.
Jorge Díaz, recientemente designado como responsable del área de sistemas de Aula Digit@l, ha identificado la necesidad de incorporar el uso de tecnologías y sistemas de información en el proceso académico. Por ello, ha decidido encargar a usted la construcción de un software que permita a los docentes llevar un registro actualizado de las evaluaciones realizadas durante el proceso académico, debiendo tenerse en consideración los siguientes requerimientos funcionales:
  • Registro actualizado de cursos.
El software debe permitir al profesor realizar un registro de los cursos que tiene a su cargo, siendo necesario los siguientes datos:
Código Nombre
01 Lenguaje de Programación
02 Base de Datos
  • Registro actualizado de alumnos.
El software debe permitir al docente registrar los alumnos matriculados en los cursos que tiene a su cargo.
Código Nombre
01 JORGE DIAZ PAREDES
02 LUIS PALACIOS ROJAS
  • Registro actualizado de fórmulas.
El software debe permitir al docente registrar las fórmulas de evaluación que ha establecido para los cursos que tiene a su cargo, tal como:
(PC+TR+(EP*2))/4
Donde PC, TR y EP son las etiquetas que representan la evaluaciones establecidas, las cuales dependen del curso.
  • Registro actualizado de notas.
El software debe permitir al docente registrar las notas de los estudiantes matriculados en los cursos que tiene su cargo, según las evaluaciones consideradas en la fórmula definida para cada curso.


Curso: 01 - Lenguaje de Programación
Formula: (PC+TR+(EP*2))/4
Código    Nombre                                     PC        TR       EP
  01         JORGE DIAZ PAREDES        ___    ____     ____
  02         LUIS PALACIOS ROJAS       ___     ____     ____

  • Consulta de notas.
El software debe permitir al docente consultar las notas de los cursos que tiene a su cargo.


Curso: 01 - Lenguaje de Programación
Formula: (PC+TR+(EP*2))/4
Código   Nombre                              PC         TR          EP          Promedio
01 JORGE DIAZ PAREDES      10.00      10.00       12.00         11.00
02 LUIS PALACIOS ROJAS      12.00      12.00       12.00         12.00

  

Hola amigos, les habla su compañera Fiorella, como hemos observado queridos amigos!.. tenemos muchos requerimientos de información y necesitamos  buscar un ayudante y quien mejor que nuestro gran amigo! JAVA!  =)
que es un Lenguaje de Programación y esta orientado a objetos, es por ello que hemos realizado satisfactoriamente  nuestro proyecto.



Bueno y ustedes se preguntaran, cómo ha sido posible la resolución de este proyecto?..
Para ello a continuación le mostraremos los pasos que hemos realizado en la ejecución del mismo:
En Primer lugar hemos instalado el Java Development Kit y luego el IDE NetBeans 6.9 y para instalarnos el IDE NetBeans tenemos que hacer clic aquí. (Descarga e instalación del Entorno de Desarrollo Java NetBeans) 


Como Neat beans es una herramienta para que los programadores puedan escribir, compilar, depurar y ejecutar programas, entonces damos ejecución a lo siguiente...
Ahh! ..pero antes de dar ejecución a los pasos que hemos seguido en nuestro Proyecto, deben saber que el IDE NetBeans es un entorno de desarrollo Open Source escrito en Java y como este será el entorno de desarrollo utilizado durante el curso, es conveniente saber cómo:


  •   Crear un nuevo Proyecto: 
Elegimos File | New Project...

En el cuadro de dialogo New Project elegimos Java y Java Application y seguidamente hacemos clic sobre el botón   y luego en el cuadro de diálogo New Java Application procedemos a rellenar los campos.




Y seguidamente hacemos click sobre el boton

  •  Crear un nuevo Paquete: 
Cuando estamos realizando aplicaciones de cierta envergadura, tenemos que incluir las Clases de nuestra aplicación en paquetes (packages) para poder obtener una serie de ventajas que ya veremos más adelante.
  • Estos paquetes tienen sentido tanto en el proceso de desarrollo como en el de producción.
  • Los paquetes no están ligados a un entorno de desarrollo, sino que es una parte integral y esencial del lenguaje Java.
Nos situamos en la ventana Projects y con el botón derecho del ratón seleccionamos la carpeta correspondiente. (A continuación se mostrará un ejemplo)
Elegimos new | Java Package...


Y en el cuadro de diálogo New Java Package introducimos el nombre del paquete y hacemos clic sobre el botón


  • Crear una Clase
En Java los programas o aplicaciones se escriben en ficheros que tienen la extensión .java

  • Una aplicación puede tener uno o más ficheros con extensión .java
  • Cada uno de estos ficheros .java contiene una Clase
  • Cada vez que se crea una nueva Clase, se crea su correspondiente fichero con el nombre de la Clase  y con extensión .java
  • Nos situamos en la ventana Projects y con el botón derecho del ratón seleccionamos el paquete creado.
 Elegimos new | Other...


En el cuadro de diálogo New File elegimos la categoria Java y el tipo de fichero Java Main Class y hacemos clic sobre el botón

En el campo de Texto Class Name indicamos el nombre de la Clase y hacemos clic sobre el botón

 



  • Compilar una Clase
En Java, las Clases compiladas se encuentran en ficheros que tienen la extensión .class
  • Al contenido de estas clases se le denomina código byte
  • Si no tuviéramos un IDE como NetBeans tendríamos que ejecutar el comando javac
Nos vamos a la clase y le damos anticlic y compilamos, dando clic en Compile File F9.


  • Ejecutar una Clase
A diferencia de los lenguajes compilados que ejecutamos ficheros con la extensión .exe, en java se ejecutan los ficheros con extensión .class





Ahora siii !! con unos buenos conocimientos previos! .. vamos al ataquee !! jeje..
¡¡Empezemos!!







  • Creación de 4 capas:
Deacuerdo a los requerimientos del "Aula Virtu@l"  que es nuestro caso de estudio, hemos querido conveniente en la primera parte de nuestro proyecto, realizado en IDE NetBeans estructurarlo en cuatro capas o paquetes. Lo hemos estructurado de esta manera teniendo en cuenta este esquema:



  • Entidades es una capa o paquete dentro de la cual hemos creado las clases:
  • Clase Curso:
Muy bien, deacuerdo a los requerimientos del caso en esta clase hemos considerado el codigo del curso, el nombre del curso y la formula del curso, esta formula nos muestra la manera que se evaluara el curso y así mismo cómo se obtendra el promedio final; por consiguiente creamos una lista para almacenar los Tipos de Evaluaciones; y para poder obtenerlo debemos importar la clase List del paquete utilidades de java y creamos la Lista y las propiedades previamente mencionados de la siguiente forma:

Como observamos, hemos creado Class Curso y luego las propiedades respectivos y el tipo de valor de cada propiedad; en el caso de List<String> Tipo Evaluaciones, esta lista nos almacenará cadenas es por ello que lo colocamos String.

Luego creamos constructores, uno lo podemos autogenerar dando anticlic sobre el codigo y en Constructor le damos click y autogeneramos el Constructor; además implemntaremos un constructor, con que finalidad? .. pues luego veremos que necesitaremos tanto un constructor implementado y uno sin implementar.
Para implementar nuestro primer y segundo constructor lo hacemos de la sigueinte manera:
Como observamos, no es necesario parametros para el primer contructor y en el segundo solictamos un String Codigo, un String Nombre, un String Formula y un List<String> Evaluaciones como parametros y los asignamos a nuestros atributos previamnte creados con this para hacer referencia a la propiedad de esta clase. Luego que hemos construido lo solicitado, constuimos los getters and setters, ya sea manualmente o autogerandolo dando anticlic sobre el codigo y dando click en Getters and Setters, de la siguiente manera.



Y ustedes se preguntarán: ¿Para qué necesitamos Getters and Setters? .. pues la razón de crear estos métodos, es debido a que habitualmente se recomienda que los campos (o propiedades) de una clase sean de acceso privado, es decir, únicamente desde el interior de la clase, y que para accesar o modificar estos valores, se utilicen métodos públicos diseñados para esa tarea. Estos son los denominados setters (set – modificar) y getters (get - accesar u obtener).


  • Clase Alumno:
En esta clase, vamos a seguir algunos pasos similares que el de la clase ya creada de Curso. Para esta clase hemos considerado los requerimientos de informacion previamente  dichos, los cuales son para el caso del Alumno: Su Codigo, su Nombre; el Curso al que se le matriculará, pero para crear este curso, tendremos que tener en cuenta que este curso pertenece a la Clase Curso previamente creada y por ende es un objeto de la Clase Curso, y pues como nuestro querido Java está Orientado a Objetos, crearemos el Objeto oCurso del tipo Curso. Y lo estructuramos de la siguiente forma:


Como observamos, hemos creado Class Alumno y luego las propiedades respectivos y el tipo de valor de cada propiedad, pero además si se dan cuenta hemos creado 2 propiedades adicionales: Notas y Promedio; la propiedad Notas almacenará un conjutno de notas, que son las que el alumno tendra en el cusro y por ello la almacenamos en una Lista de la manera que ya conocemos, llamando a la Clase List, y la propiedad Promedio es el promedio final que resultará de la formula para obtenerla, y este nos devolverá un double (tipo de variable en Java).
Luego, así mismo creamos las contructores para nuestra Clase Alumno, uno implementado y otro no implementado que puede ser autogenerado.

 

Posteriormente los getters anda setters.




  • Clase Notas:
En esta clase, hemos considerado como atributos: String TipoEvaluaciones y un Double Valor.


Luego hemos generado sus constructores:
 

Posteriormente los getters and setters:



  • Acceso a Datos es un paquete, el cual no tiene conección a una bae de datos, y por tal motivo simulamos una Base de Datos. En esta simulación de una Base de Datos hemos creado las clases: TablaAlumno y Tabla Curso.

  • TablaAlumno:
Continuando con la realizacion de nuestro proyecto y  asi poder llevar acabo la resolución efectiva de los requerimientos de información del caso "Aula Virtu@l", creamos una clase TablaAlumno así mismo una lista Alumnos dentro de la clase, el cual almacenará todos los alumnos que se van a registrar en un determinado curso.
Para crear la lista se tiene en cuenta el mismo esquema ya realizado previamente.

 

Luego se crea la función Seleccionar para buscar los alumnos que son introducidos y guardados previamente. Esta función Seleccionar va a tener como parametros a un String Codigo, String Nombre, Curso oCurso (Objeto de la Clase Curso).

 

Posteriormente creamos un método Buscar, este método lo hemos creado con la finalidad de que posteriormente podamos implementar otros métodos, los cuales son: Insertar, Actualizar y Eliminar, en este caso: un determinado Alumno.
 
 Asi creamos el método Insertar:


Asi creamos el método Actualizar:

 Así tambien creams el método Eliminar:



  • TablaCurso:
Bueno, luego creamos otra clase pero esta vez de curso, creamos una clase TablaCurso así mismo una lista Cursos dentro de la clase, el cual almacenará todos los cursos que se van a registrar.
La lista  se crea teniendo en cuenta las estructuradas previamente diseñadas, asi:
List <Curso> = new ArrayList<Curso()>


Luego creamos la Función Seleccionar, para buscar los cursos que son introducidos y previamente guardados. Esta función Seleccionar va a tener como parametros a un String Codigo y  un String Nombre.

Posteriormente crearemos un método auxiliar que llamaremos Buscar el cual nos ayudará a implementar los métodos Insertar, Actualizar y Eliminar un determinado curso.

Asi creamos el método Insertar:
Asi creamos el método Actualizar:
Así tambien creamos el método Eliminar:





  • Lógica dentro de esta capa, hemos creado 3 clases: la Clase Calculadora, Gestión de Notas y LógicaFórmula; ahora dare paso a mi compañero que les hablara a detalle de esta capa.

  • Calculadora
Bueno compañeros, les habla su amigo Elias, y bueno para poder desarrollar la formula de cada curso que se registra, nosotros hemos hecho un pequeño algoritmo que se los ire detallando paso a paso en el transcurso de mi descripción.
En si esta parte del desarrollo de la formula esta estructura en tres partes:
La primera es la que se encarga de verificarme que la expresión que estoy ingresando sea correcta o no, para la cual nosotros hemos hecho uso de una maquina de estado que va a interactuar con la expresión que nosotros ingresemos para ver si esta sintacticamente bien escrita
Esta máquina de estado se define como un conjunto de estados que sirve para cada instante, un estado para la máquina, las cuales pueden ser que este correcto o incorrecto, dentro de ella se hará uso a las llamadas estructuras recursivas, las cuales se llamaran así misma para poder ver si lo que continua en la expresión es correcto o no.
Una vez que ya sabemos para que nos va a servir nuestra maquina de estado empezaremos con su implementación para su posterior uso, lo primero que haremos es crear nuestra función o procedimiento principal el cual va a llamar (por decirlo así) a todas las funciones o procedimientos que están secuencialmente dentro de otras(recursividad).

Primero creamos nuestra clase calculadora (en la cual van a estar nuestra maquina de estado y la evaluación del promedio de la formula) dentro del paquete LogicaNegocio, luego creamos un método publico el cual va a llamar a todos los método privados que se encuentran dentro de la clase, a esta la hemos llamado  “EsCorrecto” ya que simboliza el inicio de la evaluación de la expresión, a la cual le pasamos como parámetro la expresión para que analice en la primera posición ósea en la posición 0 . Entonces hacemos uso de la estructura “if” que es un tipo de condicional la cual evalúa una condición, si es verdadera ejecuta un código, si es falsa , ejecuta otro código (o continúa con la  ejecución del programa).
Empezamos a evaluar la expresión, nosotros hemos establecido dos casos con la que puede empezar la formula, puede ser que empiece con una letra, o un paréntesis obviamente abierto, si nos dijeran que puede empezar con otro tipo de dato, simplemente crearíamos otro método con el tipo de dato que nos están solicitando, y lo incluiríamos en la condicional.
Ahh!! Me olvidaba algo muy importante de contarles este método publico “EsCorrecto” es un método de tipo booleano, y que quiere decir esto? Quiere decir que me va a devolver un true si cumple el condicional, y false si es que nose cumple este.
Entonces leyendo el código seria para que sea verdadero o correcta la expresión, debe empezar con una letra (Esletra (Expresion, 0)) ó ( | | ) en todo caso con un  parentesisabierto(Esparentesisabierto(Expresion,0)) .


Bueno ya que mencione estos procedimientos empezare implementándolos, luego irán viendo como una función va a llamar a otra e incluso llamarse a si misma (recursividad).

Que les parece si para tener una mejor ilustración de lo que hace esta parte de mi programa nos auto asignamos una formula(o forma de evaluar) que se nos ocurrió, para poder usarlo como ejemplo en esta parte del programa, la formula es:
promedio*0.2+examen*0.6+proyecto*0.2, bueno ya teniendo como referencia una formula concreta empezaremos dándole forma a nuestros procedimientos, entonces empezamos creando el método “Esletra”, como ven recibe como parámetros una expresión, y una posición (en la cual va ser evaluada esa expresión).
Entonces hacemos nuevamente uso del condicional para igualar si en esa posición es igual a cierto tipo de carácter (charAt), tendrá que igualarse a todos las letras del alfabeto, solo minúsculas ya que mas adelante crearemos un procedimiento que pase las minúsculas a mayúsculas para que no halla mucho conflicto y no tengamos que poner 27 letras en minúsculas y 27 letras en mayúsculas, un poco complicado no? Nos llenaríamos de código, para que lo vamos a hacer, si lo podemos evitar, hay q tratar de buscar salidas a nuestros pequeños problemas.
Entonces nos quedamos en que debe igualarse la expresión, en esa posición a todas las letras del abecedario, entonces si eso se cumple, aumentaremos en una la posición para que me pueda ver que carácter sigue después de esa letra, ahh! nuevamente me estaba olvidando de contarles que todos los métodos que voy a implementar van a hacer de tipo booleano, ósea q me va a retornar un verdadero (true) cuando se cumpla o un falso(false) cuando no se cumpla.
Bueno después haremos uso de otra condicional dentro de esta, para preguntar que la posición sea menor que el tamaño(Expresion.lenght) de la expresión, antes de continuar no quería dejar pasar por alto algo muy importante, no debemos olvidarnos que el tamaño y posición son dos cosas totalmente distintas, como así? Ósea que la expresión puede llegar a tener en su ultima posición, la posición 10 por ejemplo, pero es de tamaño 11, ya que  las posiciones empiezan a contarse desde 0,1,2…etc..En cambio el tamaño se cuenta a partir de 1,2,3…etc., al tamaño de la expresión siempre se le va a restar uno para obtener el último valor de la cadena (posición 10);
Entonces dejando bien en claro este punto continuamos con nuestro programilla.
La posición ya aumento a 1, porque a la hora de analizar la expresión vemos que en su primera posición si hay una letra, entonces pasa a ejecutar la siguiente línea de código que es aumentar la posición para ver que es lo que sigue en la expresión, entonces vemos que la posición sea menor al tamaño de la expresión, si esto es así, entonces analizamos que puede venir después, tomando como referencia la formula que nos hemos puesto, vemos que después del primer carácter que es una letra, sigue otra que es igual a la anterior ósea es una letra, entonces preguntamos con otra condicional si lo que sigue es letra o no, y vemos como un método se esta llamando así mismo(recursividad), entonces va a seguir este proceso hasta que lo que siga sea diferente a una letra, luego vemos que en el ultimo carácter de ‘promedio’ es letra y que después le sigue un operador, entonces tenemos que después d una letra, puede venir otra letra y sino (else) puede venir un también operador.

Bueno vemos ahora un método nuevo “Esoperador”, que al igual que “Esletra” recibe como parámetros una expresión y una posición en la cual van a ser evaluada, al que también implementaremos de manera similar al de “Esletra”, siguiente nuestro ejemplo de la parte superior, pero podemos ver que hay mas restricciones con respecto a la letra que les parece, si tratamos de implementar el método “Esletra” con todas las restricciones posibles que puedan venir en una formula, claro esta dejaríamos en segundo plano a nuestro ejemplo promedio*0.2+examen*0.6+proyecto*0.2, porque tan solo es un tipo de formula, puede haber innumerables formas de expresarla, la cual iremos viendo en este momento.
Bueno vemos que después de una letra puede venir otra letra (promedio), y también puede venir un operador (promedio*0.2), bueno he visto tantas formas de calificar que se me ocurre que un Prof. pueda calificar con esta formula promedio1+promedio2, vemos que después de una letra puede venir también números (promedio1);
Por cierto me olvidaba de un dato importante de la maquina de estado, como ven para inicializar el proceso de verificación de la expresión, arrancamos de la posición 0, bueno así como empezamos de cero y condicionamos que debería empezar con una letra o con un paréntesis, también debemos condicionar el termino de la expresión, nosotros creamos un método “Esterminador”, el cual me va a condicionar con que carácter va a tener que terminar mi expresión que lo implementaremos mas adelante.
Bueno dejando bien en claro esto, continuamos con el relato, veíamos que después de una letra podria venir un numero, pero vemos que a la vez este se comporta como terminador ya que después de ese numero no viene nada mas, entonces tengamos bien en claro que después de una letra, puede venir otra letra, un numero, un operador, y un terminador, entonces el método quedaría de este modo

   
Bueno antes de implementar los nuevos métodos que nos han salido como “Esoperador”, “Esnumero”, y “Esterminador”, haremos la implementación del “Esparentesisabierto” ya que la formula aparte de poder empezar con una letra también puede comenzar con un paréntesis abierto, por ejemplo tenemos (practica*0.2+parcial*0.6+examen*0.2), entonces tenemos que después de un paréntesis abierto puede venir una letra, pero puede darse el caso que después de un paréntesis abierto , pueda venir otro paréntesis abierto, veamos el siguiente ejemplo: (practica*0.2+((examen*0.6)+proyecto*0.2)).Entonces vemos que después de un paréntesis abierto puede venir una letra u otro paréntesis abierto, ahora necesitamos llevar la contabilidad de cuantos paréntesis abiertos hay , porque para que la expresión este correctamente, los paréntesis abiertos deben estar en igual cantidad que la de los paréntesis cerrados, entonces para esto necesitamos algo que nos cuente cuantos paréntesis abiertos hay en la expresión, entonces para esto nos creamos una variable entera de nombre “contador”, que va a hacer el que nos va a ayudar con el problema de la cantidad de paréntesis abierto q hay dentro de la expresión, entonces conforme vaya encontrando un paréntesis abierto esta variable ira aumentando su valor en 1.
El método maso menos quedaría estructurado de la siguiente manera:

 


  • GestionNotas
Hola amigos! .. les habla su amiga Flor, y les datallaré sobre la clase Gestión de Notas que hemos creado;. Esta clase básicamente interactúa con la capa acceso a datos y con la capa Presentación; es decir, actúa como intermediario, ya que la capa Presentación no está directamente relacionado con la capa Acceso a Datos.
En esta capa o paquete de Lógica creamos un clase GestionNotas que permite al usuario Registrar a los alumnos y también a los cursos, así mismo permite Modificar, Eliminar y Realizar consultas sobre éstos.
En esta clase se ha creado un método ConsultarAlumnos que devuelve una lista de objetos de tipo Alumno, el cual recibe parámetros como el Código, Nombre del alumno y a su vez un objeto curso de la Clase Curso:

En este método de ConsultarAlumno nos dirigimos a la parte final del código de la línea 19 en la que se observa un throws Exception; que es usado para manejar excepciones que puedan ocurrir durante la ejecución del programa. En términos más sencillos es para darle una salida elegante al programa, como se puede observar en la imagen siguiente, mientras no hay error intenta (try) retornar la lista de Alumnos, en caso contrario captura (Catch) la excepción.
Luego para registrar un Curso se hace el mismo procedimiento descrito anteriormente, con la diferencia que en crearemos un método ConsultarCurso y esta nos intentará devolver una Lista de Cursos.

Luego creamos el método Registrar Alumno que llama al método Insertar de la capa Acceso a Datos, es por ello que importamos la Clase TablaAlumno del paquete Acceso a Datos la cual contiene al método Insertar.

 
Y que hace este Método? ..pues trata de insertar el alumno, pero para ello, primero debe buscarlo en la lista Alumno para asegurarse si existe o no ese alumno; en el caso de que no existiera lo insertamos, en caso contrario no se inserta . Para ello al momento de crear el método, hacemos que nos devuelva un booleano; resulta ser verdadero (true) cuando el alumno es registrado y falso (false) cuando dicho alumno ya fue registrado.
  

Continuando, en este caso para registrar un curso, se sigue el mismo procedimiento, pero en este caso llamamos al método Insertar de la tabla Curso de la siguiente manera:
 
 Y creamos nuestro Método RegistrarCurso:
 
Así mismose crean los siguentes Métodos:
Método ModificarAlumno:

Método ModificarCurso:

Método EliminarAlumno:

 

Método EliminarCurso:



  • LógicaFórmula
En esta misma capa, se crea otra clase distinta… que en este caso se le ha llamado LogicaFormula.
En ella se crea un método llamado Expresión que va a devolver un String y que recibe de parámetro un String Expresión, es decir una expresión(formula) cualquiera.
 
Para éste método, se ha creado dos Pilas, una pila variables y una pila Operadores,..En la pila variables se almacena todas las expresiones y los números, y en la pila operadores, se almacena los operadores contenidos en la expresión. Hemos creado una pila con la siguiente estructura:
 Y es necesario llamar a la clase implementada en java para poder usarla..


Ojo:
Se está llamando a una clase implementada en java, la cual simula una pila.
 
Se declara también, una variable String Fragmento, la cual ha sido inicializada en vacio, posteriormente se explicará la utilidad de esta variable.

Se ha creado un (While), el cual tiene por condición que la posición inicial (en este caso la posición inicial es 0) del primer carácter sea menor que el tamaño de la expresión, si cumple lo anterior, pasa al (if), el cual tiene por condición que si el carácter en la posición inicial es una letra, hace lo siguiente:…recetea la variable Fragmento(Fragmento= “”), pues como la variable Fragmento esta inicialmente en vacio, no sucede nada; dentro del if, se ha declarado otro while el cual tiene como condición a lo siguiente:…si la posición es menor que el tamaño de la expresión y si es una letra o numero, pues lo almacena en la variable Fragmento y suma una posición, y realiza el bucle hasta que deje de cumplir la condición establecida, en tal caso, resta una posición (pues lo realizado no afecta en nada, ya que como se está disminuyendo la posición , al final se le aumenta),… y lo obtenido en la variable Fragmento, lo almacena en la PìlaVariables.


…como ya almaceno la primera expresión, ahora quedó en una posición disminuida, entonces sale del bucle, y la posición aumenta en uno, y sigue realizando el mismo procedimiento…
Si es que el carácter de la posición que se está analizando es un número, recetea la variable Fragmento (para poder guardar una nueva expresión), entra a un bucle while el cual tiene por condición lo siguiente:…si es una un número o si es un punto o una coma, entonces lo amacena en la variable Fragmento y suma la posición, y hace el mismo procedimiento hasta que no cumpla con la condición establecida en el while. Una vez que sale de este bucle, almacena lo obtenido de variable Fragmento en la PilaOperadores, y resta una posición, y sale del primer bucle, y al final suma otra vez la posición…
Si en caso el carácter de la posición que se está analizando inicia con un operador, se recetea la variable Fragmento para guardar la nueva expresión. Se hace un while para indicar que mientras la PilaOperadores este vacía, y el objeto de la pila sea diferente de un paréntesis abierto (“(“) y que la prioridad (es un método que posteriormente se va a explicar) del operador almacenado en la pila sea mayor o igual que el operador que se desea insertar, pues si cumple con dicha condición, se saca de la pilaVariables los dos últimos objetos insertados, y de la pilaOperadores se saca el ultimo objeto insertado, y se le almacena en la variable Postfijo, pero para poder almacenarlos en la variable String Postfijo, se castea los objetos obtenidos de la pila de la siguiente manera:
…y para que se castea?...pues como la pila solo almacena objetos, y para almacenarlos en la variable Postfijo tiene que ser de tipo String, entonces “se fuerza” a la expresión convertirlo a un String.

Después, la expresión obtenida en la variable Postfijo se le almacena en la PilaVariables.

Si en caso no cumpliera con las condiciones del while, pues si la pila está vacía, o esta un paréntesis abierto (“(”), simplemente se almacena el operador en la pilaOperadores.

Si en caso el carácter de la posición que se está evaluando es un paréntesis abierto, nuevamente se inicializa la variable Fragmento, por lo indicado ya anteriormente, y se almacena el paréntesis en la variable Fragmento, para después insertarlo en la PilaOperadores.

En cambio si el carácter de la posición que se está analizando es un paréntesis cerrado (“)”), pues se saca dos objetos de la pilaVariables y un operador de la pilaOperadores y los almacena en otra variable, y este proceso se realiza hasta encontrar un paréntesis abierto, pues cuando sucede esto, simplemente lo almacena en la PilaOperadores.

En el código de la imagen se puede observar, en la parte final, (posición++;), que es lo que estaba explicando al principio, pues al disminuir la posición en uno, no sucede nada, porque simplemente al final se le vuelve a sumar una posición, es solo una estrategia.

En la parte inicial de la explicacion de esta clase, dije que se había realizado while, para evaluar la expresión; al salir de este bucle, los objetos que quedan en la PilaVariables, son extraídos en dos variables String x, String y, y el objeto de la PilaOperadores es asignado a la variable String operador1, (para ser asignadas a dichas variables, las expresiones son casteadas), despues se asigna la expresion en la variable String Postfijo, para despues almacenarlo en la PilaVariables.
Finalmente se retorna la expresión almacenada en la PilaVariables.


En esta misma clase, se han creado métodos que se han ido utilizando al momento de evaluar la expresión.

Se ha creado método EsLetra el cual devuelve un booleano, es decir un verdadero o falso, pues si el carácter está entre los valores declarados dentro del if,  nos devuelve un true, caso contrario un false.



El método EsNumero nos devuelve un true si el carácter de la expresión está entre los valores establecidos en la condición del if, caso contrario nos devuelve un false.

El método EsOperador, al igual que los métodos anteriormente creados, también devuelve true o false.


El método EsLetraoNumero también devuelve un booleano.
 

El método EsParentesisAbierto también devuelve un booleano.

El método EsParentesisCerrado al igual que los anteriores, devuelve también un booleano.


También se creó el método Prioridad el cual a diferencia de los métodos anteriores, devuelve un entero; si es (“+”) o (“-”) devuelve el valor de 0, y si es (“*”) o (“/”) devuelve el valor de 1.


La lógica tal vez sea más entendible mediante ejemplos, es por ello que hemos simulado en un video de como funciona lo anteriormente descrito:


  • Presentación, bueno compañeros, mi nombre es Sergio y les hablare acerca de este paquete. Este es un paquete que interactúa con el paquete Lógica de Negocio. Este paquete esta conformado por 3 clases, las cuales actúan como Modelos; además 4 Frames, 3 de los cuales son para: El curso, el alumno y las notas; y un frame principal que es el primero que va a interactuar con el usuario.
  •   ModeloCurso:
Esta clase la hemos creado heredando todos los métodos de AbstractTableModel con el término "extends". Esta clase se encuentra en el paquete javax.swing.table y por además nos permite implementar los métodos con los que cuenta.
Como   observamos, dentro de esta clase estamos creando 2 propiedades : Columnas y datos. La propiedad Columna se ha creado de manera privada ya que solo se le va hacer un uzo interno; además esta variable  es un arreglo del tipo String; y tendra 2 columnas: una para el Código y otro para el Nombre. Y la propiedad Datos; es una lista que almacenará objetos de la Clase Curso; y también se almacenará como un arreglo.
Pero para poder hacer uso de ella e implementarlo necesitamos importalo previamente:

Luego invocamos a su constructor, teniendo como parámetros una Lista de la Clase Cursos.


 Luego creamos las siguientes clases: 


La clase getRowCount(), es una clase del tipo String que nos permite obtener el número de filas de la Lista Datos.
La clase getColumnCount(); es una clase del tipo String que nos permite obtener el número de columnas de la Lista Datos.
La clase getColumnName() es una clase del tipo Sring que tiene como parámetro a int ColumnIndex (posicion de la columna) la que nos permitirá  obtener el nombre de la Columna requerida.
La clase getValueAt() es una clase del tipo Object; que tiene como parámetros (intRowIndex, int ColumnIndex), este object es inicializado como Null, luego: si se hace referencia  a la pirmera posicion de la columna, nos obtendra el Codigo del Curso, por el caso contrario si hace referemcia a la sgeunda columna nos obtendra el Nombre del Curso; y al final se retorna el valor del objeto.

  •   ModeloAlumno:
Igualmente en esta clase la hemos creado heredando todos los métodos de AbstractTableModel con el término "extends".

Como   observamos, dentro de esta clase tambien estamos creando 2 propiedades : Columnas y datos. La propiedad Columna es un arreglo del tipo String; y tendra 3 columnas: una para el Código, otro para el Nombre y uno para el Curso en el que esta matriculado.
Tambien es necesario importalo previamente para poder implementarlo.
Posteriormente al igual que en el ModeloCurso; creamos  la clase getRowCount(), la clase getColumnCount(); la clase getColumnName()  y la clase getValueAt().


  • ModeloNotas:
Para la clase ModeloNotas, tambien se siguen los mismo pasos de los 2 modelos anteriores, sólo que en el método getValueAt lo implementamos más; pues como en nuestro ModeloNotas tenemos una tabla; esta tabla es determinada deacuerdo al número de evaluaciones que se realizen en el curso. Por tal motivo el tamaño de nuestra Tabla es variable y para obtener el valor es necesario tener en cuenta si se encuntran denro del rango del numero de columnas y así mismo de las filas:
Luego en esta clase, observamos @Override; como una de mis compañeras explico anteriormente, sirve para sobreescribir clases que son propias del NetBeans:




  • Login:



  • FrmPrincipal:
 

La función del JFramePrincipal es permitir al usuario ingresar a cualquier de los siguientes JFrames: Curso, Alumno y Notas, para poder satifacer nuestros requerimientos de información, a su vez nos permite Salir del programa de una manera sencilla.

  • FrmCursos:


Este JFrame se ha creado con la finalidad de interactuar de una manera gráfica con el usuario. Este JFrame nos permite ingresar datos como: código del curso, el nombre y la formula respectiva, los cuales van a ser almacenados, ademas nos permitirá modificar, eliminar y buscar los datos, así como también, al seleccionar un curso ya almacenado nos permitirá ver todo lo relacionado a ellos.

  •  FrmAlumnos:
Este JFrame nos permite ingresar datos como: código, el nombre del alumno y el curso en el que se va a matricular(seleccionando un curso, de los cursos que ya están inscritos), los cuales van a ser almacenados, y al igual que el JFrame anterior, nos permite insertar, modificar, eliminar y buscar datos de manera mas sencilla.


  •  FrmNotas:
Y finalmente este JFrame nos permite ver la lista de alumnos pertenecientes a cada curso inscrito, es decir, al seleccionar un curso, nos mostrará una lista de los alumnos, en el cual van a estar establecidas las evaluaciones(variables) las cuales forman parte de la formula del curso, y a su vez nos permitirá ingresar las notas respectivas, para finalmente obtener y mostrar el promedio final. 






Bueno compañeros, para poder observar, el proyecto .. pueden descargarlo y así podran compartir con nosotros, nuestras travecías con Java!.. aqui les faciltamos el codigo y el ejecutable.

 

             



Esperamos que hallamos podido compartir información valiosa!..  
Por ahora nos despedimos!



0 Comentarios: