Programación en Pascal/Control condicional

De Wikilibros, la colección de libros de texto de contenido libre.

Los programas tienen que tomar decisiones. Al fin y al cabo, esto es lo que hace particulares a los ordenadores, lo que los diferencia del resto de las máquinas.

If..then..else[editar]

Con estas tres palabras claves, se pueden tomar decisiones en tiempo de ejecución sobre prácticamente cualquier condición posible. Veamos un ejemplo:

program leccion6;
const Pi=3.14156;
var
    radio : Integer;
    entrada : char;

begin
   
    write('¿Necesitas calcular la circunferencia? [S/N]:'); readln(entrada);
    if (entrada='s') or (entrada='S') then
    begin
        write('Escribe el radio: '); readln(radio);
        write('La circunferencia es ');
        writeln(2*PI*radio);
    end
    else writeln ('No se ha calculado la circunferencia.');
end.

De este pequeño programa se pueden aprender muchas cosas. Lo primero que llama la atención es:

if (entrada='s') or (entrada='S') then

Lo que hay entre el if y el then es la condición. Si lo lees en español literalmente, significa lo mismo que lo que hay escrito, es decir: Si entrada es igual a s minúscula o entrada es igual a S mayúscula entonces.... Entonces estas aprendiendo también que, en Pascal, la palabra or significa lo mismo que en nuestro lenguaje humano, es una forma de unir dos condiciones.

Como ves, las condiciones están puestas entre paréntesis. Esto es necesario porque en Pascal el operador lógico or tiene mayor prioridad que los operadores relacionales (en este caso el operador de igualdad). Si no se pusieran los paréntesis la primera operación que se trataría de realizar sería la or lógica entre el valor literal 's' y la variable entrada. Además de no ser la expresión que se desea evaluar, se produciría un error sintáctico en tiempo de compilación puesto que se produciría una incompatibilidad de tipos. El primer operador que se evaluaría sería el or lógico por ser el más prioritario de la expresión y devolvería un resultado booleano. A continuación, quedan dos operadores relacionales (igualdad) que al tener la misma prioridad se evaluarían de izquierda a derecha. El primero trataría de comparar la variable entrada de tipo char con el resultado lógico obtenido anteriormente como consecuencia de evaluar el operador or. Estas operaciones entre elementos de distinto tipo no están permitidas en Pascal que es un lenguaje fuertemente 'tipado'. Para evitar este doble problema podemos hacer uso de los paréntesis qu al igual que en matemáticas, en programación el uso de paréntesis determina la prioridad y el orden para realizar las operaciones.

Y por último, lo más interesante de todo, la condición: entrada='s' significa ¿es entrada igual a s?. Fíjate que, para las condiciones, NO usamos :=, sino = a secas. Esto es porque una condición no es lo mismo que una asignación. Ahora no estamos asignando a entrada el valor 's', sino que estamos verificándolo. Es una diferenciación muy importante.

Por supuesto, en Pascal los caracteres y los strings hay que rodearlos siempre con los caracteres ' '. Y las mayúsculas, en los strings y caracteres, no son iguales a las minúsculas (fuera de los strings da igual).

Inmediatamente después tenemos otra sorpresa. ¡Hay un bloque, compuesto por begin y end dentro del bloque principal! Lo que hace este bloque, como estarás suponiendo, es ejecutar lo que hay en su interior si la condición antes propuesta es verdadera. Lo que hay dentro del bloque ya sabes lo que significa.

Inmediatamente después del bloque está esto:

    end
    else writeln ('No se ha calculado la circunferencia.');
end.

Fíjate en dos cosas muy importantes: el end no tiene un punto y coma al final, e inmediatamente después hay un else. ¿Por qué?

Porque el else pertenece todavía a la instrucción if anterior. else significa y si no. Si pusieras un punto y coma detrás del end, obtendrías un error. Siempre ten en cuenta, y para esto sirven los puntos y comas, a que instrucción pertenecen unas y otras cosas. Tener esto claro te evitará muchos fallos en el futuro.

Detrás del else no tenemos un bloque de begin...end. Esto es debido no a que no podamos, sino a que como solo ejecutamos una sola instrucción, no es necesario. Podíamos haber escrito esto y el resultado es el mismo:

    end
    else begin
        writeln ('No se ha calculado la circunferencia.');
    end;
end.

Como siempre, da igual el espaciado, si pones el begin en una nueva linea, o no, etc. Solo hay que respetar el ;.

Recuerda: Aprender a manejar correctamente los begin...end y los ; es imprescindible para entender perfectamente como escribir condiciones.

Operaciones lógicas[editar]

Ya hemos visto, en el ejemplo anterior, dos operaciones lógicas. Una es la igualdad, mediante el símbolo =, y la otra es un or lógico represantado por la palabra or. Veamos todas las operaciones lógicas que se pueden usar, y algunos ejemplos: