Programa en C. Problemas con el almacenamiento de datos en variables

Iniciado por tenji, 18 Junio 2011, 18:11 PM

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

tenji

Hola a todos, me estreno en este foro con un programa que consiste en fichar jugadores para un equipo de fútbol. Para ello tengo un presupuesto de 50,000,000 de euros y cada vez que fiche un jugador, debo de introducir el sueldo a pagar del jugador, el cúal, se restará al presupuesto que tengo. Os muestro el código que he hecho y después os explico mis dudas/problemas.
Antes de mostrarlo, me gustaría aclarar que soy primerizo en esto de la programación y no domino bien el concepto de almacenaje de datos en un array y en una variable en general, por lo que seguramente habrá cosas innecesarias.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 50

void restarpresupuesto(float a, float b);

int main(){
int i,j,ok,respuesta;
float sueldo[N];
char cadena[5][N];
float presupuesto = 50000000 ;
printf("Vamos a fichar jugadores\n");
do{
              for(i=0;i<2;i++){
                        printf("Introduzca el nombre del jugador %d: ",i+1);
                        fflush(stdin);
                        fgets(cadena,N-1,stdin);
                        printf("El jugador %s cobra: ",cadena);
                        scanf("%f",&sueldo[N]);
                        restarpresupuesto(sueldo[N],presupuesto);
                       
                        }
        printf("Desea fichar mas jugadores? Pulse:0-SI o 1-NO \n");
         scanf("%d",&respuesta);
}while(respuesta==0);
printf("EL EQUIPO ESTA FORMADO POR:\n");
   
for(i=0;i<2;i++){
    printf("El jugador numero %d que se llama: %s ", i+1,cadena);
    printf("y cobra %f euros\n ", sueldo[N]);
           }
       
    if (i>1){
        printf("\nHas fichado %d jugadores \n",i);
        }  else
               printf("\nHas fichado 1 jugador\n");

system("pause");
fflush(stdin);
return 0;
}

   void restarpresupuesto(float a, float b){
         float presupuestofinal;
         presupuestofinal=(b - a);
         printf("Le queda %f euros de presupuesto \n",presupuestofinal );
}


1. Quisiera saber como puedo hacer para que cada vez que introduzca sueldos de los jugadores, eston se resten al presupuesto partiendo del resultado de la resta anterior. Ejemplo: Parto de 5000 euros, el jugador 1 cobra 400, me quedan 4600, para cuando introduzca el sueldo del segundo jugador, quiero que la resta se inicie desde 4600 y no desde 5000.
No se como hacerlo.¿Me ayudan?.
2. Cuando muestro los resultados, solo me muestra el primer sueldo que introduzco en todos los jugadores, es decir, si pongo que el primer jugador cobra 500, todos, independientemente de lo que introduzca, van a cobrar 500 euros. En definitiva solo me almacena el primer numero que introduzco. ¿que debo hacer?.
Agradecería una respuesta.

Ejemplo de ejecución/compilacion:
Vamos a fichar jugadores
Introduzca el nombre del jugador 1: PEPE
El jugador PEPE
cobra: 600000
Le queda 49400000.000000 euros de presupuesto
Introduzca el nombre del jugador 2: MANOLO
El jugador MANOLO
cobra: 234234
Le queda 49765768.000000 euros de presupuesto
Desea fichar mas jugadores? Pulse:0-SI o 1-NO
1
EL EQUIPO ESTA FORMADO POR:
El jugador numero 1 que se llama: PEPE
y cobra 234234.000000 euros
El jugador numero 2 que se llama: MANOLO
y cobra 234234.000000 euros

Has fichado 2 jugadores
Presione una tecla para continuar . . .

Gracias por su atención y espero que me puedan ayudar
Hasta pronto (Espero).

Dark Invader

#1
Hola,

Pues tu codigo se puede simplificar mucho,el numero de jugadores maximos que puedes fichar en este codigo que te voy a poner es 11,si quieres mas solo adaptalo un poco.He utilizado una estructura para ello,mira a ver si te convence:

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


