Python

Evaluación de Condiciones Lógicas

Condiciones lógicas.

Anteriormente revisamos que una condición lógica da como resultado un valor lógico, el cual puede ser verdadero o falso. Es precisamente en las estructuras de control en donde se utilizan ampliamente la evaluación de condiciones lógicas, si revisas en la sección anterior, todas las estructuras hacen o no algo en función del resultado de evaluar una condición lógica.

En esta sección se profundizará en el uso de expresiones lógicas.

Nota: Aunque en este momento no le encuentres mucho sentido a los ejemplos siguientes, trata de seguirlos, en la siguiente sección todo empezará a tomar sentido.

Expresiones con 2 operandos

Las expresiones compuestas por 2 operandos son las más sencillas de evaluar, las cuales generan un valor dependiendo del operador utilizado. Considera las siguientes expresiones.

int eMinima = 18; //Establecemos la edad mínima aceptada
int eUsuario = 16; //Suponemos una edad para nuestro usuario
bool MayordeEdad;

Si evaluamos estas expresiones con los operadores relacionales más comunes tenemos:

eMinima < eUsuario eMinima > eUsuario eMinima == eUsuario eMinima != eUsuario eMinima <= eUsuario
MayordeEdad true false false true true

Actualizamos la edad del usuario:

eUsuario = 18;

con este cambio nuestra evaluación de condiciones cambia del siguiente modo:

eMinima < eUsuario eMinima > eUsuario eMinima == eUsuario eMinima != eUsuario eMinima <= eUsuario
MayordeEdad false false true false true

El siguiente programa ilustra la evaluación con operadores lógicos, probablemente te parezca muy simple, lo importante en este caso es que comprendas como se evalúan las expresiones y que modifiques el código para que observes los cambios en la ejecución.

/******************************************************************************
// operadoreslogicos.cpp
// Este programa muestra la evauación de 2 números con operadores lógicos
// 2017, Por http://about.me/carlosgbr
// Versión 1
// Compilado en https://www.onlinegdb.com/online_c++_compiler
*******************************************************************************/#include <iostream>
using namespace std;
int main()
{
    int numero1 = 0, numero2=0;
    bool resultado;
    cout << "En este programa se evalúan expresiones lógicas\n";
    cout << "Introduce 2 cifras para que puedas compararlos:\n\n";
    cout << "Escribe un número (con o sin decimales), a continuación pulsa ENTER\n";
    cin >> numero1;
    cout << "Escribe otro número (con o sin decimales), a continuación pulsa ENTER \n";
    cin >> numero2;
    cout << "\n\n";
    cout << "Considera que 0 = Falso y 1 = Verdadero \n";
    cout << numero1 << " < "  << numero2  << " = "  << (numero1 < numero2) << "\n";
    cout << numero1 << " <= "  << numero2  << " = "  << (numero1 <= numero2) << "\n";
    cout << numero1 << " > "  << numero2  << " = "  << (numero1 > numero2) << "\n";
    cout << numero1 << " >= "  << numero2  << " = "  << (numero1 >= numero2) << "\n";
    cout << numero1 << " == "  << numero2  << " = "  << (numero1 == numero2) << "\n";
    cout << numero1 << " != "  << numero2  << " = "  << (numero1 != numero2) << "\n";
    cout << "not (" << numero1 << " != " << numero2 << ") = " << not (numero1 != numero2) << "\n";
    return 0;
}

Evaluando expresiones complejas

En ocasiones tendremos que evaluar 3 o más condiciones, por ejemplo considera el pago de comisiones para un empleado: Supongamos que se le dará bono de productividad solo si no tuvo faltas y si cumplió todas sus actividades durante el periodo evaluado. Si solo cumple una de las 2 solo se le darán $100.00 de comisión.

int limitefaltas = 0; //tolerancia de faltas para recibir bono
int faltasemp = 3; //Las faltas del empleado en el periodo
int act = 10; //actividades totales que debe hacer en el periodo
int actCumplidas = 12; // actividades realizadas
bool darBono; // Aquí se almacena si se dar no bono al empleado.

