Sábado 14 de Diciembre de 2024, 22:37
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
) »
Problema Ordenacion Ficheros
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Problema Ordenacion Ficheros (Leído 1330 veces)
lorekilia
Nuevo Miembro
Mensajes: 2
Problema Ordenacion Ficheros
«
en:
Jueves 22 de Mayo de 2008, 09:51 »
0
Hola, a ver si me pueden ayudar con un problema al ordenar un fichero. Es la primera vez que lo hago y no tengo mucha idea la verdad. Quiero crear un fichero de control de los viajantes de una empresa para cada registro se controlaran el dni (8 digitos), nombre y apellidos,antiguedad, kms realizados e importe total de las ventas. El de crear los registros creo que lo he hecho bien solo que nose como hacer para que el dni solo tenga 8 digitos (si me lo pueden decir les estaria muy agradecida) y luego quiero hacer otro programa para que saque un listado ordenado de menor a mayor de los diez viajantes que mas han vendido.El codigo que he hecho para ordenarlos me compila pero no me va y ya nose como hacerlo y seguramente lo he hecho fatal
Echenme una mano porfavor. Les dejo los codigos que tengo:
Código: Text
Creacion de registros al azar:
//creacion registros al azar
#include <iostream.h>
#include <map.h>
#include<stdio.h>
#include <time.h>
#include<conio.h>
using namespace std;
typedef unsigned int direc;
typedef unsigned int dni;
void inserta(map<dni,direc,less<dni> >&,dni,direc);
void buscar(map<dni,direc,less<dni> >,dni,direc &);
void guarda(map<dni,direc,less<dni> >);
void creacion(map<dni,direc,less<dni> >&,int cuantos);
FILE *pclave;
FILE *datos;
FILE *indice;
FILE * lapila;
typedef struct ficha
{
dni clave;
char apellido[40];
char nombre [30];
int antiguedad;
int kms;
int importe;
}PERSONA;
void main (void)
{
randomize();
clrscr();
int max;
dni busc;
direc registro;
PERSONA tmp;
lapila=fopen("lapila.txt","w+b");
fclose(lapila);
datos=fopen("datos.txt","w+b");
map<dni, direc, less<dni> > m;
map<dni, direc, less<dni> >::iterator pos;
cout <<"cuantos registros deseas crear?:"<<endl;
cin >> max;
creacion(m,max);
indice=fopen("indice.txt","w+b");
fprintf(indice,"%d %d\n",max,0);
fclose(indice);
guarda(m);
fclose(datos);
fclose(indice);
fclose(pclave);
}// fin de main
void inserta(map<dni,direc,less<dni> >& m,dni alfa,direc beta)
{
m.insert(pair<dni,direc>(alfa,beta));
} // fin de inserta
void buscar(map<dni,direc,less<dni> > m,dni alfa,direc & registro)
{
map<dni, direc, less<dni> >::iterator i;
map<dni, direc, less<dni> >::iterator j;
i=m.find(alfa);
if (i!=m.end())
registro= (*i).second;
else
registro= 0;
} // fin de busca
void guarda(map<dni,direc,less<dni> > m)
{
map<dni, direc, less<dni> >::iterator inicio,final;
inicio=m.begin();
final=m.end();
pclave=fopen("claves.txt","w+b");
for(inicio=m.begin();inicio!=m.end();inicio++)
fprintf(pclave,"%d %d\n",(*inicio).first,(*inicio).second);
} // fin de guarda
void creacion(map<dni,direc,less<dni> >& m,int cuantos)
{
dni d1;
direc d2;
int t;
PERSONA tmp;
char nom[10][30]={"Jose","David","Pedro","Maria","Carlos","Susana","Vicente","Manuel","Sergio","Ana"};
char apel[10][30]={"Garcia","Gonzalez","Martinez","Perez","Alvarez","Gimeno","Vazquez","Madrid","Rodriguez","Calvo"};
// Introducción de elementos
cout <<"creando....."<< endl;
for (t=1;t<=cuantos;t++)
{
do
{
d1=random(99000000)+ 1;
d2=t;
}while (m.find(d1)!=m.end());
// inserto en el mapa
inserta (m,d1,t);
// inserto en el archivo
strcpy(tmp.nombre,nom[random(10)]);
strcpy(tmp.apellido,apel[random(10)]);
tmp.antiguedad=random(40)+1;
tmp.kms=random(5000)+200;
tmp.importe=random(800)+20;
tmp.clave=d1;
fseek(datos,(d2-1)*sizeof(PERSONA),0);
fwrite(&tmp,sizeof(PERSONA),1,datos);
//if (d1 % 100000==0)
// cout << d1<<endl;
}
cout <<"creado...."<<endl;
} // fin de creacion
Ordenacion de los diez viajantes que mas han vendido de menor a mayor:
Código: Text
#include <stdio.h>
#include <conio.h>
//ordenacion
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include <map>
#include<time.h>
#define numreg 10000
#define max 10
using namespace std;
typedef struct ficha
{
int dni;
char apellido[30];
char nombre [30];
int antiguedad;
int kms;
int importe;
}PERSONA;
typedef multimap< float, int, greater<float> > ventas;
FILE * lapila;
main()
{
PERSONA datos;
ventas ordenado;
ventas :: iterator pos;
float venta;
int reg;
clock_t q1,q2;
lapila = fopen("lapila.txt","r+b");
// tomamos tpos de ordenacion = llenado del mapa
q1=clock();
for (reg=1;reg<=10;reg++)
{
fseek(lapila,(reg-1)*sizeof(datos),0);
fread(&datos,sizeof(datos),1,lapila);
venta =(datos.importe);
ordenado.insert(pair<float,int>(venta,reg));
}
q2=clock();
cout <<"tipo de ordenaciones:"<<(q2-q1)/CLK_TCK;
getch();
clrscr();
for (pos = ordenado.begin (); pos!= ordenado.end(); pos ++)
{
reg=(*pos).second;
fseek(lapila,(reg-1)*sizeof(datos),0);
fread(&datos,sizeof(datos),1,lapila);
cout.width(12);
cout.setf(ios::left);
cout << "Nombre:";
cout.width(10);
cout.setf(ios::left);
cout<<datos.nombre;
cout.width(10);
cout<<"importe:";
cout.width(6);
cout.precision(2);
cout<<(*pos).first;
cout.width(4);
cout<<"Reg:";
cout<<reg;
cout<<endl;
}
fclose(lapila);
}
Tweet
carmamezo
Miembro MUY activo
Mensajes: 232
Re: Problema Ordenacion Ficheros
«
Respuesta #1 en:
Jueves 22 de Mayo de 2008, 10:13 »
0
Hola,
para conseguir que el DNI ocupe 8 caracteres recógelo como un char dni [8], luego si quieres puedes convertirlo a int con un atoi()...
Para ordenar los registros por ventas no tienes más remedio que recorrer todos los registros y quedarte con aquellos que más importe tengan... En el código que has dejado sólo lees los 10 primeros registros creo, pero no tienen por qué ser los 10 con más ventas, a no ser que al guardar los registros lo hagas con una ordenación por ventas...
Creo que en este caso te puede ayudar bastante el uso de listas/pilas/colas, crear una pila de 10 estructuras y guardar en ella los registros ordenados por ventas, vas leyendo todas las estructuras y aquellas que tienen mayor importe las introduces en tu pila. Con este método es fácil insertar estructuras en medio, eliminar estructuras que al principio podían estar dentro de las 10 primeras pero que luego han caído... tendrás que redefinir el programa de ordenación si quieres usar este método.
Un saludo,
No hay tonto más molesto que el ingenioso.
lorekilia
Nuevo Miembro
Mensajes: 2
Re: Problema Ordenacion Ficheros
«
Respuesta #2 en:
Jueves 22 de Mayo de 2008, 23:07 »
0
Muchas gracias por tu respuesta, me voy a poner manos a la obra a ver si me sale bien, tengo ya ganas de que me salga
Un saludo y muchas gracias de nuevo
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problema Ordenacion Ficheros