Hola, estoy repasando nuevamente lo que sé hasta el momento y se me cruzó por la cabeza resolver recursivamente un conteo de vocales, quisiera saber si ustedes creen que es la manera correcta de resolverlo, si existen mejores soluciones... etc
#include <stdio.h>
#define ptrNULL 0
int es_vocal(char c)
{
/* Aqui se presento la situacion de un switch
no se precisamente cual solucion es la mejor
*/
char conjunto[] = {'a','e', 'i', 'o', 'u'};
int i;
for(i = 0; i < 5; i++)
if(c == conjunto[i]) return 1;
return 0;
}
unsigned int contar_vocal(char *palabra)
{
if(*palabra == ptrNULL)
return 0;
else
if(es_vocal(tolower(*palabra)))
{
palabra++;
return (1 + contar_vocal(palabra));
}
else
{
palabra++;
return contar_vocal(palabra);
}
}
int main()
{
char *s = "MUrCiELagO";
int cnt;
cnt = contar_vocal(s);
printf("\nCantidad > %d\n", cnt);
return 0;
}
Otra solución:
#include <stdio.h>
#include <ctype.h>
int esvocal(char c);
int main(void)
{
char *pchar,str[]="MurCieLago";
int nv=0;
for(pchar=str;*pchar;pchar++)
{
if(esvocal(*pchar))
nv++;
}
printf("Cantidad de vocales:%d\n",nv);
return 0;
}
int esvocal(char c)
{
c=tolower(c);
return (c=='a'||c=='e'||c=='i'||c=='o'||c=='u');
}
Opino que las soluciones recursivas solo deben ser utilizadas cuando hacen más facil el entender el problema. Como en el caso de las torres de hanoi por ejemplo.
De cierta manera, es otra forma de resolverlo, pero sin recursividad...
Respecto a tu opinión, por el momento no tengo un argumento fuerte para poner en discusión...
cbug, te falta incluir la libreria ctype.h para la funcion tolower()
Aca dejo otro codigo...
#include <stdio.h>
#include <ctype.h>
int contarVocales( char *palabra )
{
char c;
if ( *palabra == '\0' )
{
return 0;
}
else
{
c = tolower( *palabra );
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
{
return ( 1 + contarVocales( ++palabra ) );
}
else
{
return contarVocales( ++palabra );
}
}
}
int main( void )
{
char *s = "MUrCiELagO";
printf("Cantidad: %d\n", contarVocales( s ) );
return 0;
}
Salu10.
Cierto, ahora una pregunta, tu que estás más adentrado en el tema...
Es más conveniente hacer un bucle de búsqueda de "vocal", o hacer una comparación ya sea mediante un if() o switch()?
Cita de: cbug en 4 Julio 2010, 14:28 PM
Cierto, ahora una pregunta, tu que estás más adentrado en el tema...
Es más conveniente hacer un bucle de búsqueda de "vocal", o hacer una comparación ya sea mediante un if() o switch()?
Yo lo que haría, es un puntero a la matriz y, con un bucle que la vaya recorriendo. Luego le añades un
if() para buscar la letra.
Saludos :P
No comprendo.
Cita de: cbug en 4 Julio 2010, 16:04 PM
No comprendo.
Es lo que hizo
czealt, pero te explico la parte dónde busca:
char str[] = "MurCieLago";
char *pchar = str;
for(; *pchar; pchar++)
{
if(esvocal(*pchar))
//...
Primero creas una matriz con la palabra deseada, en este caso: murciélago; seguidamente, creamos un puntero que va a apuntar a la matriz creada; luego en el
for(), con el puntero creado vamos recorriendo el CONTENIDO de la matriz, o sea los carácteres, y dentro de este
for(), le hacemos un
if() para comprobar si existe una vocal. ¿Entiendes? Te lo puedo explicar mejor si quieres :) Aunque esta sería mi forma de hacerlo :P
Saludos :P
Ah, claro... me confundí, porque pensé que hacías referencia a mi última pregunta... Porque en realidad estaba tratando el tema de recursividad antes que el método iterativo :xD
¡Buenas!
Si te referias a comprobar si un caracter es una vocal tambien puedes utilizar este metodo.
int esvocal(char c)
{
char vocales[]="aeiou";
return (strchr(vocales , tolower(c)) != NULL);
}
Y bueno, el metodo recursivo que haas planteado es correcto, aunque prefiero el iterativo.
¡Saludos!
La verdad que no había pensado en esa función... :D
Si... es cierto que el método iterativo es mucho mejor...