Ayuda con un programa, por favor

dark_angel_666
02 de Febrero del 2006
Necesito realizar el siguiente programa como trabajo de fin de trimestre y no tengo n p i, por favor si alguien puede ayudarme.

OBJETIVO
Se pretende crear una aplicación para gestionar un torneo de ajedrez. Para estas competiciones de ajedrez existen una serie de participantes y un conjunto de enfrentamientos que terminan con un resultado particular. Podemos considerar que los enfrentamientos se realizan en rondas o jornadas, y que tras cada jornada existe una clasificación de los competidores atendiendo a los resultados obtenidos hasta ese momento.
La aplicación que se desarrolle deberá ser capaz de almacenar información sobre participantes y resultados en la competición, así como de presentar clasificaciones de los participantes según el estado de la competición y generar los enfrentamientos para cada jornada.
DESARROLLO
Para simplificar el desarrollo de la aplicación, vamos a determinar una serie de restricciones que se deben satisfacer en todo momento:
• El número de participantes en la competición será par, y no podrá exceder de 10.
• Cada participante deberá enfrentarse con todos los demás participantes. Así, por ejemplo, si hubiesen 8 participantes, la competición constaría de 7 jornadas en las que cada participante se enfrenta con todos los demás.
• Los resultados de un enfrentamiento pueden ser victoria de un participante frente a otro, o empate entre los dos participantes, para lo cual se asignará una puntuación de 0 puntos para una derrota, 1 punto para una victoria y 0,5 puntos para un empate (para los dos participantes).
• Si no se ha realizado todavía el enfrentamiento, se pondrá -1 a cada participante como resultado provisional.
• De la clasificación de los participantes solo nos va a interesar saber quien es el máximo ganador o quién es el participante con menor puntuación, en un momento dado. Por tanto, esto se calcula como la suma de los puntos obtenidos por los participantes en sus enfrentamientos hasta el momento en que deseemos saber la clasificación, de modo que el jugador que más puntos tenga será el primer clasificado, y el jugador que menos puntos tenga será el último clasificado. No existe ningún criterio de desempate en caso de que varios participantes coincidan en el número de puntos obtenidos.
• Toda la información de participantes, jornadas y resultados se debe almacenar en un fichero de texto, pero no quién es el mejor o peor clasificado, que se deberán calcular en cada momento cuando lo solicite el usuario a la aplicación.
Funcionamiento
El programa debe poder trabajar con un torneo ya creado (cuya información se almacena en un fichero y se carga en el programa) o bien crear un torneo nuevo. Cada torneo se guarda en un fichero diferente.
Cuando se cree un nuevo torneo, se deberán introducir el número de participantes (un número par) y los nombres de todos los participantes del torneo, tras lo cual, se generarán todas las jornadas con todos los enfrentamientos.
El programa debe permitir introducir resultados de cada jornada, de forma que no se podrán introducir resultados de una jornada si no se han llenado los resultados de la jornada anterior.
El programa también permitirá visualizar los resultados de cualquier jornada, así como quién es el primero y el último en la clasificación al terminar una jornada concreta, así como, quién es el primero y el último en ese momento del campeonato.
Una de las opciones del programa debe permitir almacenar en un fichero el estado actual del torneo, lo que implica guardar el número de participantes, sus nombres, los emparejamientos de cada ronda y los resultados de los encuentros en cada jornada. Este fichero será el que se utilice para cargar un torneo y trabajar sobre él.
Nota: Para poder usar la función de apertura de un fichero pasándole como argumento una variable string se debe escribir utilizando c_str(). Ejemplo:
string nombre;
fichero.open( nombre.c_str() );
Opciones
El programa funcionará a través de un menú con las siguientes opciones:
1. Cargar torneo.
2. Crear un torneo nuevo.
3. Introducir resultados de jornada.
4. Ver resultados de una jornada.
5. Ver quién es el primer clasificado y el último en una jornada.
6. Ver quién es el primer clasificado y el último en el momento actual del campeonato.
7. Ver todos los resultados del torneo (dando los nombres de los competidores y el resultado).
8. Guardar torneo.
9. Salir del programa.
Estas opciones se implementarán a través de un menú, que será lo primero que se muestre al ejecutar la aplicación, y será de tipo cíclico, es decir, tras cada operación se volverá al menú principal.
El programa finalizará cuando el usuario elija la opción de Salir del programa.
Nota: Hay que tener en cuenta que se deberá controlar en cada momento las opciones tales como: “salir del programa sin haber guardado”, “crear un torneo nuevo cuando ya hay cargado otro torneo”, “no se puede visualizar resultados ni introducirlos si no estamos en un torneo”, etc.
Formato del fichero
El fichero de almacenamiento de los torneos será de tipo texto plano, donde se almacenará la siguiente información:
• En la primera línea, el número de participantes (n)
• En la segunda línea, el número de jornadas transcurridas (ya jugadas, es decir, con resultados)
• En las siguientes n líneas, los nombres de los n participantes
• En las siguientes líneas, se almacenarán los emparejamientos con los resultados, de forma que se utilizarán números naturales que corresponderán a cada participante para indicar el emparejamiento. En cada línea aparecerán 2 números naturales separados por un espacio en blanco, correspondientes a los participantes que se enfrentan, y a continuación (tras un espacio en blanco) dos números separados por un espacio que indican el resultado del enfrentamiento (las posibles variantes son 0,5 0,5 (empate), 1 0 (victoria de las blancas) y 0 1 (victoria de las negras)).
Por ejemplo, un fichero de un torneo para 4 participantes puede ser el siguiente:
4
2
Andres Lopez Cuesta
Juan Martinez Fernandez
Pablo Casanova Perez
Julian Andujar Carrasco
1 4 0,5 0,5
2 3 1 0
1 3 0 1
2 4 0 1
1 2 -1 -1
3 4 -1 -1
En este ejemplo se puede observar que hay 4 participantes (3 jornadas de 2 enfrentamientos cada una), y se han introducido los resultados de las 2 primeras jornadas. Por ejemplo, en la primera jornada se han enfrentado Andrés López Cuesta con Julián Andujar Carrasco, con un resultado de empate, y Juan Martínez Fernández con Pablo Casanova Pérez, con resultado de victoria del primero.
Algoritmo de cálculo de emparejamientos
Para determinar los emparejamientos en cada jornada, tomamos el requisito de que todos los participantes (un número par) se enfrentan entre sí, lo que supone que ante un número de n participantes se generarán n-1 jornadas, con n/2 enfrentamientos en cada jornada, de manera que no queden participantes sin emparejar en una misma jornada, y no se repitan los emparejamientos en diferentes jornadas.
Con todo, el algoritmo que se puede utilizar es el siguiente:
En la ronda k (1 <= k < n) el equipo i<n jugará con el j<n si (i+j) mod (n-1) = k mod (n-1) donde j es distinto de i. Cuando i=j, es decir que 2i mod (n-1) = k mod (n-1), el equipo i juega contra el n.

sergio
02 de Febrero del 2006
pues vaya, parece que es el mismo que el mio, tu no seras de fisicas verdad?