Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: marta.r en 2 Enero 2019, 21:15 pm



Título: recorrer una cadena de caracteres
Publicado por: marta.r 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


Título: Re: recorrer una cadena de caracteres
Publicado por: fary 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?


Título: Re: recorrer una cadena de caracteres
Publicado por: Cero++ 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.


Título: Re: recorrer una cadena de caracteres
Publicado por: fary 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.


Título: Re: recorrer una cadena de caracteres
Publicado por: K-YreX 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. }


Título: Re: recorrer una cadena de caracteres
Publicado por: Cero++ 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


Título: Re: recorrer una cadena de caracteres
Publicado por: Cero++ 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


Título: Re: recorrer una cadena de caracteres
Publicado por: fary 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.  


Título: Re: recorrer una cadena de caracteres
Publicado por: K-YreX 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. }


Título: Re: recorrer una cadena de caracteres
Publicado por: fary 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.


Título: Re: recorrer una cadena de caracteres
Publicado por: Eternal Idol en 4 Enero 2019, 18:46 pm
No hagan tareas ajenas por favor.