elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Guardar una frase en los elementos de un vector
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Guardar una frase en los elementos de un vector  (Leído 3,950 veces)
GominaTilted

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Guardar una frase en los elementos de un vector
« 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


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Guardar una frase en los elementos de un vector
« Respuesta #1 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.  


En línea

GominaTilted

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Guardar una frase en los elementos de un vector
« Respuesta #2 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 :/
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Guardar una frase en los elementos de un vector
« Respuesta #3 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
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Guardar una frase en los elementos de un vector
« Respuesta #4 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. }
En línea

GominaTilted

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Guardar una frase en los elementos de un vector
« Respuesta #5 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.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Guardar una frase en los elementos de un vector
« Respuesta #6 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.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Guardar una frase en los elementos de un vector
« Respuesta #7 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
« Última modificación: 10 Diciembre 2018, 16:25 pm por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
GominaTilted

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Guardar una frase en los elementos de un vector
« Respuesta #8 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.
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Guardar una frase en los elementos de un vector
« Respuesta #9 en: 10 Diciembre 2018, 15:52 pm »

Esto
Código
  1. cin >> frase;
solo lee la primera palabra. No lee la frase completa.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Eliminar elementos repetidos de un vector
Programación General
GaLaN GaLaNaSo 3000 2 62,999 Último mensaje 16 Noviembre 2011, 06:44 am
por osolmm
Introducir elementos de un vector en orden
Programación C/C++
Katerina Dobreva 3 2,752 Último mensaje 15 Noviembre 2014, 11:54 am
por Eternal Idol
Eliminar elementos de un vector
Programación C/C++
chihue 1 2,106 Último mensaje 3 Enero 2015, 03:13 am
por rir3760
Eliminar todos los elementos de un vector
Programación C/C++
chihue 5 2,775 Último mensaje 8 Enero 2015, 05:57 am
por crack81
Contar elementos de un vector
Programación C/C++
estudiante_1 3 7,822 Último mensaje 18 Enero 2016, 15:58 pm
por Yoel Alejandro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines