Uso de listas y ficheros en C.

Iniciado por tenji, 22 Junio 2011, 17:48 PM

0 Miembros y 1 Visitante están viendo este tema.

tenji

Hola buenas tardes, quisiera que me ayudarán a realizar el siguiente programa en el cúal he de emplear 2 listas y un fichero. He de decir para quien vea el código que he realizado, que soy novato en esto de la programación y no se me da muy bien que digamos, por ello es probable que haya cosas que sobren (doy por hecho que faltan cosas).

El enunciado es el siguiente:

Se pretende realizar un programa en C para los clubes de fútbol, que permita realizar la gestión de fichajes para la próxima temporada.
El programa dispondrá de una lista de jugadores disponibles que podrán ser fichados por el equipo, siempre que la suma de los sueldos
no supere el presupuesto del club.

FUNCIONAMIENTO:
Se parte de los listas, una para los jugadores disponibles y otra para los jugadores elegidos. Ambas estarán vacías al principio. El programa deberá leer los datos de los jugadores disponibles, cuyo número es inderterminado. Se leerán por teclado hasta que tecleemos un nombre en blanco.

Los datos que nos interesan de cada jugador son:
-Nombre(50 caracteres max.)
-Sueldo(en EUROS)

A continuación se leerá el presupuesto del club, también en EUROS.

Una vez leída toda la información quedará almacenada en memoria y se presentará un menú en pantalla que permita:
-(E)legir: si pulsamos 'E' o 'e', leeremos el nombre del jugador elegido. Si lo encuentra en la lista, lo añadirá a la lista
del equipo, siempre y cuando el presupuesto lo permita.
-(Q)uitar jugador: si pulsamos 'Q' o 'q', eliminaremos un jugador elegido anteriormente. Se leerá su nombre y si está en la lista del equipo, se volverá
a añadir a la lista de jugadores disponibles.
-(S)alir: si pulsamos 'S' o 's', saldremos del programa creando un fichero binario secuencial con los datos de los jugadores disponibles y liberando antes
toda la memoria asignada para la lista de jugadores disponibles.

El programa debe mostrar esto (mas o menos):

Presupuesto: 5000 / Queda: 5000
   Jugadores            Equipo
----------------------------------------------------------
   Casillas(990)
   Raúl(1500)
   Torres(1240)
   Villa(1000)
                  Gasto=0

(E)legir      (Q)uitar jugador                    (S)alir

Si elegieramos a Villa sucedería esto:

Presupuesto: 5000 / Queda: 4000
   Jugadores            Equipo
----------------------------------------------------------
   Casillas(990)            Villa(1000)
   Raúl(1500)
   Torres(1240)
   
                  Gasto=1000

(E)legir      (Q)uitar jugador                     (S)alir



Bien, púes esto es lo que llevo de código y que por supuesto no funciona.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct futbolistas{
        struct futbolistas *sig;
        float sueldo;
        char nombre[50];
}Datos;
typedef Datos *Lista;
typedef Datos *NODO;

int main(){

int i=0,ok,opciones;
float presupuesto = 5000;
Lista *listafutbolistasdisponibles=NULL;
Lista *listafutbolistaselegidos=NULL;

NODO *nuevo=NULL;
NODO *aux=NULL;

do{
      nuevo=(NODO*)malloc(sizeof(NODO));
      puts("Introduzca el nombre del futbolista:\n");
      fflush(stdin);
      fgets(nuevo->nombre,50-1,stdin);
      puts("Introduzca el sueldo del futbolista:\n");
      fflush(stdin);
      scanf("%f",&nuevo->sueldo);
      nuevo->sig=listafutbolistasdisponibles;
                  if(listafutbolistasdisponibles==NULL){
                       listafutbolistasdisponibles=nuevo;                           
                  }else{
                        nuevo->sig=listafutbolistasdisponibles;
                        listafutbolistasdisponibles=nuevo;
                        }
      }while(nuevo->nombre=="");

aux=listafutbolistasdisponibles;
while(aux){
           i++;
           printf("Presupuesto: %f / Queda: %f \n", presupuesto, presupuesto);
           printf("Jugadores \t\t Equipo \n");
           printf("------------------------------------------------ \n");
           printf("%s ( %.2f )\n", aux->nombre,aux->sueldo);
           printf("\t\t Gasto\n");
           aux=aux->sig;
           }
printf("(E)legir \t (Q)uitar jugador\t (S)alir\n");

    system("PAUSE");
    return 0;
}



