Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


Tema 5: Condiciones.

Vamos a ver cómo podemos evaluar condiciones desde Pascal. La primera construcción que trataremos es if ... then. En español sería "si ... entonces", que expresa bastante bien lo que podemos hacer con ella. El formato es "if condicion then sentencia". Veamos un ejemplo breve antes de seguir:

 {--------------------------}
 {  Ejemplo en Pascal:      }
 {                          }
 {    Primera prueba de     }
 {    "if"                  }
 {    IF1.PAS               }
 {                          }
 {  Este fuente procede de  }
 {  CUPAS, curso de Pascal  }
 {  por Nacho Cabanes       }
 {                          }
 {  Comprobado con:         }
 {    - Free Pascal 2.2.0w  }
 {    - Turbo Pascal 7.0    }
 {    - Turbo Pascal 5.0    }
 {    - Surpas 1.00         }
 {--------------------------}

 program if1;

 var numero: integer;

 begin
   writeln('Escriba un número');
   readln(numero);
   if numero>0 then writeln('El número es positivo');
 end. 

Todo claro, ¿verdad? La "condición" debe ser una expresión que devuelva un valor del tipo "boolean" (verdadero/falso). La "sentencia" se ejecutará si ese valor es "cierto" (TRUE). Este valor puede ser tanto el resultado de una comparación (como hemos hecho en el ejemplo anterior), como una propia variable booleana (forma que veremos a continuación).

Ejercicio propuesto: Crea un programa que pida al usuario un número entero y diga si ha tecleado el número 5 o ha tecleado un número distinto.
Ejercicio propuesto: Crea un programa que pida al usuario un número real y diga si es mayor de 10.
Ejercicio propuesto: Crea un programa que pida al usuario un número entero y diga si es par (pista: habrá que comprobar el resto de la división entre 2).


Tema 5.2: Condiciones y variables boolean.

Así, una forma más "rebuscada" (pero que a veces resultará más cómoda y más legible) de hacer lo anterior sería, usando una variable "boolean":

 {--------------------------}
 {  Ejemplo en Pascal:      }
 {                          }
 {    Segunda prueba de     }
 {    "if"                  }
 {    IF2.PAS               }
 {                          }
 {  Este fuente procede de  }
 {  CUPAS, curso de Pascal  }
 {  por Nacho Cabanes       }
 {                          }
 {  Comprobado con:         }
 {    - Free Pascal 2.2.0w  }
 {    - Turbo Pascal 7.0    }
 {    - Turbo Pascal 5.0    }
 {    - Surpas 1.00         }
 {--------------------------}

 program if2;

 var
   numero: integer;
   esPositivo: boolean;

 begin
   writeln('Escriba un número');
   readln(numero);
   esPositivo := (numero>0);
   if esPositivo then writeln('El número es positivo');
 end. 

Cuando veamos en el próximo tema las órdenes para controlar el flujo del programa, seguiremos descubriendo aplicaciones de las variables booleanas, que muchas veces uno considera "poco útiles" cuando está aprendiendo.


Tema 5.3: Condiciones y sentencias compuestas.

La "sentencia" que sigue a "if .. then" puede ser una sentencia simple o compuesta. Las sentencias compuestas se forman agrupando varias simples entre un "begin" y un "end":

 {--------------------------}
 {  Ejemplo en Pascal:      }
 {                          }
 {    Tercera prueba de     }
 {    "if"                  }
 {    IF3.PAS               }
 {                          }
 {  Este fuente procede de  }
 {  CUPAS, curso de Pascal  }
 {  por Nacho Cabanes       }
 {                          }
 {  Comprobado con:         }
 {    - Free Pascal 2.2.0w  }
 {    - Turbo Pascal 7.0    }
 {    - Turbo Pascal 5.0    }
 {    - Surpas 1.00         }
 {--------------------------}

 program if3;

 var
   numero: integer;

 begin
   writeln('Escriba un número');
   readln(numero);
   if numero<0 then
     begin
     writeln('El número es negativo.  Pulse INTRO para seguir.');
     readln
     end;
 end. 

En este ejemplo, si el número es negativo, se ejecutan dos acciones: escribir un mensaje en pantalla y esperar a que el usuario pulse INTRO (o ENTER, o RETURN, o <-+, según sea nuestro teclado), lo que podemos conseguir usando "readln" pero sin indicar ninguna variable en la que queremos almacenar lo que el usuario teclee.

Nota: nuevamente, hemos empleado la escritura indentada para intentar que el programa resulte más legible: los pasos que se dan si se cumple la condición aparecen más a la derecha que el resto, para que resulten más fáciles de identificar.

Ejercicio propuesto: Crea un programa que pida al usuario un su nombre. Sólo si ese nombre es "Juan", deberá entonces pedirle una contraseña, y en caso de que la contraseña sea "1234", le responderá diciendo "Bienvenido!"


Tema 5.4: Si no se cumple la condición.

Sigamos... También podemos indicar lo que queremos que se haga si no se cumple la condición. Para ello tenemos la construcción "if condición then sentencia1 else sentencia2":

 {--------------------------}
 {  Ejemplo en Pascal:      }
 {                          }
 {    Cuarta prueba de      }
 {    "if"                  }
 {    IF4.PAS               }
 {                          }
 {  Este fuente procede de  }
 {  CUPAS, curso de Pascal  }
 {  por Nacho Cabanes       }
 {                          }
 {  Comprobado con:         }
 {    - Free Pascal 2.2.0w  }
 {    - Turbo Pascal 7.0    }
 {    - Turbo Pascal 5.0    }
 {    - Surpas 1.00         }
 {--------------------------}

 program if4;

 var
   numero: integer;

 begin
   writeln('Escriba un número');
   readln(numero);
   if numero<0 then
     writeln('El número es negativo.')
   else
     writeln('El número es positivo o cero.')
 end. 

Un detalle importante que conviene tener en cuenta es que antes del "else" no debe haber un punto y coma, porque eso indicaría el final de la sentencia "if...", y el compilador nos avisaría con un error.

Ejercicio propuesto: Crea un programa que pida al usuario un número real y diga si ha tecleado el número 5 o ha tecleado un número distinto, usando "else".
Ejercicio propuesto: Crea un programa que pida al usuario un número entero y diga si es par o es impar.
Ejercicio propuesto: Crea un programa que pida al usuario dos números enteros y diga el resultado de dividir el primero entre el segundo si el segundo no es cero, o que escriba "no se puede dividir" en caso contrario.
Ejercicio propuesto: Crea un programa que pida al usuario un número real y muestre su valor absoluto (si es positivo, lo mostrará tal cual; si es negativo, le cambiará el signo).


Tema 5.5: Sentencias "If" encadenadas.

Las sentencias "if...then...else" se pueden encadenar:

 {--------------------------}
 {  Ejemplo en Pascal:      }
 {                          }
 {    Quinta prueba de      }
 {    "if"                  }
 {    IF5.PAS               }
 {                          }
 {  Este fuente procede de  }
 {  CUPAS, curso de Pascal  }
 {  por Nacho Cabanes       }
 {                          }
 {  Comprobado con:         }
 {    - Free Pascal 2.2.0w  }
 {    - Turbo Pascal 7.0    }
 {    - Turbo Pascal 5.0    }
 {    - Surpas 1.00         }
 {--------------------------}

 program if5;

 var
   numero: integer;

 begin
   writeln('Escriba un número');
   readln(numero);
   if numero<0 then
     writeln('El número es negativo.')
   else if numero>0 then
     writeln('El número es positivo.')
   else
     writeln('El número es cero.')
 end. 

Ejercicio propuesto: Crea un programa que pida al usuario un número entero y diga si es mayor de 10, es menor de 10 o es exactamente 10.
Ejercicio propuesto: Crea un programa que pida al usuario dos números reales y que diga si son iguales, o, en caso contrario, diga cual es el mayor de los dos.



Tema 5.6: Varias condiciones simultáneas.

Si se deben cumplir varias condiciones a la vez, podemos enlazarlas con "and" (y). Si se pueden cumplir varias, usaremos "or" (o). Para negar, "not" (no):

if ( opcion = 1 ) and ( terminado = true ) then [...]

if ( opcion = 3 ) or ( teclaPulsada = true ) then [...]

if not ( preparado ) then [...]

if ( opcion = 2 ) and not ( nivelDeAcceso < 40 ) then [...]

Ejercicio propuesto: Crea un programa que pida al usuario un número entero y diga si es par y a la vez múltiplo de 3.
Ejercicio propuesto: Crea un programa que pida al usuario dos números reales y diga si ambos positivos.


Pero cuando queremos comprobar entre varios posibles valores, sería muy pesado tener que hacerlo con muchos "if" seguidos o encadenar muchos con "and" u "or".. Hay una alternativa que resulta mucho más cómoda: la orden case. Su sintaxis es

case expresión of 
  caso1: sentencia1; 
  caso2: sentencia2; 
  ... 
  casoN: sentenciaN; 
end;

o bien, si queremos indicar lo que se debe hacer si no coincide con ninguno de los valores que hemos enumerado, usamos else:

case expresión of 
  caso1: sentencia1; 
  caso2: sentencia2; 
  ... 
  casoN: sentenciaN; 
  else
    otraSentencia; 
end;

En Pascal estándar, esta construcción se empleaba con otherwise en lugar de "else" para significar "en caso contrario", así que si alguien de los que me lee no usa TP/BP, sino un compilador que protesta con el "else" (es el caso de Surpas), ya sabe dónde probar... ;-)

Con un ejemplito se verá más claro cómo usar "case":

 {--------------------------}
 {  Ejemplo en Pascal:      }
 {                          }
 {    Condiciones múltiples }
 {    con "case"            }
 {    CASE1.PAS             }
 {                          }
 {  Este fuente procede de  }
 {  CUPAS, curso de Pascal  }
 {  por Nacho Cabanes       }
 {                          }
 {  Comprobado con:         }
 {    - Free Pascal 2.2.0w  }
 {    - Turbo Pascal 7.0    }
 {    - Turbo Pascal 5.0    }
 {    - Surpas 1.00         }
 {    - Tmt Pascal Lt 1.20  }
 {--------------------------}

 program case1;

 var
   letra: char;

 begin
   WriteLn('Escriba un símbolo');
   ReadLn(letra);
   case letra of
     ' ':                 WriteLn('Un espacio');
     'A'..'Z', 'a'..'z':  WriteLn('Una letra');
     '0'..'9':            WriteLn('Un dígito');
     '+', '-', '*', '/':  WriteLn('Un operador');
   else  { otherwise en SURPAS }
     WriteLn('No es espacio, ni letra, ni dígito, ni operador');
   end;
 end. 

Como último comentario: la "expresión" debe pertenecer a un tipo de datos con un número finito de elementos, como "integer" o "char", pero no "real".

Y como se ve en el ejemplo, los "casos" posibles pueden ser valores únicos, varios valores separados por comas, o un rango de valores separados por .. (como los puntos suspensivos, pero sólo dos, al igual que en los "arrays").


Ejercicio propuesto: Crea un programa que pida al usuario un número entero del 1 al 3, y escriba en pantalla "Uno", "Dos", "Tres" o "Número incorrecto" según corresponda.
Ejercicio propuesto: Crea un programa que pida al usuario un número, una operación (+, -, * o /) y otro número, y muestre el resultado de aplicar esa operación a esos dos números.