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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  recorrer una cadena de caracteres
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: recorrer una cadena de caracteres  (Leído 3,012 veces)
marta.r

Desconectado Desconectado

Mensajes: 2


Ver Perfil
recorrer una cadena de caracteres
« en: 2 Enero 2019, 21:15 pm »

Buenas, tengo que hacer un ejercicio que pida una frase, muestre el numero de vocales que tiene y las muestre por pantalla.
Se que es nivel muy básico pero no se por donde empezar.. Gracias


En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: recorrer una cadena de caracteres
« Respuesta #1 en: 2 Enero 2019, 21:21 pm »

Recorre todos los caracteres de la cadena y comparalo con las 5 vocales que hay, si coincide con alguna vocal, incrementa el contador...  ¿Puedes mostrar el código que tienes?


En línea

Un byte a la izquierda.
Cero++

Desconectado Desconectado

Mensajes: 52



Ver Perfil WWW
Re: recorrer una cadena de caracteres
« Respuesta #2 en: 4 Enero 2019, 03:56 am »

Buenas, tengo que hacer un ejercicio que pida una frase, muestre el numero de vocales que tiene y las muestre por pantalla.
Se que es nivel muy básico pero no se por donde empezar.. Gracias

Podrías mostrar tu código base?

Mira, aquí te adjunto el código que hice, espero sea de ayuda  ;D

Código
  1. #include <iostream>
  2. #include <cctype>
  3. using namespace std;
  4. void Todo_minuscula(string s);
  5. int main(int argc, char *argv[]) {
  6. string frase="En el dia mas brillante, en la noche mas obscura,
  7. ningun mal escapara de mi, La luz del linterna verde!",vocal;
  8. /*Ahora voy a pasar todo a minuscula para que se encuentre la vocal
  9. sin importar si es mayuscula o minuscula*/
  10. Todo_minuscula(frase);
  11. int contador_de_vocales=0;
  12. cout<<"Que vocal desea ver cuantas veces aparece? "; cin>>vocal;
  13. /*Paso a minuscula la vocal, ya que todo esta en minuscula*/
  14. vocal=tolower(vocal[0]);
  15. //creo un auxiliar
  16. size_t p=frase.find(vocal,0);
  17. while(p!=string::npos){ //string::npos es un valor especial del metodo find...
  18. contador_de_vocales++;
  19. p=frase.find(vocal,p+vocal.size());
  20. }
  21. cout<<"Cantidad de veces que aparece la vocal "<<vocal<<": "<<contador_de_vocales;
  22. return 0;
  23. }
  24.  
  25. void Todo_minuscula(string s){
  26. if(!s.empty()){
  27. for(size_t i=0;i<s.size();i++) {
  28. s[i]=tolower(s[i]);
  29. }
  30. }
  31. }
  32.  

Para la próxima trata de hacerlo y déjalo donde no sepas cómo proseguir, sino, nunca vas a aprender.
Chao.
En línea

Código:
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]
fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: recorrer una cadena de caracteres
« Respuesta #3 en: 4 Enero 2019, 07:42 am »

Pues ya que publicaste una solución, voy a poner yo la mía en C, creo que es mas rápida que la tuya Cero++  :P

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int NumeroVocales(char * Cadena);
  5.  
  6. int main()
  7. {
  8.    char * cadena = "Elhacker.net, la mejor web!";
  9.  
  10.    printf("La cadena tiene %i vocales\n", NumeroVocales(cadena));
  11.    return 0;
  12. }
  13.  
  14. int NumeroVocales(char * Cadena)
  15. {
  16.    char Vocales[9] = {'a','e','i','o','u','A','E','I','O','U'};
  17.    int Contador = 0;
  18.    int Desplazamiento = 0;
  19.    int i;
  20.  
  21.    while (Cadena[Desplazamiento] != '\0')
  22.    {
  23.        for(i=0;i<=9;i++)
  24.        {
  25.            if (Cadena[Desplazamiento] == Vocales[i])
  26.            {
  27.                Contador++;
  28.                break;
  29.            }
  30.        }
  31.        Desplazamiento++;
  32.    }
  33.    return Contador;
  34. }
  35.  

saludos.
En línea

Un byte a la izquierda.
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: recorrer una cadena de caracteres
« Respuesta #4 en: 4 Enero 2019, 08:39 am »

Aquí tenéis otra solución:
Código
  1. int contarVocales(const string &frase){
  2.    int contador = 0;
  3.    for(size_t i = 0; i < frase.size(); i++){
  4.        switch(tolower(frase[i])){
  5.            case 'a': case 'e': case 'i': case 'o': case 'u':
  6.                contador++;
  7.        }
  8.    return contador;
  9. }

O sin usar el switch:
Código
  1. int contarVocales(const string &frase){
  2.    int contador = 0;
  3.    char actual;
  4.    for(size_t i = 0; i < frase.size(); i++){
  5.        actual = tolower(frase[i]);
  6.        if(actual == 'a' || actual == 'e' || actual == 'i' || actual == 'o' || actual == 'u')
  7.            contador++;
  8.    }
  9.    return contador;
  10. }
En línea

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

Desconectado Desconectado

Mensajes: 52



Ver Perfil WWW
Re: recorrer una cadena de caracteres
« Respuesta #5 en: 4 Enero 2019, 13:36 pm »

Pues ya que publicaste una solución, voy a poner yo la mía en C, creo que es mas rápida que la tuya Cero++  :P

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int NumeroVocales(char * Cadena);
  5.  
  6. int main()
  7. {
  8.    char * cadena = "Elhacker.net, la mejor web!";
  9.  
  10.    printf("La cadena tiene %i vocales\n", NumeroVocales(cadena));
  11.    return 0;
  12. }
  13.  
  14. int NumeroVocales(char * Cadena)
  15. {
  16.    char Vocales[9] = {'a','e','i','o','u','A','E','I','O','U'};
  17.    int Contador = 0;
  18.    int Desplazamiento = 0;
  19.    int i;
  20.  
  21.    while (Cadena[Desplazamiento] != '\0')
  22.    {
  23.        for(i=0;i<=9;i++)
  24.        {
  25.            if (Cadena[Desplazamiento] == Vocales[i])
  26.            {
  27.                Contador++;
  28.                break;
  29.            }
  30.        }
  31.        Desplazamiento++;
  32.    }
  33.    return Contador;
  34. }
  35.  

saludos.

Pero no es más fácil el convertir toda la oración a minúscula o mayúscula? Y así te evitas el hecho de pasar las mismas vocales pero en Mayus. o viceversa.
En fin, hace lo mismo jaja Pero me pregunto cuál forma sería más rápida de compilar, si estuviéramos buscando alguna palabra en un archivo de texto
En línea

Código:
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]
Cero++

Desconectado Desconectado

Mensajes: 52



Ver Perfil WWW
Re: recorrer una cadena de caracteres
« Respuesta #6 en: 4 Enero 2019, 13:42 pm »

Aquí tenéis otra solución:
Código
  1. int contarVocales(const string &frase){
  2.    int contador = 0;
  3.    for(size_t i = 0; i < frase.size(); i++){
  4.        switch(tolower(frase[i])){
  5.            case 'a': case 'e': case 'i': case 'o': case 'u':
  6.                contador++;
  7.        }
  8.    return contador;
  9. }

O sin usar el switch:
Código
  1. int contarVocales(const string &frase){
  2.    int contador = 0;
  3.    char actual;
  4.    for(size_t i = 0; i < frase.size(); i++){
  5.        actual = tolower(frase[i]);
  6.        if(actual == 'a' || actual == 'e' || actual == 'i' || actual == 'o' || actual == 'u')
  7.            contador++;
  8.    }
  9.    return contador;
  10. }

Me gusta ese código, se ve simple  y fácil de recordar ;D Te evitas el uso de los manipuladores :P
Te lo voy a robar  :xD
En línea

Código:
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]
fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: recorrer una cadena de caracteres
« Respuesta #7 en: 4 Enero 2019, 15:16 pm »

He he estado dando vueltas a la cosa... :rolleyes:  quizás así es mejor  :laugh:

Código
  1. int NumeroVocales(char * Cadena)
  2. {
  3.    int i,x,a = 0 ;
  4.    for (i=0; Cadena[i] != '\0';i++)
  5.    {
  6.       x = Cadena[i];
  7.       if (x <= 90) x += 32;
  8.       if (x == 'a'|| x == 'e' || x == 'i' || x == 'o' || x == 'u')a++;
  9.    }
  10.    return a;
  11. }
  12.  
En línea

Un byte a la izquierda.
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: recorrer una cadena de caracteres
« Respuesta #8 en: 4 Enero 2019, 16:22 pm »

He he estado dando vueltas a la cosa... :rolleyes:  quizás así es mejor  :laugh:

Código
  1. int NumeroVocales(char * Cadena)
  2. {
  3.    int i,x,a = 0 ;
  4.    for (i=0; Cadena[i] != '\0';i++)
  5.    {
  6.       x = Cadena[i];
  7.       if (x <= 90) x += 32;
  8.       if (x == 'a'|| x == 'e' || x == 'i' || x == 'o' || x == 'u')a++;
  9.    }
  10.    return a;
  11. }
  12.  

Aunque para este caso puede funcionar no es muy recomendable ese <if> de la línea 7. Ya que vas a convertir más caracteres de los que deberías, por ejemplo, los espacios los vas a convertir en arrobas y repito, aunque para este ejercicio no influye, no es muy correcto. Para eso está la función <tolower()> o si se hace usando los valores en ascii es mejor comprobar que es una letra es decir:
Código
  1. // usando variable char
  2. char caracter;
  3. if(caracter >= 'A' && caracter <= 'Z'){
  4.    // es mayuscula, haces lo que sea...
  5. }
  6.  
  7. // usando variable entera
  8. int caracter_ascii;
  9. if(caracter_ascii >= 65 && caracter_ascii <= 90){
  10.    // es mayuscula, haces lo que sea...
  11. }
En línea

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


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: recorrer una cadena de caracteres
« Respuesta #9 en: 4 Enero 2019, 16:51 pm »

Aunque para este caso puede funcionar no es muy recomendable ese <if> de la línea 7. Ya que vas a convertir más caracteres de los que deberías, por ejemplo, los espacios los vas a convertir en arrobas y repito, aunque para este ejercicio no influye, no es muy correcto. Para eso está la función <tolower()> o si se hace usando los valores en ascii es mejor comprobar que es una letra es decir:

Ya se que se van a modificar todos lo demás, pero en este caso como bien dices no influye  :silbar: me puede el ansia de hacer minimalista y rápido el código. Quiero mas 'retos' como este  :-[ me encantan!

saludos.
En línea

Un byte a la izquierda.
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
cadena de caracteres
Programación C/C++
Ander123 1 2,358 Último mensaje 6 Septiembre 2012, 14:15 pm
por avesudra
[?] C++ Ayuda Recorrer cadena?
Programación C/C++
Scene 2 10,651 Último mensaje 9 Septiembre 2013, 17:42 pm
por rir3760
Problema al recorrer cadena
Programación C/C++
Joe Fraddy 8 3,066 Último mensaje 7 Octubre 2016, 21:11 pm
por Joe Fraddy
cadena de caracteres
Programación C/C++
brayan 5 2,499 Último mensaje 27 Abril 2017, 18:41 pm
por Fedex15
Cadena de caracteres en C
Programación C/C++
Jurott1 8 3,023 Último mensaje 2 Mayo 2017, 01:33 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines