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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  buscar deuda mayor
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: buscar deuda mayor  (Leído 6,388 veces)
minette1988

Desconectado Desconectado

Mensajes: 53


Ver Perfil
buscar deuda mayor
« en: 7 Junio 2010, 15:44 pm »

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.

Código
  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. 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[NUM_CLIENTES];
  76.         int i=0;
  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[i].deuda = 0.0;
  88.                printf("Nombre: "); LEE_CAD(cli[i].nombre, TAM_NOMBRE);
  89.                printf("Dirección: "); LEE_CAD(cli[i].direccion, TAM_DIR);
  90.                printf("Deuda: "); scanf("%lf", &cli[i].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.        int i=0;
  105.        int deuda_mayor;
  106.        deuda_mayor=0;
  107.        for(i=0; i<NUM_CLIENTES; i++){
  108.            rewind(pf);
  109.            fread(&cli,sizeof(struct cliente),1,pf);
  110.            while(!feof(pf)){
  111.                for(i=1; i<NUM_CLIENTES; i++){
  112.                   if(cli[i].deuda > cli[deuda_mayor].deuda);
  113.                      deuda_mayor=i;
  114.                }
  115.            }
  116.            printf("%s %.2lf\n", cli[deuda_mayor].nombre,cli[deuda_mayor].deuda);
  117.        }
  118. }

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






« Última modificación: 8 Junio 2010, 20:37 pm por minette1988 » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: buscar deuda mayor
« Respuesta #1 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?

Código
  1.           if(cli.deuda > cli[deuda_mayor].deuda);
  2.              deuda_mayor=cli.deuda;

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

Saludos


En línea

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

Desconectado Desconectado

Mensajes: 290

¡La verdad os hará libres!


Ver Perfil WWW
Re: buscar deuda mayor
« Respuesta #2 en: 7 Junio 2010, 22:35 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?

Código
  1.           if(cli.deuda > cli[deuda_mayor].deuda);
  2.              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
  1. if(cli.deuda > cli[deuda_mayor].deuda) deuda_mayor = cli.deuda;

o

Código
  1. if(cli.deuda > cli[deuda_mayor].deuda)
  2. {
  3. deuda_mayor = cli.deuda;
  4. }

Saludos :P
« Última modificación: 1 Septiembre 2010, 19:29 pm por Horricreu » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: buscar deuda mayor
« Respuesta #3 en: 7 Junio 2010, 22:39 pm »

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

Saludos!
En línea

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

Desconectado Desconectado

Mensajes: 290

¡La verdad os hará libres!


Ver Perfil WWW
Re: buscar deuda mayor
« Respuesta #4 en: 7 Junio 2010, 22:40 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
« Última modificación: 18 Julio 2010, 18:15 pm por Horricreu » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: buscar deuda mayor
« Respuesta #5 en: 7 Junio 2010, 23:41 pm »

Citar
Ok. 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  :)
« Última modificación: 8 Junio 2010, 18:25 pm por Littlehorse » En línea

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

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: buscar deuda mayor
« Respuesta #6 en: 8 Junio 2010, 12:55 pm »

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.
En línea

nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: buscar deuda mayor
« Respuesta #7 en: 8 Junio 2010, 14:55 pm »

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.

Código:
double deuda_mayor = 0.0;
...
cli[deuda_mayor].nombre, ...

Salu10.
« Última modificación: 8 Junio 2010, 15:29 pm por nicolas_cof » En línea

minette1988

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: buscar deuda mayor
« Respuesta #8 en: 8 Junio 2010, 15:56 pm »

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.
En línea

nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: buscar deuda mayor
« Respuesta #9 en: 8 Junio 2010, 16:01 pm »

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.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Deuda privada convertida en deuda publica
Foro Libre
crazykenny 2 2,877 Último mensaje 16 Abril 2011, 19:01 pm
por ignorantev1.1
Deuda española,prima de riesgo,españa va mal.
Foro Libre
Anonymous250 3 2,994 Último mensaje 1 Diciembre 2011, 00:54 am
por Last_
¿Qué buscar a la hora de comprar un móvil para una persona mayor?
Noticias
wolfbcn 0 1,214 Último mensaje 29 Marzo 2016, 21:50 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines