Autor
|
Tema: ordenar por nombre o deuda con la función qsort (Leído 3,575 veces)
|
minette1988
Desconectado
Mensajes: 53
|
El siguiente programa ordena los nombres alfabéticamente usando qsort, lo que quiero es mediante un switch darle la opción de ordenar por el nombre u ordenar por la deuda. Lo he intentado varias veces y no me sale. Este es el código: /* Programa de ejemplo de gestió de memoria dinámica. El programa tomará los registros de un fichero y reservará la memoria necesaria para poder guardarlos en memoria y ordenarlos con el qsort(), una vez ordenados los volverá a guardar en el fichero */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* macro para leer cadenas con caracteres blanco filtrando los return y blancos iniciales */ #define lee_cad(cad,n,fin) cad[0]=getchar(); \ while(((int)cad[0] == 10) || ((int)cad[0] == 32)) \ cad[0]=getchar();\ n=0; \ while(((int)cad[n]!= 10) && (n < fin)){ \ n++; cad[n]=getchar();} \ cad[n]='\0'; struct registro{ char nombre[50]; float deuda; }; int main(){ FILE * df; struct registro cliente; int i,fin; char op; int num_registros; struct registro *punt_memoria; int compara(); if((df =fopen("apuestas.dat","wb")) == NULL ){ printf("\nError al crear el fichero apuestas.dat\n"); } do{ printf("Nombre del apostante: "); lee_cad(cliente.nombre,i,50); //scanf("%49s",cliente.nombre); scanf("%f",&cliente. deuda); fwrite(&cliente ,sizeof(cliente ),1,df ); printf("Otro(0 --> No / 1 --> Sí) "); } while(fin!=0); if((df =fopen("apuestas.dat","rb")) == NULL ){ printf("\nError al abrir el fichero apuestas.dat\n"); } /* Para ver cuantos registros hay en el fichero, pongo el puntero al final, obtengo su posición y divido por el tamaño del registro */ num_registros = ftell(df )/sizeof(cliente ); /* Reservo la memoria necesaria para estos registros */ punt_memoria = (struct registro *)calloc(num_registros , sizeof(cliente )); /* Leo los registro del fichero y los guardo en memoria */ rewind(df ); /* Llego el descriptor de fichero al principio */ /* Leo todos los registros y los guardo en la zona reservada de memoria */ fread(punt_memoria ,sizeof(cliente ),num_registros ,df ); /* Ordeno el vector con qsort() */ qsort(punt_memoria ,num_registros ,sizeof(cliente ),compara ); /* Guarda los registros ordenados en el fichero */ if((df =fopen("apuestas.dat","wb")) == NULL ){ printf("\nError al crear el fichero apuestas.dat\n"); } fwrite(punt_memoria ,sizeof(cliente ),num_registros ,df ); /* Mostrar el contenido del fichero ordenado */ if((df =fopen("apuestas.dat","rb")) == NULL ){ printf("\nError al abrir el fichero apuestas.dat\n"); } fread(punt_memoria ,sizeof(cliente ),num_registros ,df ); for(i=0; i < num_registros; i++) printf("%s %.1f\n",(punt_memoria +i )->nombre , (punt_memoria +i )->deuda ); } /* main() */ /* La función compara usa strcmp para ordenar alfabéticamente el fichero */ int compara(struct registro *r1, struct registro *r2){ return(strcmp(r1 ->nombre , r2 ->nombre )); }
|
|
|
En línea
|
|
|
|
nicolas_cof
Desconectado
Mensajes: 348
Into the Wild
|
int main() { ... int compara(); ... Los prototipos de las funciones se declaran fuera de la funcion main() Y el macro lee_cad() no hace quedar a tu codigo muy ordenado que digamos... Salu10.
|
|
|
En línea
|
|
|
|
Gallu
Desconectado
Mensajes: 247
|
Pues a simple vista diria que lo único que tienes que hacer es implementar un compara para los floats ejem. int compara_deuda(struct registro *r1, struct registro *r2){ return(r1->deuda > r2->deuda )); }
y pasarselo al qsort donde corresponda qsort(punt_memoria ,num_registros ,sizeof(cliente ),compara_deuda );
ya me diras si te funciona ... Lo siguiente ordena por deuda de manera ascendente /* Programa de ejemplo de gestió de memoria dinámica. El programa tomará los registros de un fichero y reservará la memoria necesaria para poder guardarlos en memoria y ordenarlos con el qsort(), una vez ordenados los volverá a guardar en el fichero */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* macro para leer cadenas con caracteres blanco filtrando los return y blancos iniciales */ #define lee_cad(cad,n,fin) cad[0]=getchar(); \ while(((int)cad[0] == 10) || ((int)cad[0] == 32)) \ cad[0]=getchar();\ n=0; \ while(((int)cad[n]!= 10) && (n < fin)){ \ n++; cad[n]=getchar();} \ cad[n]='\0'; struct registro{ char nombre[50]; float deuda; }; /* Prototipos de procedimientos */ int compara_float(); int compara(); int main(){ FILE * df; struct registro cliente; int i,fin; char op; int num_registros; struct registro *punt_memoria; if((df =fopen("apuestas.dat","wb")) == NULL ){ printf("\nError al crear el fichero apuestas.dat\n"); } do{ printf("Nombre del apostante: "); lee_cad(cliente.nombre,i,50); //scanf("%49s",cliente.nombre); scanf("%f",&cliente. deuda); fwrite(&cliente ,sizeof(cliente ),1,df ); printf("Otro(0 --> No / 1 --> Sí) "); } while(fin!=0); if((df =fopen("apuestas.dat","rb")) == NULL ){ printf("\nError al abrir el fichero apuestas.dat\n"); } /* Para ver cuantos registros hay en el fichero, pongo el puntero al final, obtengo su posición y divido por el tamaño del registro */ num_registros = ftell(df )/sizeof(cliente ); /* Reservo la memoria necesaria para estos registros */ punt_memoria = (struct registro *)calloc(num_registros , sizeof(cliente )); /* Leo los registro del fichero y los guardo en memoria */ rewind(df ); /* Llego el descriptor de fichero al principio */ /* Leo todos los registros y los guardo en la zona reservada de memoria */ fread(punt_memoria ,sizeof(cliente ),num_registros ,df ); /* Ordeno el vector con qsort() */ qsort(punt_memoria ,num_registros ,sizeof(cliente ),compara_float ); /* simplemante cambias el parámetro con el nuevo tipo de ordenación */ /* Guarda los registros ordenados en el fichero */ if((df =fopen("apuestas.dat","wb")) == NULL ){ printf("\nError al crear el fichero apuestas.dat\n"); } fwrite(punt_memoria ,sizeof(cliente ),num_registros ,df ); /* Mostrar el contenido del fichero ordenado */ if((df =fopen("apuestas.dat","rb")) == NULL ){ printf("\nError al abrir el fichero apuestas.dat\n"); } fread(punt_memoria ,sizeof(cliente ),num_registros ,df ); for(i=0; i < num_registros; i++) printf("%s %.1f\n",(punt_memoria +i )->nombre , (punt_memoria +i )->deuda ); } /* main() */ /* La función compara usa strcmp para ordenar alfabéticamente el fichero */ int compara(struct registro *r1, struct registro *r2){ return(strcmp(r1 ->nombre , r2 ->nombre )); } int compara_float(struct registro *r1, struct registro *r2){ return(r1->deuda > r2->deuda); }
|
|
« Última modificación: 2 Junio 2010, 16:15 pm por Didacso »
|
En línea
|
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Deuda privada convertida en deuda publica
Foro Libre
|
crazykenny
|
2
|
2,687
|
16 Abril 2011, 19:01 pm
por ignorantev1.1
|
|
|
Problemas con qsort y bsearch
Programación C/C++
|
alt_369
|
2
|
1,862
|
19 Mayo 2013, 09:30 am
por alt_369
|
|
|
Ordenar por nombre y sueldo
Java
|
Baal_30
|
8
|
6,618
|
25 Marzo 2015, 13:16 pm
por Baal_30
|
|
|
qsort
Programación C/C++
|
Dato Vagabundo
|
1
|
1,824
|
26 Agosto 2016, 18:36 pm
por AlbertoBSD
|
|
|
[[RETO]] Funcion para ordenar, extraer e insertar en una pila
« 1 2 »
Programación C/C++
|
BlackDhampir
|
10
|
9,225
|
28 Octubre 2021, 16:22 pm
por Eternal Idol
|
|