elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ordenar strings de analisis de fechas en lista doblemente enlazada.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ordenar strings de analisis de fechas en lista doblemente enlazada.  (Leído 2,443 veces)
falconez

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Ordenar strings de analisis de fechas en lista doblemente enlazada.
« en: 13 Junio 2014, 21:05 pm »

/*
 *

 * 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;
}




« Última modificación: 13 Junio 2014, 21:13 pm por falconez » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ordenar strings de analisis de fechas en lista doblemente enlazada.
« Respuesta #1 en: 16 Junio 2014, 09:21 am »

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
  1. std::string cad1 = "bcd";
  2. std::string cad2 = "abc";
  3.  
  4. if ( cad1 > cad2 )
  5. {
  6.  std::string temp = cad1;
  7.  cad1 = cad2;
  8.  cad2 = temp;
  9. }
  10.  
  11. std::cout << cad1 << " " << cad2 << std::endl;
  12.  

Salida:
Código:
abc bcd

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

Código
  1. bool operator<( const std::string& cad1, const std::string& cad2 )
  2. {
  3.  bool to_return = true;
  4.  
  5.  for ( unsigned int i = 0; i < cad1.size( ); ++i )
  6.  {
  7.    if ( cad1[ i ] > cad2[ i ] )
  8.    {
  9.      to_return = false;
  10.      break;
  11.    }
  12.    else if ( cad1[ i ] < cad2[ i ] )
  13.      break;
  14.  }
  15.  
  16.  return to_return;
  17. }

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


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
una lista circular doblemente enlazada en c sharp c#
.NET (C#, VB.NET, ASP)
neo_angel_xxx 2 9,024 Último mensaje 29 Octubre 2010, 01:48 am
por [D4N93R]
ayuda...Lista doblemente enlazada
Java
goll9d 2 3,638 Último mensaje 22 Enero 2012, 04:50 am
por goll9d
ayuda con lista doblemente enlazada
Programación C/C++
gibi77 3 3,701 Último mensaje 7 Marzo 2012, 07:47 am
por nirvguy
Ayuda con lista doblemente enlazada
Programación C/C++
falconez 2 9,028 Último mensaje 16 Diciembre 2013, 01:35 am
por falconez
Ordenar lista doblemente enlazada con insertion sort
Programación C/C++
mari2diaz 2 6,089 Último mensaje 27 Marzo 2022, 23:53 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines