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:
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
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 [Seleccionar]
#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