Verificar clave de acceso a cajero automático en C++

Este pequeño programa simula el acceso a un cajero, solicita la contraseña al usuario y verifica que no contenga caracteres; además, para que la contraseña tenga total validez, se verifica que el dígito en la posición 3 y 4 sean par. El programa está escrito en tan solo 39 líneas de código C++.

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

int main() {
    string passwd, binds; char ch;
    long int acert = 0, pos, digit;

    cout << "Ingrese la contraseña, por favor: ";
    getline(cin >> ws, passwd);

    pos = passwd.length();
    for(long ind = 0; ind < pos; ind++) {
       if(pos >= 4) {
         ch = passwd[ind];
         if(isdigit(ch)) {
            binds = passwd[ind];
            digit = stol(binds);
            if((digit % 2 == 0) && (ind == 3) || (ind == 4)) {
               acert++;
            }
         } else {
           cout << "Su clave contiene caracteres \n";
           exit(0);
         }
       } else {
         cout << "La clave debe contener 4 o mas digitos!!" << endl;
         exit(0);
       }
    }

    if(acert == 2) {
      cout << "Bienvenido a la plataforma del banco!!" << endl;
    } else {
      cout << "Lo sentimos, contraseña incorrecta!!" << endl;
    }
    return 0;
}

Las primeras 3 líneas corresponden a las directivas del preprocesador, ellas le indican que se van a incluir las cabeceras <iostream>, <string> y <cctype> correspondientes a las operaciones de entrada y salida de datos, manejo de cadenas de caracteres y manejo de caracteres, respectivamente. La cuarta línea corresponde a la declaración using, ella nos permite referirnos a un espacio de nombres específico que en este caso es std.

Declaración de variables:
string passwd, binds; char ch;
long int acert = 0, pos, digit;

C++ es un lenguaje fuertemente tipado, lo que quiere decir que toda variable se debe declarar antes de poder usarse en diferentes operaciones; por lo tanto, se declaran 6 variables, las 2 primeras son de tipo string, en ellas se van a almacenar la contraseña y caracteres individuales de tipo string; la tercera, es de tipo char, almacena los caracteres para ser verificados. Las otras 3 variables son de tipo long int.

Solicitud, ingreso y asignación de datos desde el teclado:
cout << "Ingrese la contraseña, por favor: ";
getline(cin >> ws, passwd);

pos = passwd.length();

Aquí empezamos a hacer uso de las variables declaradas anteriormente; la primera línea muestra en pantalla un mensaje indicando al usuario que ingrese una contraseña utilizando el objeto cout; la segunda línea se encarga de leer por teclado la contraseña y la almacena en la variable passwd utilizando la función getline y eliminando cualquier salto de línea que se encuentre en el buffer; la tercera línea asigna la longitud de la cadena almacenada en la variable passwd a la variable pos.

Sentencia for() principal:
for(long ind = 0; ind < pos; ind++) {
   // Aqui va el bloque de codigo!
}

El bucle for() declara una variable llamada ind e inicializada con un valor de cero (0), este bucle va a iterar desde cer (0) hasta que la variable sea menor al valor almacenado en la variable pos.

Sentencia if() principal, verificando la condicional:
if(pos >= 4) {

} else {
  cout << "La clave debe contener 4 o mas digitos!!" << endl;
  exit(0);
}

El programa contiene 2 sentencias  if(), una externa y una anidada; la anterior sentencia if corresponde a la sentencia externa, ella evalúa que el valor almacenado en la variable pos sea mayor a 4. Recordemos que la variable pos contiene la longitud de la contraseña; por lo tanto, lo que verifica la sentencia if externa es que la longitud de la contraseña sea mayor a 4 dígitos.

Si la sentencia if externa se evalúa a false, se ignorara el bloque de código que le sigue y salta a la sentencia else la cual contiene un mensaje para el usuario indicando el tamaño que debe tener la contraseña; la función exit(0) finaliza el programa de forma temprana, de lo contrario el bucle for seguirá iterando sobre la longitud total de la contraseña y, muy probablemente causaría un un resultado inesperado en en la verificación de la misma en dado caso que el último valor sea un dígito.

Asignación y primera sentencia if() anidada:
ch = passwd[ind];
if(isdigit(ch)) {

} else {
  cout << "Su clave contiene caracteres \n";
  exit(0);
}

Este fragmento de código corresponde al bloque de código que se encuentra dentro de la sentencia if() que fue anteriormente explicada. Aquí se hace uso de la varia ch de tipo char para almacenar el valor ubicado en la posición o índice ind; se usa una sentencia if anidada para comprobar si el valor en la variable ind es un dígito, de ser así, se evalúa a true y se ejecuta el bloque de código que lo sigue. De otra forma, se evalúa a false, y se ejecutan el objeto cout y la función exit(0) explicadas anteriormente.

Asignación, conversión y segunda sentencia if() anidada:
binds = passwd[ind];
digit = stol(binds);
if((digit % 2 == 0) && (ind == 3) || (ind == 4)) {
  acert++;
}

Este bloque de código corresponde al bloque de código en la sentencia if() que anteriormente explicada. Aquí se hace uso de dos variables de tipos diferentes para realizar dos operaciones diferente, una sentencia if para realizar la verificación de tres valores; la primera variable es binds, almacenará el valor en el índice ind pero en formato string y no en char; la segunda variable es digit, es de tipo long int y se encargará de guardar el valor almacenado en binds convertido a tipo long utilizando la función stol().

La sentencia if() es una sentencia anidada dentro de otra sentencia anidada, básicamente va a verificar que el módulo 2 del valor almacenado en digit sea igual a cero (0); además, se utilizan los operadores lógicos && y || para realizar 2 verificaciones que deben dar como resultado true para incrementar la variable acert por 1; sin embargo, si esta condicional if no se evalúa a true sino a false, se saltara el incremento de la variable acert y causara un aviso que le informa al usuario que el acceso a la plataforma del banco fue rechazada, como se puede ver en el siguiente fragmento de código.

Sentencia if() final, verificando la igualdad:
if(acert == 2) {
   cout << "Bienvenido a la plataforma del banco!!" << endl;
} else {
   cout << "Lo sentimos, contraseña incorrecta!!" << endl;
}

Anteriormente se dijo que si la sentencia if() no se evalúa a true, entonces como resultado la variable acert no incrementa el valor por 1. Este último fragmento de código es otra sentencia if, verifica que la variable acert sea igual a 2 y le informa al usuario si su acceso al cajero fue aceptado o rechazado, ¿pero por qué? Pues bien, esta variable es la que indica o garantiza que los valores ubicados en el índice 3 e índice 4 efectivamente son pares. Aquí viene la prueba de lo que ocurre en los 4 posibles casos de acceso de la contraseña:

Contraseña con caracteres

Contraseña con menos de 4 dígitos!

Contraseña de acceso exitoso, los valores en la posición 3 y 4 son pares: 42

Contraseña de acceso denegado, el valor en la posición 3 es impar: 52

Add a Comment

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