struct fichajes{
float sueldo;
char cadena[20];

};
int main (void){
   struct fichajes jugadores[11];
    int i,j,ok,respuesta;
     float presupuesto = 500000000;
     float presupuesto1[11];
   
    printf("Vamos a fichar jugadores\n(tieen que fichar 11 jugadores)");
for (i=0;i<11;i++)
            {
                       printf("Introduzca el nombre del jugador %d: ",i+1);
                       fflush(stdin);
                       gets(jugadores[i].cadena);
                       printf("El jugador %s cobra: ",jugadores[i].cadena);
                       scanf("%f",&jugadores[i].sueldo);
                       presupuesto1[i] = presupuesto - jugadores[i].sueldo;
                       printf("le quedan %f euros.",presupuesto1[i]);
                       printf("tiene %d jugadores de momento",i);
                         printf("Desea fichar mas jugadores? Pulse:0-SI o 1-NO \n");
        scanf("%d",&respuesta);
        if(presupuesto<jugadores[i].sueldo){
                                            printf("ya no queda mas dinero");
                                            exit(0);}
while(respuesta==!0){
                   
                 exit(0);
                 }
                     
                       }
                       getchar();
                       return 0;
}


Puede que tenga algun fallo,no lo he compilado ni ejecutado.

Salu2

tenji

Gracias Dark Invader, estoy probando el código que me has entregado y puedo sacar bastantes cosas buenas de él, pero sin embargo y siempre y cuando no tengas inconvenientes, me gustaría que me explicarás algunas cosas de tu código que nunca habia visto.
1. Que es exit exactamente, nunca lo habia visto. ¿Cuando lo deberia usar?¿Se le dan valores?, lo digo por lo del 0.
2.¿que hace el gets?¿cuando lo deberia usar?.
3. ¿Que diferencia hay entre el getchar() y el system("pause")?, se usan para lo mismo ¿no?.
4.while(respuesta==!0)- ¿Quiere decir algo asi como que mientras respuesta sea igual o distinta de 0 haz lo que que te indique a continuación?. Yo lo habia vista al reves !=0, pero los iguales ¿cuando debo usarlos?.
5.3. ¿Se podria hacer lo que se pide sin recurrir a una estructura de datos?. Uno de los objetivos del ejercicio es hacer lo que se pide a través de arrays y funciones. Lo siento, eso no lo habia dicho desde el principio.

Estoy intentando que muestre los datos almacenados, pero no me muestra únicamente los datos que introduzco,¿que debo hacer par que me muestre solo lo que introduzco?, es decir, si introduzco 2 jugadores, que solo me muestre esos 2 jugadores.
Dejo de nuevo mi codigo y un ejemplo de ejecución/compilación del mismo:

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


struct fichajes{
float sueldo;
char cadena[20];
};
int main (void){
    struct fichajes jugadores[11];
     int i,j,ok,respuesta;
      float presupuesto = 500000000;
      float presupuesto1[11];

     printf("Vamos a fichar jugadores\n(tiene que fichar 11 jugadores)\n");
     do{
for (i=0;i<2;i++)
             {
                        printf("Introduzca el nombre del jugador %d: ",i+1);
                        fflush(stdin);
                        gets(jugadores[i].cadena);
                        printf("El jugador %s cobra: ",jugadores[i].cadena);
                        scanf("%f",&jugadores[i].sueldo);
                        presupuesto1[i] = presupuesto - jugadores[i].sueldo;
                        printf("le quedan %f euros.",presupuesto1[i]);
                        printf("tiene %d jugadores de momento \n",i);
                       
              }
         printf("Desea fichar mas jugadores? Pulse:0-SI o 1-NO \n");
         scanf("%d",&respuesta);
         if(presupuesto<jugadores[i].sueldo){
         printf("ya no queda mas dinero");
        }
}while(respuesta==0);
                 //  exit(0);
                                for(i=0;i<11;i++){
    printf("El jugador numero %d que se llama: %s ", i+1,jugadores[i].cadena);
    printf("y cobra %f euros\n ", presupuesto1[i]);
           }
       
    if (i>1){
        printf("\nHas fichado %d jugadores \n",i);
        }  else
               printf("\nHas fichado 1 jugador\n");

system("pause");
fflush(stdin);
return 0;
}





COMPILACIÓN/EJECUCIÓN:
Vamos a fichar jugadores
(tiene que fichar 11 jugadores)
Introduzca el nombre del jugador 1: PEPE
El jugador PEPE cobra: 600000
le quedan 499400000.000000 euros.tiene 0 jugadores de momento
Introduzca el nombre del jugador 2: MANOLO
El jugador MANOLO cobra: 4000000
le quedan 496000000.000000 euros.tiene 1 jugadores de momento
Desea fichar mas jugadores? Pulse:0-SI o 1-NO
1
El jugador numero 1 que se llama: PEPE y cobra 600000.000000 euros
El jugador numero 2 que se llama: MANOLO y cobra 4000000.000000 euros
El jugador numero 3 que se llama: ↑☼> y cobra 0.000000 euros
El jugador numero 4 que se llama: h♫> y cobra 0.000000 euros
El jugador numero 5 que se llama: àsÚv y cobra 23674690270553925000000000000000
00.000000 euros
El jugador numero 6 que se llama: └■" y cobra 0.000000 euros
El jugador numero 7 que se llama: ♥£°v y cobra 0.000000 euros
El jugador numero 8 que se llama:  y cobra 0.000000 euros
El jugador numero 9 que se llama: È■" y cobra 252169917953230580000000000000000
0.000000 euros
El jugador numero 10 que se llama: ►£°vª▓¨v ☼> y cobra -1.#QNAN0 euros
El jugador numero 11 que se llama:  y cobra 2532206505100750300000000000000000.
000000 euros

Has fichado 11 jugadores
Presione una tecla para continuar . . .

Gracias de nuevo y agradeceria una respuesta
Hasta pronto.

Dark Invader

#3
No tengo ningun incoveniente,siempre es un placer explicar algo si es por enseñar  ::)

1:Exit cierra el programa cuando lee esa misma linea,el unico valor que tiene es 0(segun he visto).

2:gets coge una cadena,en este caso hubiera valido scanf,pero scanf no lee espacios por lo que un nombre como:

Juan jose, solo leería Juan,entonces se utiliza el gets y se coge toda la cadena y así no tienes que limpiar el buffer de entrada

3:es lo mismo exactamente,solo que me resulta más comodo llamar a una sola libreria,la stdio.h, y poner getchar que llamar a stadio.h y a cstdlib para llamar al sistema,además creo que en la universidad os cuelgan si utilizais la llamada al sistema(ya lo comprobare el año que viene  :xD )

4:}while(respuesta==!0);

Bueno esto se nota que es del cansancio mio xD porque en vez de while pondria mejor un if, si la respuesta es distinta de 0,exit,osea cierra el programa,como 0 es la unica que le dice al sistema que vuelva a hacer el bucle,cualquier otro numero cerraria el programa.Esto es mientras la respuesta sea igual a un numero que no es 0 haz tal,pero si hubieras puesto if(respuesta !=0) dirias que si la respuesta es disitinta de 0...Como ves,hay varias alternativas.

5:Difici,bastante dificil.En el ejemplo se utilizan arrays y estructuras,puedes añadir una funcion para que te calcule cualquier cosa y adornas el programa,pero es que con estructuras y arrays se puede hacer eso muy facilmente.Intenta hacer alguno con funciones y lo pegas si tienes alguna duda.

6:

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


struct fichajes{
float sueldo;
char cadena[20];
};
int main (void){
   struct fichajes jugadores[11];
    int i,j,ok,respuesta;
     float presupuesto = 500000000;
     float presupuesto1[11];
     int numero;

    printf("Vamos a fichar jugadores\n(tiene que fichar 11 jugadores)\n");
    do{
for (i=0;i<11;i++)
            {
                       printf("Introduzca el nombre del jugador %d: ",i+1);
                       fflush(stdin);
                       gets(jugadores[i].cadena);
                       printf("El jugador %s cobra: ",jugadores[i].cadena);
                       scanf("%f",&jugadores[i].sueldo);
                       presupuesto1[i] = presupuesto - jugadores[i].sueldo;
                       printf("le quedan %f euros.",presupuesto1[i]);
                       printf("tiene %d jugadores de momento \n",i+1);
                       
             }
        printf("Desea fichar mas jugadores? Pulse:0-SI o 1-NO \n");
        scanf("%d",&respuesta);
        if(presupuesto<jugadores[i].sueldo){
        printf("ya no queda mas dinero");
       }
if(respuesta!=0){
printf("ha fichado a:");
for (numero = 0;numero<i;numero++){
printf("\n %s con un sueldo de %d",jugadores[numero].cadena,jugadores[numero].sueldo);
system("pause");
                 exit(0);
                 }
                 }
                 
                 }
     

system("pause");
return 0;
}


Creo que era esto lo que pedias,el programa me da algunos errores de parentesis y tal,ahora mismo ando un poco ocupado para encontrarlos  :silbar:

Me comentas como ha ido todo.

Salu2

tenji

Hola de nuevo, gracias Dark invader(otra vez). Mira, he estado realizando cambios y adaptaciones al programa y me ha quedado asi:
#include <string.h>
#include <stdio.h>
#define N 50
#define MAX_J 2
#define PRES 500000

struct fichajes
{
    float sueldo;
    char nombre[N];
};
typedef struct fichajes Jugadores;

int validar(int min,int max);
void cadenas(char *cadena);
int validarsueldo(float valor,int min,int max);

int main()
{
    Jugadores jugadores[MAX_J];
    float presupuesto = PRES;
    float previo;
    int i,ok,j,res;
   
    // Inicializamos los valores
   
    for(i=0;i<MAX_J;i++)
        jugadores[i].sueldo = -1;
       
    /* Inserción de datos: */
    i=0;
    while(presupuesto > 0 && i<MAX_J)
    {
        cadenas(jugadores[i].nombre);
        do
        {
            ok=1;
            printf("Introduce SUELDO del jugador:\t");
            scanf("%f",&previo);
            ok = validarsueldo(previo,100,80000);
            if(!ok) printf("Error. Valor fuera de rango\n");   
        }while(!ok);
       
       
        if(previo > presupuesto)
        {
            printf("Error. Presupuesto insuficiente. Se asignara presupuesto restante....\n");
            jugadores[i].sueldo = presupuesto;
            presupuesto-= jugadores[i].sueldo;
        }
        else
        {
            jugadores[i].sueldo = previo;
            presupuesto-=previo;
        }   
       
        printf("Desea seguir introduciendo jugadores? (0-NO / 1-SI):\t");
        res = validar(0,1);
        if(res)
        {
                printf("Queda un presupuesto de: %.2f euros\n",presupuesto);
                i++;
                if(i==MAX_J) printf("Numero de fichajes maximos alcanzados.....\n");
        }
        else i=MAX_J;
       
       
    } // fin while
   
   
    /*Presentación de los datos:*/
    j=0;
    for(i=0;i<MAX_J;i++)
    {
        if(jugadores[i].sueldo!=-1)
        {
            printf("Jugador %d:\n",j+1);
            printf("\tNOMBRE: %s\n",jugadores[i].nombre);
            printf("\tSUELDO: %.2f euros.\n",jugadores[i].sueldo);
            j++;
        }
    }
     
    return 0;
   
}

int validarsueldo(float valor,int min,int max)
{
    if(valor<min || valor>max)
        return 0;
    return 1;
}

int validar(int min,int max)
{
    int valor;
    do
    {
        scanf("%d",&valor);
        if(valor<min || valor>max)
            printf("Error. Valor fuera de rango.\n.Introduzca nuevo valor:\t");
    }while(valor<min || valor>max);
    return valor;
}

void cadenas(char *cadena)
{
    char cad[N];
    int n;
    printf("Introduce NOMBRE DEL JUGADOR:\t");
    fflush(stdin);
    fgets(cad,N-1,stdin);
    n = strlen(cad);
    cad[n-1] = '\0';
    strcpy(cadena,cad);
}


Bueno, he de decir que me ha ayudado un chaval (que usa debian) y no se que he hecho pero no muestra los resultados. (Solamente he borrado #include <ncurses.h> y he sustituido __fpurge por fflush). ¿Alguién me puede decir por que?.
Yo pienso que es porque no hay un getchar(); o un system("pause"); pero no se si hay algo mas.

Agradeceria una respuesta.

Un saludo y hasta pronto.