Autor
|
Tema: buscar deuda mayor (Leído 6,284 veces)
|
minette1988
Desconectado
Mensajes: 53
|
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"); } } do{ 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"); } break;} case '2':{ deuda_mayor(pf); break;} case '3':{ fclose(pf ); pf =NULL ; remove("datos.dat"); sel = '0'; break;} } //switch }while(sel!='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"); } /* 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 ); /*Escribe el cliente en el fichero */ fwrite(&cli , sizeof(struct cliente ), 1, pf ); LEE_CHAR(otro); }while((otro=='s') || (otro=='S')); printf("Error al cerrar el fichero, compruebe si hay información.\n"); } } /* 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++){ fread(&cli ,sizeof(struct cliente ),1,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.
|
|
« Última modificación: 8 Junio 2010, 20:37 pm por minette1988 »
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
No hagas triple post! usa el botón modificar. 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
|
|
|
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
Mensajes: 290
¡La verdad os hará libres!
|
No hagas triple post! usa el botón modificar. 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: if(cli.deuda > cli[deuda_mayor].deuda) deuda_mayor = cli.deuda;
o if(cli.deuda > cli[deuda_mayor].deuda) { deuda_mayor = cli.deuda; }
Saludos
|
|
« Última modificación: 1 Septiembre 2010, 19:29 pm por Horricreu »
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
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
Mensajes: 290
¡La verdad os hará libres!
|
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
|
|
« Última modificación: 18 Julio 2010, 18:15 pm por Horricreu »
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
Ok. De nada, supongo 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
Mensajes: 53
|
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
Mensajes: 348
Into the Wild
|
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.
|
|
« Última modificación: 8 Junio 2010, 15:29 pm por nicolas_cof »
|
En línea
|
|
|
|
minette1988
Desconectado
Mensajes: 53
|
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
Mensajes: 348
Into the Wild
|
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
|
|
|
|
|
|