Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: RON06 en 21 Febrero 2011, 14:36 pm



Título: Mantener ordenados strings
Publicado por: RON06 en 21 Febrero 2011, 14:36 pm
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:

(http://img402.imageshack.us/img402/5792/muestraz.png) (http://img402.imageshack.us/i/muestraz.png/)

I el codigo que he hecho hasta el momento es el siguiente:
Código:
#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  ::)