Necesito ayuda con un programa de C

mongui

Hola gente !

Resulta que me han mandado diseñar un programa super largo, y tengo un mes para crearlo...

Os comento en qué consiste.

Tengo que diseñar una liga de fútbol, con 20 equipos, que se enfrenten todos entre sí. El programa me pedirá por teclado la jornada que quiera introducir los resultados, y a continuación de introducir los resultados, al final de cada jornada, me mostrará una tabla clasificatoria con la lista de equipos en función de los partidos que ya se hayan jugado. Las características de cada equipo serán:

  • Puntos obtenidos
  • Goles en contra / favor
  • Partidos ganados / perdidos

Llevo ya tiempo sin tocar C, ya que ahora estoy con Visual Basic. Os pediría por favor, que me echaseis una mano, ya que me urge.

Por favor ! :(

Saludos!

PD: El programa lo tengo que hacer en C, por si no ha quedado claro :p

JuAn4k4

Una pregunta solo, si la informacion la tienes que guardar para posteriores veces que se ejecute -> guardalo todo en ficheros.

Basicamente lo que tienes que hacer es, tener un vector con equipos

typedef struct{
  int partidosJugados;
  int partidosGanados;
  int partidosPerdidos;
  int golesFavor;
  int golesContra;
} equipo, *ptequipo;

/* Los puntos los tendras con los ganados/perdidos y los puntos que de cada uno */

Si necesitas tener un histoiral de jornadas necesitaras algo mas complejo.

Si solo necesitas la clasificacion, con ese vector te valdra, incluso yo pondria un dato mas " partidos jugados " y un "identificador de equipo", ya sea nombre o numero.

Interaccion:
Puedes hacerlo facil para que el usuario solo tenga que meter numeritos: (Entre comillas lo que saldra por pantalla)
"Opcion: 1)Añadir jornada . 2) Ver Clasificacion 3)Salir "
"Opcion : 1) Añadir Enfrentamiento. 2) Volver "
"Añadir Enfrentamiento: Elija equipo local
1) ...
2) ...
3) ...
Elija opcion: "
y lo mismo para el visitante, despues:
"Resultado (X-Y) : "

Si algun equipo tiene mas partidos que el numero de la jornada puedes controlarlo y decir que no.

Y despues ver clasificacion a partir del vector de equipos lo tienes hecho.

Tambien puedes añadir al menu las opciones: Añadir Equipo, Eliminar Equipo, Editar Equipo. Aunque si no te dice nada de eso no lo hagas.
El problema que tiene esto es que no tienes control de las jornadas, ( Que jornadas ha jugado un equipo etc , para que no juegue varios partidos en la misma jornada ), ni puedes ver las jornadas por separado que es bastante util y tal.

PD: Pero esto ni es largo ni es para un mes, esto en dos tardes lo tienes hecho. Para un mes te metes en un fichero la informacion de los equipos, la informacion de cada jornada, y le metes control en las jornadas que se disputan para que no haya equipos con mas de 1 partido en la misma jornada, le pones la gestion para editar los equipos y dejas una interfaz "chulilla" para lo que C te deja hacer sin usar gtk.

mongui

Muchas gracias por la ayuda ^^

Quizás pido algo más, pero nadie me lo va a dar echo. xD

Es que ando con el agua al cuello entre el curro y las clases, y no tengo tiempo de nada... He empezado el código, pero nada, no sé por dónde agarrarlo :/

¿A quién le apetece hacerlo por dinero? :p

JuAn4k4

Pues empieza con papel y lapiz como he hecho yo para explicartelo.

mongui

En cuanto a la pregunta, sí, en ficheros mejor. Así luego podrías recurrir a ellos para luego sacar la información.

JuAn4k4

¿ Y las jornadas ?¿ Necesitas el historial de las jornadas ?

Si es posible podrias poner el enunciado completo o dar link al pdf que lo suelen colgar y eso, y asi te digo si lo que te he puesto vale, o hay que rehacerlo.

mongui

La hoja la tengo en clase, pero mañana pongo el enunciado sin falta.

Sería cuestión de ir almacenando los datos de las jornadas en un fichero, y que al finalizar cada jornada, te vaya sacando como va la "liga". Entonces sí, sería recomendable ir guardando la info en un fichero.

JuAn4k4

Vale entonces sin mas te haces una funcioncita que con los datos de una jornada te actualice el vector de los equipos.

Otra funcion que te coja el fichero y te de la info de cada jornada, de una en una o todas de vez.

Y ya tienes los equipos, y luego te haces otra funcion que a partir de los equipos te muestre en pantalla la clasificacion.

Entonces solo te faltara hacer la gestion de usuario - fichero y como codificas el fichero, te recomendaria:

n
1
equipo1 equipo2 x y
...
2
equipo1 equipo2 z t
..
n
equipo1 equipo2 u v
...

y cuando no haya resultado para una jornada dejas la linea en blanco si hace falta, asi tendras un tamaño fijo para las jornadas y podras hacer el fichero directo, nose eso segun se te ocurra.

De todas formas yo ahora me piro para clase, mañana con el enunciado entero de clase lo miro mejor si quieres, aunque con todo esto que te he dicho ya tendrias que saber hacerlo.

mongui
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>

int main()
{
   FILE *archivo;
   FILE *archivo1;
   int opcion, i=0, jornada;
   int cadena[500];
   archivo=fopen("tabla.txt","a");
   	printf("\n ====================");
      printf("\n        MENU         ");
      printf("\n 1.- Anyadir jornada");
      printf("\n 2.- Ver tabla de clasificacion");
      printf("\n 3.- Salir");
      printf("\n Introduzca opcion: ");
      scanf("%d", &opcion);
   switch(opcion)
   {
      case 1: printf("\ Introduzca numero de jornada: ");
                 scanf("%d", &jornada)
                 if(jornada==1)
                 {
                 archivo1=fopen("jornada1.txt","r");
      		 for(i=0; feof(archivo1)==0; i++)
             {
      	    fgets(cadena[i], 5000, archivo1);
             }
             printf("\n %s", cadena[i]);
             }
      		 break;
   }
   fclose(archivo);
	getch();
   return 0;
}

De momento llevo eso, pero me da error. Te explico mi idea. Es que no pillo del todo el ejercicio... Y tus conocimientos de C son superiores a los míos, y lo que me propones hacer no tengo ni idea.xD

Primero sale el menú, y elige una opción. Entonces, en la primera opción, que meta el número de jornada. Si es la 1, que lea un fichero. Si es la 2, que lea otro... Así hasta 20, con los diferentes emparejamientos dentro de cada fichero. Y ya, en función del resultado en cada partido, que saque la tabla.

¿O no? Mae mía, que cacao tengo en la cabeza... :/

GaN2

Pretendes hacer 40 ficheros, uno para jornada de liga??? Es un poco bestia xD Si tuviera tiempo te ayudaba, pero toy liadillo con un examen y apenas tengo tiempo.

BLZKZ

Puedes escribir en bloque en un fichero. Arrays enteros y puedes leer y meterlo en arrays, no hace falta que hagas 40 ficheros, solo 1 fichero y un array 1..40 de registros de la informacion. Creo que es mucho mas cómodo y seria más rapido. Eso si al cargar directamente todo en el array de 40 puede que tarde mas en cargar y ocupe mas memoria, pero luego para buscar jornada y eso seria mas facil con direcciones o punteros :S

Piensa por ejemplo que goles favor/contra puedes hacerlo con un for sumando todos los goles de todos los registros de ese array que son las jornadas. Y asi te ahorras memoria. Y asi con partidos ganados/perdidos y demás

mongui

Es que como os digo, ahora mismo mis conocimientos acerca de C están en el olvido, y aparte, el nivel que tenéis vosotros es superior al mío.

Si pudieseis decirme en 4 palabras la mejor manera de hacerlo... Yo es que tengo ya mucho cacao en mi cabeza :/

sh0ty

Y pretendes dedicarte a la programacion? no es por joder pero espabila si quieres dedicarte a esto.

Editado:
Quise simplificarlo un poco y hacer el codigo mas claro.

typedef struct { 
int IndiceRival, Favor, Contra, Nojugado; 
} Jornadas[Numero de jornadas][10];
typedef struct{
  int partidosJugados;
  int partidosGanados;
  int partidosPerdidos;
  int golesFavor;
  int golesContra;
} Equipos[20];

