Materia
Ejercicios


Tarea 3: Copa América en la USM

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.
  • Conocer código html para el desarrollo de una página web,

Enunciado

Estamos a días del comienzo de la Copa América y como buenos anfitriones queremos saber qué es lo que está ocurriendo con todos los equipos de esta gran copa. Es por esto que surge la necesidad de tener un sistema que vaya almacenando la información de los resultados de los partidos en todo momento. Para lograr esto, se les pide a ustedes, los estudiantes del ramo de Programación de la UTFSM, que implementen un sistema en python que sea capaz de manipular distintos tipos de archivos, con la información más importante de la copa América, con el objetivo de alimentar un sitio web que vaya mostrando el avance de esta copa, en donde podrán visualizar los distintos resultados de los partidos.

Para esta tarea, usted deberá implementar un sistema de gestión de resultados de los distintos partidos llevados de la copa América. El sistema, una vez que haya sido implementado, deberá contar con las siguientes funcionalidades:

  • Registrar los nombres y grupos de los países que son participantes en esta versión de la Copa América
  • Ingresar los resultados de los partidos que se han jugado en esta Copa América.
  • Registrar los distintos resultados de los partidos para obtener la tabla de posiciones y los equipos clasificados a la segunda fase de la copa.
  • Interpretar información entregada a través de archivos para procesar los datos y visualizarlos en el sistema.

Para permitir que el sitio web cumpla con las funciones anteriores, se les entregará un conjunto de archivos que les proveerá de algunas funciones ya implementadas y otras que ustedes deben implementar con su equipo para el correcto funcionamiento.

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 sistema, es el encargado de levantar el servidor que permite ver el sitio.
  • funciones.py: archivo que contiene las funciones que deberán implementar junto a su equipo de trabajo, para el correcto funcionamiento del sitio.
  • definiciones.py: archivo que contiene algunas definiciones de nombres e íconos que utiliza el sitio.
  • grupos.dat: archivo de texto que contiene la información de los países y los distintos grupos a lo que pertenecen.
  • partidos.dat: archivo de texto temporal que permite tener la información del partido que se está llevando a cabo en algún instante en específico.
  • resultados.dat: archivo de texto que almacena la información de los resultados de un partido.
  • detalle_partido.txt: archivo de texto que contiene información importante de los equipos una vez finalizado un partido.

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:

# Iniciando Sistema de Registro de Copa América en http://localhost:8080

Este mensaje indica que el servidor web que contiene el sitio se está ejecutando de manera local. Abra su navegador preferido (chrome, internet explorer, safari u otro) y escriba la dirección http://localhost:8080/, se debería mostrar la página web que aparece en el video.

El sitio se divide en las siguientes secciones:

  • Página Principal: se muestra al escribir la dirección http://localhost:8080. Esta página da la bienvenida al usuario y presenta el menú principal del sitio.
  • Equipos: se muestra al escribir http://localhost:8080/equipos. Aquí se pueden ingresar la información de los equipos y el grupo al cual pertenecen (Importante: como está pensando en copa América la información de los equipos y los grupos debe ser la oficial, de lo contrario, el sistema no debe permitir ingresar datos).
  • Partidos: se muestra al escribir la dirección http://localhost:8080/partidos. En esta página se deben ingresa los nombres de los dos países que van a tener un partido.
  • Resultados: en esta página se muestra la tabla de posiciones de los equipos hasta la fase de grupos.
  • Marcador: Se debe acceder a esta página una vez ingresada la información de los dos equipos que van a jugar un partido. En esta sección es posible actualizar el resultado final del encuentro.
  • Cuartos_de_final: muestra la información de los equipos clasificados a 4tos de finales.
  • Semi Final: muestra la información de los equipos clasificados a semi final.
  • Final: muestra la información de los equipos en la final.

El sitio cuenta con una barra de navegación que permite entrar a cada uno de los sitios mostrados anteriormente.

Representación

El sitio web permite que cualquier persona realice cambios en la información. Para mantener la completa integridad del sistema es importante respetar la representación de las distintas estructuras que se les entrega a continuación. De lo contrario, el sistema podría responder de una forma inesperada.

Todos los archivos de texto presentes en el sistema mantienen una estructura similar. Cada valor se encuentra separado por el siguiente caracter ”;”. Por ejemplo, el archivo grupos.dat se presenta de la siguiente forma

# grupos.dat:  país;grupo

Por lo tanto, cuando usted realice inserciones sobre el archivo, para mantener actualizada la información de los equipos en el sistema, deberá realizarlo manteniendo dicha estructura.

El archivo partidos.dat mantiene la siguiente estructura

# partidos.dat:  país1;país2;marcador1;marcador2

Es imporante señalar que este es un archivo temporal que permite que sea posible agregar la información final del marcador sólo cuando se agrega un partido. Por lo tanto, cuando ustedes creen un partido, deberán guardar en este archivo la información del partido tal cual se plantea acá. Una vez que el partido haya sido procesado y que los resultados hayan sido guardados en el archivo correspondiente, este archivo debe cambiar su estructura manteniendo solamente una línea con el dato NULL (tal cual viene adjunto con los archivos de la tarea).

El archivo resultados.dat mantiene la información final de los partidos. Este archivo no se debe sobrescribir, solamente debemos insertar registros al final de este. Su estructura es la que se presenta a continuación

# resultados.dat:  país1;país2;marcador1Final;marcador2Final

Manteniendo este formato es posible obtener la información que se necesita para poder actualizar la tabla de posiciones y almacenar dicha información en el fichero.

detalles_partidos.dat. Al igual que resultados.dat, este archivo no se debe sobrescribir, sino que las inserciones deben hacerse siempre al final. Su estructura es la que se presenta a continuación

# detalle_partidos.dat:  país;PJ;PG;PP;PE;GF;GC;DI;PTS

con

# PJ: Partidos Jugados.
# PG: Partidos Ganados.
# PP: Partidos Perdidos.
# PE: Partidos Empatados.
# GF: Goles a favor.
# GC: Goles en contra.
# DI: Diferencia de goles.
# PTS: Puntos.

Al momento de realizar el cálculo de los equipos clasificados, en caso de empate el orden de desempate es el que se presenta a continuación: puntos, diferencia de goles, goles a favor. De mantenerse el empate, escoger a cualquiera de los dos equipos.

Para el conteo de puntos se consideran 1 punto por empate, 3 puntos por partido ganado y 0 puntos por partido perdido.

El archivo cuarto_de_final.dat mantiene el registro de los equipos en cuarto de final junto al resultado que se obtuvo entre ambos, la estructura que presenta es la siguiente

# cuarto_de_final.dat:  CodigoPartido;Equipo1;Equipo2;GolesEquipo1;GolesEquipo2

Este archivo inicialmente presenta por defecto la siguiente estructura, que corresponde a la información general de cuartos de final, esta información debe ser sobreescrita una vez se hayan jugado los partidos de la primera fase y se sepan la tabla de posición final de cada grupo

# cuarto_de_final.dat:
# P2;A2;C2;0;0
# P3;B1;3ero2;0;0
# P1;A1;3ero1;0;0
# P4;C1;B2;0;0

En donde

# PX: Significa el partido X de los cuartos de finales.
# A1: Se entiende como el primer lugar del grupo A, se aplica lo mismo para los grupos B y C, es decir quedaría, B1 y C1
# A2: Se entiende como el segundo lugar del grupo A, se aplica lo mismo para los grupos B y C, es decir quedaría, B2 y C2
# 3ero1: Se entiende como el mejor tercero. (El equipo que obtuvo mejor puntación de los que están en tercer lugar.)
# 3ero2: Se entiende como el segundo mejor tercero. (El equipo que obtuvo la segunda mejor puntación de los que están en tercer lugar.)

El archivo semi_finales.dat mantiene el registro de los equipos en semi final junto al resultado que se obtuvo entre ambos, la estructura que presenta es la siguiente

# semi_finales.dat:  CodigoPartido;Equipo1;Equipo2;GolesEquipo1;GolesEquipo2

Este archivo inicialmente presenta por defecto la siguiente estructura, que corresponde a la información general de semi finales, notar que acá los equipos que se enfrentarán corresponden a los ganadores de los partidos PX y Py, por ejemplo para el caso del partido 6 (P6) los equipos que se enfrentan son los ganadores del partido 1 y 2 de los cuartos de final

# semi_finales.dat:
# P6;P1;P2;0;0
# P5;P3;P4;0;0

El archivo finales.dat mantiene el registro de los equipos en final junto al resultado que se obtuvo entre ambos, la estructura que presenta es la siguiente

# finales.dat:  CodigoPartido;Equipo1;Equipo2;GolesEquipo1;GolesEquipo2

Este archivo inicialmente presenta por defecto la siguiente estructura, que corresponde a la información general de la final

# finales.dat:
# P7;PerP5;PerP6;0;0
# P8;GanP5;GanP6;0;0

importate Existe una estructura de datos que describe todo el proceso de clasificación una vez terminada la fase de grupos. Esta estructura está definida en el archivo definiciones.py y debe ser actualizada cada vez que se obtengan resultados de marcadores durante cuartos, semi o final respectivamente. Actualizar esta estructura permite que el sistema muestre en el sitio web el nombre de los equipos una vez que se conocen los ganadores. Este diccionario es enviado en main.py a los distintos templates para mostrar su información.

Qué hay que implementar

Las funciones que usted debe implementar con su equipo de trabajo son las siguientes:

  • registrar_partidos(partido): esta función recibe como parámetro el diccionario,``partido``,que contiene el nombre de de los equipos que se enfrentarán en un partido. Su estructura se describe como sigue, notar que esta función se realiza sólo para la primera ronda de partidos, para los partidos de cuartos de finales hacia adelante se debe realizar de forma automática en base a las reglas de la competencia, descritas en cada archivo correspondiente a la etapa que se deba juagar (cuartos, semi, final)

    # partido  = {"equipo1": nombre_equipo, "equipo2": nombre_equipo2}
    

El resultado de esta función es el de escribir en el archivo partidos.dat la información de los dos equipos que se enfrentarán en un partido, en base a la descripción que se dió anteriormente. Importante: se debe validar que los equipos pertenezcan a un mismo grupo a la hora de enfrentarse a un partido o que no hayan jugado un partido anteriormente. La función devuelve True o False según se pueda o no agregar el partido.

  • obtener_equipos(): esta función devuelve una lista con la información de todos los países que están registrados en el sistema, para ello, debe hacer uso del archivo grupos.dat que mantiene la información de los países y grupos. No recibe parámetros de entrada y la estructura de la lista que devuelve se presenta a continuación

    # equipos  = [pais1, pais2, pais3, ... , paisN]
    
  • ingresar_equipos(equipo): esta función recibe como parámetro un diccionario con la información del equipo que se quiere ingresar al sistema. Luego de validar esta información, la función devuelve True o False según se pueda o no agregar el equipo. El resultado de esta función corresponde a una inserción en el archivo grupos.dat con la información del equipo y el grupo al cual pertenece (Esta información es útil para la función obtener_equipos()). Asimismo, se debe crear un registro en detalle_partido.dat con todos los valores inicializados en 0 (con excepción del nombre del equipo). Esto se debe a que a partir de este momento el equipo es considerado para la tabla de posiciones.

importante: para validar los equipos y los grupos, se dispone de una estructura de datos en definiciones.py. Esta corresponde a un diccionario con la información correcta de cada equipo y grupo. Úsela para validar.

  • actualizar_fecha(): esta función debe procesar la información que se va registrando tras cada partido en resultados.dat para escribir la información de cada fecha en detalle_partidos.dat. En otras palabras, según el resultado de los partidos, esta función debe determinar los ganadores, perdedores, puntajes y goles asociados, información que es escrita en detalle_partidos.dat. La información que se almacena en este archivo detalle es tomado luego por la función tabla_de_posiciones para desplegar el contenido en localhost:8080/resultados/. Esta función no retorna ni recibe ningún parámetro. Para el tratamiento de la información, esta función sobre escribe el archivo detalle_partido.dat cada vez que es invocada.

  • actualizar_partido(partido): esta función debe agregar el resultado de un partido al archivo resultados.dat. Para ello recibe como parámetro un diccionario que presenta la siguiente estructura

    # partido  = {"equipo1": (nombre_equipo,cantidad_goles), "equipo2": (nombre_equipo2,cantidad_goles)}
    

A partir de esta información se debe registrar el partido en el archivo antes mencionado. Es importante destacar que una vez que sea registrado el partido en su archivo correspondiente, al archivo partidos.dat debe sobrescribirse con un único registro que contenga el string ‘NULL’ (de esta forma main.py reconoce que no hay partidos jugándose en un determinado momento)

  • cuarto_de_final(): esta función debe ser capaz de obtener los equipos clasificados a cuartos de final, para lo cual debe escribir sus datos en el archivo cuarto_de_final.dat y actualizar el diccionario general del Fixture de los equipos clasificados, tal como fue descrito anteriormente. Para ello, esta función deberá obtener la información que fue escrita previamente en distintos procesos durante la realización de cada uno de los partidos. La forma de obtener esta información queda a libre disposición, puede ser trabajando directamente sobre los archivos que el sistema generó cuando se fue llenando el resultado de los distintos partidos o bien trabajando con las funciones que usted creo anteriormente. Lo importante es que el correcto funcionamiento de esta función determina que se actualice la información de los clasificados, en cada una de las etapas posteriores. Para determinar los equipos clasificados se considerará el primer y segundo mejor equipo de cada grupo así como el primer y segundo mejor tercero. El detalle de los partidos puede ser consultado en http://localhost:8080/cuartos_de_final/. Tal como puede verse en aquella url, inicialmente se muestra el contenido de los cuartos de final de manera general. Mientras no se tengan los ganadores correspondientes de cada grupo, el sistema mostrará la información de los partidos en base a lo que se espera que ocurra. En la medida que el sistema vaya registrando los distintos resultados, la url de cuartos de final mostrará el cuadro con los próximos partidos. Esta función debe necesariamente escribir la información en el archivo cuarto_de_final.dat en base a los valores que se van guardando en el diccionario fixture_final. ¿Qué significa esto? Dado que para esta tarea no se les ha pedido implementar un módulo que permita ingresar de manera automática y a través del sistema el resultado de los cuartos de final, inicialmente se dispone de un archivo genérico para cada una de las etapas. El archivo cuarto_de_final.dat tiene almacenado los datos generales de los partidos de esta etapa (que es la misma información que se encuentra almacenada por defecto en el diccionario fixture_final) en la medida que se vayan teniendo los resultados, ambos elementos deben ser actualizados (el archivo debe reemplazar los datos de generales por los valores específicos de los resultados) y estos de deben actualizar en el diccionario.

Esta función no recibe ningún parámetro, ni devuelve ningún valor.

  • semi_finales(): esta función cumple el mismo objetivo que la función cuarto_de_final. Para ello deberá obtener la información de los resultados obtenidos durante los cuartos de final para escribir los nombres de los equipos clasificados en el archivo semi_finales.dat y actualizar los mismos datos en el diccionario fixture_general según corresponda.
  • finales(): esta función cumple el mismo objetivo que la función cuarto_de_final y semi_finales. Para ello deberá obtener la información de los resultados obtenidos durante la semi final para escribir los nombres de los equipos clasificados en el archivo finales.dat y actualizar los mismos datos en el diccionario fixture_general según corresponda.

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 debe preocuparse de borrarlos, pero puede hacerlo si gusta.

Entrega

La fecha de entrega es el Lunes 29 de Junio a las 23:00 hrs vía Aula`_.

La tarea debe ser resuelta en equipos de dos o 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 por correo electrónico.

Los equipos de trabajo pueden ser los mismos de la tarea anterior, pero recuerde que deben ser de 2 ó 3 personas.

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.