Palíndromos con C++

Los palíndromos son palabras, frases o números que leídos de atrás hacia adelante se leen igual de adelante hacia atrás; por ejemplo: arenera y ana. Para el caso de los números se les llama comúnmente capicúa; por ejemplo: 1991 y 2002. Este pequeño programa o frase nos indica si una palabra es o no es palíndromo.

#include <iostream>
#include <string>
using namespace std;

int main() {
    string texto;
    int aux = 0, igual = 0;
    
    cout << "Ingrese la palabra a evaluar: ";
    getline(cin >> ws, texto);
    
    for(int ind = texto.length() - 1; ind >= 0; ind--) {
        if(texto[ind] == texto[aux]) {
            igual++;
        }
        aux++;
    }
    
    if(texto.length() == igual) {
        cout << "La palabra ingresada es palindromo!! :D" << endl;
    } else {
        cout << "La palabra ingresada no es palindromo!! :D" << endl;
    }
    
    return 0;
}
Directivas del Preprocesador:
#include <iostream>
#include <string>

Como lo explique en la publicación Hola Mundo, las líneas que inician con un signo numeral “#” son directivas del preprocesador; son analizadas e interpretadas antes de que el código fuente sea compilado. La directiva #include le indica al preprocesador que deseamos incluir las cabeceras <iostream> y <string> para trabajar con operaciones de entrada y salida de datos al igual que con cadenas de caracteres.

Sentencia using, espacio de nombres:
using namespace std;

El espacio de nombres es una manera de encapsular la definición de la estructura de nuestro código como lo son variables, clases, registros y funciones bajo un mismo nombre afín de evitar colisiones con la definición de la estructura de otras bibliotecas. El fragmento de código anterior básicamente lo que hace es incorporar el espacio de nombres std al actual ámbito afín de utilizar cin y cout directamente sin el prefijo std::.

Función main():
int main() {
   /* Bloque de código de la función */
}

La función main() es la protagonista pues es la única función que se ejecuta de forma automática cuando el programa es ejecutado. Todo lo que se encuentre en ella es ejecutado mientras el programa se encuentre en ejecución independientemente en donde encuentre, adicional a eso en el lenguaje C++ se encierra el bloque de código entre un par de llaves {} y es obligatorio el “;” para delimitar el fin de línea.

Declarando variables:
string texto;
int aux = 0, igual = 0;

C++ es un lenguaje fuerte y estáticamente tipado, lo que quiere decir que toda variable a usar debe cumplir dos reglas; la primera es ser declarada antes de poder usarse en su ámbito y la segunda es que debe definir su tipo. Aquí declaramos 3 variables, la primera es de tipo string (cadena de caracteres) mientras que los otros dos tipos son de tipo int inicializados con un valor de cero.

La variable string no requiere ser inicializada mientras que las variables int si lo requieren, esto se debe a que si no se inicializan van a tener un valor indeterminado y en caso de ser usadas como acumuladores se vera afectado el resultado final.

Solicitud e ingreso de datos por el usuario:
cout << "Ingrese la palabra a evaluar: ";
getline(cin >> ws, texto);

El objeto cout nos permite realizar operaciones de salida de datos usando el operador de inserción “<<“, en este caso le estamos pidiendo al usuario que ingrese una palabra. En la segunda línea se realiza la operación de entrada de datos pero con algunas diferencias a la entrada normal con el objeto cin, en este caso usamos la función getline() para capturar la información ingresada por el usuario capturando texto con espacios en blanco pero eliminando los espacios finales y saltos de línea del buffer.

Bucle for(), buscando la igualdad:
for(int ind = texto.length() - 1; ind >= 0; ind--) {
    if(texto[ind] == texto[aux]) {
        igual++;
    }
    aux++;
}

El bucle for() va a iterar iniciando por la longitud de la cadena utilizando el método length() – 1 reduciendo el valor de ind en 1 hasta que ind sea mayor o igual a cero. Conforme avanza el bucle for, la variable aux se va a incrementar en 1 mientras la sentencia if() verifica que cada uno de los elementos del string en los índice ind y aux sean iguales; si se cumple la igualdad, la variable igual se incrementa en 1.

Sentencia if(), comparando la igualdad:
if(texto.length() == igual) {
    cout << "La palabra ingresada es palindromo!! :D" << endl;
} else {
    cout << "La palabra ingresada no es palindromo!! :D" << endl;
}

Esta última sentencia if va a verificar que la longitud del texto o palabra ingresada por el usuario sea igual al valor que se encuentra almacenado en la variable igual, dicha variable ba incrementando su valor en el bucle for visto anteriormente. Si la igualdad se cumple entonces el texto o palabra es palíndromo y se le informa al usuario, de lo contrario se le informa al usuario que dicha palabra o texto no el palíndromo.

Función reverse(), una forma más sencilla:

Hay una forma más sencilla que nos ahorra 3 líneas de código reemplazando el bucle for() anterior.

#include <algorithm>

Lo primero que hay que hacer es agregar la cabecera <algorithm> ya que la función reverse() está allí, una vez hecho esto podemos hacer uso de la función reverse sin problema alguno.

string reversa = texto;
reverse(reversa.begin(), reversa.end());

Lo primero que hay que hacer es crear una copia de la información ingresada por el usuario, para esta tarea solo hay que crear una variable de tipo string y asignarle la información ingresada por el usuario ¿por qué? la respuesta es sencilla, la función reverse() invierte todo el orden del contenido.

En la segunda línea usamos la función reverse para invertir el contenido del string. Dicha función recibe dos argumentos de tipo puntero; el primero, llama al método .begin(), un iterador que apunta al primer elemento; el segundo, llama al método .end(), un iterador que apunta al último elemento.

Una vez realizado este proceso, entonces se procede a comparar ambos strings con la sentencia if() anterior; pero se debe cambiar la condicional de la siguiente forma if(texto == reversa) para comparar ambas cadenas en lugar de la longitud.

One Comment

Add a Comment

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