Beruflich Dokumente
Kultur Dokumente
La estructura condicional
Hasta ahora hemos visto cómo resolver problemas muy simples. En este capítulo se in-
troduce un nuevo tipo de estructura que nos va a permitir variar el flujo de control de nuestro
programa dependiendo de que se cumplan o no ciertas condiciones. En el ejemplo de la sec-
ción 3.4 (resolución de una ecuación de segundo grado) se podía dar el caso de que a valiese
cero; en tales circunstancias sería necesario aplicar un método distinto para resolver el sis-
tema de ecuaciones, pero con las estructuras que conocemos hasta ahora no es posible tener
varias alternativas para resolver un problema. Por tanto, nos sería de gran utilidad una es-
tructura que permitiese continuar la ejecución de nuestro algoritmo por diferentes caminos,
dependiendo de si se dan unas condiciones u otras. Esta nueva estructura es la llamada estruc-
tura condicional, de bifurcación o de selección. Existen distintas instrucciones que permiten
implementar este tipo de estructura, diferenciándose entre ellas en el número de alternativas
que ofrecen.
129
130 4.1. LA ESTRUCTURA CONDICIONAL
Verdadera
Condición
Falsa
BloqueInst
Ejemplo
1 IF (x.GT.4) THEN
2 y=6
3 ENDIF
En este caso evaluamos la expresión lógica (x.GT.4) y en caso de que sea cierta,
es decir, en caso de que el valor de la variable x sea mayor que 4, ejecutaremos la
instrucción de asignación y=6.
Ejemplo
1 IF (i/=0 .AND. j>=9) THEN
2 h=1/(2*j+3)
3 k=-h*20
4 ENDIF
Observa que la condición es una expresión cuyo resultado es un dato de tipo lógico
y que puede ser tan compleja como necesitemos. En este caso la condición está com-
puesta por dos condiciones más simples.
Ejemplo
Construir una condicional que compruebe si el valor almacenado en una variable x es
par y, en caso afirmativo, que imprima un mensaje en pantalla indicando tal hecho.
1 IF (MOD(x,2)==0) THEN
2 PRINT*, "El número ",x," es par"
3 ENDIF
Para comprobar si un número es par, calculamos el resto de la división entera entre ese
número y dos. Si el resto es cero es que el número es par; en caso contrario el número
será impar. El resto se puede calcular con la función intrínseca MOD.
Ejemplo
1 IF x.GT.4 THEN
2 y=6
3 ENDIF
En este caso la instrucción está mal escrita ya que falta un par de paréntesis que englobe
a la condición. Al igual que ocurrirá con el resto de condicionales, la expresión lógica
ha de ir, obligatoriamente, entre paréntesis.
Ejemplo
1 IF (x>4) y=6
En este caso evaluamos la expresión lógica (x>4) y en caso de que sea cierta, es decir,
en caso de que el valor de la variable x sea mayor que 4, ejecutaremos la asignación
y=6.
2 Al igual que ocurre con la condicional simple, los paréntesis de la condición son obligatorios.
132 4.1. LA ESTRUCTURA CONDICIONAL
Ejemplo
1 IF (i/=0 .AND. j>=9) PRINT*, "El valor de i es ",i
Ejemplo
Comprobar si una variable x contiene un valor par o impar y mostrar un mensaje que
indique la situación.
Si hacemos uso de la condicional simple tendríamos que hacer algo similar a lo si-
guiente:
es decir, tenemos que hacer una comprobación para verificar si es par y otra para ve-
rificar si es impar. Esto resulta poco eficiente ya que, en definitiva, lo que estamos
haciendo es comprobar dos veces lo mismo.
La estructura condicional permite incluir una segunda parte para solucionar de una forma
más natural este tipo de situaciones. Esta segunda versión se conoce como IF-THEN-ELSE
(en castellano SI-ENTONCES-SINO). Su organigrama lo tenemos en la figura 4.2.
Verdadera Falsa
Condición
BloqueV BloqueF
En dicha figura, Condición es una expresión que devuelve un dato de tipo lógico y Blo-
queV y BloqueF son dos grupos de instrucciones. La interpretación sería: “si el resultado de
evaluar Condición es verdadero (.TRUE.) entonces ejecutamos BloqueV y en caso contrario
(si es falso, .FALSE.) ejecutamos BloqueF”. Es decir, planteamos como alternativa la eje-
cución de dos bloques distintos de instrucciones. Observa que la estructura tiene un único
punto de entrada y un único punto de salida. Se comienza con la evaluación de la condición
y ambos caminos acaban en un punto común.
La sintaxis3 de esta instrucción en Fortran es la siguiente:
La estructura condicional IF-THEN-ELSE
IF (<Condición>) THEN
<BloqueV>
ELSE
<BloqueF>
ENDIF
Ejemplo
Reescribir la condicional que imprime un mensaje diciendo si un número es par o
impar.
1 IF (MOD(x,2)==0) THEN
2 PRINT*, x, " es par"
3 ELSE
4 PRINT*, x, " es impar"
5 ENDIF
Ejemplo
Escribir un trozo de programa que imprima un mensaje diciendo si un número almace-
nado en una variable x es mayor, menor o igual que 4.
1 IF (x>4) THEN
2 PRINT*, x, " es mayor que 4"
3 ELSE
4 IF (x<4) THEN
5 PRINT*, x, " es menor que 4"
6 ELSE
7 PRINT*, x, " es igual que 4"
3 El paréntesis de la expresión lógica es obligatorio (al igual que en las otras condicionales).
134 4.2. LA ESTRUCTURA MULTICONDICIONAL
8 ENDIF
9 ENDIF
Donde aparecen los puntos suspensivos podemos poner más partes ELSEIF (tantas como
necesitemos). El último bloque ELSE no es obligatorio.
4 Los paréntesis son obligatorios en todas las condiciones.
4. LA ESTRUCTURA CONDICIONAL 135
Verdadera Falsa
Condición1
Bloque1
Verdadera Falsa
Condición2
Bloque2 ...
Verdadera Falsa
CondiciónN
BloqueN BloqueF
Ejemplo
Reescribir el ejemplo anterior usando la instrucción IF-THEN-ELSEIF:
1 IF (x>4) THEN
2 PRINT*, x, " es mayor que 4"
3 ELSEIF (x.EQ.4) THEN
4 PRINT*, x, " es igual que 4"
5 ELSE
6 PRINT*, x, " es menor que 4"
7 ENDIF
Podemos observar que, aunque la escritura es muy similar a la del ejemplo anterior,
nos hemos ahorrado escribir un ENDIF. En este caso no hay anidamiento sino que hay
una única estructura multicondicional y por tanto sólo hay que usar un ENDIF.
Ejemplo
Dada la nota numérica de un alumno, queremos obtener la nota expresada con palabras
(suspenso, aprobado, notable, ...):
Solución A
136 4.2. LA ESTRUCTURA MULTICONDICIONAL
1 IF ((nota<0).OR.(nota>10)) THEN
2 PRINT*, "Nota incorrecta"
3 ELSEIF ((nota>=0) .AND. (nota<5)) THEN
4 PRINT*, "Suspenso"
5 ELSEIF ((nota>=5) .AND. (nota<7)) THEN
6 PRINT*, "Aprobado"
7 ELSEIF ((nota>=7) .AND. (nota<9)) THEN
8 PRINT*, "Notable"
9 ELSEIF ((nota>=9) .AND. (nota<10)) THEN
10 PRINT*, "Sobresaliente"
11 ELSE
12 PRINT*, "Matrícula de honor"
13 ENDIF
Supongamos que nota vale 8. La ejecución de esta instrucción sería como sigue:
Comprobamos si ((8<0).OR.(8>10)).
Como es falso, entonces pasamos al siguiente ELSEIF y hay que comprobar si
((8>=0).AND.(8<5)).
Como es falso, entonces pasamos al siguiente ELSEIF y hay que comprobar si
((8>=5).AND.(8<7)).
Como es falso, entonces pasamos al siguiente ELSEIF y hay que comprobar si
((8>=7).AND.(8<9)).
Como es verdadero, entonces ejecutamos el bloque correspondiente (PRINT*,
“Notable”) y acabamos la multicondicional.
Solución B
1 IF ((nota<0).OR.(nota>10)) THEN
2 PRINT*, "Nota incorrecta"
3 ELSEIF (nota<5) THEN
4 PRINT*, "Suspenso"
5 ELSEIF (nota<7) THEN
6 PRINT*, "Aprobado"
7 ELSEIF (nota<9) THEN
8 PRINT*, "Notable"
4. LA ESTRUCTURA CONDICIONAL 137
Hay que tener cuidado con las condiciones que se ponen en la estructura multicondicional
ya que deberían ser mutuamente excluyentes. Este hecho no es comprobado por el compilador
por lo que en algún caso podríamos estar cometiendo algún tipo de error o simplemente
haciendo nuestro programa poco eficiente.
Ejemplo
Determinar qué bloques de sentencias se ejecutan (y en qué orden) dependiendo de los
valores de las condiciones:
1 IF (Cond1) THEN
2 IF ((Cond2) .AND. (Cond3)) THEN
3 Bloque_1
4 ELSE
5 IF (Cond4) THEN
6 Bloque_2
7 END IF
8 Bloque_3
9 END IF
10 ELSE
11 Bloque_4
12 END IF
Ejemplo
Supongamos que tenemos la estructura multicondicional del ejemplo anterior. ¿Pode-
mos reescribir dicho código sin hacer uso de estructuras multicondicionales? La res-
puesta es que sí y a continuación vemos una posible solución:
138 4.2. LA ESTRUCTURA MULTICONDICIONAL
1 IF (.NOT.(Cond1)) THEN
2 Bloque_4
3 END IF
4 IF ((Cond1) .AND. .NOT.(Cond2) .AND. .NOT.(Cond4)) THEN
5 Bloque_3
6 END IF
7 IF ((Cond1) .AND. .NOT.(Cond2) .AND. (Cond4)) THEN
8 Bloque_2
9 Bloque_3
10 END IF
11 IF ((Cond1) .AND. (Cond2) .AND. (Cond3)) THEN
12 Bloque_1
13 END IF
14 IF ((Cond1) .AND. (Cond2) .AND. .NOT.(Cond3) .AND. .NOT.(Cond4)) THEN
15 Bloque_3
16 END IF
17 IF ((Cond1) .AND. (Cond2) .AND. .NOT.(Cond3) .AND. (Cond4)) THEN
18 Bloque_2
19 Bloque_3
20 END IF
Hay otras soluciones pero todas ellas implican hacer múltiples veces las comproba-
ciones sobre las condiciones resultando más ineficientes (y difíciles de comprender)
que la estructura multicondicional. Al ser todas las condicionales ejecutadas de forma
secuencial una tras otra, es necesario que las condiciones de cada una de ellas sean
mutuamente excluyentes. Es la única forma de asegurarse de que en caso de entrar en
una de ellas no entraremos en ninguna otra.
También podemos apreciar que repetimos varias veces algunos de los bloques de códi-
go con el consiguiente gasto de memoria que eso supone.
En algunos casos concretos donde hemos de elegir entre múltiples alternativas resulta
cómodo usar esta estructura, aunque su uso está limitado sólo a algunos tipos de formas
multicondicionales.
El organigrama lo podemos ver en la figura 4.4.
La sintaxis5 de esta estructura es:
Cierto
expr==selector1 Bloque1
Falso
Cierto
expr==selector2 Bloque2
Falso
...
Cierto
expr==selectorN BloqueN
Falso
BloqueDef
END SELECT
DEFAULT. Hay algunas cosas que hemos de tener en cuenta cuando usemos esta instrucción:
Los selectores tienen que ser constantes del mismo tipo que devuelve la expresión.
Dentro de un mismo selector podemos poner:
Esta estructura se podría sustituir por una condicional anidada IF-THEN-ELSE o bien por una
estructura IF-THEN-ELSEIF. En cambio, una estructura IF-THEN-ELSE (u otra variante) no
siempre podrá ser sustituida por una multicondicional SELECT-CASE ya que en esta los
selectores sólo pueden incluir constantes.
Ejemplo
Implementar un programa que, dado un número entero x, imprima un mensaje de texto
en función de su valor, según las siguientes alternativas:
Si es menor que 1.
Si vale 1.
Si vale 2, 3, ó 4.
Si está entre 5 y 10.
Si es mayor que 11.
4. LA ESTRUCTURA CONDICIONAL 141
En este caso no hemos necesitado el selector DEFAULT ya que tenemos cubiertas todas
las posibilidades. De todas formas el último selector CASE (11:) lo podríamos haber
sustituido por un CASE DEFAULT ya que si llegamos a ese punto tenemos garantizado
que el número almacenado en x es mayor o igual que 11.
Ejemplo
Vamos a plantearnos la posibilidad de escribir un programa para gestionar una pequeña
base de datos con los alumnos de una asignatura. Una de las tareas que hemos de hacer
es preparar un menú de opciones a través del cual preguntemos al usuario qué tipo
de operación desea realizar sobre dicha base de datos (añadir nuevos alumnos, buscar,
...) y actuar en consecuencia. Escribir un programa que imprima un menú de opciones
en pantalla, permita seleccionar una de ellas, y ejecute la acción asociada a la opción
elegida. Las opciones serán las siguientes:
Sólo tenemos que realizar la parte que se encarga de presentar el menú y elegir una
opción. No entraremos al detalle de realizar cada una de esas tareas.
Análisis
correspondiente. Es decir si, por ejemplo, asociamos el número 1 a la opción que nos
permite hacer un listado de los datos que maneja el programa, nos bastará con introdu-
cir el número 1 por el teclado para que nuestro algoritmo interprete que deseamos tener
un listado de los datos. Si optamos por este método, entonces la variable que almace-
nará la opción elegida por el usuario puede ser de tipo entero. ¿Qué rango de valores
es válido? Esto viene determinado por el número de opciones de nuestro menú.
Ahora hay que determinar las variables de salida del algoritmo. ¿Cuáles son? En es-
te caso las variables de salida dependerán de la opción que hayamos elegido. Puesto
que no vamos a escribir los algoritmos que realizan los trabajos asociados a cada op-
ción, nuestro algoritmo no necesitará tener variables de salida. Simplemente dejaremos
indicadas las operaciones que habría que realizar para cada opción.
Diseño
Implementación
Para hacer el algoritmo algo más cómodo (por si necesitásemos variar las opciones más
adelante) vamos a definir como constantes el número de opciones y los mensajes que
aparecerán por pantalla para cada opción.
El programa sería este:
4 ! Declaración de constantes
5 ! Vamos a definir como constantes el número de opciones que
6 ! tendrá nuestro menú y el nombre de cada opción
7 INTEGER, PARAMETER :: NumeroOpc=5
8 CHARACTER (LEN=*), PARAMETER :: &
9 &opc1="1 - Listado de alumnos", &
10 &opc2="2 - Buscar un alumno", &
11 &opc3="3 - Añadir alumno", &
12 &opc4="4 - Borrar un alumno", &
13 &opc5="5 - Finalizar"
14 ! Declaración de variables
15 INTEGER :: op ! Esta variable servirá para leer la opción
4. LA ESTRUCTURA CONDICIONAL 143
Inicio
Mostrar Menu
Leer opcion
Cierto
opcion==1 Listar alumnos ...
Falso
Cierto
opcion==2 Buscar alumno ...
Falso
Cierto
opcion==3 Anadir nuevo alumno ...
Falso
Cierto
opcion==4 Borrar un alumno ...
Falso
Cierto
opcion==5 Finalizar ...
Falso
END SELECT
Fin
19 PRINT*, opc3
20 PRINT*, opc4
21 PRINT*, opc5
40 END
4. LA ESTRUCTURA CONDICIONAL 145
4.3. Resumen
• Valores individuales.
• Varios valores (separados por comas).
• Rangos de valores (usando dos puntos :).
• Mezcla de valores y rangos de valores.
4. LA ESTRUCTURA CONDICIONAL 147
4.4. Ejercicios
1. Supongamos que A, B, C y D son variables enteras y que Bloque1, Bloque2, Bloque3
y Bloque4 son conjuntos de instrucciones.
2. Haz un programa que lea tres números enteros por teclado y que, si el segundo de ellos
es negativo, calcule e imprima el producto de los tres. En caso contrario debe imprimir
la media de los tres números.
3. Calcula las soluciones de una ecuación de segundo grado teniendo en cuenta todas las
posibles alternativas.
4. Haz un programa que permita traducir entre grados Celsius (C), Fahrenheit (F), Kelvin
(K) y Rankine (R). El programa preguntará en qué unidades damos la temperatura de
entrada y a qué escala la queremos convertir. Para ello sabemos que:
K = C + 273,15
R = F + 459,67
5(F−32)
C= 9
5. Escribe un programa que pregunte el nombre, los apellidos, el salario base de un em-
pleado y su antigüedad en la empresa y que aplique las siguientes tablas para calcular
su sueldo mensual:
148 4.4. EJERCICIOS
6. Haz un programa que lea los siguientes datos de una persona: nombre, sueldo mensual,
edad y sexo. A continuación, el programa deberá clasificar a la persona en alguna de
las siguientes categorías:
a) Hombre pobre. Aquellos hombres cuyo sueldo sea inferior a 500 euros/mes.
b) Mujer rica. Las mujeres cuyo sueldo supere los 6000 euros/mes.
c) Joven mujer de clase media. Mujer cuya edad esté comprendida entre los 20 y los
30 años y cuyo sueldo esté entre 1200 y 2000 euros/mes.
Es posible que una persona no entre dentro de ninguna de estas categorías. En tal caso
imprime un mensaje que lo indique.
7. Haz un programa que lea los datos que definen un círculo (centro y radio) y las coor-
denadas de un punto en el espacio. El programa deberá decirnos si el punto está o no
dentro del círculo.
8. Haz un programa que lea las coordenadas que definen un rectángulo (esquina superior
y esquina inferior opuesta) y las coordenadas de un punto en el espacio. El programa
deberá decirnos si el punto está o no dentro del rectángulo.
9. Haz un programa que lea dos números enteros por teclado y diga si el primero divide
o no al segundo.
4. LA ESTRUCTURA CONDICIONAL 149
10. Haz un programa que lea tres valores enteros por teclado y que diga cuántos de ellos
hay iguales entre si.
11. En una ciudad compuesta por 6 barrios (cada uno identificado por un número entero
del 1 al 6) hay una empresa de transportes que cobra una tasa única por el reparto de
una carga (65 euros). Los camiones de la empresa pueden transportar tres pedidos en
cada viaje. Se establecen algunos descuentos según los siguientes criterios:
a) Si las tres cargas del camión van al mismo barrio se aplica un 30 % de descuento
a cada carga.
b) Si dos cargas van al mismo barrio se les aplica un 15 % de descuento (sólo a esas
dos).
Haz un programa que reciba como entrada los códigos de los barrios a los que van las
tres cargas de un viaje y que nos diga la cantidad que hay que pagar por cada carga. La
tasa única no será un dato de entrada sino una constante con nombre.
12. Haz un programa que lea por teclado el nombre de una fruta (manzana, naranja, pera,
...) y que, según sea la fruta, muestre una descripción de la misma. Si se introduce un
nombre de una fruta desconocida se mostrará un mensaje adecuado.
13. Realizar un programa que lea un año por teclado y diga si es o no bisiesto (divisible
por 4 y no por 100; excepto los divisibles por 400).
14. Haz un programa que lea el nombre de un mes y que diga el número de días que tiene
ese mes.
15. Hacer un programa que lea las coordenadas de tres puntos y que diga si forman o no
un triángulo6. Indicar también si el triángulo es o no equilátero.
16. Una fabrica de zapatos también fabrica las cajas de cartón para embalarlos. El coste
de la caja es 0.02 euros por cm2 de cartón. Si hay N pares de zapatos dispuestos para
ser embalados, y cada caja tiene una superficie de M cm2 , realizar un algoritmo que
calcule el gasto de la fabrica en las cajas y el precio de venta de los zapatos a partir del
costo (dado), del gasto en la caja y de la ganancia (30 %) (N y M son datos de entrada).
17. Un operador ferroviario establece una serie de descuentos en el precio de sus billetes
en función de las características del cliente:
a) Los clientes menores de 4 años no pagan. Los clientes cuya edad está entre 4 y 7
años pagan la mitad del billete. Los mayores de 65 años pagan el 40 % del billete.
b) Los estudiantes pagan el 40 % del importe.
c) Los miembros de familia numerosa pagan el 70 % del precio.
6 Si llamamos a los puntos A, B y C sabremos que forman un triángulo si la mayor de las distancias AB, AC, BC
es menor que la suma de las otras dos. Además, el triángulo será equilátero si las tres distancias son iguales. También
podemos decir que los tres puntos forman un triángulo si no están alineados.
150 4.5. SOLUCIONES
Haz un programa que reciba como entrada el precio de un billete y que le pregunte al
usuario los datos necesarios para averiguar que descuento le corresponde. El programa
nos dirá que porcentaje de descuento se aplica y el precio rebajado. Ten en cuenta que
siempre se aplicará el descuento más beneficioso para el usuario y que los descuentos
no son acumulativos.
4.5. Soluciones
Ejercicio 1
a) La solución al primer apartado es la siguiente:
1 IF (A<B) THEN
2 IF (C/=D) THEN
3 IF (B>=D) THEN
4 Bloque1
5 ENDIF
6 ENDIF
7 ENDIF
b) La solución al segundo apartado es:
1 IF ((A>B) .AND. (B<=C) .AND. (C/=D)) THEN
2 Bloque1
3 ENDIF
4 IF ((A>B) .AND. (B<=C) .AND. (C==D)) THEN
5 Bloque2
6 ENDIF
7 IF ((A>B) .AND. (B>C)) THEN
8 Bloque3
9 ENDIF
10 IF (A<=B) THEN
11 Bloque4
12 ENDIF
Ejercicio 2
Necesitamos tres variables enteras para almacenar los tres datos de entrada. Podríamos
declarar una cuarta variable para almacenar el dato de salida (que podría ser entero o
real dependiendo del caso) pero nos la vamos a ahorrar de forma que escribiremos la
expresión que hace el cálculo del resultado directamente en la instrucción PRINT de
salida de datos.
Una vez leídos los datos de entrada hemos de usar una condicional que permita com-
probar el valor del segundo de ellos y, en función de su valor (positivo o negativo),
que se realice un cálculo u otro. Es decir, tenemos dos posibles alternativas, por lo que
parece que la estructura se ajusta a una condicional doble.
La solución sería la siguiente:
4. LA ESTRUCTURA CONDICIONAL 151
3 INTEGER :: a, b, c
Observa que para el cálculo de la media hemos dividido por el número real 3.0. De esta
forma forzamos la promoción del numerador a representación real y la división es real
(obtenemos también los decimales).
Ejercicio 3
Como entradas tendremos los coeficientes (reales) de la ecuación a, b y c. En cuanto
a los datos de salida, estos pueden variar en función del tipo de ecuación que formen
los coeficientes: podemos tener una solución, dos soluciones, ninguna solución real
o infinitas soluciones. Puesto que hasta que no empezamos a hacer los cálculos no
sabemos qué solución debemos dar, podríamos pensar en ir escribiendo instrucciones
PRINT conforme las vayamos necesitando (intercaladas entre los cálculos).
En lugar de hacer eso vamos a seguir el protocolo habitual:
Una vez que hemos hecho el cálculo, en función del valor de los coeficientes, vamos a
mostrar el resultado pero de nuevo tenemos varias alternativas:
De esta forma, cuando estamos haciendo los cálculos le asignamos a la variable llama-
da tiposolucion el valor que le corresponde para después consultarlo y mostrar el
mensaje de salida adecuado.
3 REAL :: a,b,c,x1,x2,disc
4 INTEGER :: tiposolucion
5 ! Leemos coeficientes
6 PRINT*, "Dime los coeficientes de la ecuación a, b y c"
7 READ*, a, b, c
46 END PROGRAM
Ejercicio 5
En este problema los datos de entrada son el nombre del empleado (cadena de carac-
teres), los apellidos (cadena de caracretes), la antigüedad en la empresa (entero) y el
salario base (real).
Hemos optado por calcular primero todos los porcentajes que se han de aplicar (incre-
mentos y retenciones) para, posteriormente, aplicarlos sobre el sueldo. De esta forma,
las ecuaciones que calculan los datos de salida son válidas independientemente de lo
que valgan en concreto dichos porcentajes.
7 ! Otras variables
8 REAL :: incremento ! Incremento de sueldo por antigüedad
154 4.5. SOLUCIONES
60 ! Al año gana:
61 sueldo_neto_anual = sueldo_neto_mes*10 + sueldo_extra_neto*2
62 sueldo_bruto_anual = sueldo_bruto_mes*10 + sueldo_extra_bruto*2
80 ! Mostramos datos:
81 IF (inicial2==" ") THEN
82 PRINT*, "Trabajador: ", inicial1, "., ",TRIM(nombre)
83 ELSE
84 PRINT*,"Trabajador: ", inicial1, ". ", inicial2, "., ", &
85 & TRIM(nombre)
86 ENDIF
Ejercicio 6
Los datos de entrada al problema serían: el nombre (cadena de caracteres), el sueldo
(número entero), la edad (entero) y el sexo (un carácter: M o F). Observa que en la etapa
de petición de datos no se hace ninguna comprobación sobre la validez de los mismos
(que el sueldo sea positivo, que el sexo sea M o F, que la edad sea positiva, etc.). Tras
pedir los datos de entrada, comprobaremos cuál de las condiciones del enunciado es la
que se cumple y codificaremos en una variable (tipo) el resultado. En la variable tipo
pondremos alguno de los siguientes valores:
Una vez que tenemos calculado el valor de la variable tipo procederemos a mostrar los
datos de salida con una multicondicional de tipo SELECT CASE.
Observa que al escribir el nombre en pantalla hacemos uso de la función TRIM para
evitar que se escriban también los espacios en blanco de relleno de la cadena.
3 CHARACTER(LEN=30) :: nombre
4 INTEGER :: sueldo, edad
5 CHARACTER :: sexo
6 INTEGER :: tipo
21 tipo=0
22 IF ((sexo==’M’) .OR. (sexo==’m’)) THEN
23 IF (sueldo<500) tipo=1
24 ELSE
25 IF (sueldo>6000) THEN
26 tipo=2
27 ELSE IF ((edad>=20) .AND. (edad<=30) .AND. (sueldo>=1200) &
28 & .AND. (sueldo<=2000)) THEN
29 tipo=3
30 ENDIF
31 ENDIF
42 END PROGRAM
Ejercicio 7
En este caso los datos de entrada serían las coordenadas del centro del círculo (reales)
y el radio del mismo (también real) además de las coordenadas del punto. Las coorde-
nadas del centro y del punto se pueden almacenar en cuatro variables de tipo real pero
en este caso vamos a definir un nuevo tipo de dato para almacenarlas. Ese nuevo tipo
constará de dos campos: uno para las ordenadas y otro para las abscisas.
La forma de resolver el problema es calcular la distancia desde el centro del círculo al
punto y comprobar si es menor, mayor o igual que el radio.
26 END PROGRAM
Ejercicio 9
Como datos de entrada tenemos dos números enteros (m y n). El dato de salida será un
mensaje en pantalla indicando si m es divisible por n.
Para comprobar si un número m es divisible por otro n vamos a comprobar si el resto
de la división entera del primero por el segundo es cero. En caso afirmativo podremos
decir que n divide a m. Para el cálculo del resto de una división entera usaremos la
función intrínseca MOD.
Equivalentemente, podemos sustituir la función MOD por la expresión m-(m/n)*n. En
este caso, al tratarse de variables enteras, la división m/n obtendría el cociente de la
división entera (sin decimales).
3 INTEGER :: n, m
4. LA ESTRUCTURA CONDICIONAL 159
7 ! Comprobamos si n divide a m
8 IF (MOD(m,n)==0) THEN
9 PRINT*, n, " divide a ", m
10 ELSE
11 PRINT*, n, " no divide a ", m
12 ENDIF
13 END PROGRAM
Ejercicio 14
El dato de entrada es el nombre de un mes. Para almacenarlo necesitaremos una va-
riable de tipo cadena de caracteres. La longitud máxima de dicha cadena será la del
nombre del mes más largo que podamos tener (Septiembre con diez caracteres).
En este programa hemos de cuidar la escritura de mayúsculas y minúsculas en el nom-
bre de los meses cuando lo ejecutemos ya que si, por ejemplo, escribimos el nombre
todo en minúsculas o todo en mayúsculas nos diría que no es reconocido. La forma de
escribir los meses será: la primera letra mayúscula y el resto minúsculas (tal como se
han escrito en la multicondicional SELECT CASE).
18 END
160 4.5. SOLUCIONES
Ejercicio 15
Para almacenar las coordenadas de los tres puntos de entrada usaremos un nuevo tipo
de dato de forma análoga a como hicimos en el ejercicio 7. Los pasos a seguir son los
siguientes:
3 TYPE Punto2D
4 REAL :: x, y
5 END TYPE Punto2D
6 TYPE(Punto2D) :: a, b, c
7 REAL :: AB, AC, BC, LadoMayor, SumaOtros
8 ! Leemos datos
9 PRINT*, "Dame las coordenadas (x,y) del punto A:"
10 READ*, a
11 PRINT*, "Dame las coordenadas (x,y) del punto B:"
12 READ*, b
13 PRINT*, "Dame las coordenadas (x,y) del punto C:"
14 READ*, c
26 ELSE
27 LadoMayor = BC
28 ENDIF
29 ELSE
30 IF (AC>BC) THEN
31 LadoMayor = AC
32 ELSE
33 LadoMayor = BC
34 ENDIF
35 ENDIF
57 END
162 4.5. SOLUCIONES