No he completado todo lo que dice el enunciado por que quiero hacerlo paso a paso y asegurarme de que lo que hago lo hago bien.

Agradecería una respuesta/ayuda, gracias

Hasta pronto(espero).

leogtz

Cada quien tiene su manera de trabajar con listas enlazadas, personalmente me parece más práctico el manejarlo todo con funciones, es decir, tener nuestra lista o listas y estarlas mandando como argumentos a las funciones, es decir

/* Lista simplemente enlazada */
struct datos
{
    signed int dato;
    struct datos *siguiente;
};
/* Funciones */
void error(void)
{
    perror("Error : Insuficiente espacio de memoria.");
    exit(EXIT_FAILURE);
}
struct datos *NuevoElemento(void)
{
    struct datos *q = (struct datos *)malloc(sizeof(struct datos));
    if(!q)
    error;
    return q;
}
/* Funcion prototipo */
void menu(void);
void anadir(struct datos **, signed int);
void borrar(struct datos **, signed int);
struct datos *buscar(struct datos *, signed int);
void visualizar(struct datos *);


Así reduces mucho la complejidad al separar las cosas.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

tenji

Bueno Leo, gracias por el consejo, he intendado hacer lo que dices y este es el resultado:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct futbolistas{
        struct futbolistas *sig;
        float sueldo;
        char nombre[50];
}Datos;
typedef Datos *Lista;
typedef Datos *T_NODO;

void insertar( Lista *listafutbolistasdisponibles){
T_NODO *nuevo=NULL;
do{
      nuevo=(T_NODO*)malloc(sizeof(T_NODO));
      puts("Introduzca el nombre del futbolista:\n");
      fflush(stdin);
      fgets(nuevo->nombre,50-1,stdin);
      puts("Introduzca el sueldo del futbolista:\n");
      fflush(stdin);
      scanf("%f",nuevo->sueldo);
      nuevo->sig=listafutbolistasdisponibles;
                  if(listafutbolistasdisponibles==NULL){
                       listafutbolistasdisponibles=nuevo;                           
                  }else{
                        nuevo->sig=listafutbolistasdisponibles;
                        listafutbolistasdisponibles=nuevo;
                        }
      }while(nuevo->nombre=="");
}

