Materia
Ejercicios


anterior | siguiente

Tarea 3: PyLunch Simulathon

Objetivos de aprendizaje

Después de resolver la tarea 3, usted será capaz de:

  • Manipular archivos de texto con una estructura pre-definida de datos,
  • Realizar procesamiento de texto sobre datos con un formato específico,
  • Guardar y leer datos en un archivo.
  • Trabajar con el módulo Tkinter para el desarrollo de una interfaz gráfica (GUI),

Enunciado

En la universidad muchos estudiantes deben hacer fila en el patio central para almorzar, enfrentándose al problema de quienes cuelan a sus amigos, quitándoles tiempo de almuerzo a los que hacen la fila completa. Para sensibilizar este tema y demostrar los dañinos efectos de esta mala práctica, en esta tarea deberán programar un simulador de la fila de almuerzos, considerando que los comensales pueden morir de inanición, no alcanzar a escoger su opción en el menú y/o llegar tarde a clases.

Para poder hacer este simulador deben implementar las siguientes funcionalidades:

  • Simular la fila de almuerzos con estudiante colándose.
  • Simular la fila de almuerzos con estudiantes respetuosos (sin colarse).
  • Procesar estudiantes por cada minuto.
  • Actualizar el hambre de los estudiantes de la fila.
  • Eliminar estudiantes que mueren de inanición en la fila.
  • Visualizar estudiantes que están en la fila y cuanta hambre tienen.

Ustedes deben implementar estas funcionalidades completando las funciones entregadas en el archivo funciones.py

Archivos

Los archivos que se le entregarán los puede descargar acá. A continuación se mencionan los distintos archivos y la función que cumplen dentro del sistema.

  • main.py: archivo principal del programa, permite ver la interfaz y llamar las funciones.

  • funciones.py: archivo que contiene las funciones que deberán implementar junto a su equipo de trabajo, para el correcto funcionamiento del programa.

  • recursos.py: archivo que contiene algunas funciones útiles para el funcionamiento de la tarea y un par de variables importantes.

  • NombresApellidos.txt: Archivo de 2 líneas, una con nombres y otra con apellidos.

  • Alumnos.txt: Archivo generado automáticamente por el main. Éste identifica a los estudiantes, donde cada línea tiene el siguiente formato:

    Nombre Apellido Apellido;Sopa;Entrada;Fondo;Postre;Clases a las 2;Tiempo de almuerzo;HambreMaxima/HambreActual
En este formato, las comidas (Sopa, Entrada, Fondo y Postre) son valores numéricos (1 o 2) identificando las preferencias en el menú (opción 1 o 2), Clases a las 2 es un SI o NO dependiendo si tiene clases a las 14:00, Tiempo de almuerzo es el tiempo en minutos que le toma al estudiante almorzar (desde que entra al casino hasta que sale de él) y HambreActual es un indicador de cuanta hambre tiene, si su valor es 0 entonces muere de inanición.
  • Amistades.txt: Archivo generado automáticamente por el main. Éste contiene las amistades en la universidad en el formato:

    Nombre1 Apellido1 Apellido1->Nombre2 Apellido2 Apellido2
Indicando que estudiante 1 es amigo de estudiante 2 (unidireccional), eso no significa que estudiante 2 sea amigo de estudiante 1.
  • Entrada.txt: Archivo generado automáticamente por el main. Éste contiene los estudiantes y sus horarios de llegada al patio central para hacer la fila en el formato:

    Nombre Apellido Apellido#Hora:Minuto
  • Fila.txt: Archivo generado automáticamente por el main. Éste comienza vacío y se debe llenar con los nombres completos de las personas que estén en la fila, por orden de llegada (los nombres de más arriba son quienes entrarán primero al casino).

Funcionamiento

Una vez descargado el archivo para comenzar la tarea, descomprímalo y ejecute el archivo main.py. Se abrirá una ventana como la que se muestra a continuación:

../../_images/2016-2_tarea3GUI.png

Para hacer funcionar la tarea se deben ingresar valores en los campos de, almuerzos por minuto, chequear o no la casilla de habilitar colarse, y rellenar con valores la cantidad de comida de cada tipo cuidando que la suma de ambos tipos de comida sea igual o mayor al número de estudiantes. NOTA: estos campos deben estar llenos para que la tarea funcione correctamente.

Finalmente se hace click en Iniciar y se comenzará la jornada, actualizándose minuto a minuto los campos de datos sobre el almuerzo.

El orden de llamada de las funciones (en cada minuto) es el siguiente:

  1. FilaColandose o FilaNormal (según esté o no habilitada la opción de colarse).
  2. ProcesarHora.
  3. ProcesarHambre.
  4. EliminarPorHambre.

Qué hay que implementar

Las funciones que deben implementar son las siguientes:

  • FilaColandose(hora): esta función actualiza el archivo Fila.txt con el orden de los estudiantes en la fila en la hora entregada como parámetro.
En esta función considere que los estudiantes se cuelan en la fila, es decir, si al momento de llegar un estudiante tiene un amigo más adelante en la fila, éste se ubicará detrás de él saltándose a quienes estén entre medio.
  • FilaNormal(hora): esta función actualiza el archivo Fila.txt con el orden de los estudiantes en la fila en la hora entregada como parámetro.

  • ProcesarHora(hora, cantidad, comida): esta función registra el ingreso de cantidad de estudiantes en la hora especificada, quitándolos de la fila. En el proceso, se deben descontar los platos consumidos del menú, retornando la tupla comida actualizada con las cantidades de cada comida restante:

    (sopa1, sopa2, entrada1, entrada2, fondo1, fondo2, postre1, postre2)
    

Por último, la función también entrega la cantidad de estudiantes felices y tristes (un estudiante es feliz si pudo consumir al menos 2 de sus preferencias el menú) y alumnos atrasados. Con esto en consideración, se deben retornan 3 valores en el siguiente orden:

atrasados, (felices, tristes), (sopa1, sopa2, entrada1, entrada2, fondo1, fondo2, postre1, postre2)
  • ProcesarHambre(): Esta función resta una unidad al hambre actual de todos los estudiantes que estén en la fila.
Ésta retorna la cantidad de estudiantes en la fila.
  • EliminarPorHambre(): Esta función busca a todos los alumnos que llegaron 0 en su nivel de HambreActual y los elimina de todos los registros de estudiantes disponibles, es decir de Fila.txt, Alumnos.txt, Entrada.txt y todas las amistades que involucren al individuo serán eliminadas de Amistades.txt.
Ésta retorna la cantidad de muertos.
  • Visualizar(): utilizando el diccionario statusdict2 definido en recursos.py, la función retorna un string que represente la fila de estudiantes, asignándole a cada estudiante una barra según el % de hambre que le queda en base a su hambre total. La escala se encuentra definida en la siguiente tabla, también puede revisar los comentarios en el archivo recursos.py. La línea de barras resultante debe tener saltos de línea cada 65 caracteres.
% tramo
10 x < 10
20 10 <= x < 20
30 20 <= x < 30
40 30 <= x < 40
50 40 <= x < 50
60 50 <= x < 60
80 60 <= x < 80
100 80 <= x <= 100

Consideraciones

  • Puede implementar otras funciones, además de las que se solicitan para pasos intermedios que le permitan obtener la información solicitada en las funciones.
  • Puede crear archivos intermedios que le permitan realizar lo solicitado en el enunciado (archivos temporales). No es obligación borrarlos una vez creados.
  • Puede mejorar a gusto la tarea, incluso importando otros módulos de python.

Entrega

La fecha límite de entrega es el Viernes 18 de Noviembre a las 23:00hrs. La tarea debe ser resuelta en equipos de máximo tres personas. Sólo uno de los integrantes del equipo debe subir la tarea en la sección Tareas de la plataforma Aula, en el ramo de Programación IWI131.

Se debe entregar un archivo comprimido (.zip) que debe contener todos los archivos para hacer funcionar la tarea con el nombre tarea-3-RUT.zip, reemplazando RUT con el RUT del integrante que subirá la tarea. Sólo debe ir la parte del RUT hasta antes de la raya. Por ejemplo: tarea-3-18000123.zip.

Al principio del archivo funciones.py se debe poner un comentario indicando los RUT de los integrantes del equipo como en el siguiente ejemplo:

# Integrantes:
# 18000123-0 Perico Los Palotes
# 18000456-7 Fulanita de Tal
# 18000890-k Federico Santa Maria

No se puede subir ningún archivo adicional.

Evite dejar para última hora la entrega de la tarea. Cerca del plazo final, la plataforma seguramente estará sobrecargada.

Las tareas atrasadas (máximo un día de retraso) tendrán el descuento especificado en la rúbrica de corrección. NO se recibirán tareas por correo electrónico.

Los equipos no necesariamente tienen que ser los mismos de las tareas anteriores.

Políticas de copia

Usted puede discutir la tarea con compañeros de otros grupos, pero bajo ningún motivo puede compartir o copiar el código de su tarea. Cada equipo debe escribir su propio código.

Las políticas de copia de la asignatura rigen para la tarea.

En caso de tener problemas con el desarrollo de la tarea, asista a las ayudantías o consulte en el grupo de facebook.