find(): buscar la primera vocal de una palabra en C++

En C++ existe un método llamado find() que se encuentra en la cabecera <string>, dicho método nos permite encontrar en un string la primera ocurrencia de un carácter o substring y nos devuelve su índice. Aquí hay un pequeño programa para ilustrar de mejor forma su funcionamiento.

Código fuente
#include <iostream>
#include <cctype>
#include <string>
#include <algorithm>
using namespace std;

int filtrar(int i) {
    if(i != -1) {
        return i;
    }
    return 45000;
}

int main() {
    int a, e, i, o, u;
    string palabra, aux;

    cout << "Ingrese una palabra a evaluar: ";
    getline(cin >> ws, aux);

    for(int ind = 0; ind < aux.length(); ind++) {
        palabra.push_back(tolower(aux[ind]));
    }

    a = filtrar(palabra.find('a'));
    e = filtrar(palabra.find('e'));
    i = filtrar(palabra.find('i'));
    o = filtrar(palabra.find('o'));
    u = filtrar(palabra.find('u'));

    int vocal = min(a, min(e, min(i, min(o, u))));

    cout << "\nLa primera vocal es: " << palabra[vocal] << endl;
    cout << "Su indice es: " << vocal << endl;

    return 0;
}

Debemos incluir las cabeceras necesarias para poder usar los objetos cout y cin, además del método find() y la función min(). Las cabeceras que necesitamos son <iostream>, <cctype>, <string> y <algorithm>.

* <iostream>: necesaria para poder usar los objetos «cin» y «cout».

* <cctype>: necesaria para poder usar la función tolower().

* <string>: necesaria para poder crear objetos de tipo string y usar sus métodos, en este caso length(), push_back() y find().

* <algorithm>: necesaria para poder usar la función min().

En la línea 4 aparece la sentencia using namespace std;, que básicamente nos permite hacer uso de todas las clases, objetos y/o funciones de la biblioteca estándar de C++ sin el prefijo std::; por ejemplo: std::cout.

Función filtrar(int i)
int filtrar(int i) {
    if(i != -1) {
        return i;
    }
    return 45000;
}

Básicamente esta función recibe un parámetro de tipo int y verifica si es diferente a -1 y devuelve el valor de i, de lo contrario, devuelve el número 45000. La función filtrar será usada más adelante cuando estemos usando el método find() para corregir un error que genera los valores negativos.

Función main()

La función main() es la función principal de todo programa escrito en C++ y es el punto de partida cuando se ejecuta el programa una vez ha sido compilado, eso quiere decir que solo el código escrito en su interior se ejecutará. A partir de ahora todo el código que aparezca debe ir dentro de una función main().

Creando las variables necesarias
int a, e, i, o, u;
string palabra, aux;

Creamos 6 variables, 5 de tipo int para almacenar el índice de cada una de las vocales y 2 de tipo string una para almacenar la palabra ingresada por el usuario y otra para almacenar la palabra convertida en minúscula.

Leer palabra ingresada por el usuario

Este programa permite al usuario ingresar la palabra que desea ser evaluada.

cout << "Ingrese una palabra a evaluar: ";
getline(cin >> ws, aux);

Primero mostramos un mensaje en pantalla incidcando al usuario que ingrese una palabra que desee evaluar, esto lo hacemos con el objeto cout. La segunda línea deja al programa en espera hasta que el usuario ingrese la palabra y presione Enter, aquí la función getline() captura la palabra ingresada por el usuario con espacios en blanco; pero elimina los espacios finales y saltos de línea del buffer y luego almacena la palabra en la variable «aux».

Convertir palabra en minúscula

Debido a que es muy posible que un usuario ingrese palabras compuesta por caracteres están en mayúscula, lo más apropiado es convertir toda la palabra a minúscula y así obtener los índices exactos más adelante.

Aquí usaremos los métodos length() y push_back(), al igual que la función tolower().

for(int ind = 0; ind < aux.length(); ind++) {
    palabra.push_back(tolower(aux[ind]));
}

En C++ los objetos string no poseen un método tolower() o lower() cómo si existe en lenguajes como Python, pero si existe la función tolower(); debido a esto, debemos acudir a iterar sobre todo el string y convertir cada carácter en minúscula.

El bucle for() tiene una variable inicial llamada «ind» que inicia en 0 hasta que su valor sea menor a la longitud del string que, la longitud la conseguimos usando el método length(). La función tolower() convierte cada uno de los caracteres de la palabra ingresada por el usuario en minúscula, luego usamos el método push_back() para añadirlos a la variable «palabra». Para obtener cada carácter solo debemos su índice entre […].

Obtener el índice de cada vocal

Para saber cuál es la primera vocal en una palabra se requiere obtener el índice de cada una de forma correcta y aquí entra en juego la función filtrar() explicada al inicio.

a = filtrar(palabra.find('a'));
e = filtrar(palabra.find('e'));
i = filtrar(palabra.find('i'));
o = filtrar(palabra.find('o'));
u = filtrar(palabra.find('u'));

Al inicio dijimos que el método find() nos permite encontrar en un string el índice de la primera ocurrencia de un carácter; por ejemplo, en la palabra -estamos en Junio- find() nos da el índice 3 para la vocal «a», el índice 0 para la vocal «e», el índice 14 para la vocal «i», el índice 5 para la vocal «o» y el índice 12 para la vocal «u».

¿Pero, qué ocurre si alguna de las vocales no está en la palabra? el método find() nos devuelve -1. Por último, el índice de cada vocal es enviado a la función filtrar() para verificar que ninguno de los índices sea -1 o de lo contrario devuelve como valor el número 45000, como se explicó hace unos momentos.

Filtrar el índice menor

Si alguno de los índices es -1, vamos tener un error que altera el resultado final, ya que todo número negativo es menor a cualquier número positivo. Esto se soluciona con la función filtrar() explicada arriba.

int vocal = min(a, min(e, min(i, min(o, u))));

Usamos la función min(), ubicada en la cabecera <algorithm> para obtener el índice menor. Esta función recibe dos argumentos, el primero es la variable que representa la vocal y el segundo es una función min() anidada, excepto la última que recibe las variables «o» y «u».

Mostrar la primera vocal y su índice

Todo programa debe mostrar un resultado al final.

cout << "\nLa primera vocal es: " << palabra[vocal] << endl;
cout << "Su indice es: " << vocal << endl;

La primera línea muestra la primera vocal encontrada por el programa usando el índice almacenado en la variable «vocal» que explicamos antes. En la segunda línea muestra el índice en donde se encuentra la vocal.

Ejecutando el programa
[fixedtorres@linuxero]$ g++ BuscarPrimeraVocal.cpp -o BuscarPrimeraVocal
[fixedtorres@linuxero]$ ./BuscarPrimeraVocal
Ingrese una palabra a evaluar: todo funciona bien

La primera vocal es: o
Su indice es: 1
[fixedtorres@linuxero]$

Al ejecutar el programa nos indica que la primera vocal de la palabra ingresada es la «o» y que se encuentra en el índice 1, lo cual es correcto.

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *