recorrer una cadena de caracteres

Iniciado por marta.r, 2 Enero 2019, 21:15 PM

0 Miembros y 2 Visitantes están viendo este tema.

marta.r

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

fary

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?
Un byte a la izquierda.

Cero++

Cita de: 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

Podrías mostrar tu código base?

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

Código (cpp) [Seleccionar]
#include <iostream>
#include <cctype>
using namespace std;
void Todo_minuscula(string s);
int main(int argc, char *argv[]) {
string frase="En el dia mas brillante, en la noche mas obscura,
ningun mal escapara de mi, La luz del linterna verde!",vocal;
/*Ahora voy a pasar todo a minuscula para que se encuentre la vocal
sin importar si es mayuscula o minuscula*/
Todo_minuscula(frase);
int contador_de_vocales=0;
cout<<"Que vocal desea ver cuantas veces aparece? "; cin>>vocal;
/*Paso a minuscula la vocal, ya que todo esta en minuscula*/
vocal=tolower(vocal[0]);
//creo un auxiliar
size_t p=frase.find(vocal,0);
while(p!=string::npos){ //string::npos es un valor especial del metodo find...
contador_de_vocales++;
p=frase.find(vocal,p+vocal.size());
}
cout<<"Cantidad de veces que aparece la vocal "<<vocal<<": "<<contador_de_vocales;
return 0;
}

void Todo_minuscula(string s){
if(!s.empty()){
for(size_t i=0;i<s.size();i++) {
s[i]=tolower(s[i]);
}
}
}


Para la próxima trata de hacerlo y déjalo donde no sepas cómo proseguir, sino, nunca vas a aprender.
Chao.
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

fary

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

#include <stdio.h>
#include <stdlib.h>

int NumeroVocales(char * Cadena);

int main()
{
   char * cadena = "Elhacker.net, la mejor web!";

   printf("La cadena tiene %i vocales\n", NumeroVocales(cadena));
   return 0;
}

int NumeroVocales(char * Cadena)
{
   char Vocales[9] = {'a','e','i','o','u','A','E','I','O','U'};
   int Contador = 0;
   int Desplazamiento = 0;
   int i;

   while (Cadena[Desplazamiento] != '\0')
   {
       for(i=0;i<=9;i++)
       {
           if (Cadena[Desplazamiento] == Vocales[i])
           {
               Contador++;
               break;
           }
       }
       Desplazamiento++;
   }
   return Contador;
}


saludos.
Un byte a la izquierda.

K-YreX

Aquí tenéis otra solución:
Código (cpp) [Seleccionar]

int contarVocales(const string &frase){
    int contador = 0;
    for(size_t i = 0; i < frase.size(); i++){
        switch(tolower(frase[i])){
            case 'a': case 'e': case 'i': case 'o': case 'u':
                contador++;
        }
    return contador;
}


O sin usar el switch:
Código (cpp) [Seleccionar]

int contarVocales(const string &frase){
    int contador = 0;
    char actual;
    for(size_t i = 0; i < frase.size(); i++){
        actual = tolower(frase[i]);
        if(actual == 'a' || actual == 'e' || actual == 'i' || actual == 'o' || actual == 'u')
            contador++;
    }
    return contador;
}
Código (cpp) [Seleccionar]

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

Cero++

Cita de: 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

#include <stdio.h>
#include <stdlib.h>

int NumeroVocales(char * Cadena);

int main()
{
   char * cadena = "Elhacker.net, la mejor web!";

   printf("La cadena tiene %i vocales\n", NumeroVocales(cadena));
   return 0;
}

int NumeroVocales(char * Cadena)
{
   char Vocales[9] = {'a','e','i','o','u','A','E','I','O','U'};
   int Contador = 0;
   int Desplazamiento = 0;
   int i;

   while (Cadena[Desplazamiento] != '\0')
   {
       for(i=0;i<=9;i++)
       {
           if (Cadena[Desplazamiento] == Vocales[i])
           {
               Contador++;
               break;
           }
       }
       Desplazamiento++;
   }
   return Contador;
}


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
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

Cero++

Cita de: YreX-DwX en  4 Enero 2019, 08:39 AM
Aquí tenéis otra solución:
Código (cpp) [Seleccionar]

int contarVocales(const string &frase){
    int contador = 0;
    for(size_t i = 0; i < frase.size(); i++){
        switch(tolower(frase[i])){
            case 'a': case 'e': case 'i': case 'o': case 'u':
                contador++;
        }
    return contador;
}


O sin usar el switch:
Código (cpp) [Seleccionar]

int contarVocales(const string &frase){
    int contador = 0;
    char actual;
    for(size_t i = 0; i < frase.size(); i++){
        actual = tolower(frase[i]);
        if(actual == 'a' || actual == 'e' || actual == 'i' || actual == 'o' || actual == 'u')
            contador++;
    }
    return contador;
}


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
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

fary

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

int NumeroVocales(char * Cadena)
{
    int i,x,a = 0 ;
    for (i=0; Cadena[i] != '\0';i++)
    {
       x = Cadena[i];
       if (x <= 90) x += 32;
       if (x == 'a'|| x == 'e' || x == 'i' || x == 'o' || x == 'u')a++;
    }
    return a;
}
Un byte a la izquierda.

K-YreX

Cita de: fary en  4 Enero 2019, 15:16 PM
He he estado dando vueltas a la cosa... :rolleyes:  quizás así es mejor  :laugh:

int NumeroVocales(char * Cadena)
{
    int i,x,a = 0 ;
    for (i=0; Cadena[i] != '\0';i++)
    {
       x = Cadena[i];
       if (x <= 90) x += 32;
       if (x == 'a'|| x == 'e' || x == 'i' || x == 'o' || x == 'u')a++;
    }
    return a;
}


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:

// usando variable char
char caracter;
if(caracter >= 'A' && caracter <= 'Z'){
    // es mayuscula, haces lo que sea...
}

// usando variable entera
int caracter_ascii;
if(caracter_ascii >= 65 && caracter_ascii <= 90){
    // es mayuscula, haces lo que sea...
}
Código (cpp) [Seleccionar]

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

fary

Cita de: YreX-DwX en  4 Enero 2019, 16:22 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.
Un byte a la izquierda.