Foros del Web » Programación para mayores de 30 ;) » C/C++ »

imprimir la deuda mayor de un cliente

Estas en el tema de imprimir la deuda mayor de un cliente en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 07/06/2010, 07:40
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
imprimir la deuda mayor de un cliente

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];

char otro;

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

/* Lectura de los ciclistas */
do {

cli.deuda = 0.0;
printf("Nombre: "); LEE_CAD(cli.nombre, TAM_NOMBRE);
printf("Dirección: "); LEE_CAD(cli.direccion, TAM_DIR);
printf("Deuda: "); scanf("%lf", &cli.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 deuda_mayor=0;

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

printf("%s %.2lf\n", cli[deuda_mayor].nombre,cli[deuda_mayor].deuda);

}
  #2 (permalink)  
Antiguo 07/06/2010, 07:41
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

Disculpad por no resaltar el código, lo muestro resaltado

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LEE_CHAR(c)\
  6.         c=getchar();\
  7.         while((c=='\n') || (c==' ') || (c=='\t'))\
  8.             c=getchar();
  9.  
  10. #define LEE_CAD(c,n) { int i=0; \
  11.                      c[i]=getchar();\
  12.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  13.              while ((c[i]!='\n') && (i < (n-1))){ \
  14.                 i++;\
  15.             c[i]=getchar(); }\
  16.              c[i]='\0'; }
  17.  
  18. #define TAM_NOMBRE 100
  19. #define TAM_DIR 100
  20. #define NUM_CLIENTES 10
  21.  
  22. struct cliente{
  23.     char nombre[TAM_NOMBRE];
  24.         char direccion[TAM_DIR];
  25.         double deuda;
  26. };
  27. int main(){
  28.     void crear_fich();
  29.         char sel;
  30.     FILE *pf; //Puntero a fichero
  31.  
  32.         /* Abre el fichero para trabajar con él en Lectura / Escritura */
  33.         if((pf = fopen("datos.dat", "wb+")) == NULL) {/*"rb+"*/
  34.            /* Si no existe, ejecuta el módulo que lo cree */
  35.        crear_fich();
  36.        /* Una vez creado lo habre en lectura/escritura */
  37.            if((pf = fopen("datos.dat", "rb+")) == NULL) {
  38.         perror("Fichero no accesible");
  39.                 exit(1);
  40.        }
  41.         }
  42.  
  43.     do{
  44.         printf("MENÚ\n----\n");
  45.        
  46.         printf("1). Dar de alta un cliente.\n");
  47.                 printf("2). Mostrar la deuda mayor.\n");
  48.                 printf("3). salir y eliminar.\n");
  49.                 printf("0). Salir\n\nOpción(0-2): ");
  50.  
  51.         do{
  52.             LEE_CHAR(sel);
  53.         }while( (sel<'0') || (sel>'3') );
  54.  
  55.         switch(sel){
  56.                 case '1':{
  57.                         crear_fich(pf);
  58.                         /* Una vez creado lo abre en lectura/escritura */
  59.                         if((pf = fopen("datos.dat", "rb+")) == NULL) {
  60.                         perror("Fichero no accesible");
  61.                                 exit(2);
  62.                         }
  63.                     break;}
  64.                                 case '2':{ deuda_mayor(pf);
  65.                                         break;}
  66.                                 case '3':{ fclose(pf); pf=NULL; remove("datos.dat"); sel= '0';
  67.                     break;}
  68.                 } //switch
  69.     }while(sel!='0');
  70.  
  71.     exit(0);
  72. }//main()
  73. ////////////////////////////////////////
  74. void crear_fich(FILE* pf) {
  75.          struct cliente cli[NUM_CLIENTES];
  76.          
  77.          char otro;
  78.  
  79.      if((pf = fopen("datos.dat", "ab")) == NULL) {
  80.         perror("Al crear el fichero de datos");
  81.                 exit(2);
  82.          }
  83.          
  84.          /* Lectura de los ciclistas */
  85.          do {
  86.        
  87.         cli.deuda = 0.0;
  88.                 printf("Nombre: "); LEE_CAD(cli.nombre, TAM_NOMBRE);
  89.                 printf("Dirección: "); LEE_CAD(cli.direccion, TAM_DIR);
  90.                 printf("Deuda: "); scanf("%lf", &cli.deuda);
  91.                 /*Escribe el cliente en el fichero */
  92.                 fwrite(&cli, sizeof(struct cliente), 1, pf);
  93.         printf("¿Otro? (s/n) ");
  94.                 LEE_CHAR(otro);
  95.         }while((otro=='s') || (otro=='S'));
  96.     if(fclose(pf) == EOF){
  97.         printf("Error al cerrar el fichero, compruebe si hay información.\n"); 
  98.                 exit(3);
  99.         }
  100. } /* crear_fich()*/
  101. //////////////////////////////////
  102. void deuda_mayor(FILE *pf){
  103.         struct cliente cli[NUM_CLIENTES];
  104.        
  105.         int deuda_mayor=0;
  106.  
  107.            if(cli.deuda > cli[deuda_mayor].deuda);
  108.               deuda_mayor=cli.deuda;
  109.        
  110.            printf("%s %.2lf\n", cli[deuda_mayor].nombre,cli[deuda_mayor].deuda);
  111.  
  112. }
  #3 (permalink)  
