Instrucción IF...THEN...ELSE:
Esta instrucción funciona casi igual que la IF...THEN, pero con una diferencia crucial. La sentencia
la
instruccion se ejecutaba solo si la
condicion era verdadera, o sea TRUE. En caso contrario no se ejecuta nada y el programa continúa su curso. Sin embargo, la instrucción IF...THEN...ELSE se ejutará siempre. Veamos, su sintaxis es así
Código Pascal:
Ver originalIf condicion then
instruccion1
Else
instruccion2;
Esto significa
SI pasa tal cosa HAS esta instruccion, SINO HAS esta otra. O sea, si la condicion es verdadera se ejecuta la
instruccion1 tal y como ya han visto, y se omitirá la instrucción luego del
ELSE. Si la condición es falsa no se hará la
instruccion1 y se hará automáticamente la
instruccion2.
O sea, le estamos diciendo al IF lo que debe hacer si su condicion es falsa. Antes solo le decíamos que hacer si era verdadera, ahora tiene las dos opciones, por lo tanto, algo se ejecutará sí o sí.
Noten que la
instruccion1 no termina en punto y coma (
;). Nunca antes de un
ELSE que forma parte de un
IF debe ir un punto y coma porque el compilador creerá que es un IF común como el que vimos al principio.
Para el ejemplo anterior, teniendo las variables letra1 y letra2 puedo escribir esto
Código Pascal:
Ver originalIf letra1<=letra2 then
writeln('La primera letra es menor o igual que la segunda')
Else
writeln('La primera letra es mayor que la segunda');
Veamos un ejemplo, primero solo con IF...THEN, donde se le pedirá al usuario que ingrese su edad, asumiremos que se ingresarán números enteros. Si la edad es mayor a 50 años le decimos que es un viejo, en caso contrario le decimos que es joven:
Código Pascal:
Ver originalPROGRAM viejo;
Var
edad: integer; //Variable para guardar la edad.
BEGIN
//Mostramos mensaje y leemos la edad.
write('Ingrese su edad: ');
readln(edad);
//Mostramos lo mismo que ya ingresó.
writeln('Usted tiene ',edad,' años.');
//Si tiene más de 50 años le decimos viejo.
If edad>50 then
writeln('Usted es un viejo');
//Si tiene menos de 50 o 50 justito, le decimos joven.
If edad<=50 then
writeln('Usted es joven');
END.
Hemos usado dos sentencias IF, una contempla lo que la otra no, o sea que o se ejecuta una o la otra. Sin embargo, aunque esto se puede hacer, no es lo correcto porque en futuros programas mucho mas complejos se complicará, además hace que el código sea menos comprensible. Los dos If anteriores se resumen en este
Código Pascal:
Ver originalIf edad>50 then
writeln('Usted es un viejo')
Else
writeln('Usted es joven');
Anidación de la instrucción If…then:
Es posible colocar un
if dentro de otro
if. A esto se lo conoce como
anidación y se usa a muy menudo. Sin embargo hay que tener mucho cuidado de hacerlo bien o podría darse que nosotros creemos que el programa tomará cierto camino cuando en realidad no lo hará. Veremos un ejemplo de eso luego del de a continuación:
Veamos un ejemplo en el que se nos pedirá la edad dos veces. Si ingresamos una edad mayor a 50 y otra menor nos dirá que somos viejos jóvenes.
Código Pascal:
Ver originalPROGRAM anidacion;
Var
edad1, edad2: integer;
BEGIN
Write(‘Ingresa tu edad: ‘);
Readln(edad1);
Write(‘Ingresa tu edad nuevamente: ‘);
Readln(edad2);
If edad1>50 then
If edad2<50 then
Writeln(‘Eres un viejo joven’);
END.
Como vemos, nuestro programa nos pide el ingreso de números enteros que corresponden a nuestra edad. En la línea 12 decimos si el valor en
edad1 es mayor a 50 entonces si el valor en
edad2 es menor a 50 escribe
‘Eres un viejo joven’.
Ahora bien, si
edad1 es menor a 50 entonces no pasa nada, porque el segundo
If está dentro del primero y por ende, si la condición de este no se cumple no entraremos en él.
Anidación de un if…then con un if…then…else:
Es posible hacer todas las anidaciones que se quieran, sin embargo como ya dije antes, debemos tener cuidado. Aquí daré un ejemplo de una anidación que nosotros podríamos interpretar de forma errónea.
Código Pascal:
Ver originalPROGRAM anidacion2;
Var
edad1, edad2: integer;
BEGIN
Write(‘Ingresa tu edad: ’);
Readln(edad1);
Write(‘Ingresa nuevamente tu edad: ‘);
Readln(edad2);
If edad1>50 then
If edad1=edad2 then
Writeln(‘Eres un viejo’)
else
Writeln(‘Eres joven’);
END.
En este ejemplo uno podría interpretar que si tenemos más de 50 años y además ingresamos las dos veces la misma edad aparecerá el mensaje
‘Eres un viejo’, y si
edad1 era menor a 50 nos aparecerá el mensaje
‘Eres joven’. Sin embargo no es así, esa instrucción se fijará si nuestra edad es mayor a 50 y solo si eso es cierto luego verá si ambas edades eran iguales, si es así aparecerá el mensaje
‘Eres un viejo’ y si no aparecerá el mensaje
‘Eres joven’. La correcta indentación de esa instrucción es la siguiente:
Código Pascal:
Ver originalIf edad1>50 then
If edad1=edad2 then
Wirteln(‘Eres un viejo’)
else
Writeln(‘Eres un joven’);
Como ven, solo se ejecutará esto si
edad1>50 resulta ser
true.
La forma correcta de escribir esta instrucción para obtener el resultado que interpretábamos anteriormente sería:
Código Pascal:
Ver originalIf edad1>50 then
begin
If edad1=edad2 then
Wirteln(‘Eres un viejo’);
end
else
Writeln(‘Eres un joven’);
Como ven, hemos encerrado entre
begin y
end la segunda instrucción
if. Esto hace que todo lo que esté dentro del área abarcada por esas dos palabras sea como una sola instrucción para el programa, a pesar de que allí dentro podemos poner todas las que queramos. De no hacer esto, el
else formaría parte del segundo
if y no del primero. Debemos recordar que un
else cierra siempre al
if que se encuentre más próximo a él. Para quebrar esto debemos usar
beginy
end.
Los delimitantes
begin y
end se usan para indicar que al tomar cierto flujo de ejecución dada una condición el programa debe efectuar muchas instrucciones. No serviría de mucho que por cada
if que usemos solo podamos dictar una instrucción. La sintaxis genérica sería la siguiente:
Código Pascal:
Ver originalIf condicion then
begin
Instruccion1;
Instruccion2;
.
.
.
InstruccionN;
end
else
begin
Instruccion1;
Instruccion2;
.
.
.
InstruccionN;
end;
Vean que también es posible usar los delimitadores
begin y
end para la instrucción
else del
if. Estos
begin y
end forman lo que llamamos
bloques de instrucciones y difieren del
begin y
end principales ya que estos forman un único bloque que es el programa completo. Luego de un
end va enseguida un punto y coma que indica el final del bloque y no un punto como en el caso del
end principal.
Notar que el end anterior al else no finaliza con punto y coma. Esto se debe a lo que ya expliqué antes.
Recordar que nunca, antes de una instrucción else que forma parte de un if debe ir colocado un punto y coma. Condiciones compuestas:
Hasta ahora hemos visto como dada una condición específica el programa tomará un camino u otro para realizar sus tareas. Sin embargo normalmente deben cumplirse varias condiciones para que un programa tome un camino u otro. Aquí entramos a componer condiciones, o sea, a decir cosas como: Si pasa tal cosa
y tal otra has esta tarea
o si pasa tal otra cosa has esta.
Aprenderemos a usar los
operadores booleanos para componer condiciones.
Veamos un ejemplo parecido al anterior:
Código Pascal:
Ver originalPROGRAM anidacion2;
Var
edad1, edad2: integer;
BEGIN
Write(‘Ingresa tu edad: ’);
Readln(edad1);
Write(‘Ingresa nuevamente tu edad: ‘);
Readln(edad2);
If (edad1>50) and (edad1=edad2) then
Writeln(‘Eres un viejo’)
else
Writeln(‘O eres joven o mentiroso’);
END.
Aquí vemos que en la instrucción IF hay dos condiciones entre paréntesis unidas por la palabra reservada
AND. Esto significa que se ejecutará la instrucción del IF si ambas condiciones son verdaderas, o sea, si se cumple a la vez que
edad1>50 y que
edad1=edad2. Basta con que una de ellas sea falsa para que no se ejecute la instrucción del IF y se pase a la del ELSE. En ese caso no sabremos si sucedió porque el usuario era joven o si era un mentiroso que ingresó dos edades diferentes.
Esta es una composición de condiciones que forman una condición total. El AND forma esta condición evaluando las dos pequeñas, entonces si ambas son verdaderas a la vez la condición AND devuelve TRUE.
Estas composiciones son evaluadas por Free Pascal con el método conocido como
circuito corto. Esto es que, si la primera condición del AND es falsa, ya no se evaluará la segunda porque aunque esta fuera verdadera la condición total resulta falsa. Así nacen las tablas de verdad.
AND en inglés significa
Y.
Si nosotros quisiéramos haber dicho que se ejecute el IF si la primera condición
ó la otra eran verdaderas deberíamos haber usado el operador
OR. Este es verdadero si al menos una de las condiciones es verdadera. También se evalúa por circuito corto, o sea, si la primera condición es verdadera ya no se evaluará la segunda porque aunque resulte falsa la condición total OR será verdadera.
En la parte c podrán ver las tablas de verdad para comprender mejor esto.