
/*************** Practica 08: Ordenacion de palabras con heaps **********
 *
 *  Nombre de Fichero: 00Ordena.cpp
 *
 *  Proposito: Este programa lee las palabras de un fichero, y utilizando  
 *             monticulos las muestra ordenadnas por pantalla                  
 *
 *  Condiciones de Final Anormal y Mensajes de Error y Advertencia
 *
 *  --> No hay final anormal
 *
 *  --> Mensajes de error y advertencia
 *       "Error abriendo fichero"   -> El nombre del fichero proporcionado
 *                                     por el usuario no es correcto y no
 *                                     se ha podido abrir el fichero
 *       "Se ha llegado al valor maximo del Heap"
                                    -> Se ha llenado la estructura interna
                                       del monticulo. 
 *
 *  Historia de Desarrollo:
 *  Fecha     Autor           Id Cambio  Version  Descripcion del cambio
 *  --------  --------------  ---------  -------  ----------------------
 *  28-05-03  Ricardo Ferris          0      1.0
 *
 ************************************************************************/

#include <iostream.h>
#include <stdlib.h>
#include <fstream.h>
#include <string>
#include "00maxHeap.h"

/*
 * Declaracion de los prototipos de las funciones
 */
void Presentacion (void);
bool HacerHeap (ifstream & f_in, Heap & h);
void MostrarHeap (Heap);

/*
 * Programa principal
 */
int main (void)
{
    Heap h;
    ifstream f_in;
    string nom_fic;
    Presentacion ();

    cout << "Dime nombre del fichero a ordenar: ";
    cin >> nom_fic;

    f_in.open (nom_fic.c_str () );

    if (!f_in)
        cout << "Error abriendo fichero " << nom_fic;
    else
    {
        cout << "FICHERO SIN ORDENAR: " << endl;
        HacerHeap (f_in,h);

        cout << "FICHERO ORDENADO: " << endl;
        MostrarHeap (h);
    }

    cout << endl;
    system ("PAUSE");
    return 0;
}

/*************** Presentacion ********************************************
 *
 *  Prototipo:    void Presentacion(void)
 *
 *  Descripcion:  Esta funcion indica, brevemente, lo que realiza
 *                el programa y como lo hace.
 *
 *  Parametros:
 *  Nombre          Tipo        E/S  Descripcion
 *  ------          ----------  ---  ------------
 *  ninguno
 *
 *  Valor devuelto:
 *  Ninguno
 *
 ************************************************************************/
void Presentacion(void)
{
   char ch;

   cout << "\n\n";
   cout << "Practica 08. Ordenacion utilizando onticulos de máximos\n";
   cout << "\n";
   cout << "Este programa lee palabras de un fichero indicado por el usuario\n";
   cout << "y utilizando un montículo de máximos muestra las palabras ordenadas\n";
   cout << "por pantalla.\n";
   cout << "\n";
   cout << "Programa realizado por:\n";
   cout << "     Ricardo Ferris Castell\n";
   cout << "     Version 1.0 - 28 de Mayo de 2003\n";
   cout << "\n";
   cout << "Practicas de Algoritmos y Estructuras de Datos I (2002-2003)\n";
   cout << "Practicas de Fundamentos de Programacion 2 (2002-2003)\n";
   cout << "\nPulsa una tecla y luego enter\n";
   cin >> ch;
   cin.ignore();
}

/*************** HacerHeap ***********************************************
 *
 *  Prototipo:    void HacerHeap (ifstream & f_in, Heap & h)
 *
 *  Descripcion:  Esta funcion se encarga de leer palabra a palabra
 *                el fichero pasado como parametro y guardarlas en el 
 *                monticulo.
 *
 *  Parametros:
 *  Nombre          Tipo        E/S  Descripcion
 *  ------          ----------  ---  ------------
 *  f-in            ifstream    E    Descriptor del fichero de donde
 *                                   leeremos las palabras
 *  h               Heap          S  Heap en donde pondremos las palabras
 *
 *  Valor devuelto:
 *  Ninguno
 *
 ************************************************************************/
bool HacerHeap (ifstream & f_in, Heap & h)
{
    string palabra;
    bool error_heap = false;

    f_in >> palabra;
    while ( (!f_in.eof()) && (!error_heap) )
    {
        cout << palabra << " ";
        error_heap = h.Insertar (palabra);
        f_in >> palabra;
    }
    if (error_heap)
        cout << "Se ha llegado al valor maximo del Heap";

    cout << endl;
    system ("PAUSE");
    f_in.close ();

    return(error_heap);
}

void MostrarHeap (Heap h)
{
    bool b_aux;
    string palabra;

    if (!h.HeapVacio () )
    {
        b_aux = h.ConsultarMaximo (palabra);
        b_aux = h.EliminarMaximo ();
        MostrarHeap (h);

        cout << palabra << " ";
    }
}

