Ver Mensaje Individual
  #9 (permalink)  
Antiguo 12/06/2010, 05:22
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
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.