Informe Proyecto ELO329: Malla interactiva con proyección de semestres restantes

Integrantes:

·         José Flores Fuentes

·         Javier Coñiam

·         Jesús Bustamante

 

Descripción del problema

El estudiante promedio, para bien o mal, reprueba ramos. Por ello, al momento de reprobar alguno, normalmente uno va a la malla de la carrera y empieza a investigar si hay algún ramo que tenga

como prerrequisito el ramo reprobado. De esta manera, el estudiante se hace una idea acerca de los semestres adicionales que, si corresponde, tendrá que cursar por esos ramos con prerrequisitos.

El problema que precisamente se quiere cubrir, es que las herramientas actuales de mallas interactivas no son del todo de ayuda para el caso descrito, pues efectivamente ayudan a proyectar los

ramos restantes, pero no específicamente el tiempo restante de carrera. Entonces, la solución que se propone es una malla interactiva progresiva, de manera que el estudiante pueda ir llenando

 semestre a semestre los ramos reprobados (si tiene), y así proyectar el tiempo restante y de egreso.

Análisis del problema

El escenario en el que se basa el proyecto es simple: un alumno reprueba ramos y específicamente quiere averiguar cuanto tiempo de carrera le sumó eso. Hay herramientas existentes simples para

ver cuantos ramos lleva un alumno aprobados y cuantos le quedan, tal vez incluyendo un porcentaje, para visualizar cuanto le falta, sin embargo, esas herramientas responden a otra pregunta del

alumno: “¿Cuántos ramos me quedan?”. Entonces, la pregunta del estudiante que se busca responder y facilitar su respuesta, sería “¿Cuántos semestres me quedan?”, donde hay que tomar en

cuenta otros parámetros (enfoque distinto al de una malla interactiva genérica) como elementos centrales (como prerrequisitos de un ramo) del proyecto. La solución propuesta es mediante un

programa desarrollado en Qt Creator y C++, donde el estudiante carga desde un archivo de configuración su malla académica y puede ir actualizando semestre a semestre su progreso y la aplicación

agranda su malla en cuanto a semestres tomando en cuenta los ramos reprobados. Además, el estudiante puede guardar su progreso en un formato que después puede cargar nuevamente en el programa.

Definición de requerimientos

-          Caso de uso 1: Actualización de tamaño de malla en semestres

Actores: Alumno

Evento: Alumno aprieta botón “Actualizar” en la aplicación

Precondiciones:  

·         Alumno debe tener una malla cargada en el programa (sea malla base o cargada de un progreso ya hecho).

·         Alumno agrega progreso a la malla por lo menos en 1 semestre (marca cuales aprueba y reprueba).

Curso normal del evento:

Actor

Sistema

1)       Alumno apreta actualizar en la aplicación

 

 

2)       El sistema agranda la malla en ventana principal por columnas si se tuvieron que agregar semestres y muestra el N° de semestres restantes.

 

-          Caso de uso 2: Cargar progreso de malla interactiva

Actores: Alumno

Evento: Alumno aprieta botón “Cargar progreso” en el Menú “Archivo” de barra de menús.

Precondiciones:  

·         Usuario debe tener un archivo con su progreso hecho en otra instancia con la aplicación.

Curso normal del evento:

Actor

Sistema

1)       Alumno aprieta botón “Archivo” en la barra de menús.

 

 

2)       El sistema despliega opciones “Importar”, “Guardar progreso”, “Cargar progreso”.

3)       Alumno selecciona opción “Cargar progreso”.

 

 

4)       Sistema despliega ventana de selección de archivo.

5)       Alumno selecciona archivo txt con su progreso.

 

 

6)      Sistema carga malla con progreso y la despliega en la ventana principal.

 

-          Caso de uso 3: Guardar progreso de malla interactiva

Actores: Alumno

Evento: Alumno aprieta botón “Guardar progreso” en el Menú “Archivo” de barra de menús.

Precondiciones:  

·         Alumno debe haber hecho algún progreso sobre una malla base o una malla cargada con progreso.

Curso normal del evento:

Actor

Sistema

1)       Alumno aprieta botón “Archivo” en la barra de menús.

 

 

2)       El sistema despliega opciones “Importar”, “Guardar progreso”, “Cargar progreso”.

3)       Alumno selecciona opción “Guardar progreso”.

 

 

4)       Sistema despliega ventana de selección de directorio donde guardar archivo de progreso.

5)       Alumno selecciona directorio donde guardar archivo de progreso.

 

 

6)      Sistema guarda archivo de progreso en directorio seleccionado por usuario.

 

-          Caso de uso 4: Importar malla base

Actores: Alumno

Evento: Alumno aprieta botón “Guardar progreso” en el Menú “Archivo” de barra de menús.

Precondiciones:  

·        Alumno debe tener algún archivo de malla base.

Curso normal del evento:

Actor

Sistema

1)       Alumno aprieta botón “Archivo” en la barra de menús.

 

 

2)       El sistema despliega opciones “Importar”, “Guardar progreso”, “Cargar progreso”.

3)       Alumno selecciona opción “Importar”.

 

 

4)       Sistema despliega ventana de selección de archivo de malla base.

5)       Alumno selecciona archivo de malla base.

 

 

6)      Sistema arma y muestra malla académica base, permitiendo a usuario marcar ramos aprobados o reprobados desde cero.

 

                Diseño de la solución

Diagrama de clases UML

                                               Figura 1: Diagrama de clases UML de solución

               

Diagrama de secuencia de Caso de Uso 1(Base)

                                               Figura 2: Diagrama de secuencia de CU1

Respecto al diseño del proyecto, se tomaron las siguientes decisiones:

-          No hacer una entidad semestre: Se pensó también acerca de una tercera entidad “Semestre”, que tendría que ir entre malla y ramo, tal

que un semestre tenga varios ramos, y una malla varios semestres. No se optó por ello dado que lo comparamos con la opción de un

simple atributo “semestre” de ramo, que era lo más sencillo en la práctica para la programación, pues en el contexto la entidad “Semestre”

no hubiera tenido otro rol además de contener ramos.

-          No tomar en cuenta ramos complementarios: Ramos complementarios pudieron haber sido un subtipo de ramo, pero se optó por no

tomarlos en cuenta como ramos distintos, pues ahí nos metíamos con lo que tiene que decidir el alumno, cosa que no está contemplada

en el diseño. Además, bajo el contexto, un ramo complementario también se adhiere a un calendario de ramos que pueden ser impartidos

en ciertos semestres depende directamente de cada departamento en la universidad (y no hay una API de estos tampoco).

-          No armar interfaz para introducir ramos o armar mallas: El punto del proyecto es que el alumno le da una malla (en el formato que nosotros

estimamos) y la aplicación le facilita una interfaz para responder la pregunta inicial: ¿Cuántos semestres me quedan?. De todas maneras,

sería una buena proyección del proyecto a futuro el poder hacer otra interfaz para diseñar una malla desde 0 con herramienta de crear ramos,

de forma que el usuario no tenga que escribir a mano un txt (como en este caso) para usar el programa que acá si diseñamos e implementamos.

-          No tomar en cuenta ramos con “candado”: En el contexto real, al reprobar un ramo, este queda con “candado”, que significa que sí o sí debe

tomarse al siguiente semestre. Nuestra aplicación no toma en cuenta eso.

-          Toma en cuenta paridad: El programa toma en cuenta la paridad por omisión. Esto es, si el ramo es anual y está en un semestre impar, entonces

el siguiente semestre que estará disponible (si lo reprueba el alumno) es otro semestre impar.

                Implementación de la solución

                La interfaz, en general tomó la siguiente forma:

               

                                                               Figura 3: Interfaz general

                Donde en azul están los ramos que se pueden marcar como aprobados(disponibles) y en gris están los bloqueados.

               

                Figura 4: Selección de ramos de primer semestre menos MAT-021 aprobados (sin actualizar)

                Ahora, en verde se encuentran los ramos marcados como aprobados. En pos de la demostración, MAT-021 se configuró como un ramo anual,

                a pesar de que en realidad no lo es.

                A continuación, se muestran las implementaciones para algunos casos de uso.

                CU1: Actualización de tamaño de malla en semestres

               

                Figura 5: Selección de ramos de primer semestre menos MAT-021 aprobados (actualizado)

Se puede apreciar que, en primer lugar, la malla creció en 1 año (corresponde para ramos anuales). Además, en esta malla, FIS-110 requiere

tener MAT-021 aprobado, además de MAT-022 necesitar MAT-021.

Figura 6: Formato en archivo de configuración

Se puede notar en el “slot” antepenúltimo, que es donde se ponen los prerrequisitos, que está MAT-021 en ambos ramos, que se aplazan en 1

semestre, además de los que necesitaban MAT-022, FIS-120, etc.

CU2 y CU3: Guardar y cargar progreso

Figura 7: Opciones de MenuBar

Figura 8: Ventana emergente de guardar progreso

Figura 9: Ventana emergente de cargar progreso

Nota: Se omite prueba para CU4, pues su prueba es el hecho de tener la malla base. Además, las imágenes usan harto espacio.

Dificultades en el progreso

Una dificultad notable en la parte gráfica es que la interfaz se cortaba al extender una proyección de 13 o más semestres y realmente no

supimos durante gran parte del proyecto arreglarlo, pues la mayor parte del tiempo nos centramos en la parte de código de “procesamiento”

del txt, que era muy tedioso, dado que se trabajó con QString y se tuvo que revisar harta librería de Qt Creator, por tanto, gráficamente, se

trabajó con un prototipo que se acababa tapando con la ventana, pero por lo menos podíamos verificar la lectura del txt. No fue sino hasta la

 “fase final” que se arregló (para verificar que todo se leyera bien) ajustando setMinimumSize() y updateGeometry() para que la grilla se auto-

comprima a la ventana al presionar actualizar. Además, hubo dificultades también ligadas a como organizar el proyecto en cuanto a métodos,

pues teníamos el método ligado al botón de actualizar, pero también tuvimos que implementar otro método para actualizar los estados (color de

aprobación) cada vez que se clickeaba un ramo, para actualizar el color del ramo clickeado(ahí la dificultad estuvo en reconocer eso, que era otro

método de actualización el que había que implementar). En la “fase final” del proyecto (con el bug de interfaz cortada arreglado, pero antes del entregable

final), hubo un error de cálculo y movimiento de los ramos que movía todo incorrectamente, de manera que a veces bajo ciertas condiciones, ramos

reprobados anuales que fueron aprobados posteriormente volvían a su lugar en semestre 1, en lugar de mantenerse en su lugar del semestre que fueron

aprobados. Esto provocaba que la malla se achicase de nuevo, a veces volviendo a 12 semestres a pesar de reprobar ramo anual.

Figura 10: Bug fase final, reprobando MAT-021

                                Figura 11: Bug fase final, después de actualizar pasando 2 semestres seguidos

La figura 10 corresponde a lo que pasa al actualizar con MAT-021 reprobado en primer semestre tanto para la versión final tanto

como para la versión de la fase final (antes del entregable). Después, en figura 11 se aprueba todo 2 semestres seguidos y se

actualiza, lo que provoca que MAT0-21 se vaya a semestre 1 y, por tanto, desaparezcan las columnas de semestre 13 y 14.

Lo que se pudo arreglar, en la versión entregable final, es que no desaparezcan los últimos semestres, pero el ramo, al ser

 aprobado (independiente del semestre), siempre volvía al semestre original donde se supone que se aprueba.

Nota final: Disculpas de antemano por la calidad de las imágenes en formato htm, parece ser que Word comprime imágenes para

este formato.

Descargar proyecto aquí