/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ordenar alfabéticamente, con vector de estructuras y strings

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Dinosaur



Registrado: 21 Dic 2012
Mensajes: 4

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com