Documentos de Académico
Documentos de Profesional
Documentos de Cultura
f90 Condicional
f90 Condicional
4
La estructura condicional
Hasta ahora hemos visto cmo resolver problemas muy simples. En este captulo se introduce 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 seccin 3.4 (resolucin de una ecuacin de segundo grado) se poda dar el caso de que a valiese
cero; en tales circunstancias sera necesario aplicar un mtodo distinto para resolver el sistema de ecuaciones, pero con las estructuras que conocemos hasta ahora no es posible tener
varias alternativas para resolver un problema. Por tanto, nos sera de gran utilidad una estructura que permitiese continuar la ejecucin de nuestro algoritmo por diferentes caminos,
dependiendo de si se dan unas condiciones u otras. Esta nueva estructura es la llamada estructura condicional, de bifurcacin o de seleccin. Existen distintas instrucciones que permiten
implementar este tipo de estructura, diferencindose entre ellas en el nmero de alternativas
que ofrecen.
130
Falsa
Condicin
Verdadera
BloqueInst
Ejemplo
1
2
3
IF (x.GT.4) THEN
y=6
ENDIF
En este caso evaluamos la expresin lgica (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
instruccin de asignacin y=6.
Ejemplo
1
2
3
4
4. LA ESTRUCTURA CONDICIONAL
131
Observa que la condicin es una expresin cuyo resultado es un dato de tipo lgico
y que puede ser tan compleja como necesitemos. En este caso la condicin est compuesta por dos condiciones ms 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
2
3
IF (MOD(x,2)==0) THEN
PRINT*, "El nmero ",x," es par"
ENDIF
Para comprobar si un nmero es par, calculamos el resto de la divisin entera entre ese
nmero y dos. Si el resto es cero es que el nmero es par; en caso contrario el nmero
ser impar. El resto se puede calcular con la funcin intrnseca MOD.
Ejemplo
1
2
3
IF x.GT.4 THEN
y=6
ENDIF
En este caso la instruccin est mal escrita ya que falta un par de parntesis que englobe
a la condicin. Al igual que ocurrir con el resto de condicionales, la expresin lgica
ha de ir, obligatoriamente, entre parntesis.
IF logico
(IF-THEN simplificado)
4.1.1.
IF (x>4) y=6
En este caso evaluamos la expresin lgica (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 asignacin
y=6.
2 Al
igual que ocurre con la condicional simple, los parntesis de la condicin son obligatorios.
132
Ejemplo
1
4.1.2.
es decir, tenemos que hacer una comprobacin para verificar si es par y otra para verificar 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
ms natural este tipo de situaciones. Esta segunda versin se conoce como IF-THEN-ELSE
(en castellano SI-ENTONCES-SINO). Su organigrama lo tenemos en la figura 4.2.
Verdadera
BloqueV
Condicin
Falsa
BloqueF
4. LA ESTRUCTURA CONDICIONAL
133
En dicha figura, Condicin es una expresin que devuelve un dato de tipo lgico y BloqueV y BloqueF son dos grupos de instrucciones. La interpretacin sera: si el resultado de
evaluar Condicin es verdadero (.TRUE.) entonces ejecutamos BloqueV y en caso contrario
(si es falso, .FALSE.) ejecutamos BloqueF. Es decir, planteamos como alternativa la ejecucin 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 evaluacin de la condicin
y ambos caminos acaban en un punto comn.
La sintaxis3 de esta instruccin en Fortran es la siguiente:
La estructura condicional IF-THEN-ELSE
IF (<Condicin>) THEN
<BloqueV>
ELSE
<BloqueF>
ENDIF
Ejemplo
Reescribir la condicional que imprime un mensaje diciendo si un nmero es par o
impar.
1
2
3
4
5
IF (MOD(x,2)==0) THEN
PRINT*, x, " es par"
ELSE
PRINT*, x, " es impar"
ENDIF
3 El
IF (x>4) THEN
PRINT*, x, " es mayor que 4"
ELSE
IF (x<4) THEN
PRINT*, x, " es menor que 4"
ELSE
PRINT*, x, " es igual que 4"
parntesis de la expresin lgica es obligatorio (al igual que en las otras condicionales).
134
8
9
ENDIF
ENDIF
4.2.1.
La estructura IF-THEN-ELSEIF
En el ejemplo anterior hemos visto cmo elegir una de entre tres posibles alternativas
haciendo uso de estructuras condicionales dobles anidadas. En ese caso sera ms cmodo
usar una nica instruccin que nos simplifique un poco el proceso de escritura del programa.
En realidad la estructura IF-THEN-ELSEIF se puede considerar como una simplificacin en
la escritura de ciertos tipos de condicionales con anidamiento en su parte ELSE.
Al igual que ocurre con el resto de estructuras que se estudian en este texto, existe un
nico punto de entrada a la multicondicional (la primera condicin) y un nico punto de
salida donde convergen todas las alternativas propuestas.
El organigrama de esta instruccin lo tenemos en la figura 4.3.
Su sintaxis4 es la siguiente:
La estructura multicondicional IF-THEN-ELSEIF
IF (<Condicin1>) THEN
<Bloque1>
ELSEIF (<Condicin2>) THEN
<Bloque2>
.....
ELSEIF (<CondicinN>) THEN
<BloqueN>
ELSE
<BloqueF>
ENDIF
Donde aparecen los puntos suspensivos podemos poner ms partes ELSEIF (tantas como
necesitemos). El ltimo bloque ELSE no es obligatorio.
4 Los
135
4. LA ESTRUCTURA CONDICIONAL
Verdadera
Bloque1
Condicin1
Verdadera
Falsa
Condicin2
Bloque2
Falsa
...
Verdadera
BloqueN
CondicinN
Falsa
BloqueF
Ejemplo
Reescribir el ejemplo anterior usando la instruccin IF-THEN-ELSEIF:
1
2
3
4
5
6
7
IF (x>4) THEN
PRINT*, x, " es mayor que 4"
ELSEIF (x.EQ.4) THEN
PRINT*, x, " es igual que 4"
ELSE
PRINT*, x, " es menor que 4"
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 slo hay que usar un ENDIF.
Ejemplo
Dada la nota numrica de un alumno, queremos obtener la nota expresada con palabras
(suspenso, aprobado, notable, ...):
Solucin A
136
IF ((nota<0).OR.(nota>10)) THEN
PRINT*, "Nota incorrecta"
ELSEIF ((nota>=0) .AND. (nota<5)) THEN
PRINT*, "Suspenso"
ELSEIF ((nota>=5) .AND. (nota<7)) THEN
PRINT*, "Aprobado"
ELSEIF ((nota>=7) .AND. (nota<9)) THEN
PRINT*, "Notable"
ELSEIF ((nota>=9) .AND. (nota<10)) THEN
PRINT*, "Sobresaliente"
ELSE
PRINT*, "Matrcula de honor"
ENDIF
Supongamos que nota vale 8. La ejecucin de esta instruccin sera 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.
En este caso la condicin (nota>=5) del primer ELSEIF no es necesaria ya que si
llegamos a ese punto es porque no se cumpli la condicin del primer IF, es decir,
((nota<0).OR.(nota>10)) y a partir de ese momento se cumplir siempre que la
nota es mayor o igual que cero. Lo mismo ocurre en los otros ELSEIF. Por lo tanto,
esta solucin est evaluando algunas subexpresiones que no son necesarias.
Solucin B
A continuacin se propone una versin mejorada de esta multicondicional en la que se
hacen menos comparaciones en las condiciones lgicas.
1
2
3
4
5
6
7
8
IF ((nota<0).OR.(nota>10)) THEN
PRINT*, "Nota incorrecta"
ELSEIF (nota<5) THEN
PRINT*, "Suspenso"
ELSEIF (nota<7) THEN
PRINT*, "Aprobado"
ELSEIF (nota<9) THEN
PRINT*, "Notable"
137
4. LA ESTRUCTURA CONDICIONAL
9
10
11
12
13
Hay que tener cuidado con las condiciones que se ponen en la estructura multicondicional
ya que deberan ser mutuamente excluyentes. Este hecho no es comprobado por el compilador
por lo que en algn caso podramos estar cometiendo algn 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
2
3
4
5
6
7
8
9
10
11
12
IF (Cond1) THEN
IF ((Cond2) .AND. (Cond3)) THEN
Bloque_1
ELSE
IF (Cond4) THEN
Bloque_2
END IF
Bloque_3
END IF
ELSE
Bloque_4
END IF
Cond1
.FALSE.
.TRUE.
.TRUE.
.TRUE.
.TRUE.
.TRUE.
.TRUE.
.TRUE.
.TRUE.
Cond2
.FALSE.
.FALSE.
.FALSE.
.FALSE.
.TRUE.
.TRUE.
.TRUE.
.TRUE.
Cond3
.FALSE.
.FALSE.
.TRUE.
.TRUE.
.FALSE.
.FALSE.
.TRUE.
.TRUE.
Cond4
.FALSE.
.TRUE.
.FALSE.
.TRUE.
.FALSE.
.TRUE.
.FALSE.
.TRUE.
Bloques
4
3
2, 3
3
2, 3
3
2, 3
1
1
Ejemplo
Supongamos que tenemos la estructura multicondicional del ejemplo anterior. Podemos reescribir dicho cdigo sin hacer uso de estructuras multicondicionales? La respuesta es que s y a continuacin vemos una posible solucin:
138
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IF (.NOT.(Cond1))
Bloque_4
END IF
IF ((Cond1) .AND.
Bloque_3
END IF
IF ((Cond1) .AND.
Bloque_2
Bloque_3
END IF
IF ((Cond1) .AND.
Bloque_1
END IF
IF ((Cond1) .AND.
Bloque_3
END IF
IF ((Cond1) .AND.
Bloque_2
Bloque_3
END IF
THEN
Hay otras soluciones pero todas ellas implican hacer mltiples veces las comprobaciones sobre las condiciones resultando ms ineficientes (y difciles 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.
Tambin podemos apreciar que repetimos varias veces algunos de los bloques de cdigo con el consiguiente gasto de memoria que eso supone.
4.2.2.
La estructura SELECT-CASE
En algunos casos concretos donde hemos de elegir entre mltiples alternativas resulta
cmodo usar esta estructura, aunque su uso est limitado slo a algunos tipos de formas
multicondicionales.
El organigrama lo podemos ver en la figura 4.4.
La sintaxis5 de esta estructura es:
5 Los
139
4. LA ESTRUCTURA CONDICIONAL
Cierto
Bloque1
Falso
expr==selector1
Cierto
Bloque2
Falso
expr==selector2
...
Falso
expr==selectorN
Cierto
BloqueN
BloqueDef
END SELECT
La idea de la estructura consiste en evaluar la expresin <expr> y compararla con distintos valores a los que hemos llamado selectores; dependiendo de con cual de ellos coincida,
ejecutaremos un bloque u otro de cdigo. Esta comparacin se va haciendo en orden hasta que encuentra coincidencia entre el valor de la expresin y alguno de los selectores. En
ese momento se ejecuta el bloque asociado al selector coincidente y finaliza la instruccin.
Si no se da la igualdad en ninguno de los casos entonces ejecutamos el bloque del selector
140
DEFAULT. Hay algunas cosas que hemos de tener en cuenta cuando usemos esta instruccin:
La expresin <expr> ha de devolver como resultado un dato de tipo lgico (LOGICAL),
entero (INTEGER) o carcter (CHARACTER).
Los selectores tienen que ser constantes del mismo tipo que devuelve la expresin.
Dentro de un mismo selector podemos poner:
Un nico valor. Por ejemplo (3).
Varios valores separados por comas. Por ejemplo (2,3,4,7,9). En este caso se
compara la expresin con todos ellos y si coincide con alguno se ejecuta el bloque
de ese selector.
Un rango de valores. Por ejemplo (3:7) sera equivalente a (3,4,5,6,7). Cuando ponemos un rango podemos omitir el comienzo o el final de dicho rango. Si
omitimos el final y por ejemplo ponemos (3:) queremos decir que compare con
los nmeros 3, 4, 5, ..., es decir con todos los nmeros mayores o iguales que
3. Si omitimos el comienzo, y por ejemplo ponemos (:5) queremos indicar que
compare con todos los nmeros que sean menores o iguales que 5.
Podemos mezclar valores y rangos. Por ejemplo (3, 8, 10:15, -2).
Los selectores han de ser mutuamente excluyentes. Si no lo fuesen el compilador genera un error (si fuese posible determinar esta circunstancia en tiempo de compilacin).
El selector DEFAULT es opcional.
Tanto la expresin <expr> como los selectores han de ir entre parntesis.
Esta estructura se podra 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 slo pueden incluir constantes.
Ejemplo
Implementar un programa que, dado un nmero entero x, imprima un mensaje de texto
en funcin de su valor, segn 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
1
2
3
4
5
6
7
8
9
10
11
12
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 podramos haber
sustituido por un CASE DEFAULT ya que si llegamos a ese punto tenemos garantizado
que el nmero almacenado en x es mayor o igual que 11.
Ejemplo
Vamos a plantearnos la posibilidad de escribir un programa para gestionar una pequea
base de datos con los alumnos de una asignatura. Una de las tareas que hemos de hacer
es preparar un men de opciones a travs del cual preguntemos al usuario qu tipo
de operacin desea realizar sobre dicha base de datos (aadir 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 accin asociada a la opcin
elegida. Las opciones sern las siguientes:
a) Obtener un listado con todos los alumnos.
b) Buscar los datos de un alumno a partir de su NIF.
c) Aadir un nuevo alumno a la base de datos.
d) Borrar un alumno de la base de datos.
e) Finalizar la ejecucin del programa.
Slo tenemos que realizar la parte que se encarga de presentar el men y elegir una
opcin. No entraremos al detalle de realizar cada una de esas tareas.
Anlisis
Lo primero de todo es realizar el correspondiente anlisis del problema. En este caso
comenzaremos plantendonos qu datos vamos a necesitar para que funcione el men.
El usuario, en algn momento, ha de introducir mediante el teclado la opcin del men que desea ejecutar. Por tanto, un dato de entrada a nuestro programa es la opcin
que elige el usuario. Qu tipo de dato es? Esto depender de cmo queramos hacer el
men; una alternativa bastante usual es asignar un nmero a cada una de las opciones
del men de forma que para seleccionar una de ellas bastar con introducir el nmero
142
correspondiente. Es decir si, por ejemplo, asociamos el nmero 1 a la opcin que nos
permite hacer un listado de los datos que maneja el programa, nos bastar con introducir el nmero 1 por el teclado para que nuestro algoritmo interprete que deseamos tener
un listado de los datos. Si optamos por este mtodo, entonces la variable que almacenar la opcin elegida por el usuario puede ser de tipo entero. Qu rango de valores
es vlido? Esto viene determinado por el nmero de opciones de nuestro men.
Ahora hay que determinar las variables de salida del algoritmo. Cules son? En este caso las variables de salida dependern de la opcin que hayamos elegido. Puesto
que no vamos a escribir los algoritmos que realizan los trabajos asociados a cada opcin, nuestro algoritmo no necesitar tener variables de salida. Simplemente dejaremos
indicadas las operaciones que habra que realizar para cada opcin.
Diseo
Las etapas para resolver el problema seran:
a) Mostrar un men con las opciones vlidas
b) Leer un dato por teclado que sea el nmero de opcin seleccionada
c) Segn sea dicho valor ejecutar el bloque de instrucciones correspondiente
El organigrama podra quedar como el de la figura 4.5.
Implementacin
Para hacer el algoritmo algo ms cmodo (por si necesitsemos variar las opciones ms
adelante) vamos a definir como constantes el nmero de opciones y los mensajes que
aparecern por pantalla para cada opcin.
El programa sera este:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PROGRAM Menu
!### ejselect.f90 ###
IMPLICIT NONE
! Implementacin de un Men de opciones
! Declaracin de constantes
! Vamos a definir como constantes el nmero de opciones que
! tendr nuestro men y el nombre de cada opcin
INTEGER, PARAMETER :: NumeroOpc=5
CHARACTER (LEN=*), PARAMETER :: &
&opc1="1 - Listado de alumnos", &
&opc2="2 - Buscar un alumno", &
&opc3="3 - Aadir alumno", &
&opc4="4 - Borrar un alumno", &
&opc5="5 - Finalizar"
! Declaracin de variables
INTEGER :: op
! Esta variable servir para leer la opcin
143
4. LA ESTRUCTURA CONDICIONAL
Inicio
Mostrar Menu
Leer opcion
Cierto
Falso
opcion==1
Cierto
Falso
opcion==2
Cierto
Falso
opcion==3
Cierto
Falso
opcion==4
Cierto
Finalizar ...
Falso
opcion==5
END SELECT
Fin
16
17
18
144
19
20
21
22
23
24
PRINT*, opc3
PRINT*, opc4
PRINT*, opc5
! Leer opcin por teclado
PRINT*, "Qu opcin quieres ejecutar?"
READ*, op
39
40
END
25
26
27
28
29
30
31
32
33
34
35
36
37
38
4. LA ESTRUCTURA CONDICIONAL
145
4.3. Resumen
Las estructuras condicionales permiten alterar el flujo de ejecucin normal de un programa y permiten elegir entre varias alternativas para seguir la ejecucin.
146
4.3. RESUMEN
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.
a) Expresa la siguiente instruccin condicional mediante condicionales simples anidadas sin usar operadores lgicos:
1
2
3
b) Cambia el siguiente conjunto de condicionales anidadas por un grupo de condicionales simples equivalentes sin usar anidamiento (nota: usa condiciones compuestas mediante operadores lgicos):
1
2
3
4
5
6
7
8
9
10
11
12
13
IF (A>B) THEN
IF (B<=C) THEN
IF (C/=D) THEN
Bloque1
ELSE
Bloque2
ENDIF
ELSE
Bloque3
ENDIF
ELSE
Bloque4
ENDIF
2. Haz un programa que lea tres nmeros 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 nmeros.
3. Calcula las soluciones de una ecuacin 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
C=
5(F32)
9
5. Escribe un programa que pregunte el nombre, los apellidos, el salario base de un empleado y su antigedad en la empresa y que aplique las siguientes tablas para calcular
su sueldo mensual:
148
4.4. EJERCICIOS
Antigedad
<3 aos
3 y <5
5 y <8
8
Incremento Sueldo
+5 %
+10 %
+15 %
+20 %
Las retenciones sobre la nmina mensual (ya aplicado el incremento de sueldo) son:
Sueldo bruto mensual
<900 euros
900 y <1300
1300 y <1800
1800
Seguridad social
5%
5%
7%
8%
IRPF
10 %
12 %
15 %
18 %
En los meses de Julio y Diciembre el empleado cobra paga extra. Esta paga supone
sumar al sueldo normal (con incremento) el salario base de un mes (sin incremento).
El programa imprimir el nombre y las iniciales de los apellidos junto con el sueldo
bruto y neto de un mes normal, el sueldo bruto y neto de un mes de paga extra y el
sueldo bruto y neto totales anuales.
Por ejemplo, un empleado con una antigedad de 4 aos y un sueldo base de 1000 euros
cobrar un mes normal 1100 euros brutos. Descontando de ah 55 euros de seguridad
social y 132 de IRPF nos queda que el sueldo neto es de 913 euros mensuales. Los
meses de paga extra cobrar 2100 euros brutos y 1743 euros netos. El sueldo bruto
anual es de 15200 euros y el neto es de 12616 euros.
6. Haz un programa que lea los siguientes datos de una persona: nombre, sueldo mensual,
edad y sexo. A continuacin, el programa deber clasificar a la persona en alguna de
las siguientes categoras:
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 aos y cuyo sueldo est entre 1200 y 2000 euros/mes.
Es posible que una persona no entre dentro de ninguna de estas categoras. En tal caso
imprime un mensaje que lo indique.
7. Haz un programa que lea los datos que definen un crculo (centro y radio) y las coordenadas de un punto en el espacio. El programa deber decirnos si el punto est o no
dentro del crculo.
8. Haz un programa que lea las coordenadas que definen un rectngulo (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 rectngulo.
9. Haz un programa que lea dos nmeros 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 cuntos de ellos
hay iguales entre si.
11. En una ciudad compuesta por 6 barrios (cada uno identificado por un nmero 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 segn los siguientes criterios:
a) Si las tres cargas del camin 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 (slo a esas
dos).
Haz un programa que reciba como entrada los cdigos 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, segn sea la fruta, muestre una descripcin de la misma. Si se introduce un
nombre de una fruta desconocida se mostrar un mensaje adecuado.
13. Realizar un programa que lea un ao 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 nmero de das que tiene
ese mes.
15. Hacer un programa que lea las coordenadas de tres puntos y que diga si forman o no
un tringulo6. Indicar tambin si el tringulo es o no equiltero.
16. Una fabrica de zapatos tambin fabrica las cajas de cartn para embalarlos. El coste
de la caja es 0.02 euros por cm2 de cartn. 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 funcin de las caractersticas del cliente:
a) Los clientes menores de 4 aos no pagan. Los clientes cuya edad est entre 4 y 7
aos pagan la mitad del billete. Los mayores de 65 aos 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 tringulo si la mayor de las distancias AB, AC, BC
es menor que la suma de las otras dos. Adems, el tringulo ser equiltero si las tres distancias son iguales. Tambin
podemos decir que los tres puntos forman un tringulo si no estn 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 ms beneficioso para el usuario y que los descuentos
no son acumulativos.
4.5. Soluciones
Ejercicio 1
a) La solucin al primer apartado es la siguiente:
1
2
3
4
5
6
7
IF (A<B) THEN
IF (C/=D) THEN
IF (B>=D) THEN
Bloque1
ENDIF
ENDIF
ENDIF
Ejercicio 2
Necesitamos tres variables enteras para almacenar los tres datos de entrada. Podramos
declarar una cuarta variable para almacenar el dato de salida (que podra ser entero o
real dependiendo del caso) pero nos la vamos a ahorrar de forma que escribiremos la
expresin que hace el clculo del resultado directamente en la instruccin PRINT de
salida de datos.
Una vez ledos los datos de entrada hemos de usar una condicional que permita comprobar el valor del segundo de ellos y, en funcin de su valor (positivo o negativo),
que se realice un clculo u otro. Es decir, tenemos dos posibles alternativas, por lo que
parece que la estructura se ajusta a una condicional doble.
La solucin sera la siguiente:
151
4. LA ESTRUCTURA CONDICIONAL
PROGRAM TresNumeros
IMPLICIT NONE
INTEGER :: a, b, c
4
5
6
12
13
7
8
9
10
11
Observa que para el clculo de la media hemos dividido por el nmero real 3.0. De esta
forma forzamos la promocin del numerador a representacin real y la divisin es real
(obtenemos tambin los decimales).
Ejercicio 3
Como entradas tendremos los coeficientes (reales) de la ecuacin a, b y c. En cuanto
a los datos de salida, estos pueden variar en funcin del tipo de ecuacin que formen
los coeficientes: podemos tener una solucin, dos soluciones, ninguna solucin real
o infinitas soluciones. Puesto que hasta que no empezamos a hacer los clculos no
sabemos qu solucin debemos dar, podramos pensar en ir escribiendo instrucciones
PRINT conforme las vayamos necesitando (intercaladas entre los clculos).
En lugar de hacer eso vamos a seguir el protocolo habitual:
a) Pedimos datos de entrada.
b) Hacemos todos los clculos.
c) Mostramos datos de salida.
Tras pedir los datos de entrada empezamos a distinguir posibles casos:
Si a==0 y b==0 entonces cualquier x es solucin de la ecuacin.
Si a==0 y b/=0 entonces hay una nica solucin real (la llamaremos x1).
Si a/=0 y el discriminante es negativo entonces no hay soluciones reales.
Si a/=0 y el discriminante es positivo entonces hay dos soluciones x1 y x2.
Si a/=0 y el discriminante es cero entonces hay una solucin x1.
152
4.5. SOLUCIONES
Una vez que hemos hecho el clculo, en funcin del valor de los coeficientes, vamos a
mostrar el resultado pero de nuevo tenemos varias alternativas:
Si a==0 y b==0 entonces escribimos un mensaje diciendo que cualquier x es
solucin de la ecuacin.
Si a==0 y b/=0 entonces diremos que la nica solucin es el valor de x1.
...
Es decir, hemos de escribir una estructura de condicionales anloga a la anterior. Para
evitar repetir esta estructura podemos usar una variable adicional (tiposolucion) que
almacene un valor que codifique el tipo de solucin que hemos de mostrar. Por ejemplo:
tiposolucion=0 si no hay soluciones reales.
tiposolucion=1 si la nica solucin se ha calculado en x1.
tiposolucion=2 si las dos soluciones estn en x1 y x2.
tiposolucion=3 si cualquier valor de x es solucin.
De esta forma, cuando estamos haciendo los clculos le asignamos a la variable llamada tiposolucion el valor que le corresponde para despus consultarlo y mostrar el
mensaje de salida adecuado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PROGRAM Ecuacion2G
IMPLICIT NONE
REAL :: a,b,c,x1,x2,disc
INTEGER :: tiposolucion
! Leemos coeficientes
PRINT*, "Dime los coeficientes de la ecuacin a, b y c"
READ*, a, b, c
! Calculamos las soluciones
! Usaremos la variable de tipo "bandera" tiposolucion para almacenar
! el tipo de solucin que hemos encontrado:
!
0 -> No hay soluciones reales
!
1 -> Hay una solucin real
!
2 -> Hay dos soluciones reales
!
3 -> Hay infinitas soluciones reales
IF (a==0) THEN
IF (b==0) THEN
tiposolucion = 3
! Infinitas soluciones
ELSE
tiposolucion = 1
! Unica solucin real
x1 = -c / b
ENDIF
ELSE
153
4. LA ESTRUCTURA CONDICIONAL
23
24
25
26
27
28
29
30
31
32
33
34
45
46
END PROGRAM
35
36
37
38
39
40
41
42
43
44
Ejercicio 5
En este problema los datos de entrada son el nombre del empleado (cadena de caracteres), los apellidos (cadena de caracretes), la antigedad en la empresa (entero) y el
salario base (real).
Hemos optado por calcular primero todos los porcentajes que se han de aplicar (incrementos y retenciones) para, posteriormente, aplicarlos sobre el sueldo. De esta forma,
las ecuaciones que calculan los datos de salida son vlidas independientemente de lo
que valgan en concreto dichos porcentajes.
1
2
3
4
5
6
7
8
PROGRAM Sueldo
IMPLICIT NONE
! Nombre y apellidos
! Antigedad en la empresa
! Salario base de clculo
154
4.5. SOLUCIONES
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
155
4. LA ESTRUCTURA CONDICIONAL
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
"Sueldo
"Sueldo
"Sueldo
"Sueldo
"Sueldo
"Sueldo
bruto mensual
neto mensual
bruto paga extra
neto paga extra
bruto anual
neto anual
=
=
=
=
=
=
",
",
",
",
",
",
sueldo_bruto_mes
sueldo_neto_mes
sueldo_extra_bruto
sueldo_extra_neto
sueldo_bruto_anual
sueldo_neto_anual
156
4.5. SOLUCIONES
94
Ejercicio 6
Los datos de entrada al problema seran: el nombre (cadena de caracteres), el sueldo
(nmero entero), la edad (entero) y el sexo (un carcter: M o F). Observa que en la etapa
de peticin de datos no se hace ninguna comprobacin 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 cul 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:
0 : No es posible clasificar a la persona.
1 : Es un hombre pobre.
2 : Es una mujer rica.
3 : Es una mujer joven de clase media.
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 funcin TRIM para
evitar que se escriban tambin los espacios en blanco de relleno de la cadena.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PROGRAM Clasifica
IMPLICIT NONE
CHARACTER(LEN=30) :: nombre
INTEGER :: sueldo, edad
CHARACTER :: sexo
INTEGER :: tipo
! Leemos datos de entrada
PRINT*, "Dime el nombre"
READ*, nombre
PRINT*, "Dime la edad"
READ*, edad
PRINT*, "Dime el sueldo"
READ*, sueldo
PRINT*, "Dime el sexo (M/F)"
READ*, sexo
! La variable tipo valdr:
!
0 -> Sin clasificar
!
1 -> Hombre pobre
!
2 -> Mujer rica
!
3 -> Joven mujer de clase media
157
4. LA ESTRUCTURA CONDICIONAL
21
22
23
24
25
26
27
28
29
30
31
tipo=0
IF ((sexo==M) .OR. (sexo==m)) THEN
IF (sueldo<500) tipo=1
ELSE
IF (sueldo>6000) THEN
tipo=2
ELSE IF ((edad>=20) .AND. (edad<=30) .AND. (sueldo>=1200) &
& .AND. (sueldo<=2000)) THEN
tipo=3
ENDIF
ENDIF
41
42
END PROGRAM
32
33
34
35
36
37
38
39
40
usted no es clasificable"
es usted un pobre hombre"
es usted una mujer rica"
eres una joven mujer de clase media"
Ejercicio 7
En este caso los datos de entrada seran las coordenadas del centro del crculo (reales)
y el radio del mismo (tambin real) adems de las coordenadas del punto. Las coordenadas 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 crculo al
punto y comprobar si es menor, mayor o igual que el radio.
1
2
3
4
5
6
PROGRAM PuntoEnCirculo
IMPLICIT NONE
158
4.5. SOLUCIONES
10
11
12
13
14
15
16
17
25
26
END PROGRAM
18
19
20
21
22
23
24
PROGRAM DivideNum
IMPLICIT NONE
INTEGER :: n, m
159
4. LA ESTRUCTURA CONDICIONAL
4
5
6
12
! Comprobamos si
IF (MOD(m,n)==0)
PRINT*, n, "
ELSE
PRINT*, n, "
ENDIF
13
END PROGRAM
7
8
9
10
11
n divide a m
THEN
divide a ", m
no divide a ", m
Ejercicio 14
El dato de entrada es el nombre de un mes. Para almacenarlo necesitaremos una variable de tipo cadena de caracteres. La longitud mxima de dicha cadena ser la del
nombre del mes ms largo que podamos tener (Septiembre con diez caracteres).
En este programa hemos de cuidar la escritura de maysculas y minsculas en el nombre de los meses cuando lo ejecutemos ya que si, por ejemplo, escribimos el nombre
todo en minsculas o todo en maysculas nos dira que no es reconocido. La forma de
escribir los meses ser: la primera letra mayscula y el resto minsculas (tal como se
han escrito en la multicondicional SELECT CASE).
PROGRAM NombreMes
IMPLICIT NONE
4
5
17
18
END
6
7
8
9
10
11
12
13
14
15
16
160
4.5. SOLUCIONES
Ejercicio 15
Para almacenar las coordenadas de los tres puntos de entrada usaremos un nuevo tipo
de dato de forma anloga a como hicimos en el ejercicio 7. Los pasos a seguir son los
siguientes:
a) Preguntamos por las coordenadas de los tres puntos A, B y C.
b) Calculamos la longitud de los tres lados AB, AC, BC.
c) Comprobamos cul de los tres lados es el mayor mediante varias condicionales.
Anotamos en una nueva variable (LadoMayor) cul de las tres es la mayor distancia.
d) A continuacin, sabiendo cul es lado de mayor longitud sumamos los otros dos.
e) Finalmente, y de acuerdo a la regla que indica el enunciado, comprobamos si
los tres puntos forman un tringulo o no. En el caso de que lo formen, tambin
comprobaremos si es equiltero.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PROGRAM Triangulo
IMPLICIT NONE
TYPE Punto2D
REAL :: x, y
END TYPE Punto2D
TYPE(Punto2D) :: a, b, c
REAL :: AB, AC, BC, LadoMayor, SumaOtros
! Leemos datos
PRINT*, "Dame las coordenadas (x,y) del punto A:"
READ*, a
PRINT*, "Dame las coordenadas (x,y) del punto B:"
READ*, b
PRINT*, "Dame las coordenadas (x,y) del punto C:"
READ*, c
! Calculamos la longitud de los lados
AB = SQRT( (a%x-b%x)**2 + (a%y-b%y)**2 )
AC = SQRT( (a%x-c%x)**2 + (a%y-c%y)**2 )
BC = SQRT( (b%x-c%x)**2 + (b%y-c%y)**2 )
! Calculamos el lado de mayor longitud y lo almacenamos en LadoMayor
! Esto lo podramos hacer fcilmente usando la funcin intrnseca MAX:
!
LadoMayor = MAX(AB, AC, BC)
! aunque en su lugar vamos a hacer uso de estructuras condicionales.
IF (AB>AC) THEN
IF (AB>BC) THEN
LadoMayor = AB
4. LA ESTRUCTURA CONDICIONAL
ELSE
26
LadoMayor = BC
ENDIF
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
ELSE
IF (AC>BC) THEN
LadoMayor = AC
ELSE
LadoMayor = BC
ENDIF
ENDIF
! Comprobamos cul es el lado mayor y calculamos la suma de los otros
! dos en SumaOtros
IF (LadoMayor==AB) THEN
SumaOtros = AC+BC
ELSE IF (LadoMayor==AC) THEN
SumaOtros = AB+BC
ELSE
SumaOtros = AB+AC
ENDIF
56
57
END
45
46
47
48
49
50
51
52
53
54
55
161
162
4.5. SOLUCIONES