En este caso debemos evaluar y comparar las faltas y a parte las actividades cumplidas para determinar si le toca bono al empleado.

limitefaltas <= faltasemp
darBono false

Codificando esta condición tenemos:

darBono = (limitefaltas <= faltasemp);

Por asistencia al empleado no le toca bono!

act <= actCumplidas
darBono True

Codificando esta condición tenemos:

darBono = (act <= actCumplidas);

Por rendimiento al empleado sí le toca bono!

Ahora que sabemos que no le toca bono completo, debemos evaluar si merece al menos la comisión de $100.00 recuerda que la condición es que al menos una de las 2 se cumpla (sea verdadera), en este caso tenemos 2 expresiones que debemos evaluar, en estos casos utilizaremos los operadores Y lógico u O lógico, recuerda como trabajan estos operadores: Y sea cierto, solo si las 2 expresiones evaluadas son verdaderas, OR será verdadero solo si una de las 2 o las 2 expresiones son verdaderas, de este modo la expresión que hace lo que necesitamos es OR. Consulta la sección de Operadores para revisar en detalle este tema.

la evaluación la haremos de este modo:

limitefaltas <= faltasemp OR act <= actCumplidase dar bono?
Posibilidad 1 true true true
Posibilidad 2 true false true
Posibilidad 3 false true true
Posibilidad 4 false false false

Si codificamos esto en C++ la expresión resultante es:

darBono = (limitefaltas <= faltasemp) || (act <= actCumplidase);

Con esta sentencia podremos determinar si al menos le toca el bono opcional al empleado. Nota que las expresiones están agrupadas con paréntesis. Esto en necesario cuando evalúas expresiones compuestas.

Programa con expresiones complejas

El siguiente es un ejemplo que implementa la evaluación de las tablas de verdad que anteriormente se mostraron para los operadores AND y OR, por una parte, y la evaluación de dos expresiones compuestas por el otro. También notarás que se incluyó parte del código del programa anterior, te presente que es una práctica frecuente reutilizar tu propio código como el de terceros al realizar tus programas.

