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