elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Uso de listas y ficheros en C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Uso de listas y ficheros en C.  (Leído 4,000 veces)
tenji

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Uso de listas y ficheros en C.
« en: 22 Junio 2011, 17:48 pm »

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.
Código:
#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).


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Uso de listas y ficheros en C.
« Respuesta #1 en: 22 Junio 2011, 20:52 pm »

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

Código
  1. /* Lista simplemente enlazada */
  2. struct datos
  3. {
  4.    signed int dato;
  5.    struct datos *siguiente;
  6. };
  7. /* Funciones */
  8. void error(void)
  9. {
  10.    perror("Error : Insuficiente espacio de memoria.");
  11.    exit(EXIT_FAILURE);
  12. }
  13. struct datos *NuevoElemento(void)
  14. {
  15.    struct datos *q = (struct datos *)malloc(sizeof(struct datos));
  16.    if(!q)
  17.    error;
  18.    return q;
  19. }
  20. /* Funcion prototipo */
  21. void menu(void);
  22. void anadir(struct datos **, signed int);
  23. void borrar(struct datos **, signed int);
  24. struct datos *buscar(struct datos *, signed int);
  25. void visualizar(struct datos *);
  26.  

Así reduces mucho la complejidad al separar las cosas.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
tenji

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Uso de listas y ficheros en C.
« Respuesta #2 en: 23 Junio 2011, 19:10 pm »

Bueno Leo, gracias por el consejo, he intendado hacer lo que dices y este es el resultado:
Código:
#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
En línea

tenji

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Uso de listas y ficheros en C.
« Respuesta #3 en: 24 Junio 2011, 18:44 pm »

Mi nuevo código:
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).
En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: Uso de listas y ficheros en C.
« Respuesta #4 en: 24 Junio 2011, 22:54 pm »

Te ayudo con una parte compañero , tenias muchos pero que muchos fallos
El siguiente código funciona a medias ..
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <malloc.h>
  5.  
  6. #define limpiaBuffer while(getchar() != '\n')
  7.  
  8. typedef struct{
  9.        void *sig;
  10.        float sueldo;
  11.        char nombre[50];
  12. }Datos;
  13.  
  14. float presupuesto = 5000;
  15. float restante = 5000 ;
  16.  
  17.  
  18. void insertar( Datos **listafutbolistasdisponibles){
  19. Datos *nuevo;
  20. char aux[50];
  21. float sueldo;
  22. do{
  23.      nuevo = (Datos*) malloc(sizeof(Datos));
  24.      puts("Introduzca el nombre del futbolista:");
  25.      fgets(aux , 50 ,stdin);
  26.      strcpy(nuevo->nombre , aux);
  27.      limpiaBuffer;
  28.  
  29.      puts("Introduzca el sueldo del futbolista:");      
  30.  
  31.      fscanf(stdin , "%f", &sueldo);
  32.      nuevo->sueldo = sueldo;
  33.  
  34.      limpiaBuffer;      
  35.  
  36.              if(*listafutbolistasdisponibles == NULL){
  37.         *listafutbolistasdisponibles = nuevo;
  38.      }else{
  39.        nuevo->sig = *listafutbolistasdisponibles;
  40. *listafutbolistasdisponibles =  nuevo;
  41.     }
  42.  
  43. }while(nuevo->nombre == "");
  44. }
  45.  
  46. void Mostrar_datos(Datos listafutbolistasdisponibles){
  47.        int i=0;
  48.  
  49. Datos *aux = NULL;
  50. aux = &listafutbolistasdisponibles;
  51.  
  52.  
  53.  
  54. while(aux){
  55.   restante = restante - aux->sueldo;
  56.   i++;
  57.   printf("Presupuesto: %f / Queda: %f \n", presupuesto, restante);
  58.   printf("Jugadores \t\t Equipo \n");
  59.   printf("------------------------------------------------ \n");
  60.   printf("%s ( %.2f )\n", aux->nombre, aux->sueldo);
  61.   printf("\t\t Gasto\n");
  62.   aux = aux->sig;
  63. }
  64. }
  65. /*
  66.  
  67. void ElegiryCopiar(Datos listafutbolistasdisponibles, Datos *listafutbolistaselegidos){
  68. NODO aux, sig, nodo, nodo2;
  69. int enc,ok; char objetivo[50];
  70. do{
  71. enc=0;
  72. puts("¿Que jugador quiere fichar?\n");
  73. limpiaBuffer;
  74.  
  75. fgets(objetivo,50-1,stdin);
  76. aux = listafutbolistasdisponibles;
  77.        while (aux && !enc){
  78.                if (aux->nombre==objetivo){
  79.                        enc=1;
  80.                        while(nodo){
  81.                        strcpy(objetivo,nodo->nombre);
  82.                        nodo2 = (NODO) malloc(sizeof(Datos));
  83.  
  84.                        strcpy(objetivo,nodo->nombre);
  85.                        nodo2->sig = *listafutbolistaselegidos;
  86.                        *listafutbolistaselegidos = nodo2;
  87.                        nodo = nodo->sig;
  88.                         }
  89.                         aux=aux->sig;
  90.                 } //fin del if
  91.         }//fin del primer while
  92.  
  93. if(enc==0)
  94. puts("Error");
  95. puts("¿Quiere fichar de nuevo?(0-no/ 1-si)\n");
  96. ok=validar(0,1);
  97. }while(ok==1);
  98. }//fin de ElegiryCopiar*/
  99.  
  100.  
  101.  
  102.  
  103. int main(){
  104. char opcion = ' ';
  105. int opciones;
  106.  
  107. Datos *listafutbolistasdisponibles = NULL;
  108. Datos *listafutbolistaselegidos = NULL;
  109.  
  110. insertar(&listafutbolistasdisponibles);
  111. printf("%s" , listafutbolistasdisponibles->nombre);
  112.  
  113. Mostrar_datos(*listafutbolistasdisponibles);
  114.  
  115.        do{
  116.  printf("(E)legir \t (Q)uitar jugador\t (S)alir\n");
  117.  
  118.  
  119.  opcion = (char) getchar();
  120.  
  121.  switch(opcion){
  122.      case 'e' : case 'E' :
  123.          printf("Ha elegido Elegir \n") ;
  124.  
  125.  // ElegiryCopiar(*listafutbolistasdisponibles , listafutbolistaselegidos);
  126.   break;
  127.      case 'q' : case 'Q' :
  128.           printf("Ha elegido quitar \n") ;
  129.           break;
  130.              default:
  131.                   break;
  132.         }
  133.  
  134. }while(opcion != 'S' & opcion != 's');
  135.  
  136. return 0;
  137. }
  138.  
  139.  
  140.  
En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listas
PHP
Darksurgeon13 1 2,077 Último mensaje 19 Diciembre 2009, 19:28 pm
por Og.
Uso de Listas: Subprograma que lea 2 listas y forme una.
Dudas Generales
hbenitez 2 3,325 Último mensaje 8 Agosto 2010, 20:11 pm
por hbenitez
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 5,191 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
Listas en C++
Programación C/C++
farresito 4 3,149 Último mensaje 10 Marzo 2011, 12:54 pm
por farresito
ficheros en listas enlazadas
Programación C/C++
mapers 3 4,506 Último mensaje 28 Marzo 2011, 14:09 pm
por D4RIO
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines