Título: Ordenar strings de analisis de fechas en lista doblemente enlazada. Publicado por: falconez 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; } Título: Re: Ordenar strings de analisis de fechas en lista doblemente enlazada. Publicado por: eferion 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
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
Nota que para simplificar estoy asumiendo que ambos strings tienen la misma longitud. |