Mantener ordenados strings

Iniciado por RON06, 21 Febrero 2011, 14:36 PM

0 Miembros y 1 Visitante están viendo este tema.

RON06

Hola a tod@s!

Quiero hacer un programa que lea una serie de strings(palabras) con una marca al final de todo, en este caso la marca es '#'.

Cada vez que aparezca un nombre repetido se incrementa en 1 el nombre de apariciones.

I si la palabra es nueva, se añade ordenadamente.
Es decir, sin añadirla al final y después ordenar antes de mostrar por pantalla.

En definitiva, tengo problemas en el momento de añadir ordenadamente.

Una muestra de lo que quería que hiciese es esta imagen:



I el codigo que he hecho hasta el momento es el siguiente:
#include <iostream>
#include <string>

using namespace std;

   // Constantes
   const int N=2000;
   const string FIN="#";

   //Estructura de nombres
   struct Nombre {
       string texto;
       int veces;
   };

   // Declaración de nuevo tipo
   typedef Nombre TablaNombres[N];

void insertarOrdenado(TablaNombres nombres, int& n, string p) {
   //Declaración variables
   int posicion, compara,compara2,i;
   bool encontrada;

   posicion=1;
   encontrada=false;//indica si ha encontrado la posicion de inserción

   while ((posicion<=n) and (not encontrada)) {
         compara=p.compare((nombres[posicion].texto));
         if (compara>=0) {
            encontrada=true;
         }
         else {
               posicion=posicion+1;
         }
   }
   //posicion es la posición de inserción

   compara2=p.compare((nombres[posicion].texto));
   if (compara2==0) {
       nombres[posicion].veces=nombres[posicion].veces+1;

   }
   else {
   //Añadir nuevo

   for (i=n;i>=posicion;i--){
       nombres[i+1]=nombres[i];
   }
   nombres[posicion].texto=p;
   nombres[posicion].veces=1;

   n=n+1;
   }
}


void lecturaNombres(TablaNombres nombres, int& n) {
   //Declaración variables
   string p;
   int c;

   cin >> p;
   c=p.compare(FIN); //c=0 si son iguales

   while (c!=0) {

   insertarOrdenado(nombres,n,p);

   cin >> p;

   }
}


void mostrar(TablaNombres nombres, int n) {
   //Declaración variables
   int i;

   for (i=0; i<n; i++) {
        cout << nombres[i].texto << " - " << nombres[i].veces << endl;
   }
}


int main()
{
   // Declaración de variables
   int n;
   TablaNombres nombres;

   n=0;

   cout << "ESCRIBA LOS NOMBRES A PROCESAR" << endl;

   lecturaNombres(nombres,n);

   cout << "NOMBRES ORDENADOS ALFABETICAMENTE" << endl;

   mostrar(nombres,n);

   return 0;
}



Al compilar no me sale ningún error ni advertencia, pero al ejecutar, después de introducir los nombres separados por un espacio en blanco y con la marca final '#'.
No muestra nada más.

El problema deduzco que es en el InsertarOrdenado, está mal planteado o tiene algún bucle infinito.

Si alguien me puede ayudar muchas gracias  ;D


PD: Se acceptan propuestas de cambios en la manera de estructurar el problema o sugerencias de como solucionarlo.

Revisando días después he visto los errores  ::)