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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Imprimir la palabra mas larga de un string C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Imprimir la palabra mas larga de un string C++  (Leído 6,825 veces)
MellaSystems

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Imprimir la palabra mas larga de un string C++
« en: 15 Febrero 2015, 23:08 pm »

Gente necesito una ayudita... Quiero hacer una funcion que reciba un string y que dentro del string busque la palabra mas larga y la imprima. Y quisiera saber como voltear un string alreves pero que se quede en la misma posicion con los metodos sort() y reverse().

tengo esto asi las pude voltear:

#include <iostream>
#include <string>
using namespace std;
 
void invertStringWords(string);
void countVocals(string);
void countConsonants(string);
void countSpecialCharacters(string);
void displayMaxCharacterWords(string);
void countWords(string);
 
int main() {
    string words;
    std::cout<<"Introduzca alguna frase: ";
    std::getline(std::cin,words);
   
    cout << endl << "Sentencia original: \t" << words << endl;
    reverse(words.begin(),words.end());
    invertStringWords(words);
   
   
    system("pause");
    return 0;
}

//Funcion que invierte el orden de las palabras en una cadena
void invertStringWords(string words) {
          //Arreglo con la longitud de los caracteres en la sentencia
          int arraylength = words.length();
 
          // índice para el caracter que está siendo leído
          int a=0;
 
          // String para almacenar la última palabra formada del arreglo
          string invert="";
 
          // Arreglo de caracteres con la cadena final de palabras invertidas
           char invertedWords[arraylength];
 
           // Ciclo que recorre la cadena original desde el final
           for(int i=arraylength-1; i >= -1; i--){
             // Si encontramos un espacio ya hemos terminado una palabra
             // invertir la palabra y agregarla al principio del arreglo invertido
             if(i==-1 || words == ' ') {
                         // Agregar la última palabra encontrada invertida en la sentencia
                         // al principio del arreglo de cadena invertida
                         for(int b=invert.length()-1; b >=0 ; b--) {
                                 invertedWords[a] = invert;
                                 a++;
                         }
                         // Agregar un espacio para delimitar palabra e incrementar el contador
                         // 'a' solo si no se ha llegado al final del arreglo.
                         if (i>-1)
                            invertedWords[a++] = ' ';
                         invert="";
             }
             else
             {
              // Tenemos un caracter, agregarlo a la cadena temporal
                         invert +=words;
             }
     }
             cout << endl << "Sentencia invertida: \t" << invertedWords << endl;
}


En línea

Miseryk

Desconectado Desconectado

Mensajes: 217


SI.NU.SA U.GU.DE (2NE1 - D-Unit)


Ver Perfil
Re: Imprimir la palabra mas larga de un string C++
« Respuesta #1 en: 16 Febrero 2015, 04:36 am »

Gente necesito una ayudita... Quiero hacer una funcion que reciba un string y que dentro del string busque la palabra mas larga y la imprima. Y quisiera saber como voltear un string alreves pero que se quede en la misma posicion con los metodos sort() y reverse().

tengo esto asi las pude voltear:

#include <iostream>
#include <string>
using namespace std;
 
void invertStringWords(string);
void countVocals(string);
void countConsonants(string);
void countSpecialCharacters(string);
void displayMaxCharacterWords(string);
void countWords(string);
 
int main() {
    string words;
    std::cout<<"Introduzca alguna frase: ";
    std::getline(std::cin,words);
    
    cout << endl << "Sentencia original: \t" << words << endl;
    reverse(words.begin(),words.end());
    invertStringWords(words);
    
    
    system("pause");
    return 0;
}

//Funcion que invierte el orden de las palabras en una cadena
void invertStringWords(string words) {
          //Arreglo con la longitud de los caracteres en la sentencia
          int arraylength = words.length();
 
          // índice para el caracter que está siendo leído
          int a=0;
 
          // String para almacenar la última palabra formada del arreglo
          string invert="";
 
          // Arreglo de caracteres con la cadena final de palabras invertidas
           char invertedWords[arraylength];
 
           // Ciclo que recorre la cadena original desde el final
           for(int i=arraylength-1; i >= -1; i--){
             // Si encontramos un espacio ya hemos terminado una palabra
             // invertir la palabra y agregarla al principio del arreglo invertido
             if(i==-1 || words == ' ') {
                         // Agregar la última palabra encontrada invertida en la sentencia
                         // al principio del arreglo de cadena invertida
                         for(int b=invert.length()-1; b >=0 ; b--) {
                                 invertedWords[a] = invert;
                                 a++;
                         }
                         // Agregar un espacio para delimitar palabra e incrementar el contador
                         // 'a' solo si no se ha llegado al final del arreglo.
                         if (i>-1)
                            invertedWords[a++] = ' ';
                         invert="";
             }
             else
             {
              // Tenemos un caracter, agregarlo a la cadena temporal
                         invert +=words;
             }
     }
             cout << endl << "Sentencia invertida: \t" << invertedWords << endl;
}

Yo para obtener la frase más larga, lo que haría es rermplazar los "." (puntos), "," (comas) y demás con espacios, luego hago un split con delimitador de " " (espacio) y tengo todas las palabras separadas, busco en cada index cuál tiene la mayor longitud y guardo ese string y el index si es necesario.

Y para voltear un string lo que tenés que hacer es ir leyendo el address del string original desde su última posición hacia su principio e ir copiando cada byte a otro address de otro string.


« Última modificación: 16 Febrero 2015, 04:42 am por Miseryk » En línea

Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It’s never too late to change our luck
So, don’t let them steal your light
Don’t let them break your stride
There is light on the other side
And you’ll see all the raindrops falling behind
Make it out tonight
it’s a revolution

CL!!!
Miseryk

Desconectado Desconectado

Mensajes: 217


SI.NU.SA U.GU.DE (2NE1 - D-Unit)


Ver Perfil
Re: Imprimir la palabra mas larga de un string C++
« Respuesta #2 en: 16 Febrero 2015, 06:29 am »

Código
  1. #include <iostream>
  2. #include <Windows.h>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. char Orig[] = {"1234567"};
  9.  
  10. int lenStr = strlen(Orig);
  11.  
  12. char * output = new char[lenStr + 1];
  13.  
  14. __asm
  15. {
  16. pushad
  17.  
  18. std
  19. mov ecx, lenStr
  20.  
  21. lea esi, Orig
  22. add esi, ecx
  23. dec esi
  24. mov edi, output
  25. zrep:
  26. movsb
  27. inc edi
  28. inc edi
  29. loop zrep
  30. mov byte ptr [edi], 0x00
  31.  
  32. popad
  33. }
  34.  
  35. cout << output << endl; //7654321
  36.  
  37. delete[] output;
  38.  
  39. cin.get();
  40.  
  41. return 0;
  42. }
  43.  
En línea

Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It’s never too late to change our luck
So, don’t let them steal your light
Don’t let them break your stride
There is light on the other side
And you’ll see all the raindrops falling behind
Make it out tonight
it’s a revolution

CL!!!
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Imprimir la palabra mas larga de un string C++
« Respuesta #3 en: 16 Febrero 2015, 11:26 am »

Invertir un string... que tal así:

Código
  1. int main( )
  2. {
  3.  std::string cadena = "0123456789";
  4.  std::string invertida( cadena.rbegin( ), cadena.rend( ) );
  5.  
  6.  std::cout << invertida << std::endl;
  7. }

En cuanto a encontrar la palabra más larga... con iteradores se puede conseguir fácilmente:

Código
  1. void PalabraMasLarga( const std::string& cadena )
  2. {
  3.  std::string palabra;
  4.  auto it = cadena.begin( );
  5.  
  6.  for( auto it2 = it; it2 != cadena.end( ); ++it2 )
  7.  {
  8.    if ( *it2 == ' ' )
  9.    {
  10.      size_t length = std::distance( it, it2 );
  11.      if ( length > palabra.size( ) )
  12.        palabra = std::string( it, it2 );
  13.      it = it2+1;
  14.    }
  15.  }
  16.  
  17.  std::cout << palabra << std::endl;
  18. }

El codigo usa dos iteradores, uno apunta al inicio de la palabra actual y el otro va avanzando hasta encontrar un espacio, si la longitud de la cadena es mayor que la palabra más larga encontrada hasta ahora, la sustituye.

Simple y rápido.
En línea

Miseryk

Desconectado Desconectado

Mensajes: 217


SI.NU.SA U.GU.DE (2NE1 - D-Unit)


Ver Perfil
Re: Imprimir la palabra mas larga de un string C++
« Respuesta #4 en: 16 Febrero 2015, 15:52 pm »

Invertir un string... que tal así:

Código
  1. int main( )
  2. {
  3.  std::string cadena = "0123456789";
  4.  std::string invertida( cadena.rbegin( ), cadena.rend( ) );
  5.  
  6.  std::cout << invertida << std::endl;
  7. }

En cuanto a encontrar la palabra más larga... con iteradores se puede conseguir fácilmente:

Código
  1. void PalabraMasLarga( const std::string& cadena )
  2. {
  3.  std::string palabra;
  4.  auto it = cadena.begin( );
  5.  
  6.  for( auto it2 = it; it2 != cadena.end( ); ++it2 )
  7.  {
  8.    if ( *it2 == ' ' )
  9.    {
  10.      size_t length = std::distance( it, it2 );
  11.      if ( length > palabra.size( ) )
  12.        palabra = std::string( it, it2 );
  13.      it = it2+1;
  14.    }
  15.  }
  16.  
  17.  std::cout << palabra << std::endl;
  18. }

El codigo usa dos iteradores, uno apunta al inicio de la palabra actual y el otro va avanzando hasta encontrar un espacio, si la longitud de la cadena es mayor que la palabra más larga encontrada hasta ahora, la sustituye.

Simple y rápido.

Muy bueno el invertir cadena, con respecto a la PalabraMasLargar hay un bug.

Código
  1. PalabraMasLarga("Buscandox la palabra más larga, pero tal vez no funcione,. porque falta algo.");
  2.  

Código
  1. OutPut: "funcione,.", el cual tendría que ser "Buscandox"
  2.  
En línea

Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It’s never too late to change our luck
So, don’t let them steal your light
Don’t let them break your stride
There is light on the other side
And you’ll see all the raindrops falling behind
Make it out tonight
it’s a revolution

CL!!!
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Imprimir la palabra mas larga de un string C++
« Respuesta #5 en: 16 Febrero 2015, 16:20 pm »

Muy bueno el invertir cadena, con respecto a la PalabraMasLargar hay un bug.

La idea no era dar un código completo... si miras el algoritmo ves que separa palabras únicamente por espacios, pero se puede mejorar fácilmente para que sea capaz de reconocer otros tipos de separadores.

Código
  1. if ( *it2 == ' '  || *it2 == ',' || *it2 == '.' /* ... */ )

En línea

Miseryk

Desconectado Desconectado

Mensajes: 217


SI.NU.SA U.GU.DE (2NE1 - D-Unit)


Ver Perfil
Re: Imprimir la palabra mas larga de un string C++
« Respuesta #6 en: 16 Febrero 2015, 23:11 pm »

La idea no era dar un código completo... si miras el algoritmo ves que separa palabras únicamente por espacios, pero se puede mejorar fácilmente para que sea capaz de reconocer otros tipos de separadores.

Código
  1. if ( *it2 == ' '  || *it2 == ',' || *it2 == '.' /* ... */ )



Interesante, tengo que ponerme a ver el nuevo framework, me quedé en string, pero no conocía "auto", gracias.
En línea

Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It’s never too late to change our luck
So, don’t let them steal your light
Don’t let them break your stride
There is light on the other side
And you’ll see all the raindrops falling behind
Make it out tonight
it’s a revolution

CL!!!
MellaSystems

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Re: Imprimir la palabra mas larga de un string C++
« Respuesta #7 en: 17 Febrero 2015, 01:39 am »

Muchas gracias a los dos por su aporte Myseryk y eferion muy buenos aportes
En línea

Skynet96

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Imprimir la palabra mas larga de un string C++
« Respuesta #8 en: 19 Agosto 2016, 23:29 pm »

entonces como queda el codigo? jajaja
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como modificar una palabra por otra mas larga en V Basic
Ingeniería Inversa
ELDORADOV8 4 2,942 Último mensaje 18 Junio 2008, 22:58 pm
por Shaddy
Imprimir una palabra en binario[?]
Programación C/C++
Slava_TZD 3 2,474 Último mensaje 9 Mayo 2011, 08:42 am
por Slava_TZD
Extraer Palabra de un String con delimitadores
PHP
spysecurityca 4 2,743 Último mensaje 3 Septiembre 2014, 16:51 pm
por WHK
Buscar una palabra dentro de un string
Programación C/C++
kur79 3 11,979 Último mensaje 18 Febrero 2019, 19:48 pm
por Loretz
La palabra mas larga « 1 2 »
Programación C/C++
Jesusm1229 11 7,137 Último mensaje 14 Junio 2015, 21:18 pm
por Jesusm1229
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines