Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: GominaTilted en 8 Diciembre 2018, 17:39 pm



Título: Guardar una frase en los elementos de un vector
Publicado por: GominaTilted en 8 Diciembre 2018, 17:39 pm
Buenas, debo de realizar este ejercicio (lo del título es una supuesta forma correcta pero que no sé implementar). El programa debe de pedir una frase al usuario (hasta ahí todo bien), y luego mostrar las palabras que la componen de forma enumerada (y ahí está el problema xD). Debo de usar la librería <string>, como es lógico, y todas las funciones asociadas. Un banco de pruebas sería el siguiente:

Citar
Dame frase: Esto es una prueba
1 -> Esto
2 -> es
3 -> una
4 -> prueba


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: AlbertoBSD en 8 Diciembre 2018, 17:53 pm
Mejor di que quieres que te hagan la tarea.


El codigo presenta varios problemas, el numero de espacios no puede ser mas de 10, ya que definimos *vector[10], se podria hacer de forma dinamica para aceptar "infinitos" pero eso ya involugra mas codigo.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main() {
  5. char cadena[100];
  6. char *token;
  7. char *vector[10];
  8. int i = 0;
  9. printf("Ingrse una frase: ");
  10. fgets(cadena,100,stdin);
  11. token = strtok(cadena," ");
  12. do {
  13. vector[i] = token;
  14. printf("%i -> %s\n",i+1,vector[i]);
  15. i++;
  16. token = strtok(NULL," ");
  17. }while(token != NULL);
  18. }
  19.  


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: GominaTilted en 8 Diciembre 2018, 18:11 pm
Mejor di que quieres que te hagan la tarea.


El codigo presenta varios problemas, el numero de espacios no puede ser mas de 10, ya que definimos *vector[10], se podria hacer de forma dinamica para aceptar "infinitos" pero eso ya involugra mas codigo.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main() {
  5. char cadena[100];
  6. char *token;
  7. char *vector[10];
  8. int i = 0;
  9. printf("Ingrse una frase: ");
  10. fgets(cadena,100,stdin);
  11. token = strtok(cadena," ");
  12. do {
  13. vector[i] = token;
  14. printf("%i -> %s\n",i+1,vector[i]);
  15. i++;
  16. token = strtok(NULL," ");
  17. }while(token != NULL);
  18. }
  19.  
Realmente no quería un código (aunque lo pueda parecer por decir lo de <string>), solo una clave para poder sacarlo, pero gracias de todas formas. Ah, por cierto, no sé lo que son los tokens :/


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: AlbertoBSD en 8 Diciembre 2018, 18:20 pm
Token:

Citar
a thing serving as a visible or tangible representation of a fact, quality, feeling, etc.

Código:
Dame frase: Token1 Token2 Token3 Token4
1 -> Token1
2 -> Token2
3 -> Token3
4 -> Token4


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: MAFUS en 8 Diciembre 2018, 18:28 pm
Si el enunciado es mostrar una frase palabra a palabra lo puedes simplificar tanto como:
Recorre la frase de principio a fin. Si encuentras un espacio escribe un avance de línea, en caso contrario escribe el carácter que has encontrado.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<ctype.h>
  4.  
  5. int main() {
  6. char cadena[100];
  7. printf("Ingrse una frase: ");
  8. scanf("%100s", cadena);
  9.  
  10. for(int i=0; i<strlen(cadena); ++i)
  11.        putchar(isblank(cadena[i])? '\n' : cadena[i]);
  12. }


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: GominaTilted en 8 Diciembre 2018, 19:15 pm
Bueno, he conseguido hacerme mi codigo, y ha quedado así:

Código:
#include <iostream>
#include <string>
using namespace std;

void Cabecera (void);
void SepararPalabras (void);

int main (void)
{
Cabecera();
SepararPalabras();
return 0;
}
void Cabecera (void)
{
cout << "Este programa pide una frase y devuelve enumeradas sus palabras" << endl << endl;
return;
}
void SepararPalabras (void)

string frase;
int i, x = 1, n;
cout << "Dame una frase: ";
getline (cin, frase);
for (i = 0; i < frase.length (); i++)
{
if (isalpha (frase[i]))
{
cout << x << "-> ";
while (isalpha (frase[i]))
{
frase[i];
cout << frase[i];
i++;
}
cout << endl;
x++;
}
}
return;
}