void Mostrar_datos(Lista listafutbolistasdisponibles){
     int i=0;float presupuesto = 5000;
T_NODO *aux=NULL;     
aux=&listafutbolistasdisponibles;
while(aux){
           i++;
           printf("Presupuesto: %f / Queda: %f \n", presupuesto, presupuesto);
           printf("Jugadores \t\t Equipo \n");
           printf("------------------------------------------------ \n");
           printf("%s ( %.2f )\n", aux->nombre,aux->sueldo);
           printf("\t\t Gasto\n");
           aux=aux->sig;
           }
printf("(E)legir \t (Q)uitar jugador\t (S)alir\n");


int main(){
Lista *listafutbolistasdisponibles=NULL;
Lista *listafutbolistaselegidos=NULL;
insertar(&listafutbolistasdisponiles);
Mostrar_datos(listafutbolistasdisponibles);
   
    system("pause");
    return 0;
}



Como podrás ver no he avanzado mucho, sigo cometiendo muchos fallos y me gustaria saber cúales son para seguir avanzando con el ejercicio. ¿Me ayudas?.
¿Alguién mas puede ayudarme?.

Un saludo

tenji

Mi nuevo código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>

typedef struct futbolistas{
        struct futbolistas *sig;
        float sueldo;
        char nombre[50];
}Datos;
typedef Datos *Lista;
typedef Datos *NODO;

Lista listafutbolistasdisponibles=NULL;
Lista listafutbolistaselegidos=NULL;

void insertar( Lista *listafutbolistasdisponibles){
NODO nuevo;
do{
      nuevo=(NODO*)malloc(sizeof(NODO));
      puts("Introduzca el nombre del futbolista:\n");
      fflush(stdin);
      fgets(nuevo->nombre,50-1,stdin);
      puts("Introduzca el sueldo del futbolista:\n");
      fflush(stdin);
      scanf("%f",&nuevo->sueldo);
      nuevo->sig=listafutbolistasdisponibles;
                  if(listafutbolistasdisponibles==NULL){
                       *listafutbolistasdisponibles=nuevo;
                  }else{
                        nuevo->sig=listafutbolistasdisponibles;
                        listafutbolistasdisponibles=nuevo;
                        }
      }while(nuevo->nombre=="");
}

void Mostrar_datos(Lista listafutbolistasdisponibles){
     int i=0;float presupuesto = 5000;
NODO aux=NULL;
aux=listafutbolistasdisponibles;
while(aux){
           i++;
           printf("Presupuesto: %f / Queda: %f \n", presupuesto, presupuesto);
           printf("Jugadores \t\t Equipo \n");
           printf("------------------------------------------------ \n");
           printf("%s ( %.2f )\n", &aux->nombre, &aux->sueldo);
           printf("\t\t Gasto\n");
           aux=aux->sig;
           }
}

void ElegiryCopiar(Lista listafutbolistasdisponibles, Lista *listafutbolistaselegidos){
NODO aux, sig, nodo, nodo2;
int enc,ok; char objetivo[50];
do{
        enc=0;
        puts("¿Que jugador quiere fichar?\n");
        fflush(stdin); fgets(objetivo,50-1,stdin);
        aux = listafutbolistasdisponibles;
                while (aux && !enc){
                        if (aux->nombre==objetivo){
                                enc=1;
                                while(nodo){
                                        strcpy(objetivo,nodo->nombre);
                                        nodo2=(NODO*)malloc(sizeof(NODO));
                                        strcpy(objetivo,nodo->nombre);
                                        nodo2->sig= *listafutbolistaselegidos;
                                        *listafutbolistaselegidos=nodo2;
                                        nodo=nodo->sig;
                                           }
                                 aux=aux->sig;
                                } //fin del if
                        }//fin del primer while
         if(enc==0)
         puts("Error");
         puts("¿Quiere fichar de nuevo?(0-no/ 1-si)\n");
         ok=validar(0,1);
}while(ok==1);
}//fin de ElegiryCopiar

int validar(int min, int max){
  int resultado;
  do{
      fflush(stdin);
      scanf("%d",&resultado);
      if(resultado<min||resultado>max)
      puts("Error");
  }while(resultado<min||resultado>max);
return resultado;
}


int main(){
char Salir[1];
char Elegir[1];
char Quitar[1];
int opciones;
insertar(&listafutbolistasdisponibles);
Mostrar_datos(listafutbolistasdisponibles);
printf("(E)legir \t (Q)uitar jugador\t (S)alir\n");
  opciones= validar(1,3);
  switch(opciones){
      case 1:
      while (Elegir == 'e' || Elegir == 'E'){
      ElegiryCopiar(listafutbolistasdisponibles,&listafutbolistaselegidos);}
                   break;
      case 2: while (Quitar == 'q' || Quitar =='Q'){  /*Eliminarjugador(&listafutbolistasdisponibles,listafutbolistaselegidos);
                   break;     */ }
      case 3:
      while (Salir == 's' || Salir == 'S'){/*Salir(listafutbolistasdisponibles);

                   break;  */     }
                   default:
                   break;
                 }
    system("pause");
    return 0;
}

¿Alguién puede ayudarme o decirme en que/por que fallo, por favor?.
Gracias y hasta pronto(espero).

Gallu

Te ayudo con una parte compañero , tenias muchos pero que muchos fallos
El siguiente código funciona a medias ..

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

#define limpiaBuffer while(getchar() != '\n')

typedef struct{
        void *sig;
        float sueldo;
        char nombre[50];
}Datos;

float presupuesto = 5000;
float restante = 5000 ;


void insertar( Datos **listafutbolistasdisponibles){
Datos *nuevo;
char aux[50];
float sueldo;
do{
      nuevo = (Datos*) malloc(sizeof(Datos));
      puts("Introduzca el nombre del futbolista:");
      fgets(aux , 50 ,stdin);
      strcpy(nuevo->nombre , aux);
      limpiaBuffer;

      puts("Introduzca el sueldo del futbolista:");      
     
      fscanf(stdin , "%f", &sueldo);
      nuevo->sueldo = sueldo;
     
      limpiaBuffer;      

              if(*listafutbolistasdisponibles == NULL){
         *listafutbolistasdisponibles = nuevo;
      }else{
        nuevo->sig = *listafutbolistasdisponibles;
*listafutbolistasdisponibles =  nuevo;
     }

}while(nuevo->nombre == "");
}

void Mostrar_datos(Datos listafutbolistasdisponibles){
        int i=0;
       
Datos *aux = NULL;
aux = &listafutbolistasdisponibles;



while(aux){
   restante = restante - aux->sueldo;
   i++;
   printf("Presupuesto: %f / Queda: %f \n", presupuesto, restante);
   printf("Jugadores \t\t Equipo \n");
   printf("------------------------------------------------ \n");
   printf("%s ( %.2f )\n", aux->nombre, aux->sueldo);
   printf("\t\t Gasto\n");
   aux = aux->sig;
}
}
/*

void ElegiryCopiar(Datos listafutbolistasdisponibles, Datos *listafutbolistaselegidos){
NODO aux, sig, nodo, nodo2;
int enc,ok; char objetivo[50];
do{
enc=0;
puts("¿Que jugador quiere fichar?\n");
limpiaBuffer;

fgets(objetivo,50-1,stdin);
aux = listafutbolistasdisponibles;
        while (aux && !enc){
                if (aux->nombre==objetivo){
                        enc=1;
                        while(nodo){
                        strcpy(objetivo,nodo->nombre);
                        nodo2 = (NODO) malloc(sizeof(Datos));

                        strcpy(objetivo,nodo->nombre);
                        nodo2->sig = *listafutbolistaselegidos;
                        *listafutbolistaselegidos = nodo2;
                        nodo = nodo->sig;
                         }
                         aux=aux->sig;
                 } //fin del if
         }//fin del primer while

if(enc==0)
puts("Error");
puts("¿Quiere fichar de nuevo?(0-no/ 1-si)\n");
ok=validar(0,1);
}while(ok==1);
}//fin de ElegiryCopiar*/




int main(){
char opcion = ' ';
int opciones;

Datos *listafutbolistasdisponibles = NULL;
Datos *listafutbolistaselegidos = NULL;

insertar(&listafutbolistasdisponibles);
printf("%s" , listafutbolistasdisponibles->nombre);

Mostrar_datos(*listafutbolistasdisponibles);

        do{
  printf("(E)legir \t (Q)uitar jugador\t (S)alir\n");


  opcion = (char) getchar();

  switch(opcion){
      case 'e' : case 'E' :
          printf("Ha elegido Elegir \n") ;

  // ElegiryCopiar(*listafutbolistasdisponibles , listafutbolistaselegidos);
   break;
      case 'q' : case 'Q' :
           printf("Ha elegido quitar \n") ;
           break;
              default:
                   break;
         }

}while(opcion != 'S' & opcion != 's');

getchar();
return 0;
}


Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.