Esto serian las estructuras, como ya ves al usar la variable IndiceRival nos ahorramos la mitad del espacio, con lo cual solo hace falta una matriz de [Numero jornadas][10] en vez de [Numero jornadas][20].

Y este seria el codigo para el bucle que recopila la informacion hasta la jornada deseada. Hace exactamente lo que alguien mas arriba dijo: sumar todos los datos. Ademas aprovecha el bucle de los equipos para mostar la informacion en pantalla una vez se han recopilado todos los datos. Fijate y lo entenderas.

for(int j=0; j<=Numero de la jornada; j++) {
	for(int e=0; e<10; e++) {
		if (j==Numero de la jornada) {
			Mostrar informacion en pantalla;
			continue;
		}
		if (!Jornadas[j][e].Nojugado) {
			Equipos[e].golesFavor += Jornadas[j][e].Favor;
			Equipos[e].golesContra += Jornadas[j][e].Contra;
			Equipos[IndiceRival].golesFavor += Jornadas[j][e].Contra;
			Equipos[IndiceRival].golesContra += Jornadas[j][e].Favor;
			if (Jornadas[j][e].Favor>Jornadas[j][e].Contra) {
				Equipos[n].partidosGanados++; 
				Equipos[IndiceRival].partidosPerdidos++;
			}
			else Equipos[e].partidosPerdidos++; Equipos[IndiceRival].partidosGanados++;
			Equipos[e].partidosJugados++;
			Equipos[IndiceRival].partidosJugados++;
		}
	}
}

Sirve principalmente para recopilar la informacion, para mostrarla y recogerla tendras que hacerlo tu.

mongui

Si si, te afirmo que de C ahora mismo ando super pez en tema de escribir código a lo bestia... Cuando lo dimos, me limité a lo básico (mal por mi parte), y ahora me encuentro con ésto... Ando volcado con Visual Basic, pero creo que le tendré que dedicar tiempo a C... :(

JuAn4k4

Estas empeñado en diferenciar por lenguajes un problema, este problema lo haces en otro lenguaje y sigue siendo el mismo problema, lo haces en VB y lo meterias todo en un solo fichero, lo haces en java y lo mismo, ¿ porque en C vas a tener que usar 40 ficheros ?

Si no sabes nada de C pues miras el API o miras en google como hacer X cosa que hacias en otro lenguaje a ver si se puede...

Es que no entiendo que complicacion puede tener el entender un problema porque te cambien de lenguaje.

Kenny

Hombre, de C no se mucho, pero yo intentaria buscarmelo a base de vectores y funciones.

Crear vectores para ir almacenando la informacion de cada equipo y esos vectores almacenarlos en un mismo fichero. Asi o bien imprimes todos los vectores de golpe, o solo los que te interesen si quieres imprimir la infor de un unico equipo...

Tendria que ponerme a repasar teoria y mirarmelo, peso asi a priori seria la idea que tengo para hacer ese programa.

JuAn4k4

Te paso por mp el esqueleto de lo que tendrias que hacer, espero que lo entiendas mas o menos como funciona.

Aqui te pongo solo las funciones y los tipos y en mp te mando con cachos de codigo por dentro y comentarios que dicen que tiene que hacer cada funcion y eso.

typedef struct{
int numero;
int locales[10];
int visitantes[10];
resultado resultados[10];

}jornada;

typedef struct resultado{
int golesLocal;
int golesVisitante;

}

typedef struct{
int partidosJugados;
int partidosGanados;
int partidosPerdidos;
int golesFavor;
int golesContra;
} equipo, *ptequipo;

void inicializacion(equipo equipos*, jornada ){
}

void inicializarJornadas(FILE* f, jornadas j, int num){

}

void jornadaAct(ptequipo e, jornada j){
}

int menu(){
}

void clasificacion(equipo e*){
}

void formularioJornada(jornada jornadas, int num){
}

void guardar(jornada jornadas*){

}

void main(){

Usuarios habituales

  • JuAn4k4
  • Kenny
  • mongui
  • sh0ty
  • BLZKZ
  • GaN2