/******************************************************************************
// operadoreslogicos2.cpp
// Este programa muestra la evaluación de 2 números con operadores lógicos
// AND Y OR
// 2017, Por http://about.me/carlosgbr
// Versión 1
// Compilado en https://www.onlinegdb.com/online_c++_compiler
*******************************************************************************/#include <iostream>
using namespace std;
int main()
{
    bool resp1 = true;
    bool resp2 = false;
    cout << "En este programa muestra las tablas de verdad para los operadores\n";
    cout << "AND (&) y OR ( ):\n\n";
    cout << "\n";
    cout << "Tabla de verdad para Y Lógico (AND, &)  \n";
    cout << "\tExpresión 1 \t& \tExpresión 2 \t -> \tResultado\n";
    cout << " \t" << true << " \t\t& "  << " \t" << true  << " \t\t= "  << " \t" << (true & true) << "\n";
    cout << " \t" << true << " \t\t& "  << " \t" << false  << " \t\t= "  << " \t" << (true & false) << "\n";
    cout << " \t" << false << " \t\t& "  << " \t" << true  << " \t\t= "  << " \t" << (false & true) << "\n";
    cout << " \t" << false << " \t\t& "  << " \t" << false  << " \t\t= "  << " \t" << (false & false) << "\n";
    //cout << "not (" << numero1 << " != " << numero2 << ") = " << not (numero1 != numero2) << "\n";
        cout << "\n";
    cout << "Tabla de verdad para O Lógico (OR, ||)  \n";
    cout << "\tExpresión 1 \t|| \tExpresión 2 \t -> \tResultado\n";
    cout << " \t" << true << " \t\t|| "  << " \t" << true  << " \t\t= "  << " \t" << (true || true) << "\n";
    cout << " \t" << true << " \t\t|| "  << " \t" << false  << " \t\t= "  << " \t" << (true || false) << "\n";
    cout << " \t" << false << " \t\t|| "  << " \t" << true  << " \t\t= "  << " \t" << (false || true) << "\n";
    cout << " \t" << false << " \t\t|| "  << " \t" << false  << " \t\t= "  << " \t" << (false || false) << "\n";
    //Ahora evaluamos expresiones introducidas por el usuario
    int numero1 = 0, numero2=0;
    char letra1, letra2;
    cout << "Introduce la información para que puedas compararla:\n";
    cout << "Escribe un número (sin decimales), a continuación pulsa ENTER\n";
    cin >> numero1;
    cout << "Escribe otro número (con o sin decimales), a continuación pulsa ENTER \n";
    cin >> numero2;
    cout << "Escribe una letra, a continuación pulsa ENTER\n";
    cin >> letra1;
    cout << "Escribe otra letra, a continuación pulsa ENTER \n";
    cin >> letra2;
    cout << "\n";
    cout << "Considera que 0 = Falso y 1 = Verdadero \n";
    //Imprementamos una expresión AND
    cout << numero1 << " < "  << numero2  << " = "  << (numero1 < numero2) << "\n";
    cout << letra1 << " < "  << letra2  << " = "  << (letra1 < letra2) << "\n";
    cout << "(" << letra1 << " < " << letra2 << ") & (" <<
          numero1 << " < " << numero2 << ") = " << ((letra1 < letra2) & (numero1 < numero2)) << "\n";
    //Imprementamos una expresión OR
    cout << numero1 << " < "  << numero2  << " = "  << (numero1 < numero2) << "\n";
    cout << letra1 << " < "  << letra2  << " = "  << (letra1 < letra2) << "\n";
    cout << "(" << letra1 << " < " << letra2 << ") || (" <<
          numero1 << " < " << numero2 << ") = " << ((letra1 < letra2) || (numero1 < numero2)) << "\n";
    return 0;
}
A continuación te muestro una salida del programa
Salida del programa – Tablas de Verdad

Conclusión

Podrás pensar que es muy enredado esto, no lo es, tan solo requiere que pienses de forma lógica, y dicho sea de paso, siempre será recomendable que leas un poco de lógica booleana, en donde obtendrás muchas herramientas y el pensamiento abstracto para no perderte en este tipo de construcciones. Sin embargo en general no se requiere tanta profundidad, conque manejes las tablas de verdad para las funciones AND, OR, NOT, XOR Y NAND, es suficiente para la mayoría de los casos.

Por otra parte considera que para generar una simple sentencia debemos hacer muchas suposiciones, debes tener en cuenta que tú debes prever todas las posibilidades a las que tu programa debe responder de forma apropiada. Entre más suposiciones pueda prever tu programa, verás que crece el código del mismo.

Ahora sí, estamos listos para empezar a programar cosas más interesantes.


Ethical Hack

Fuente Imágenes

  • “Estructuras de control”: by Pixabay
  • “Todas las demás imágenes de esta sección”: by Nala Systems

Código Fuente


Evaluación de Condiciones Lógicas by Roberto C. González is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
eHack Blog

Entradas recientes

dnsenum

El comando dnsenum es una herramienta de línea de comandos para realizar enumeración de DNS…

1 año hace

Las 24 listas negras de IPv4 más comunes.

En esta entrada te presento 24 de las listas negras más comunes que los servidores…

2 años hace

ZoomIt – SysInternals

ZoomIt es una herramienta de anotación y zoom de pantalla para presentaciones técnicas que incluyen…

2 años hace

WinObj – SysInternals

WinObj es el visor de espacios de nombres de Object Manager definitivo. Es la primera…

2 años hace

WhoIs – SysInternals

Whois realiza el registro de registro para el nombre de dominio o la dirección IP…

2 años hace

VolumeID – SysInternals

VolumeID – Esta utilidad, le permite cambiar los identificadores de los discos FAT y NTFS…

2 años hace