Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda con ordenacion

Estas en el tema de Ayuda con ordenacion en el foro de C/C++ en Foros del Web. Hola y de antemano gracias! Mi duda es la siguiente: Tengo que ordenar alfabeticamente una lista, el problema que tengo es que la tengo que ...
  #1 (permalink)  
Antiguo 21/02/2011, 09:27
Avatar de mihina  
Fecha de Ingreso: mayo-2010
Ubicación: Girona
Mensajes: 32
Antigüedad: 13 años, 11 meses
Puntos: 1
Información Ayuda con ordenacion

Hola y de antemano gracias!

Mi duda es la siguiente: Tengo que ordenar alfabeticamente una lista, el problema que tengo es que la tengo que ir ordenando mientra va leyendo las palabras. No puedo guardarlas todas en una lista y posteriormente ordenarlas. Se deben de ir ordenando segun se va leyendo.

Lo maximo que podio hacer es que me ordene una pequeña parte pero luego la mitad de las palabras no me las ordena y en pantalla solo salen 0.

Aqui os dejo el codigo:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string.h>
  3.  
  4. using namespace std;
  5.  
  6. const int MAX_PARAULES=2500;
  7. const string M_FI="#";
  8.  
  9. struct Paraula
  10. {
  11.     string paraula;
  12.     int llarg;
  13.     int rep;
  14. };
  15.  
  16. typedef Paraula TaulaParaula[MAX_PARAULES];
  17.  
  18. void introduirParaules(TaulaParaula t, int&n)
  19. {
  20.     string c;
  21.     int pos;
  22.     cin>>c; //palabra nueva
  23.     Paraula temp;
  24.     int j=0;
  25.  
  26.     while(c != M_FI)
  27.     {
  28.         if(n>0){
  29.             for (int i=0; i<n; i++){
  30.                 if(c.compare(t[i].paraula)<0){
  31.                     temp=t[i];
  32.                     //guardamos palabra nueva
  33.                     t[i].paraula=c;
  34.                     t[i].llarg=c.length();
  35.                     t[i].rep=1;
  36.  
  37.                     t[i+1]=temp;
  38.                 }
  39.             }
  40.         }
  41.         else{
  42.             t[n].paraula=c;
  43.             t[n].llarg=c.length();
  44.             t[n].rep=1;
  45.         }
  46.         n++;
  47.         cin>>c;
  48.     }
  49. }
  50.  
  51. int main()
  52. {
  53.     TaulaParaula paraules;
  54.     int n=0;
  55.  
  56.     cout << "ENTRA EL TEXT A ANALITZAR" << endl;
  57.     introduirParaules(paraules,n);
  58.  
  59.     cout << "PARAULES LLEGIDES PER ORDRE ALFABETIC" << endl;
  60.     mostrarParaules(paraules,n);
  61.  
  62.     return 0;
  63. }
Gracias y perdonen por si tengo algun fayo tonto, es que llevo una semana aprendiendo c++.
  #2 (permalink)  
Antiguo 21/02/2011, 10:44
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Ayuda con ordenacion

Haces bien lo de t[i+1] = temp, pero piensa que no solo tienes que mover esa palabra si no todas las que vienen detrás, o sea, sustituir esa asignacion por un bucle.
  #3 (permalink)  
Antiguo 21/02/2011, 10:48
Avatar de mihina  
Fecha de Ingreso: mayo-2010
Ubicación: Girona
Mensajes: 32
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: Ayuda con ordenacion

Si lo he intentado arreglar asi pero me peta el programa :(
Código C++:
Ver original
  1. void introduirParaules(TaulaParaula t, int&n)
  2. {
  3.     string c;
  4.     int pos;
  5.     cin>>c; //palabra nueva
  6.     Paraula temp;
  7.     int j=0;
  8.  
  9.     while(c != M_FI)
  10.     {
  11.         t[n].paraula=c;
  12.         t[n].llarg=c.length();
  13.         t[n].rep=1;
  14.  
  15.         if(n>0){
  16.             for (int i=0; i<n; i++){
  17.                 temp = t[i];
  18.                 j = i - 1;
  19.                 while ( (t[j].paraula.compare(c)>0) && (j >= 0) ){
  20.                     t[j+1] = t[j];
  21.                     j--;
  22.                 }
  23.                 t[j+1] = temp;
  24.             }
  25.         }
  26.         n++;
  27.         cin>>c;
  28.     }
  29. }
  #4 (permalink)  
Antiguo 21/02/2011, 11:03
Avatar de mihina  
Fecha de Ingreso: mayo-2010
Ubicación: Girona
Mensajes: 32
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: Ayuda con ordenacion

Bueno creo ke me voy cercando mas a la solucion por ahora tengo eso:

si introduzco: hola aa cc bb #
En pantalla me sale: aa bb bb cc
Falta que salga hola.

El codigo es:
Código C++:
Ver original
  1. void introduirParaules(TaulaParaula t, int&n)
  2. {
  3.     string c;
  4.     int pos;
  5.     cin>>c; //palabra nueva
  6.     Paraula temp;
  7.     int j=0;
  8.  
  9.     while(c != M_FI)
  10.     {
  11.         t[n].paraula=c;
  12.         t[n].llarg=c.length();
  13.         t[n].rep=1;
  14.  
  15.         if(n>0){
  16.             for (int i=0; i<n; i++){
  17.                 if(c.compare(t[i].paraula)<0){
  18.                     temp=t[i];
  19.                     t[i].paraula=c;
  20.                     t[i].llarg=c.length();
  21.                     t[i].rep=1;
  22.  
  23.                     for(int x=n; x>i; x--){
  24.                         t[x]=t[x-1];
  25.                     }
  26.                     t[i+1]=temp;
  27.                 }
  28.             }
  29.         }
  30.         n++;
  31.         cin>>c;
  32.     }
  33. }
  #5 (permalink)  
Antiguo 22/02/2011, 02:27
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Ayuda con ordenacion

No tienes que asignar nada a la ultima posicion antes de ordenar porque eso hará que se ordenen mal.

Código C:
Ver original
  1. while(c != M_FI)
  2.     {
  3.         ordenado = false;
  4.         i = 0;
  5.         while ((!ordenado) && (i<n))
  6.         {
  7.             if(c.compare(t[i].paraula)<=0)
  8.             {
  9.                 for (j = n-1; j>=i; j--)
  10.                 {
  11.                     t[j+1] = t[j];
  12.                 }
  13.                
  14.                 t[i].paraula=c;
  15.                 t[i].llarg=c.length();
  16.                 t[i].rep=1;
  17.  
  18.                 ordenado = true;
  19.              }
  20.              i++;
  21.         }
  22.         if (!ordenado)
  23.         {
  24.             t[n].paraula=c;
  25.             t[n].llarg=c.length();
  26.             t[n].rep=1;
  27.         }
  28.         n++;
  29.         cin>>c;
  30.     }
  #6 (permalink)  
Antiguo 22/02/2011, 06:20
Avatar de mihina  
Fecha de Ingreso: mayo-2010
Ubicación: Girona
Mensajes: 32
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: Ayuda con ordenacion

Muchas gracias funciona perfectamente!!!!! realmente es mucho mas sencillo de lo que yo me imaginaba yo sola me complicaba!!!!!
Muchas gracias!!!
  #7 (permalink)  
Antiguo 22/02/2011, 09:06
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Ayuda con ordenacion

Ya, si lo quieres dejar aun mejor, si te das cuenta hay una asignación repetida (la de dentro del bucle y la de insertar al final), la podríamos quitar de la siguiente manera.

Código C:
Ver original
  1. while(c != M_FI)
  2.     {
  3.         ordenado = false;
  4.         i = 0;
  5.         pos = n;
  6.         while ((!ordenado) && (i<n))
  7.         {
  8.             if(c.compare(t[i].paraula)<=0)
  9.             {
  10.                 for (j = n-1; j>=i; j--)
  11.                 {
  12.                     t[j+1] = t[j];
  13.                 }
  14.                
  15.                 pos = i;
  16.                 ordenado = true;
  17.              }
  18.              i++;
  19.         }
  20.  
  21.         t[pos].paraula=c;
  22.         t[pos].llarg=c.length();
  23.         t[pos].rep=1;
  24.  
  25.         n++;
  26.         cin>>c;
  27.     }

Etiquetas: ordenacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:07.