Autor
|
Tema: recorrer una cadena de caracteres (Leído 3,012 veces)
|
marta.r
Desconectado
Mensajes: 2
|
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
|
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++
|
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 #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.
|
|
|
En línea
|
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++ #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.
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
K-YreX
|
Aquí tenéis otra solución: 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: 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; }
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Cero++
|
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++ #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
|
|
|
En línea
|
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]
|
|
|
Cero++
|
Aquí tenéis otra solución: 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: 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 Te evitas el uso de los manipuladores Te lo voy a robar
|
|
|
En línea
|
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]
|
|
|
fary
|
He he estado dando vueltas a la cosa... quizás así es mejor 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; }
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
K-YreX
|
He he estado dando vueltas a la cosa... quizás así es mejor 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... }
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
fary
|
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 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.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
cadena de caracteres
Programación C/C++
|
Ander123
|
1
|
2,358
|
6 Septiembre 2012, 14:15 pm
por avesudra
|
|
|
[?] C++ Ayuda Recorrer cadena?
Programación C/C++
|
Scene
|
2
|
10,651
|
9 Septiembre 2013, 17:42 pm
por rir3760
|
|
|
Problema al recorrer cadena
Programación C/C++
|
Joe Fraddy
|
8
|
3,066
|
7 Octubre 2016, 21:11 pm
por Joe Fraddy
|
|
|
cadena de caracteres
Programación C/C++
|
brayan
|
5
|
2,499
|
27 Abril 2017, 18:41 pm
por Fedex15
|
|
|
Cadena de caracteres en C
Programación C/C++
|
Jurott1
|
8
|
3,023
|
2 Mayo 2017, 01:33 am
por MAFUS
|
|