Antiguo 07/06/2010, 13:45
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

Donde pone NUM_CLIENTES sobra me he equivocado al copiar el código.
  #4 (permalink)  
Antiguo 07/06/2010, 13:55
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

Perdonad, vuelvo a publicar el código con las modificaciones oprtunas. Cuando lo compilo no me saca la deuda más alta sino que me da fallos.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LEE_CHAR(c)\
  6.         c=getchar();\
  7.         while((c=='\n') || (c==' ') || (c=='\t'))\
  8.             c=getchar();
  9.  
  10. #define LEE_CAD(c,n) { int i=0; \
  11.                      c[i]=getchar();\
  12.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  13.              while ((c[i]!='\n') && (i < (n-1))){ \
  14.                 i++;\
  15.             c[i]=getchar(); }\
  16.              c[i]='\0'; }
  17.  
  18. #define TAM_NOMBRE 100
  19. #define TAM_DIR 100
  20.  
  21. struct cliente{
  22.     char nombre[TAM_NOMBRE];
  23.         char direccion[TAM_DIR];
  24.         double deuda;
  25. };
  26. int main(){
  27.     void crear_fich();
  28.         void deuda_mayor();
  29.         char sel;
  30.     FILE *pf; //Puntero a fichero
  31.  
  32.         /* Abre el fichero para trabajar con él en Lectura / Escritura */
  33.         if((pf = fopen("datos.dat", "wb+")) == NULL) {/*"rb+"*/
  34.            /* Si no existe, ejecuta el módulo que lo cree */
  35.        crear_fich();
  36.        /* Una vez creado lo habre en lectura/escritura */
  37.            if((pf = fopen("datos.dat", "rb+")) == NULL) {
  38.         perror("Fichero no accesible");
  39.                 exit(1);
  40.        }
  41.         }
  42.  
  43.     do{
  44.         printf("MENÚ\n----\n");
  45.        
  46.         printf("1). Dar de alta un cliente.\n");
  47.                 printf("2). Mostrar la deuda mayor.\n");
  48.                 printf("3). salir y eliminar.\n");
  49.                 printf("0). Salir\n\nOpción(0-2): ");
  50.  
  51.         do{
  52.             LEE_CHAR(sel);
  53.         }while( (sel<'0') || (sel>'3') );
  54.  
  55.         switch(sel){
  56.                 case '1':{
  57.                         crear_fich(pf);
  58.                         /* Una vez creado lo abre en lectura/escritura */
  59.                         if((pf = fopen("datos.dat", "rb+")) == NULL) {
  60.                         perror("Fichero no accesible");
  61.                                 exit(2);
  62.                         }
  63.                     break;}
  64.                                 case '2':{ deuda_mayor(pf);
  65.                                         break;}
  66.                                 case '3':{ fclose(pf); pf=NULL; remove("datos.dat"); sel= '0';
  67.                     break;}
  68.                 } //switch
  69.     }while(sel!='0');
  70.  
  71.     exit(0);
  72. }//main()
  73. ////////////////////////////////////////
  74. void crear_fich(FILE* pf) {
  75.          struct cliente cli;
  76.          
  77.          char otro;
  78.  
  79.      if((pf = fopen("datos.dat", "ab")) == NULL) {
  80.         perror("Al crear el fichero de datos");
  81.                 exit(2);
  82.          }
  83.          
  84.          /* Lectura de los ciclistas */
  85.          do {
  86.        
  87.         cli.deuda = 0.0;
  88.                 printf("Nombre: "); LEE_CAD(cli.nombre, TAM_NOMBRE);
  89.                 printf("Dirección: "); LEE_CAD(cli.direccion, TAM_DIR);
  90.                 printf("Deuda: "); scanf("%lf", &cli.deuda);
  91.                 /*Escribe el cliente en el fichero */
  92.                 fwrite(&cli, sizeof(struct cliente), 1, pf);
  93.         printf("¿Otro? (s/n) ");
  94.                 LEE_CHAR(otro);
  95.         }while((otro=='s') || (otro=='S'));
  96.     if(fclose(pf) == EOF){
  97.         printf("Error al cerrar el fichero, compruebe si hay información.\n"); 
  98.                 exit(3);
  99.         }
  100. } /* crear_fich()*/
  101. //////////////////////////////////
  102. void deuda_mayor(FILE *pf){
  103.         struct cliente cli;
  104.        
  105.         int deuda_mayor=0;
  106.  
  107.            if(cli.deuda > cli[deuda_mayor].deuda);
  108.               deuda_mayor=cli.deuda;
  109.        
  110.            printf("%s %.2lf\n", cli[deuda_mayor].nombre,cli[deuda_mayor].deuda);
  111.  
  112. }

Los fallos de compilación son estos:
deuda_mayor.c: En la función ‘deuda_mayor’:
deuda_mayor.c:107: error: el valor indicado por el subíndice no es ni matriz ni puntero
deuda_mayor.c:110: error: el valor indicado por el subíndice no es ni matriz ni puntero
deuda_mayor.c:110: error: el valor indicado por el subíndice no es ni matriz ni puntero

Podéis decirme cómo puedo sacar la deuda más alta, de una forma sencilla, por favor. Mañana tengo examen.
  #5 (permalink)  
Antiguo 11/06/2010, 04:04
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

Por mas que lo intento no me sale la deuda más alta.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LEE_CHAR(c)\
  6.         c=getchar();\
  7.         while((c=='\n') || (c==' ') || (c=='\t'))\
  8.             c=getchar();
  9.  
  10. #define LEE_CAD(c,n) { int i=0; \
  11.                      c[i]=getchar();\
  12.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  13.              while ((c[i]!='\n') && (i < (n-1))){ \
  14.                 i++;\
  15.             c[i]=getchar(); }\
  16.              c[i]='\0'; }
  17.  
  18. #define TAM_NOMBRE 100
  19. #define TAM_DIR 100
  20.  
  21. struct cliente{
  22.     char nombre[TAM_NOMBRE];
  23.         char direccion[TAM_DIR];
  24.         double deuda;
  25.         double mayor_deuda;
  26. };
  27. int main(){
  28.     void crear_fich();
  29.         void deuda_mayor();
  30.         char sel;
  31.     FILE *pf; //Puntero a fichero
  32.  
  33.         /* Abre el fichero para trabajar con él en Lectura / Escritura */
  34.         if((pf = fopen("datos.dat", "wb+")) == NULL) {/*"rb+"*/
  35.            /* Si no existe, ejecuta el módulo que lo cree */
  36.        crear_fich();
  37.        /* Una vez creado lo habre en lectura/escritura */
  38.            if((pf = fopen("datos.dat", "rb+")) == NULL) {
  39.         perror("Fichero no accesible");
  40.                 exit(1);
  41.        }
  42.         }
  43.  
  44.     do{
  45.         printf("MENÚ\n----\n");
  46.        
  47.         printf("1). Dar de alta un cliente.\n");
  48.                 printf("2). Mostrar la deuda mayor.\n");
  49.                 printf("3). salir y eliminar.\n");
  50.                 printf("0). Salir\n\nOpción(0-3): ");
  51.  
  52.         do{
  53.             LEE_CHAR(sel);
  54.         }while( (sel<'0') || (sel>'3') );
  55.  
  56.         switch(sel){
  57.                 case '1':{
  58.                         crear_fich(pf);
  59.                         /* Una vez creado lo abre en lectura/escritura */
  60.                         if((pf = fopen("datos.dat", "rb+")) == NULL) {
  61.                         perror("Fichero no accesible");
  62.                                 exit(2);
  63.                         }
  64.                     break;}
  65.                                 case '2':{ deuda_mayor(pf);
  66.                                         break;}
  67.                                 case '3':{ fclose(pf); pf=NULL; remove("datos.dat"); sel= '0';
  68.                     break;}
  69.                 } //switch
  70.     }while(sel!='0');
  71.  
  72.     exit(0);
  73. }//main()
  74. ////////////////////////////////////////
  75. void crear_fich(FILE* pf) {
  76.          struct cliente cli;
  77.          char otro;
  78.  
  79.      if((pf = fopen("datos.dat", "ab")) == NULL) {
  80.         perror("Al crear el fichero de datos");
  81.                 exit(2);
  82.          }
  83.          
  84.          /* Lectura de los ciclistas */
  85.          do {
  86.        
  87.         cli.deuda = 0.0;
  88.                 printf("Nombre: "); LEE_CAD(cli.nombre, TAM_NOMBRE);
  89.                 printf("Dirección: "); LEE_CAD(cli.direccion, TAM_DIR);
  90.                 printf("Deuda: "); scanf("%lf", &cli.deuda);
  91.                 /*Escribe el cliente en el fichero */
  92.                 fwrite(&cli, sizeof(struct cliente), 1, pf);
  93.         printf("¿Otro? (s/n) ");
  94.                 LEE_CHAR(otro);
  95.         }while((otro=='s') || (otro=='S'));
  96.     if(fclose(pf) == EOF){
  97.         printf("Error al cerrar el fichero, compruebe si hay información.\n"); 
  98.                 exit(3);
  99.         }
  100. } /* crear_fich()*/
  101. //////////////////////////////////
  102. void deuda_mayor(FILE *pf){
  103.         struct cliente cli;
  104.          
  105.         int mayor_deuda;
  106.         double deuda;
  107.        
  108.         if((pf=fopen("datos.dat","rb"))==NULL){
  109.            printf("Error al abrir el fichero.\n");
  110.            exit(3);
  111.         }    
  112.         fread(&cli,sizeof(struct cliente),1,pf);
  113.         while(!feof(pf)){
  114.            fread(&cli,sizeof(struct cliente),1,pf);
  115.            if(cli.deuda > cli.mayor_deuda);
  116.               deuda=mayor_deuda;
  117.         }
  118.         if(fclose(pf) == EOF){
  119.         printf("Error al cerrar el fichero, compruebe si hay información.\n"); 
  120.                 exit(4);
  121.         }
  122.         printf("%s %.2lf\n",cli.nombre,cli.deuda);
  123. }

Cuando compilo no me sale la deuda más alta.

Nombre: ana
Dirección: sss
Deuda: 500.55
¿Otro? (s/n) s
Nombre: pepe
Dirección: ddd
Deuda: 100.45
¿Otro? (s/n) s
Nombre: lola
Dirección: ppp
Deuda: 10.21
¿Otro? (s/n) n
Resultado: lola 10.21
------------------------------------------
Nombre: pepe
Dirección: sss
Deuda: 10.21
¿Otro? (s/n) s
Nombre: ana
Dirección: ooo
Deuda: 500.55
¿Otro? (s/n) s
Nombre: dani
Dirección: ttt
Deuda: 96.32
¿Otro? (s/n) n
Resultado: dani 96.32
**********************************************
Nombre: pepe
Dirección: ddd
Deuda: 100.55
¿Otro? (s/n) s
Nombre: ana
Dirección: lll
Deuda: 200.74
¿Otro? (s/n) s
Nombre: dani
Dirección: ooo
Deuda: 500.55
¿Otro? (s/n) n
Resultado: dani 500.55
  #6 (permalink)  
Antiguo 11/06/2010, 05:49
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: imprimir la deuda mayor de un cliente

linea 115, el "punto y coma" al final de la linea hace que el if haga nada y la asignacion de la linea 116 se hace siempre. Es eso lo que quieres?
  #7 (permalink)  
Antiguo 11/06/2010, 06:31
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

He quitado el ; , pero sigue sin funcionar ¿por qué?
  #8 (permalink)  
Antiguo 11/06/2010, 12:17
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: imprimir la deuda mayor de un cliente

La variable mayor_deuda, que usas en la linea 116, en que parte le has asignado un valor antes?
Pareciera, entonces, estar hecho al revés, sobre variables que no usas ni antes ni después.
  #9 (permalink)  
Antiguo 12/06/2010, 05:22
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

He intentado hacerlo de otra manera:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LEE_CHAR(c)\
  6.         c=getchar();\
  7.         while((c=='\n') || (c==' ') || (c=='\t'))\
  8.             c=getchar();
  9.  
  10. #define LEE_CAD(c,n) { int i=0; \
  11.                      c[i]=getchar();\
  12.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  13.              while ((c[i]!='\n') && (i < (n-1))){ \
  14.                 i++;\
  15.             c[i]=getchar(); }\
  16.              c[i]='\0'; }
  17.  
  18. #define TAM_NOMBRE 100
  19.  
  20.  
  21. struct cliente{
  22.     char nombre[TAM_NOMBRE];
  23.         double deuda;
  24. };
  25. int main(){
  26.   void alta();
  27.   void mostrar_todo();
  28.   void deuda_mayor();
  29.   char op;
  30.   FILE * pf;
  31.  
  32.   if((pf = fopen("datos.dat", "wb")) == NULL) {/*"rb+"*/
  33.            /* Si no existe, ejecuta el módulo que lo cree */
  34.        alta();
  35.  
  36.       if((pf = fopen("clientes.dat", "rb")) == NULL) {
  37.         perror("Fichero no accesible");
  38.                 exit(1);
  39.       }
  40.   }
  41.  
  42.   do{
  43.         printf("MENÚ\n----\n");
  44.        
  45.         printf("1). Dar de alta un cliente.\n");
  46.                 printf("2). Mostrar todo.\n");
  47.                 printf("3). Deuda mayor.\n");
  48.                 printf("4). salir y eliminar.\n");
  49.                 printf("0). Salir\n\nOpción(0-4): ");
  50.  
  51.                 do{
  52.             LEE_CHAR(op);
  53.         }while( (op < '0') || (op >'4') );
  54.  
  55.         switch(op){
  56.                     case '1': alta(pf); break;
  57.                     case '2': mostrar_todo(pf); break;
  58.                     case '3': deuda_mayor(pf); break;
  59.                     case '4':{ fclose(pf); pf=NULL; remove("clientes.dat"); op= '0';
  60.                     break;}
  61.         }
  62.   }while(op != '0');
  63.  
  64.     exit(0);
  65. }//main()
  66. //////////////////////////////////////////////////////////          
  67. void alta(FILE *pf){
  68.       struct cliente cli;
  69.       int fin;
  70.  
  71.   if((pf = fopen("clientes.dat", "wb")) == NULL) {
  72.         printf("Error al crear el fitxer\n");
  73.     }
  74.     else {
  75.         fin = 1; /* Termina con fin == 0 */
  76.  
  77.  
  78.         while ( fin ) {
  79.             printf ("Nombre del cliente: ");
  80.             LEE_CAD(cli.nombre,TAM_NOMBRE);
  81.                         printf ("Deuda: ");
  82.                         scanf("%lf",&cli.deuda);
  83.             fwrite(&cli,1,sizeof cli,pf);
  84.             printf("Otro (0--> NO, 1--> SI)? ");
  85.             scanf("%d",&fin);
  86.         }
  87.         if (fclose(pf))
  88.             printf("Error al guardar el fichero\n");
  89.     }
  90. }
  91. /////////////////////////////////////////////
  92. void mostrar_todo(FILE *pf){
  93.        struct cliente cli;
  94.  
  95.        if((pf = fopen("clientes.dat", "rb")) == NULL) {
  96.     printf("Error al abrir el fichero clientes.dat\n");
  97.        }
  98.        else{
  99.      
  100.     fread(&cli, 1, sizeof cli, pf);
  101.         while (!feof(pf)){
  102.         printf("%s  %.2lf\n", cli.nombre, cli.deuda);
  103.         fread(&cli,1, sizeof cli,pf);
  104.         }
  105.         fclose(pf);
  106.   }
  107. }
  108. //////////////////////////////////
  109. void deuda_mayor(FILE * pf){
  110.         struct cliente max,cli;
  111.  
  112.         if((pf = fopen("clientes.dat", "rb")) == NULL) {
  113.     printf("Error al abrir el fichero clientes.dat\n");
  114.         }
  115.         else{
  116.              fread(&max,1,sizeof cli,pf);/*supongo que el primero es el mayor*/
  117.              while(!feof(pf)){
  118.                 if(max.deuda < cli.deuda)/*si es mayor que el actual lo cambia*/
  119.                    max=cli;
  120.                 fread(&cli,1,sizeof cli,pf);
  121.              }
  122.         }
  123.         fclose(pf);
  124.         printf("%s %.2lf\n",cli.nombre,cli.deuda);
  125. }

Cuando compilo introduzco los datos de dos clientes, si la deuda del primer cliente es menor que la del segundo me muestra la deuda del segundo que es la más alta. Sin embargo, si la deuda del primero es mayor que la del segundo me muestra la del segundo que es la más pequeña. ¿Puede alguien decirme por qué me pasa esto?, ¿dónde está el fallo?. Espero que me podáis dar una solución efectiva. Gracias.
  #10 (permalink)  
Antiguo 12/06/2010, 15:30
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: imprimir la deuda mayor de un cliente

Linea 119. Asignas la variable "max", pero nunca la usas.
  #11 (permalink)  
Antiguo 13/06/2010, 04:15
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

No entiendo por qué dices que no la uso si la declaro en la línea 110 struct cliente max. De todas formas, como utiliza la variable max para que el programa funcione correctamente. Gracias.
  #12 (permalink)  
Antiguo 13/06/2010, 05:52
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

Gracias, ya me ha salido tenías razón en el printf la variable max no la estaba usando la he puesto y me funciona perfectamente. Muchas gracias.
  #13 (permalink)  
Antiguo 13/06/2010, 06:54
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

Si en el mismo subprograma quiero sacar además de la deuda más alta, la más pequeña ¿cómo lo hago?. He intentado hacerlo igual que para buscar la mayor, pero no me sale.

Código C:
Ver original
  1. void deuda_mayor(FILE * pf){
  2.        
  3.         struct cliente max;
  4.         struct cliente cli;
  5.         struct cliente menor;
  6.  
  7.       if((pf = fopen("clientes.dat", "rb")) == NULL) {
  8.     printf("Error al abrir el fichero clientes.dat\n");
  9.         }
  10.         else{
  11.              fread(&max,1,sizeof cli,pf);/*supongo que el primero es el mayor*/
  12.              while(!feof(pf)){
  13.                 fread(&cli,1,sizeof cli,pf);
  14.                 if(max.deuda < cli.deuda)/*si es mayor que el actual lo cambia*/
  15.                    max=cli;
  16.              }
  17.              fread(&menor,1,sizeof cli,pf);/*supongo que el primero es el mayor*/
  18.              while(!feof(pf)){
  19.                 fread(&cli,1,sizeof cli,pf);
  20.                 if(menor.deuda < cli.deuda)/*si es mayor que el actual lo cambia*/
  21.                    menor=cli;
  22.              }
  23.         }
  24.         fclose(pf);
  25.  
  26.         printf("%s %.2lf\n",max.nombre,max.deuda);
  27.         printf("%s %.2lf\n",menor.nombre,menor.deuda);
  28. }

Cuando lo compilo este es el resultado:
Muestro los datos:
pepe 100.21
ana 200.74
lola 21.32
julio 25.33
Deuda mayor y menor:
ana 200.74
-0.00
¿Por qué la deuda más pequeña no me la saca?.
  #14 (permalink)  
Antiguo 13/06/2010, 07:27
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: imprimir la deuda mayor de un cliente

Si haces copy-paste del codigo, y cambias el nombre de las variables, deberia resultar lo mismo, que es lo que te ocurre.
Haz un cambio en la lógica para obtener cosas distintas.

Ademas, si lees 2 veces el archivo, lo tienes que cerrar para volver a leerlo. Mejor es: leer 1 vez un registro, usando fread() y luego usar logica para establecer el valor de tus variables.
  #15 (permalink)  
Antiguo 13/06/2010, 08:13
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: imprimir la deuda mayor de un cliente

Se me ha ocurrido hacer esto, pero me imprime la deuda más alta 2 veces.

Código C:
Ver original
  1. void deuda_mayor(FILE * pf){
  2.        
  3.         struct cliente max,menor;
  4.         struct cliente cli;
  5.        
  6.  
  7.       if((pf = fopen("clientes.dat", "rb")) == NULL) {
  8.     printf("Error al abrir el fichero clientes.dat\n");
  9.         }
  10.         else{
  11.              fread(&max,1,sizeof cli,pf);/*supongo que el primero es el mayor*/
  12.              while(!feof(pf)){
  13.                 fread(&cli,1,sizeof cli,pf);
  14.                 if(max.deuda < cli.deuda)
  15.                   max=cli;
  16.              }
  17.         }
  18.         fclose(pf);
  19.  
  20.         printf("%s %.2lf\n",max.nombre,max.deuda);
  21.  
  22.         if((pf = fopen("clientes.dat", "rb")) == NULL) {
  23.     printf("Error al abrir el fichero clientes.dat\n");
  24.         }
  25.         else{
  26.              fread(&menor,1,sizeof cli,pf);/*supongo que el primero es el mayor*/
  27.              while(!feof(pf)){
  28.                 fread(&cli,1,sizeof cli,pf);
  29.                 if(menor.deuda < cli.deuda)
  30.                   menor=cli;
  31.              }
  32.         }
  33.         fclose(pf);  
  34.                
  35.         printf("%s %.2lf\n",menor.nombre,menor.deuda);
  36. }

Ya no se qué hacer, ¿cómo lo harías tu?, he probado todas las maneras posibles y nada.

Etiquetas: cliente, mayor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:32.