Páginas

Ordenar un fichero binario de alumnos por código de alumno en C++

Escribe un programa C++ que lea el fichero binario de alumnos.dat creado en una entrada anterior y escriba en otro fichero binario alumnos_cod.dat los alumnos ordenados por código de alumno.
Utiliza un array dinámico para realizar la ordenación.
Para ordenar el array se utilizará el método de la burbuja

Los alumnos se han escrito en el fichero utilizando la estructura:

struct Talumno
{
    char apellido1[21];
    char apellido2[21];
    char nombre[21];
    char codigo[11];
};


#include <iostream>
#include <fstream>
using namespace std;
struct Talumno
{
    char apellido1[21];
    char apellido2[21];
    char nombre[21];
    char codigo[11];
};
void burbuja(Talumno [], int);
int main()
{
    Talumno registro, *array;
    int tamanyo = sizeof(Talumno), num_registros, i=0;
    ifstream in;
    ofstream out;
    in.open("alumnos.dat", ios::binary);
    if(in.fail())
    {
       cout << "Error al abrir el fichero alumnos.dat" << endl;
       system("pause");
       exit(1);
    }
    out.open("alumnos_cod.dat", ios::binary);
    if(out.fail())
    {
       cout << "Error al crear el fichero alumnos_cod.dat" << endl;
       system("pause");
       exit(1);
    }
    //calculamos el número de registros
    in.seekg(0,ios::end); //nos posicionamos al final del fichero
    //número de registros = bytes / tamaño en bytes de un registro
    num_registros=in.tellg()/tamanyo;
    //creamos el array necesario para ordenar los registros del fichero
    array = new Talumno[num_registros];
    if(array==NULL)
    {
       cout << "Error en la asignación de memoria\n";
       system("pause");
       exit(1);
    }
    in.seekg(0); //volvemos al pincipio del fichero
    //Leemos el fichero y pasamos los registros al array
    in.read((char *) &array[i], tamanyo);
    while(!in.eof())
    {
         i++;
         in.read((char *) &array[i], tamanyo);
    }
    //ordenar el array
    burbuja(array,num_registros);
   
    //escribir el array ordenado en el fichero de salida
    for(i=0;i<num_registros;i++)
    {
            cout << "\nALUMNO: " << i+1 << endl;
            cout << "Nombre: " << array[i].nombre << endl;
            cout << "Apellido1: " << array[i].apellido1 << endl;
            cout << "Apellido2: " << array[i].apellido2 << endl;
            cout << "Codigo: " << array[i].codigo << endl;
            out.write((char *) &array[i], tamanyo);
    }
    in.close();
    out.close();
    delete [] array;
    system("pause");
}

//función que ordena de menor a mayor los alumnos por código
void burbuja(Talumno A[], int N)
{
    int i, j;
    Talumno aux;
    for(i=0;i<N-1;i++)      
        for(j=0;j<N-i-1;j++)
            if(strcmp(A[j+1].codigo,A[j].codigo)<0) 
            {               
              aux=A[j+1];   
              A[j+1]=A[j];  
              A[j]=aux;
            }
}

No hay comentarios:

Publicar un comentario