Domingo 22 de Diciembre de 2024, 13:00
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Ordenacion De Registros
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Ordenacion De Registros (Leído 3132 veces)
cybergatita
Miembro MUY activo
Mensajes: 154
Ordenacion De Registros
«
en:
Martes 13 de Junio de 2006, 20:52 »
0
Que tal compañeros!!!!
Alguien ah utilizado alguna función pre-definida para la ordenacion de registros trabajando con archivos en C++ y obviamente punteros.
en la imagen que anexo esta como estoy visualizando mis registros con los datos
los cuales quisiera ordenar alfabeticamente.
gracias chicos.
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
Tweet
tonilope
Miembro activo
Mensajes: 51
Re: Ordenacion De Registros
«
Respuesta #1 en:
Martes 13 de Junio de 2006, 21:28 »
0
Tienes la función
qsort()
->
http://c.conclase.net/librerias/funcion.php?fun=qsort
Salu2
cybergatita
Miembro MUY activo
Mensajes: 154
Re: Ordenacion De Registros
«
Respuesta #2 en:
Martes 13 de Junio de 2006, 21:51 »
0
Gracias la estoy checando.
tonilope
Miembro activo
Mensajes: 51
Re: Ordenacion De Registros
«
Respuesta #3 en:
Martes 13 de Junio de 2006, 21:55 »
0
Si te lías con ese ejemplo:
Salu2
bob esponja
Miembro MUY activo
Mensajes: 411
Re: Ordenacion De Registros
«
Respuesta #4 en:
Martes 13 de Junio de 2006, 23:07 »
0
ORDENAMIENTO!
cybergatita
Miembro MUY activo
Mensajes: 154
Re: Ordenacion De Registros
«
Respuesta #5 en:
Martes 13 de Junio de 2006, 23:11 »
0
gracias por su ayuda.
char nombre[50];
int digito[10];
void Listar2(long n, struct stRegistro *reg)
{
int i;
if(reg->valido!='S')
{
printf("[%6ld]%-50s",n,reg->nombre);
for(i=0;i<4;i++)
printf(",%4d",reg->digotp
);
printf("\n");
lo que yo quiero ordenar es el nombre del registro no los datos del registro
asi es como lo muestro
printf("Nombre digito\n");
while(fread(®, sizeof(struct stRegistro), 1, fa))
Listar(numero++, ®);
}while(!eof);
no se si me di entender y como veran algo novata, vdd:(
tonilope
Miembro activo
Mensajes: 51
Re: Ordenacion De Registros
«
Respuesta #6 en:
Miércoles 14 de Junio de 2006, 01:28 »
0
Hola. Por lo que puedo entender tienes un fichero con registros del tipo
struct stRegistro
y leyendo el código (incompleto) que has puesto intuyo que tienes definida una estructura así:
Código: Text
struct stRegistro
{
char nombre[50];
int digito;
};
Si esto es correcto y lo que pretendes es MOSTRAR por PANTALLA una lista del tipo:
Juan 1
Antonio 34
Rosa 7
Marcos 23
ETC...
ORDENADA alfabéticamente por el nombre:
Antonio 34
Juan 1
Marcos 23
Rosa 7
ETC...
TIENES que:
1) Declarar un array de tipo
struct stRegistro
para 10 (o los que necesites) elementos:
Código: Text
struct stRegistro array[10];
2) Leer TODOS los registros del fichero y cargarlos en el array
Código: Text
conta=0;
while (fread(&array[conta], 1, sizeof(struct stRegistro), puntero_fichero) > 0)
{
conta++;
}
3) Una vez tienes la lista cargada en el array, la ordenas:
Código: Text
qsort((void*)array, 10, sizeof(struct stRegistro), comparar);
4) Finalmente la muestras ordenada por pantalla:
Código: Text
for(conta=0; conta<10; conta++)
printf("\n%s\t%d", array[conta].nombre, array[conta].digito);
Ejemplo completo:
Código: Text
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM_ELEMENTOS 10
struct stRegistro
{
char nombre[50];
int digito;
};
int comparar(const void *, const void *);
int main(int argc, char **argv)
{
struct stRegistro array[NUM_ELEMENTOS];
int conta;
FILE *puntero_fichero;
puntero_fichero=fopen("fichero.dat", "rb");
conta=0;
while (fread(&array[conta], 1, sizeof(struct stRegistro), puntero_fichero) > 0)
{
conta++;
}
fclose(puntero_fichero);
printf("\n\nLa lista original:\n");
for(conta=0; conta<NUM_ELEMENTOS; conta++)
printf("\n%s\t%d", array[conta].nombre, array[conta].digito);
qsort((void*)array, NUM_ELEMENTOS, sizeof(struct stRegistro), comparar);
printf("\n\nLa lista ordenada:\n");
for(conta=0; conta<NUM_ELEMENTOS; conta++)
printf("\n%s\t%d", array[conta].nombre, array[conta].digito);
return 0;
}
int comparar(const void *arg1, const void *arg2)
{
return strcmp(((struct stRegistro*)arg1)->nombre, ((struct stRegistro*)arg2)->nombre);
}
Adjunto un fichero que he creado con 10 registros para probar este código.
Salu2
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
cybergatita
Miembro MUY activo
Mensajes: 154
Re: Ordenacion De Registros
«
Respuesta #7 en:
Miércoles 14 de Junio de 2006, 02:18 »
0
hola tonilope
estoy implementando tu ejemplo a mi codigo, pero tengo algo mal
angie_lozca@hotmail.com
saludos,
tonilope
Miembro activo
Mensajes: 51
Re: Ordenacion De Registros
«
Respuesta #8 en:
Miércoles 14 de Junio de 2006, 02:43 »
0
Pon aquí el problema que tengas.
Salu2
cybergatita
Miembro MUY activo
Mensajes: 154
Re: Ordenacion De Registros
«
Respuesta #9 en:
Miércoles 14 de Junio de 2006, 03:50 »
0
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <io.h>
struct stRegistro
{
char valido; //campo que indica si el registro es valido S->Valido, N->Invalido
char nombre[34];
int dato[4];
};
struct stRegistro array[5];
int comparar(const void *, const void *);
int Menu();
void Leer(struct stRegistro *reg);
void Mostrar(struct stRegistro *reg);
void Listar(long n,struct stRegistro *reg);
void Listar2(long n,struct stRegistro *reg);
long LeeNumero();
void Empaquetar(FILE **fa);
int main()
{
struct stRegistro reg;
FILE *fa;
int opcion;
long numero;
fa=fopen("alea.dat","r+b"); //este modo permite leer y escribir
if(!fa)fa=fopen("alea.dat","w+b"); //si el fichero no existe, lo crea
do
{
opcion=Menu();
switch(opcion)
{
case'1': //añadir registro
Leer(®);
//insertar al final;
fseek(fa,0,SEEK_END);
fwrite(®,sizeof(struct stRegistro),1,fa);
break;
case'2': //mostrar registro
clrscr();//system("cls");
printf("Mostrar registro:");
numero=LeeNumero();
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fread(®,sizeof(struct stRegistro),1,fa);
Mostrar(®);
break;
case'3': // eliminar registro
clrscr();//system("cls");
printf("Eliminar registro:");
numero=LeeNumero();
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fread(®,sizeof(struct stRegistro),1,fa);
reg.valido='N';
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fwrite(®,sizeof(struct stRegistro),1,fa);
break;
case'4': //mostrar todo
rewind(fa);
numero = 0;
//system("cls");
do{
clrscr();
printf("Nombre Calificacion\n");
while(fread(®, sizeof(struct stRegistro), 1, fa))
Listar(numero++, ®);
}while(!eof);
//system("PAUSE");
getch();
int conta=0;
while (fread(&array[conta], 1, sizeof(struct stRegistro), *reg) > 0)
{
conta++;
}
qsort((void*)array, 5, sizeof(struct stRegistro), comparar);
for(conta=0; conta<5; conta++)
printf("\n%s\t%d", array[conta].nombre, array[conta].dato);
getch();
break;
case'5': // eliminar marcados
Empaquetar(&fa);
break;
case'6':
rewind(fa);
numero=0;
clrscr();//system("cls");
printf("Nombre Datos\n");
while(fread(®,sizeof(struct stRegistro),1,fa));
Listar2(numero++,®);
getch(); //system("PAUSE");
break;
}
}while(opcion!='0');
fclose(fa);
return 0;
}
// Muestra un menu con las opciones disponibles y captura una opcion del usuario
int Menu()
{
char resp[20];
do
{
clrscr();//system("cls");
printf("MENU PRINCIPAL\n");
printf("--------\n\n");
printf("1-Insertar registro\n");
printf("2-Mostrar registro\n");
printf("3-Eliminar registro\n");
printf("4-Mostrar todo\n");
printf("5-Eliminar registro marcados\n");
printf("6-Mostrar lista de disponibles\n");
printf("0-Salir\n");
fgets(resp,20,stdin);
} while(resp[0]<'0'&&resp[0]>'6');
return resp[0];
}
// permite que el usuario introduzca un registro por pantalla
void Leer(struct stRegistro *reg)
{
int i;
char numero[6];
clrscr();// system("cls");
printf("Leer registro:\n\n");
reg->valido='S';
printf("Nombre:");
fgets(reg->nombre,34,stdin);
// la funcion fgets captura el retorno de linea, hay que eliminarlo:
for(i=strlen(reg->nombre)-1;i&®->nombre
<' ';i--)
reg->nombre
=0;
for(i=0;i<4;i++)
{
printf("Calificacion[%1d]:",i);
fgets(numero,6,stdin);
reg->dato
=atoi(numero);
}
}
// muestra un registro en pantalla, si no esta marcado como borrado
void Mostrar(struct stRegistro *reg)
{
int i;
clrscr();//system("cls");
if(reg->valido=='S')
{
printf("Nombre: %s\n",reg->nombre);
for(i=0;i<4;i++)
printf("Calificacion[%1d]:%d\n",i,reg->dato
);
}
i++;
getch();//system("PAUSE");
}
// muestra un registro por pantalla en forma de listado, si no esta marcado como borrado
void Listar2(long n, struct stRegistro *reg)
{
int i;
if(reg->valido!='S')
{
printf("[%6ld]%-34s",n,reg->nombre);
for(i=0;i<4;i++)
printf(",%4d",reg->dato
);
printf("\n");
}
}
void Listar(long n, struct stRegistro *reg)
{
int i;
if(reg->valido=='S')
{
printf("[%6ld]%-34s",n,reg->nombre);
for(i=0;i<4;i++)
printf(",%4d",reg->dato
);
printf("\n");
}
}
// lee un numero suministrado por el usuario
long LeeNumero()
{
char numero[6];
fgets(numero,6,stdin);
return atoi(numero);
}
// elimina los registros marcados como borrados
void Empaquetar(FILE**fa)
{
FILE*ftemp;
struct stRegistro reg;
ftemp=fopen("alea.tmp","wb");
rewind(*fa);
while(fread(®,sizeof(struct stRegistro),1,*fa));
if(reg.valido=='S')
fwrite(®,sizeof(struct stRegistro),1,ftemp);
fclose(ftemp);
fclose(*fa);
remove("alea.bak");
rename("alea.dat","alea.bak");
rename("alea.tmp","alea.dat");
*fa=fopen("alea.dat","r+b");
}
hola
aqui esta mi gran problema
gracias de antemano toni!!!!
cybergatita
Miembro MUY activo
Mensajes: 154
Re: Ordenacion De Registros
«
Respuesta #10 en:
Miércoles 14 de Junio de 2006, 04:08 »
0
en el case 4 trate de implementar lo que me comentaste. y me manda un error
delo contrario pues si corre:)
tonilope
Miembro activo
Mensajes: 51
Re: Ordenacion De Registros
«
Respuesta #11 en:
Miércoles 14 de Junio de 2006, 18:48 »
0
He hecho un par de correciones rápidas muy POR ENCIMA y funciona. Aquí te lo dejo:
Código: Text
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stRegistro
{
char valido; //campo que indica si el registro es valido S->Valido, N->Invalido
char nombre[34];
int dato[4];
};
int comparar(const void *, const void *);
int Menu();
void Leer(struct stRegistro *reg);
void Mostrar(struct stRegistro *reg);
void Listar(long n,struct stRegistro *reg);
long LeeNumero();
void Empaquetar(FILE **fa);
int main()
{
struct stRegistro reg;
struct stRegistro *array;
FILE *fa;
int opcion, total_registros;
long numero, conta;
fa=fopen("alea.dat","r+b"); //este modo permite leer y escribir
if(!fa)fa=fopen("alea.dat","w+b"); //si el fichero no existe, lo crea
do
{
opcion=Menu();
switch(opcion)
{
case'1': //añadir registro
Leer(®);
//insertar al final;
fseek(fa,0,SEEK_END);
fwrite(®,1,sizeof(struct stRegistro),fa);
break;
case'2': //mostrar registro
system("cls");//system("cls");
printf("Mostrar registro:");
numero=LeeNumero();
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fread(®,1,sizeof(struct stRegistro),fa);
Mostrar(®);
break;
case'3': // eliminar registro
system("cls");//system("cls");
rewind(fa);
total_registros=0;
system("cls");
printf("Nombre Calificacion\n");
while(fread(®,1, sizeof(struct stRegistro), fa)>0)
{
total_registros++;
}
array=(struct stRegistro*)malloc(total_registros*sizeof(struct stRegistro));
rewind(fa);
conta=0;
while(fread(&array[conta++],1, sizeof(struct stRegistro), fa)>0);
for(conta=0; conta<total_registros; conta++)
Listar(conta, &array[conta]);
free(array);
printf("Eliminar registro:");
numero=LeeNumero();
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fread(®,1,sizeof(struct stRegistro),fa);
reg.valido='N';
fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET);
fwrite(®,1,sizeof(struct stRegistro),fa);
break;
case'4': //mostrar todo
rewind(fa);
total_registros=0;
system("cls");
printf("Nombre Calificacion\n");
while(fread(®,1, sizeof(struct stRegistro), fa)>0)
{
total_registros++;
}
array=(struct stRegistro*)malloc(total_registros*sizeof(struct stRegistro));
rewind(fa);
conta=0;
while(fread(&array[conta++],1, sizeof(struct stRegistro), fa)>0);
qsort((void*)array, total_registros, sizeof(struct stRegistro), comparar);
for(conta=0; conta<total_registros; conta++)
Listar(conta, &array[conta]);
getch();
free(array);
break;
case'5': // eliminar marcados
Empaquetar(&fa);
break;
//NO entiendo para qué vale este case
/*
case'6':
rewind(fa);
numero=0;
system("cls");//system("cls");
printf("Nombre Datos\n");
while(fread(®,sizeof(struct stRegistro),1,fa));
Listar(numero++,®);
getch(); //system("PAUSE");
break;
*/
}
}while(opcion!='0');
fclose(fa);
return 0;
}
// Muestra un menu con las opciones disponibles y captura una opcion del usuario
int Menu()
{
char resp[20];
do
{
system("cls");//system("cls");
printf("MENU PRINCIPAL\n");
printf("--------\n\n");
printf("1-Insertar registro\n");
printf("2-Mostrar registro\n");
printf("3-Eliminar registro\n");
printf("4-Mostrar todo\n");
printf("5-Eliminar registro marcados\n");
printf("6-Mostrar lista de disponibles\n");
printf("0-Salir\n");
resp[0]=getch();
} while(resp[0]<'0'&&resp[0]>'6');
return resp[0];
}
// permite que el usuario introduzca un registro por pantalla
void Leer(struct stRegistro *reg)
{
int i;
char numero[6];
system("cls");// system("cls");
printf("Leer registro:\n\n");
reg->valido='S';
printf("Nombre:");
fgets(reg->nombre,34,stdin);
// la funcion fgets captura el retorno de linea, hay que eliminarlo:
for(i=strlen(reg->nombre)-1;i&®->nombre[i] <' ';i--)
reg->nombre[i]=0;
for(i=0;i<4;i++)
{
printf("Calificacion[%1d]:",i);
fgets(numero,6,stdin);
reg->dato[i]=atoi(numero);
}
}
// muestra un registro en pantalla, si no esta marcado como borrado
void Mostrar(struct stRegistro *reg)
{
int i;
system("cls");//system("cls");
if(reg->valido=='S')
{
printf("Nombre: %s\n",reg->nombre);
for(i=0;i<4;i++)
printf("Calificacion[%1d]:%d\n",i,reg->dato[i]);
}
i++;
getch();//system("PAUSE");
}
void Listar(long n, struct stRegistro *reg)
{
int i;
if(reg->valido=='S')
{
printf("[%6ld]%-34s",n,reg->nombre);
for(i=0;i<4;i++)
printf(",%4d",reg->dato[i]);
printf("\n");
}
}
// lee un numero suministrado por el usuario
long LeeNumero()
{
char numero[6];
fgets(numero,6,stdin);
return atoi(numero);
}
// elimina los registros marcados como borrados
void Empaquetar(FILE**fa)
{
FILE *ftemp;
struct stRegistro reg;
ftemp=fopen("alea.tmp","wb");
rewind(*fa);
while(fread(®,1,sizeof(struct stRegistro),*fa)>0)
{
if(reg.valido=='S')
fwrite(®,sizeof(struct stRegistro),1,ftemp);
}
fclose(ftemp);
fclose(*fa);
remove("alea.bak");
rename("alea.dat","alea.bak");
rename("alea.tmp","alea.dat");
*fa=fopen("alea.dat","r+b");
}
int comparar(const void *arg1, const void *arg2)
{
return strcmp(((struct stRegistro*)arg1)->nombre, ((struct stRegistro*)arg2)->nombre);
}
Salu2
cybergatita
Miembro MUY activo
Mensajes: 154
Re: Ordenacion De Registros
«
Respuesta #12 en:
Miércoles 14 de Junio de 2006, 23:10 »
0
Muchas gracias toni, ya lo implemente
ahora me falta añadirle un par de cosas mas a mi codigo, ya te contare como me fue
gracias de antemano a sus respuestas.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Ordenacion De Registros