| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Dinosaur
Registrado: 21 Dic 2012 Mensajes: 4
| Publicado: 21/12/2012 6:00 am | | | Título: Ordenar alfabéticamente, con vector de estructuras y strings |
| Buenas tardes,
Les comento, tengo que entregar un programa el cual hace las veces de una agenda electrónica. Lee los datos de un fichero "agenda.txt", que contiene los apellidos (string), el nombre (string), el telefono fijo (int) y el movil (int), el domicilio (string), el codigo postal (int) y la fecha de nacimiento (string) y los guarda en un vector de estructuras. Partamos de la base de que el fichero leído está ordenado alfabéticamente. Bien, una de las funciones que permite realizar el programa es crear nuevos contactos que almacenar en la agenda. Esa función la tengo, es fácil, y funciona bien. Se me plantea el problema cuando el nuevo contacto leído ha de almacenarse en el vector alfabéticamente, de tal forma que primero compare los apellidos con los del resto de contactos, y si hay alguno igual, compare los nombres, y quede almacenado alfabéticamente. Luego dicho vector se guardará en el fichero, pero eso no es problema. Me resulta especialmente complicado resolver el problema porque tampoco sé muy bien como comparar variables strings. Las bibliotecas que tengo permitido usar son #include <iostream>, #include <stdlib.h>, #include <fstream> y #include<string>. Mi pregunta es, ¿podrían resolverme la función que ordenara alfabéticamente dicho vector, o darme alguna orientación?
Gracias de antemano |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7527 Ubicación: Mexico
| Publicado: 21/12/2012 7:40 am | | | Título: |
| Hola
Bienvenido a los foros. Por favor lee sus reglas.
| Dinosaur escribió: | | Las bibliotecas que tengo permitido usar son #include <iostream>, #include <stdlib.h>, #include <fstream> y #include<string>. Mi pregunta es, ¿podrían resolverme la función que ordenara alfabéticamente dicho vector, o darme alguna orientación? |
Te podemos orientar pero no hacer tu tarea.
Para ordenar en C++ un array de estructuras en base a dos campos de tipo string es relativamente fácil ya que esa clase permite la comparación mediante los operadores relacionales (">=", "<=", etc.).
Lo primero que debes hacer es revisar los temas relacionados con ordenacion (en C y C++) y la clase string (C++) en la base de datos de los foros, para ello basta con utilizar el motor de búsqueda.
En base a ello empieza el programa y donde tengas dudas te ayudamos.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | Dinosaur
Registrado: 21 Dic 2012 Mensajes: 4
| Publicado: 22/12/2012 5:30 am | | | Título: |
| [quote="rir3760"] Te podemos orientar pero no hacer tu tarea.[/quote]
Lo lamento si me he explicado mal. Este es un programa importante para mi en el que me juego una asignatura y quiero hacerlo por mi mismo, pero todos mis problemas se resumen a la función que anteriormente les comenté. Solo busco orientación para resolver mi problema. Trataré de ser más preciso. Mi programa lee el fichero ordenado alfabéticamente y lo guarda en un vector. Le introduzco los datos de un nuevo contacto y mi problema fundamental se basa en desplazar todos los contactos una vez he hayado la posición alfabética en la que debería hayarse el nuevo contacto.
Miren, ésta es mi función:
void OrdenarContactos (string apellidos, string nombre, contacto v[TAM], int i) { int j=0; int k; while (apellidos > v[j].apellidos) { j++; } k=j+1; if (apellidos == v[k].apellidos) { while (nombre > v[j].nombre) { j++; } } cout << "La posicion en la que deberia ir es " << j << endl; system ("pause");
Compruebo que la posición devuelta por la variable j es la correcta, pero mi problema reside en desplazar el vector. (Les comento, i es una variable que contiene el tamaño total del vector, y es la posición original en la que se guarda el nuevo contacto, o sea, al final de todos los demás). Ahora pasa por introducir el nuevo contacto en la posición j y desplazar todo el vector. Lo intenté así, pero no sale, tuve que igualar vectores algo que creo no está permitido.
while (j<i) { v[j]=v[j+1]; j++; } v[j]=v[i]; i++; }
Espero ahora hayan quedado más claras mis dudas. Saludos! |
| | Volver arriba | |  | | Dinosaur
Registrado: 21 Dic 2012 Mensajes: 4
| Publicado: 22/12/2012 8:11 am | | | Título: |
| He hecho algunos avances. Ahora la parte para desplazar los contactos queda así:
cout << "La posicion es " << j << endl; system ("pause"); aux=j; while (j<=i) { v[j+1]=v[j]; j++; } return aux;
Ahora el problema reside en que no me ordena alfabéticamente el nombre. O sea, si le introduzco un contacto con apellidos diferentes, la ordenación se hace sin problemas. Pero si le introduzco un contacto con apellidos iguales, independientemente de cual sea el nombre, el contacto introducido siempre queda el último del conjunto de contactos con el mismo apellido. Esta es mi función CrearContacto:
void CrearContacto (struct contacto v[TAM], int & i) { int pos; string apellidos; string nombre; i++; pos= OrdenarContactos (apellidos, nombre, v, i); v[pos].apellidos = apellidos; v[pos].nombre = nombre; cout << "Introduzca su telefono fijo" << endl; cin >> v[pos].fijo; cout << "Introduzca su telefono movil" << endl; cin >> v[pos].movil; cout << "Introduzca su calle" << endl; cin.ignore(); getline (cin, v[pos].calle); cout << "Introduzca su codigo postal" << endl; cin >> v[pos].codpostal; cout << "Introduzca su fecha de nacimiento" << endl; cin.ignore(); getline (cin,v[pos].nacimiento); }
¿Alguien ve dónde podría estar el error? Gracias de antemano |
| | Volver arriba | |  | Masakre
Registrado: 06 Jun 2012 Mensajes: 245
| Publicado: 22/12/2012 8:25 am | | | Título: |
| Para ordenar sin complicaciones no hay nada más simple que el método de la burbuja jeje.
Si no me equivoco, vendría a ser lo siguiente en tu ejercicio:
| Código: | int i, j; contacto tempo; for(i=0; i<TAM-1; i++) for(j=i+1; j<TAM; j++) if( (v[i].apellidos > v[j].apellidos) || (v[i].apellidos == v[j].apellidos && v[i].nombre > v[j].nombre) ) { tempo = v[i]; v[i] = v[j]; v[j] = tempo; } |
Espero te sirva de orientación. |
| | Volver arriba | |  | Masakre
Registrado: 06 Jun 2012 Mensajes: 245
| Publicado: 22/12/2012 8:41 am | | | Título: |
| Creo que no es necesario usar el método de la burbuja porque tienes la certeza de que todo está ordenado alfabéticamente y que sólo debes introducir un nuevo contacto, ¿verdad?
En ese caso creo que podrías leer los datos en una estructura contacto, a la que podrías llamar E (nuevo elemento del vector).
Luego, para insertarlo podrías llamar a insertarE(v, posDeberia(E.apellidos, E.nombres, v), E);
La implementación de las funciones:
| Código: | void posDeberia (string apellidos, string nombre, contacto v[TAM]) { int j=0; int k; while (apellidos > v[j].apellidos) { j++; } k=j+1; if (apellidos == v[k].apellidos) { while (nombre > v[j].nombre) { j++; } } return j; }
void insertarE(contacto v[], int posI, contacto E) { // Desplazamos elementos siguientes a posI. for(int i=TAM-1; i>=posI; i--) v[i+1] = v[i]; // Insertamos posI v[posI] = E; } |
La primera es la que tú hiciste y la segunda usa la posición captada por esa función, para luego sólo desplazar e insertar el nuevo elemento. No lo he probado pero espero te pueda ser de utilidad ... |
| | Volver arriba | |  | | Dinosaur
Registrado: 21 Dic 2012 Mensajes: 4
| Publicado: 22/12/2012 9:16 am | | | Título: |
| [quote="Masakre"]Para ordenar sin complicaciones no hay nada más simple que el método de la burbuja jeje.
Si no me equivoco, vendría a ser lo siguiente en tu ejercicio: [code] int i, j; contacto tempo; for(i=0; i<TAM-1; i++) for(j=i+1; j<TAM; j++) if( (v[i].apellidos > v[j].apellidos) || (v[i].apellidos == v[j].apellidos && v[i].nombre > v[j].nombre) ) { tempo = v[i]; v[i] = v[j]; v[j] = tempo; }[/code]
Espero te sirva de orientación.[/quote]
Mil millones de gracias, había oído hablar de este método pero no lo comprendía porque siempre lo encontraba en un lenguaje distinto al que me hacen emplear en mis programas. Ahora que lo veo así me doy cuenta de como funciona y por fin me funciona el programa.
Mil gracias! |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |