• Viernes 29 de Marzo de 2024, 02:43

Autor Tema:  Problema Ordenacion Ficheros  (Leído 1258 veces)

lorekilia

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
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
  1. Creacion de registros al azar:
  2.  
  3. //creacion registros al azar
  4.  
  5. #include <iostream.h>
  6. #include <map.h>
  7. #include<stdio.h>
  8. #include <time.h>
  9. #include<conio.h>
  10. using namespace std;
  11. typedef unsigned int direc;
  12. typedef unsigned int dni;
  13. void inserta(map<dni,direc,less<dni> >&,dni,direc);
  14. void buscar(map<dni,direc,less<dni> >,dni,direc &);
  15. void guarda(map<dni,direc,less<dni> >);
  16. void creacion(map<dni,direc,less<dni> >&,int cuantos);
  17. FILE *pclave;
  18. FILE *datos;
  19. FILE *indice;
  20. FILE * lapila;
  21. typedef struct ficha
  22. {
  23.    dni clave;
  24.    char apellido[40];
  25.    char nombre [30];
  26.    int antiguedad;
  27.    int kms;
  28.    int importe;
  29. }PERSONA;
  30.  
  31. void main (void)
  32. {
  33. randomize();
  34. clrscr();
  35. int max;
  36. dni busc;
  37. direc registro;
  38. PERSONA tmp;
  39. lapila=fopen("lapila.txt","w+b");
  40. fclose(lapila);
  41. datos=fopen("datos.txt","w+b");
  42. map<dni, direc, less<dni> > m;
  43. map<dni, direc, less<dni> >::iterator pos;
  44. cout <<"cuantos registros deseas crear?:"<<endl;
  45. cin >> max;
  46. creacion(m,max);
  47. indice=fopen("indice.txt","w+b");
  48. fprintf(indice,"%d %d\n",max,0);
  49. fclose(indice);
  50. guarda(m);
  51. fclose(datos);
  52. fclose(indice);
  53. fclose(pclave);
  54.  
  55. }// fin de main
  56.  
  57. void inserta(map<dni,direc,less<dni> >& m,dni alfa,direc beta)
  58. {
  59.  m.insert(pair<dni,direc>(alfa,beta));
  60.  
  61. }  // fin de inserta
  62. void buscar(map<dni,direc,less<dni> > m,dni alfa,direc & registro)
  63. {
  64.  
  65.    map<dni, direc, less<dni> >::iterator i;
  66.    map<dni, direc, less<dni> >::iterator j;
  67.    i=m.find(alfa);
  68.  
  69.    if (i!=m.end())
  70.           registro= (*i).second;
  71.    else
  72.         registro= 0;
  73.  
  74.  
  75. } // fin de busca
  76.  
  77. void guarda(map<dni,direc,less<dni> > m)
  78. {
  79. map<dni, direc, less<dni> >::iterator inicio,final;
  80. inicio=m.begin();
  81. final=m.end();
  82. pclave=fopen("claves.txt","w+b");
  83. for(inicio=m.begin();inicio!=m.end();inicio++)
  84.   fprintf(pclave,"%d %d\n",(*inicio).first,(*inicio).second);
  85. } // fin de guarda
  86.  
  87. void creacion(map<dni,direc,less<dni> >& m,int cuantos)
  88. {
  89. dni d1;
  90. direc d2;
  91. int t;
  92. PERSONA tmp;
  93.  
  94. char nom[10][30]={"Jose","David","Pedro","Maria","Carlos","Susana","Vicente","Manuel","Sergio","Ana"};
  95. char apel[10][30]={"Garcia","Gonzalez","Martinez","Perez","Alvarez","Gimeno","Vazquez","Madrid","Rodriguez","Calvo"};
  96.  
  97. // Introducción de elementos
  98.    cout <<"creando....."<< endl;
  99.    for (t=1;t<=cuantos;t++)
  100.       {
  101.       do
  102.       {
  103.        d1=random(99000000)+ 1;
  104.          d2=t;
  105.       }while (m.find(d1)!=m.end());
  106.    // inserto en el mapa
  107.       inserta (m,d1,t);
  108.    // inserto en el archivo
  109.    strcpy(tmp.nombre,nom[random(10)]);
  110.    strcpy(tmp.apellido,apel[random(10)]);
  111.    tmp.antiguedad=random(40)+1;
  112.    tmp.kms=random(5000)+200;
  113.    tmp.importe=random(800)+20;
  114.    
  115.    tmp.clave=d1;
  116.    fseek(datos,(d2-1)*sizeof(PERSONA),0);
  117.   fwrite(&tmp,sizeof(PERSONA),1,datos);
  118.    //if (d1 % 100000==0)
  119.    //    cout << d1<<endl;
  120.    }
  121.    cout <<"creado...."<<endl;
  122. } // fin de creacion
  123.  
  124.  
  125.  
  126.  


Ordenacion de los diez viajantes que mas han vendido de menor a mayor:


Código: Text
  1. #include <stdio.h>
  2. #include <conio.h>
  3. //ordenacion
  4.  
  5. #include<string.h>
  6. #include<stdlib.h>
  7. #include<iostream>
  8. #include <map>
  9. #include<time.h>
  10. #define numreg 10000
  11. #define max 10
  12.  
  13. using namespace std;
  14.  
  15. typedef struct ficha
  16.  
  17. {
  18.    int dni;
  19.    char apellido[30];
  20.    char nombre [30];
  21.    int antiguedad;
  22.    int kms;
  23.    int importe;
  24.    }PERSONA;
  25.  
  26. typedef multimap< float, int, greater<float> > ventas;
  27.  
  28. FILE * lapila;
  29.  
  30.  
  31. main()
  32. {
  33. PERSONA datos;
  34. ventas ordenado;
  35. ventas :: iterator pos;
  36.  
  37. float venta;
  38. int reg;
  39. clock_t q1,q2;
  40. lapila = fopen("lapila.txt","r+b");
  41.  
  42. // tomamos tpos de ordenacion = llenado del mapa
  43. q1=clock();
  44. for (reg=1;reg<=10;reg++)
  45.   {
  46.    fseek(lapila,(reg-1)*sizeof(datos),0);
  47.    fread(&datos,sizeof(datos),1,lapila);
  48.    venta =(datos.importe);
  49.    ordenado.insert(pair<float,int>(venta,reg));
  50.    }
  51. q2=clock();
  52. cout <<"tipo de ordenaciones:"<<(q2-q1)/CLK_TCK;
  53. getch();
  54.  
  55. clrscr();
  56. for (pos = ordenado.begin (); pos!= ordenado.end(); pos ++)
  57.   {
  58.    reg=(*pos).second;
  59.    fseek(lapila,(reg-1)*sizeof(datos),0);
  60.    fread(&datos,sizeof(datos),1,lapila);
  61.    cout.width(12);
  62.    cout.setf(ios::left);
  63.    cout << "Nombre:";
  64.    cout.width(10);
  65.    cout.setf(ios::left);
  66.    cout<<datos.nombre;
  67.    cout.width(10);
  68.    cout<<"importe:";
  69.    cout.width(6);
  70.    cout.precision(2);
  71.    cout<<(*pos).first;
  72.    cout.width(4);
  73.    cout<<"Reg:";
  74.    cout<<reg;
  75.    cout<<endl;
  76.  
  77.    }
  78. fclose(lapila);
  79. }
  80.  
  81.  
  82.  

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
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,
 :lightsabre:
No hay tonto más molesto que el ingenioso.

lorekilia

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
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 :D  

Un saludo y muchas gracias de nuevo  :kicking: