buscar deuda mayor

Iniciado por minette1988, 7 Junio 2010, 15:44 PM

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

minette1988

Hola, tengo el siguiente ejercicio que pide los datos de los clientes y quiero hacer un subprograma que me busque la deuda mayor y la muestre por pantalla. Lo he intentado, pero no me sale, me da errores.

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

#define LEE_CHAR(c)\
c=getchar();\
while((c=='\n') || (c==' ') || (c=='\t'))\
c=getchar();

#define LEE_CAD(c,n) { int i=0; \
                     c[i]=getchar();\
     while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
     while ((c[i]!='\n') && (i < (n-1))){ \
        i++;\
c[i]=getchar(); }\
     c[i]='\0'; }

#define TAM_NOMBRE 100
#define TAM_DIR 100
#define NUM_CLIENTES 10
struct cliente{
char nombre[TAM_NOMBRE];
        char direccion[TAM_DIR];
        double deuda;
};
int main(){
void crear_fich();
        void deuda_mayor();
        char sel;
FILE *pf; //Puntero a fichero

        /* Abre el fichero para trabajar con él en Lectura / Escritura */
        if((pf = fopen("datos.dat", "wb+")) == NULL) {/*"rb+"*/
           /* Si no existe, ejecuta el módulo que lo cree */
   crear_fich();
   /* Una vez creado lo habre en lectura/escritura */
           if((pf = fopen("datos.dat", "rb+")) == NULL) {
perror("Fichero no accesible");
                exit(1);
   }
        }

do{
printf("MENÚ\n----\n");

printf("1). Dar de alta un cliente.\n");
                printf("2). Mostrar la deuda mayor.\n");
                printf("3). salir y eliminar.\n");
                printf("0). Salir\n\nOpción(0-2): ");

do{
LEE_CHAR(sel);
}while( (sel<'0') || (sel>'3') );

switch(sel){
case '1':{
crear_fich(pf);
    /* Una vez creado lo abre en lectura/escritura */
    if((pf = fopen("datos.dat", "rb+")) == NULL) {
perror("Fichero no accesible");
                exit(2);
    }
break;}
                                case '2':{ deuda_mayor(pf);
                                        break;}
                                case '3':{ fclose(pf); pf=NULL; remove("datos.dat"); sel= '0';
break;}
                } //switch
}while(sel!='0');

exit(0);
}//main()
////////////////////////////////////////
void crear_fich(FILE* pf) {
         struct cliente cli[NUM_CLIENTES];
         int i=0;
         char otro;

if((pf = fopen("datos.dat", "ab")) == NULL) {
perror("Al crear el fichero de datos");
                exit(2);
         }
         
         /* Lectura de los ciclistas */
         do {

cli[i].deuda = 0.0;
                printf("Nombre: "); LEE_CAD(cli[i].nombre, TAM_NOMBRE);
                printf("Dirección: "); LEE_CAD(cli[i].direccion, TAM_DIR);
                printf("Deuda: "); scanf("%lf", &cli[i].deuda);
                /*Escribe el cliente en el fichero */
                fwrite(&cli, sizeof(struct cliente), 1, pf);
printf("¿Otro? (s/n) ");
                LEE_CHAR(otro);
        }while((otro=='s') || (otro=='S'));
if(fclose(pf) == EOF){
printf("Error al cerrar el fichero, compruebe si hay información.\n");
                exit(3);
        }
} /* crear_fich()*/
//////////////////////////////////
void deuda_mayor(FILE *pf){
        struct cliente cli[NUM_CLIENTES]; 
        int i=0;
        int deuda_mayor;
        deuda_mayor=0;
        for(i=0; i<NUM_CLIENTES; i++){
            rewind(pf);
            fread(&cli,sizeof(struct cliente),1,pf);
            while(!feof(pf)){
                for(i=1; i<NUM_CLIENTES; i++){
                   if(cli[i].deuda > cli[deuda_mayor].deuda);
                      deuda_mayor=i;
                }
            }
            printf("%s %.2lf\n", cli[deuda_mayor].nombre,cli[deuda_mayor].deuda);
        }
}


Cuando le doy la opción 2 que es mostrar la deuda mayor no hace nada.





Littlehorse

No hagas triple post! usa el botón modificar. :D

No vi todo el codigo pero por el error, que es lo que intentas hacer con esto?

           if(cli.deuda > cli[deuda_mayor].deuda);
              deuda_mayor=cli.deuda;


No declaraste cli como un arreglo de estructuras como para utilizar los indices de esa forma.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Horricreu

#2
Cita de: Littlehorse en  7 Junio 2010, 22:32 PM
No hagas triple post! usa el botón modificar. :D

No vi todo el codigo pero por el error, que es lo que intentas hacer con esto?

          if(cli.deuda > cli[deuda_mayor].deuda);
             deuda_mayor=cli.deuda;


No declaraste cli como un arreglo de estructuras como para utilizar los indices de esa forma.

Saludos

¿Y el if() no está mal declarado? No sería:

Código (cpp) [Seleccionar]
if(cli.deuda > cli[deuda_mayor].deuda) deuda_mayor = cli.deuda;

o

Código (cpp) [Seleccionar]
if(cli.deuda > cli[deuda_mayor].deuda)
{
deuda_mayor = cli.deuda;
}


Saludos :P

Littlehorse

Si! también tiene que modificar eso, no había visto el ";" sobrante.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Horricreu

#4
Cita de: Littlehorse en  7 Junio 2010, 22:39 PM
Si! también tiene que modificar eso, no había visto el ";" sobrante.

Saludos!

Ok. Entendidos entonces, edito porque no quiero que se entienda que he querido faltar el respeto a Littlehorse (perdona una vez más).

Saludos :P

Littlehorse

#5
CitarOk. De nada, supongo :xD

Gracias por mostrarme el ";" sobrante que no había visto, igualmente yo te respondí porque pensé que eras vos el que estaba haciendo una pregunta, si no, no hubiese dicho nada porque lo que habías dicho es correcto. Ten en cuenta que no soy yo quien puso el código inicial, pero en fin, no desvirtuemos mas el hilo.

Y por cierto, no te respondí el pm porque tenes el buzón lleno.

Saludos

Edit:

Todo bien EPI  :)
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

minette1988

Os he hecho caso y he modificado el ejercicio a ver si me lo podéis mirar, por favor, sigue dándome fallos.
Hoy tengo examen. Gracias.

nicolas_cof

#7
Un error es que te falta declarar NUM_CLIENTES, que lo usas dentro de la funcion crear_fich()

Ademas si declaras un arreglo de estructura, dentro del do-while tu cli.deuda tendria que ser cli[i].deuda, cli[i]..., obviamente previamente habiendo declarado e inicializado la variable i

Error en lo siguiente, deuda_mayor debe ser declarado de tipo int.

double deuda_mayor = 0.0;
...
cli[deuda_mayor].nombre, ...


Salu10.

minette1988

He vuelto a modificarlo, he quitado NUM_CLIENTES y no entiendo por qué deuda_mayor tiene que ser int si me tiene que sacar la deuda más alta que es de tipo double.

nicolas_cof

Porque si te fijas bien a deuda_mayor lo estas usando como indicador de posicion (el cual debe ser de tipo int) en un arreglo que en este caso no lo tenes ya que a cli no lo declaras como un arreglo de estructura.

Salu10.