Como véis lleva un contador de las palabras (no lo pedía el enunciado, pero como el ejemplo lo incluía pues lo he puesto). Se me olvidó mencionar que me obligan a gastar estan librerías. Ahora le estoy dando vueltas para que omita palabras repetidas, si se os ocurre algo (y no necesito un código directamente), me sería muy útil.


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: MAFUS en 8 Diciembre 2018, 19:41 pm
Para eso no debes usar la técnica de letra a letra sino que deberás separar las palabras con un array de strings y a cada palabra que consigas mirar si ya existe en el array.


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: K-YreX en 8 Diciembre 2018, 23:54 pm
GominaTilted, respecto a tu código:
- Las funciones que no reciben parámetros, no hace falta que pongas <void>. Eso creo que es más de C, en C++ se suele dejar vacío.
Código
  1. void Cabecera()
- Y la función <Cabecera()> no tiene mucho sentido, sólo para hacer un <cout>. Si fuese un conjunto de instrucciones más grande o fuese un titulo muy trabajado... Pero para hacer un <cout> lo puedes hacerlo directamente en el <main>.
- Además si no devuelven ningún valor puedes omitir el <return> del final. No es muy habitual ver un <return> en una función de tipo <void>.

Respecto a tu problema de omitir palabras que estén repetidas, la idea siempre es la misma, tener un contenedor de palabras (seguramente usarás arrays pero también puedes usar un contenedor de la STL), coger una palabra, recorrer el contenedor y si no existe ya, la metes en el contenedor.

He estado probando un código que hice hace poco para separar palabras y he intentado adaptarlo para este problema. Sin embargo, sólo me coge la primera palabra. He mirado el código original del que he sacado la estructura de la función y en el original funciona perfecto pero no consigo dar con el problema. El código que he intentado adaptar es este:
Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. const int MAX_PALABRAS = 20;
  7.  
  8. size_t SepararPorPalabras(string, string*);
  9.  
  10. int main(){
  11. string frase;
  12. string palabras[MAX_PALABRAS];
  13. size_t numPalabras;
  14.  
  15. cout << "Ingresa una frase: ";
  16. getline(cin, frase);
  17.  
  18. numPalabras = SepararPorPalabras(frase, palabras);
  19.  
  20. cout << "La frase tiene " << numPalabras << " palabras: " << endl;
  21. for(size_t i = 0; i < numPalabras; i++)
  22. cout << "Palabra " << i+1 << ": " << palabras[i] << endl;
  23.  
  24. }
  25.  
  26. size_t SepararPorPalabras(string frase, string *palabras){
  27. size_t numPalabras = 0, letrasPorPalabra;
  28. string palabra;
  29.  
  30. while((letrasPorPalabra = frase.find(' ')) != string::npos && numPalabras < MAX_PALABRAS){
  31. palabra = frase.substr(0, letrasPorPalabra);
  32. frase.erase(0, letrasPorPalabra+1);
  33. palabras[numPalabras++] = palabra;
  34. }
  35. if(numPalabras < MAX_PALABRAS){
  36. palabra = frase.substr(0, letrasPorPalabra);
  37. palabras[numPalabras++] = palabra;
  38. }
  39. return numPalabras;
  40. }

La salida del programa es la siguiente:
Código:
Ingresa una frase: frase de prueba
La frase tiene 1 palabras:
Palabra 1: frase

Si alguien puede echarme una mano para encontrar el error.  :-X :-X


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: GominaTilted en 10 Diciembre 2018, 09:27 am
YreX-DwX, gracias por el aporte. Si consigo sacar algo te aviso xD. Luego tengo que corregir el ejercicio, osea que supongo que obtendré una solución óptima.


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: CalgaryCorpus en 10 Diciembre 2018, 15:52 pm
Esto
Código
  1. cin >> frase;
solo lee la primera palabra. No lee la frase completa.


Título: Re: Guardar una frase en los elementos de un vector
Publicado por: K-YreX en 10 Diciembre 2018, 16:24 pm
Esto
Código
  1. cin >> frase;
solo lee la primera palabra. No lee la frase completa.

Cierto, y yo que me había centrado en la función no me estaba dando cuenta de eso :-X. Ya he cambiado el código para que funcione:
Código
  1. cout << "Ingrese una frase: ";
  2. getline(cin, frase);