Ordenar strings de analisis de fechas en lista doblemente enlazada.

Iniciado por falconez, 13 Junio 2014, 21:05 PM

0 Miembros y 1 Visitante están viendo este tema.

falconez

/*
*

* Analizar los elementos en la lista por:
*

* ------>precio ( los 5 libors mas caros, mlas baratos, imprimir del libro mas caro al mas barato) ---> Casi completada

* ------>fecha de publicacion (el libro mas viejo, lista del libro mas "joven" al mas viejo) ---> como ordenar strings?

* ------>Libros por autor (lista ordenado por autor, y libro) --> como ordenar strings?
*  
*
* Created on 9 de junio de 2014, 18:11
* Como puedo ordenar los strings de fechas? ... y tambien que esta mal en mi
* mostrarLista. PD. Estoy trabajando con PUGIXML para leer xml.
* pero hacer enfasis sobre todo en estas 2 funciones.
*/

// LIBRERIAS.
#include <iostream>
#include <string>
#include "pugixml.hpp"
#include "pugixml.cpp"



// ESPACIO DE NOMBRES.
using namespace std;


#define ASCENDENTE 1
#define DESCENDENTE 0

// ESTRUCTURAS.
struct datos {
   string id; //id
   string autor; //author
   string titulo; //tittle
   string genero; //genre
   float precio; //price
   string  fechaPublic; //public date
   string descripcion; //descrip
   
   int number;
};

//struct c_date {
//    int USA;
//    int UK;
//    int EU;
//    int Norway;
//};

struct node {
   datos data;
   datos dataMoment;
   node *left;
   node *right;
};


// PROTOTIPOS.
// Función para crear una lista.
node *newList();
// Función para insertar en una lista por la derecha.
node *insertRight(node *list, node data);
// Función para imprimir un nodo en la lista.
void printNode(node *current);
// Función para imprimir la lista.
void printList(node *current);
// Función para retornar el tamaño de la lista.
int size(node * list);
node *analisisFecha(node *head);
// Función para leer el archivo XML.
void read(node *list);
node *Insertar(node *list, node data);
void ordenarLista(node *lista);
// Función para determinar libros mas caros y mas baratos
//void country(node *head);
node  *LibrosCaros(node *head);
node *LibrosBaratos(node *head);

//void analisisFecha(node *head);
void MostrarLista(node *head, int orden);


// FUNCIÓN PRINCIPAL.
int main() {
   node *head = newList();
   node *current = head;
   
   cout << "Lista\n";
   
   read(head);
   
   cout << "----------------------------------" << endl;
   printList(head);
   
  // MostrarLista(head,ASCENDENTE);
   
   cout << endl << "TAMAÑO DE LISTA TOTAL: " << size(head) << endl << endl << endl;
   
   cout << "______________________________________________________" << endl;

   
   
   cout<<"LIBROS BARATOS:"<<endl<<endl;
   LibrosBaratos(head);
   //printList(LibrosCaros(head)); //Imprimir lista de libros BARATOS detalladamente
   
   cout << "______________________________________________________" << endl;
   cout<<"LIBROS CAROS:"<<endl<<endl;
   LibrosCaros(head);
   //printList(LibrosCaros(head)); //Imprimir lista de libros CAROS detalladamente
   
   analisisFecha(head);
   
   return 0;
}



// DESARROLLO DE LOS PROTOTIPOS.
node *newList() {
   node *element = new node;
   element->data.precio = -1;
   element->right = element;
   element->left = element;
   
   return element;
}


node *insertRight(node *list, node data) {
   node *element = new node;
   element->data = data.data;
   element->left = list;
   element->right = list->right;
   list->right = element;
   element->right->left = element;
   
   return element;
}


void printNode(node *current) {
   int number = 1;
   
   cout << "[" << current->data.number << "]" << endl << endl;
   cout << "Book ID  : " << current->data.id << endl;
   cout << "Autor : " << current->data.autor << endl;
   cout << "Titulo: " << current->data.titulo << endl;
   cout << "Genero: " << current->data.genero << endl;
   cout << "Precio  : " << current->data.precio << endl;
   cout << "Fecha de Publicacion   : " << current->data.fechaPublic << endl;
   cout << "Descripcion   : " << current->data.descripcion << endl;
   cout << "----------------------------------" << endl;
   
   number++;
}

void printList(node *head) {
   node *current = head;
   while (head != current->left) {
       current = current->left;
       printNode(current);
   }
   
   cout << endl;
}

int size(node * list) {
   node *head = list;
   node *current = list;
   
   int cont = 0;
   
   while (head != (current = current->right)) {
       cont = cont + 1;
   }

   return cont;
}

void read(node *list) {
   node date;
   
   string moment;
   
   pugi::xml_document book;
   book.load_file("books.xml");    
   pugi::xml_node catalog = book.first_child().first_child();
   int n = 1;
 
 
   do {
       
       date.data.id = catalog.attribute("id").as_string();
       
       date.data.autor = catalog.child("author").text().get();
       date.data.titulo = catalog.child("title").text().get();
       date.data.genero = catalog.child("genre").text().get();
     
       //convirtiendo precio
       moment = catalog.child("price").text().get();
       date.data.precio = atof(moment.c_str());
       date.data.fechaPublic= catalog.child("publish_date").text().get();
       
       date.data.number = n;
       date.data.descripcion = catalog.child("description").text().get();
       
       
       insertRight(list, date);
       
       n++;
   }
   while(catalog = catalog.next_sibling());
}

node *LibrosCaros(node *head){
   node *current =head;
   node *librosCaros= newList(); //Creando lista libros caros para realizar el analisis
   node data;
       
   while (head != (current=current->right)){
       if (current->data.precio>15){
           data.data=current->data;        
           cout<<current->data.titulo<<"-->"<<current->data.precio<<endl;
           insertRight(librosCaros, data); //Insertando en una segunda lista de libros caros, ojo si imprimo lista se imprimen todos los detalles de cada librp
                }
       }
      return librosCaros;
         
}


node *LibrosBaratos(node *head){
   node *current =head;
   node *librosBaratos= newList(); //Creando lista libros caros para realizar el analisis
   node data;
       
   while (head != (current=current->right)){
       if (current->data.precio<15){
           data.data=current->data;        
           cout<<current->data.titulo<<"-->"<<current->data.precio<<endl;
           insertRight(librosBaratos, data); //Insertando en una segunda lista de libros caros
                }
       }
         
      return librosBaratos;
         
}

//ANALIZAR FECHAS Y ORDENAR PERO TAMPOCO TRABAJA CORRECTAMENTE
node *analisisFecha(node *head){
   node *current =head;
   node *list3= newList(); //Creando lista 2 para realizar el analisis
   node data;
   string date = "2014-06-12";
   int temp;
   cout<<"_______________________________"<<endl<<endl;
   while (head != (current=current->right)){
       //if (current->data.fechaPublic<date)
         //  cout<<current->data.number<<"--->"<<current->data.fechaPublic<<endl;
 
   }
   
}

//FUNCION NO TRABAJA CORRECTAMENTE ...
void MostrarLista(node *head, int orden) {
 
  if(!head) cout<<"Lista Vacia";
  node *current = head;
 
  if(orden == ASCENDENTE) {
     
     while(current->left ) current = current->right;
     cout<<"Orden ascendente: "<<endl;
     while(current) {
        cout<<current->data.precio<<endl;  
        current = current->right;
     }
  }
  else {
     while(current->right) current = current->right;
     cout<<"Orden descendente: "<<endl;
     while(current) {
        cout<<current->data.precio<<endl;
        current = current->left;
     }
  }
  cout<<endl;
}



eferion

Nota inicial: Por favor, el código ponlo con las etiquetas GeSHi, quedará más claro y legible. Gracias.

"ordenar" strings puede ser una tarea todo lo sencilla o complicada que quieras:

* ¿Quieres que la ordenación sea sensible al uso de mayúsculas?
* ¿Te resulta indiferente que las palabras con letras acentuadas las ponga en posiciones "extrañas"?

Si has respondido "SI" a ambas preguntas, puedes hacer uso de la ordenación básica que viene por defecto en std::string. Es decir, puedes usar los operadores de comparación:

Código (cpp) [Seleccionar]

std::string cad1 = "bcd";
std::string cad2 = "abc";

if ( cad1 > cad2 )
{
  std::string temp = cad1;
  cad1 = cad2;
  cad2 = temp;
}

std::cout << cad1 << " " << cad2 << std::endl;


Salida:
abc bcd

El mecanismo de ordenación de los operadores de comparación ( '>', '<', '==', '!=', '>=', '<=' ) vendría a ser algo tal que:

Código (cpp) [Seleccionar]

bool operator<( const std::string& cad1, const std::string& cad2 )
{
  bool to_return = true;

  for ( unsigned int i = 0; i < cad1.size( ); ++i )
  {
    if ( cad1[ i ] > cad2[ i ] )
    {
      to_return = false;
      break;
    }
    else if ( cad1[ i ] < cad2[ i ] )
      break;
  }

  return to_return;
}


Nota que para simplificar estoy asumiendo que ambos strings tienen la misma longitud.