Está en la página 1de 34

CAPTULO

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.

4.1. La estructura condicional


Comenzaremos viendo el tipo ms simple de estructura de bifurcacin. Debido a las palabras reservadas que usa se suele denominar IF-THEN (que en castellano es SI-ENTONCES).
Esta estructura nos permitir ejecutar un bloque de cdigo en funcin de la veracidad o falsedad de una condicin. El organigrama que explica el funcionamiento de esta instruccin lo
tenemos en la figura 4.1.
En dicha figura, Condicin es una expresin que devuelve un dato de tipo lgico y BloqueInst es un bloque de instrucciones. La interpretacin sera: si el resultado de evaluar
Condicin es verdadero (.TRUE.) entonces ejecutamos BloqueInst y, si es falso (.FALSE.),
129

130

4.1. LA ESTRUCTURA CONDICIONAL

Falsa

Condicin

Verdadera

BloqueInst

Figura 4.1: Organigrama de la instruccin IF-THEN.

no lo ejecutamos. Es decir, planteamos como alternativa la ejecucin o no de un conjunto de


instrucciones.
La sintaxis1 de esta instruccin en Fortran es la siguiente:
La estructura condicional IF-THEN
IF (<Condicin>) THEN
<BloqueInst>
ENDIF

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

IF (i/=0 .AND. j>=9) THEN


h=1/(2*j+3)
k=-h*20
ENDIF

En este caso comprobaremos si el valor de la variable i es distinto de 0 y el valor de j


es mayor o igual que 9; de ser as ejecutaremos las dos instrucciones de asignacin.
1 El

uso de los parntesis que engloban a la condicin lgica es obligatorio.

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.

En algunas ocasiones podemos simplificar un poco la escritura de este tipo de condicional.


En concreto, cuando el conjunto de instrucciones que vamos a ejecutar consiste en una nica
instruccin, podemos escribir la sentencia de seleccin como2:
La estructura condicional IF lgico
IF (<Condicin>) <instruccin>

Esta sentencia condicional tambin es conocida como IF lgico.


Ejemplo
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

4.1. LA ESTRUCTURA CONDICIONAL

Ejemplo
1

IF (i/=0 .AND. j>=9) PRINT*, "El valor de i es ",i

En este otro caso, imprimiremos el valor de i en pantalla cuando i sea distinto de 0 y


j sea mayor o igual que 9.

4.1.2.

Ofreciendo una alternativa

En el caso de las condicionales anteriores, slo podemos elegir entre ejecutar o no un


determinado bloque de instrucciones. Sin embargo, hay ocasiones en las que lo que tenemos
que hacer es decidir entre la ejecucin de dos posibles bloques de instrucciones.
Ejemplo
Comprobar si una variable x contiene un valor par o impar y mostrar un mensaje que
indique la situacin.
Si hacemos uso de la condicional simple tendramos que hacer algo similar a lo siguiente:
1
2

IF (MOD(x,2)==0) PRINT*, "El nmero ",x," es par"


IF (MOD(x,2)/=0) PRINT*, "El nmero ",x," es impar"

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

Figura 4.2: Organigrama de la instruccin IF-THEN-ELSE.

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

El bloque de instrucciones que se ejecuta tras comprobar la condicin, bien en la parte


THEN o bien en la parte ELSE, puede incluir cualquier tipo de instruccin, incluso nuevas
condicionales. Cuando encontramos una instruccin condicional dentro de otra decimos que
la instruccin est anidada. Anidar instrucciones consiste en incluir una instruccin de un
determinado tipo dentro de otra del mismo tipo.
Ejemplo
Escribir un trozo de programa que imprima un mensaje diciendo si un nmero almacenado en una variable x es mayor, menor o igual que 4.
1
2
3
4
5
6
7

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

4.2. LA ESTRUCTURA MULTICONDICIONAL

8
9

ENDIF
ENDIF

En este caso, la condicional IF (x<4) est anidada dentro de la parte ELSE de la


condicional IF (x>4) y slo se ejecutar si la condicin (x>4) evala como .FALSE.
Ntese que cada instruccin condicional lleva su propia parte THEN, su parte ELSE y su
ENDIF.

4.2. La estructura multicondicional


Llamaremos estructura multicondicional a aquella que nos permite elegir entre varias
alternativas de ejecucin (ms de una). En Fortran existen dos instrucciones de este tipo:
IF-THEN-ELSEIF (en castellano SI-ENTONCES-SINO SI).
SELECT CASE (en castellano SEGN SEA).

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

parntesis son obligatorios en todas las condiciones.

135

4. LA ESTRUCTURA CONDICIONAL

Verdadera

Bloque1

Condicin1

Verdadera

Falsa

Condicin2

Bloque2

Falsa

...

Verdadera

BloqueN

CondicinN

Falsa

BloqueF

Figura 4.3: Organigrama de la instruccin IF-THEN-ELSEIF.

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

4.2. LA ESTRUCTURA MULTICONDICIONAL

Veamos una posible implementacin:


1
2
3
4
5
6
7
8
9
10
11
12
13

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

ELSEIF (nota<10) THEN


PRINT*, "Sobresaliente"
ELSE
PRINT*, "Matrcula de honor"
ENDIF

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

En la siguiente tabla podemos ver la solucin:

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

4.2. LA ESTRUCTURA MULTICONDICIONAL

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

.NOT.(Cond2) .AND. .NOT.(Cond4)) THEN

.NOT.(Cond2) .AND. (Cond4)) THEN

(Cond2) .AND. (Cond3)) THEN

(Cond2) .AND. .NOT.(Cond3) .AND. .NOT.(Cond4)) THEN

(Cond2) .AND. .NOT.(Cond3) .AND. (Cond4)) 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

parntesis, tanto de la expresin como de los selectores, son obligatorios.

139

4. LA ESTRUCTURA CONDICIONAL

SELECT CASE (expr)

Cierto

Bloque1

Falso

expr==selector1

Cierto

Bloque2

Falso

expr==selector2

...

Falso

expr==selectorN

Cierto

BloqueN

BloqueDef
END SELECT

Figura 4.4: Organigrama de la sentencia SELECT-CASE.

La estructura multicondicional SELECT-CASE


SELECT CASE (<expr>)
CASE (<selector1>)
<Bloque1>
CASE (<selector2>)
<Bloque2>
...
CASE (<selectorN>)
<BloqueN>
CASE DEFAULT
<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

4.2. LA ESTRUCTURA MULTICONDICIONAL

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

SELECT CASE (x)


CASE (:1)
PRINT*, "x es menor que 1"
CASE (1)
PRINT*, "x vale 1"
CASE (2,3,4)
PRINT*, "x vale 2, 3 4"
CASE (5:10)
PRINT*, "x esta entre 5 y 10"
CASE (11:)
PRINT*, "x es mayor o igual que 11"
END SELECT

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

4.2. LA ESTRUCTURA MULTICONDICIONAL

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

SELECT CASE (opcion)

Cierto

Listar alumnos ...

Falso

opcion==1

Cierto

Buscar alumno ...

Falso

opcion==2

Cierto

Anadir nuevo alumno ...

Falso

opcion==3

Cierto

Borrar un alumno ...

Falso

opcion==4

Cierto

Finalizar ...

Falso

opcion==5

Opcion incorrecta ...

END SELECT

Fin

Figura 4.5: Organigrama para el ejemplo del men de opciones.

16
17
18

! Mostrar men en pantalla


PRINT*, opc1
PRINT*, opc2

144

4.2. LA ESTRUCTURA MULTICONDICIONAL

19
20
21

22
23
24

PRINT*, opc3
PRINT*, opc4
PRINT*, opc5
! Leer opcin por teclado
PRINT*, "Qu opcin quieres ejecutar?"
READ*, op

39

! Ejecutar la accin asociada a la opcin seleccionada


SELECT CASE (op)
CASE (1)
PRINT*, "Has seleccionado listar a los alumnos"
CASE (2)
PRINT*, "Has seleccionado buscar a un alumno"
CASE (3)
PRINT*, "Aadir a un alguno"
CASE (4)
PRINT*, "Cuidado con quien borras"
CASE (5)
PRINT*, "Hasta la prxima"
CASE DEFAULT
PRINT*, "Te has equivocado"
END SELECT

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.

La estructura condicional IF-THEN


IF (<Condicin>) THEN
<BloqueSiCondicionTRUE>
ENDIF

La estructura condicional IF lgico


IF (<Condicin>) <una_instruccin_SiCondicionTRUE>

La estructura condicional IF-THEN-ELSE


IF (<Condicin>) THEN
<BloqueSiCondicionTRUE>
ELSE
<BloqueSiCondicionFALSE>
ENDIF

La estructura multicondicional IF-THEN-ELSEIF


IF (<Condicin1>) THEN
<BloqueSiCondicion1TRUE>
ELSEIF (<Condicin2>) THEN
<BloqueSiCondicion2TRUE>
.....
ELSEIF (<CondicinN>) THEN
<BloqueSiCondicionNTRUE>
ELSE
<BloqueSiNingunaCondicionTRUE>
ENDIF

146

4.3. RESUMEN

La estructura multicondicional SELECT-CASE


SELECT CASE (<expr>)
CASE (<selector1>)
<BloqueSiExpr==Selector1>
CASE (<selector2>)
<BloqueSiExpr==Selector2>
...
CASE (<selectorN>)
<BloqueSiExpr==SelectorN>
CASE DEFAULT
<BloqueSiExprDistintoSelectores>
END SELECT

Los parntesis de la condicin y de los selectores son obligatorios.


El IF lgico slo se usa cuando el bloque condicional consta de una nica instruccin.
El IF lgico no lleva las palabras reservadas THEN ni ENDIF.
La parte ELSE y la parte DEFAULT son opcionales.
En SELECT-CASE: la expresin ha de devolver un dato de tipo entero, carcter o lgico.
En SELECT-CASE: los selectores han de ser mutuamente excluyentes y pueden estar
formados por:
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.
a) Expresa la siguiente instruccin condicional mediante condicionales simples anidadas sin usar operadores lgicos:
1
2
3

IF ((A<B) .AND. (C/=D) .AND. ((B>D) .OR. (B==D))) THEN


Bloque1
ENDIF

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

b) La solucin al segundo apartado es:


1
2
3
4
5
6
7
8
9
10
11
12

IF ((A>B) .AND. (B<=C) .AND. (C/=D)) THEN


Bloque1
ENDIF
IF ((A>B) .AND. (B<=C) .AND. (C==D)) THEN
Bloque2
ENDIF
IF ((A>B) .AND. (B>C)) THEN
Bloque3
ENDIF
IF (A<=B) THEN
Bloque4
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

!### tresnum.f90 ###

! Pedimos los datos


PRINT*, "Dime tres nmeros enteros"
READ*, a, b, c

4
5
6

12

! Comprobamos si el segundo es negativo y mostramos resultado


IF (b<0) THEN
PRINT*, "El producto es: ", a*b*c
ELSE
PRINT*, "La media es: ", (a+b+c)/3.0
ENDIF

13

END PROGRAM TresNumeros

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

!### ecu2g.f90 ###

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

disc = b**2 - 4*a*c


! El discriminante
IF (disc<0) THEN
tiposolucion = 0
! No hay soluciones reales
ELSE IF (disc>0) THEN
tiposolucion = 2
! Tenemos 2 soluciones reales
x1 = (-b + SQRT(disc)) / (2*a)
x2 = (-b - SQRT(disc)) / (2*a)
ELSE
tiposolucion = 1
! nica solucin real
x1 = -b / (2*a)
ENDIF
ENDIF

45

! Imprimimos los resultados


SELECT CASE (tiposolucion)
CASE (0)
PRINT*, "No hay soluciones reales"
CASE (1)
PRINT*, "La nica solucin es ",x1
CASE (2)
PRINT*, "Las soluciones son x=",x1," y x=",x2
CASE (3)
PRINT*, "Cualquier valor de x es solucin"
END SELECT

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

!### sueldo.f90 ###

! Declaracin de variables de entrada


CHARACTER (LEN=50) :: nombre, apellidos
INTEGER :: antiguedad
REAL :: salario_base
! Otras variables
REAL :: incremento

! Nombre y apellidos
! Antigedad en la empresa
! Salario base de clculo

! Incremento de sueldo por antigedad

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

REAL :: retencion_ss, retencion_irpf


! Retenciones del sueldo
REAL :: sueldo_bruto_mes, sueldo_neto_mes ! Sueldo bruto/neto al mes
REAL :: sueldo_extra_bruto, sueldo_extra_neto ! Sueldo con paga extra
REAL :: sueldo_bruto_anual, sueldo_neto_anual
! Sueldo anual
CHARACTER :: inicial1, inicial2
! Iniciales de cada apellido
INTEGER :: pos2 ! Para calcular la posicin de inicio del 2o apellido
! Lectura de datos desde teclado
PRINT*, "Dime el nombre del empleado"
READ*, nombre
PRINT*, "Dime los dos apellidos del empleado" ! Suponemos 2 apellidos
READ*, apellidos
PRINT*, "Cuntos aos lleva en la empresa?"
READ*, antiguedad
PRINT*, "Cul es el salario base?"
READ*, salario_base
IF ((antiguedad<0) .OR. (salario_base<0)) THEN
PRINT*, "Los datos de entrada son incorrectos"
ELSE
! Calculamos el factor de incremento de sueldo por antigedad
IF (antiguedad<3) THEN
incremento = 0.05
ELSE IF (antiguedad<5) THEN
incremento = 0.10
ELSE IF (antiguedad<8) THEN
incremento = 0.15
ELSE
incremento = 0.20
ENDIF
! El sueldo bruto mensual ser:
sueldo_bruto_mes = salario_base + salario_base*incremento
! Clculo de retenciones IRPF y SS en funcin del bruto mensual
IF (sueldo_bruto_mes<900) THEN
retencion_ss = 0.05
retencion_irpf = 0.10
ELSE IF (sueldo_bruto_mes<1300) THEN
retencion_ss = 0.05
retencion_irpf = 0.12
ELSE IF (sueldo_bruto_mes<1800) THEN
retencion_ss = 0.7
retencion_irpf = 0.15
ELSE
retencion_ss = 0.08
retencion_irpf = 0.18
ENDIF

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

! El sueldo neto mensual ser:


sueldo_neto_mes = sueldo_bruto_mes - &
& (retencion_ss+retencion_irpf)*sueldo_bruto_mes
! Los meses de paga extra:
sueldo_extra_bruto = sueldo_bruto_mes + salario_base
sueldo_extra_neto = sueldo_extra_bruto - &
& (retencion_ss+retencion_irpf)*sueldo_extra_bruto
! Al ao gana:
sueldo_neto_anual = sueldo_neto_mes*10 + sueldo_extra_neto*2
sueldo_bruto_anual = sueldo_bruto_mes*10 + sueldo_extra_bruto*2
! Calculamos las iniciales de los apellidos.
! El primer carcter ser la inicial del primer apellido
inicial1 = apellidos(1:1)
!
!
!
!
!
!

Para buscar la inicial del segundo apellido buscamos la


posicin donde se encuentre el primer espacio en blanco en la
cadena apellidos. La inicial ser, previsiblemente, el carcter
que viene a continuacin. Si, por ejemplo, usamos varios
espacios en blanco para separar los apellidos este mtodo no
funciona bien.

! Posicin donde se encuentra el primer espacio en blanco


pos2 = INDEX(apellidos," ")
IF ((pos2==0) .OR. (pos2==LEN(apellidos))) THEN
! En el caso de que no haya segundo apellido
inicial2 = " "
ELSE
inicial2 = apellidos(pos2+1:pos2+1)
ENDIF
! Mostramos datos:
IF (inicial2==" ") THEN
PRINT*, "Trabajador: ", inicial1, "., ",TRIM(nombre)
ELSE
PRINT*,"Trabajador: ", inicial1, ". ", inicial2, "., ", &
& TRIM(nombre)
ENDIF
PRINT*,
PRINT*,
PRINT*,
PRINT*,
PRINT*,
PRINT*,
ENDIF

"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

END PROGRAM Sueldo

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

!### clasifica.f90 ###

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

SELECT CASE (tipo)


CASE (0)
PRINT*, TRIM(nombre),",
CASE (1)
PRINT*, TRIM(nombre),",
CASE (2)
PRINT*, TRIM(nombre),",
CASE (3)
PRINT*, TRIM(nombre),",
END SELECT

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

! Definimos el tipo de dato Punto


TYPE Punto
REAL :: x,y
END TYPE

TYPE (Punto) :: centro, p


REAL :: radio, dist

! Leemos datos de entrada

!### puntocir.f90 ###

! Definimos dos variables de tipo Punto

158

4.5. SOLUCIONES

10
11
12
13

14
15

16
17

PRINT*, "Dime las coordenadas del centro del crculo"


READ*, centro
PRINT*, "Dime ahora su radio"
READ*, radio
PRINT*, "Dime las coordenadas del punto"
READ*, p
! Calculamos la distancia del punto al centro del crculo
dist = SQRT((centro%x-p%x)**2+(centro%y-p%y)**2)

25

! Comprobamos si la distancia es menor/mayor/igual que el radio


IF (dist<radio) THEN
PRINT*, "El punto est dentro del crculo"
ELSE IF (dist==radio) THEN
PRINT*, "El punto est en la circunferencia del crculo"
ELSE
PRINT*, "El punto est fuera del crculo"
ENDIF

26

END PROGRAM

18
19
20
21
22
23
24

Vemos cmo se ha usado la declaracin de un nuevo tipo de dato para nombrar a un


nuevo tipo de objetos en el programa (coordenadas 2D). El uso de nuevos tipos de datos
simplifica la escritura de los programas y los hace ms comprensibles, sobre todo si son
grandes. En este programa en lugar de haber definido cuatro variables reales para las
coordenadas del centro y del punto, nicamente hemos definido dos variables del nuevo
tipo de dato Punto.
Ejercicio 9
Como datos de entrada tenemos dos nmeros enteros (m y n). El dato de salida ser un
mensaje en pantalla indicando si m es divisible por n.
Para comprobar si un nmero m es divisible por otro n vamos a comprobar si el resto
de la divisin entera del primero por el segundo es cero. En caso afirmativo podremos
decir que n divide a m. Para el clculo del resto de una divisin entera usaremos la
funcin intrnseca MOD.
Equivalentemente, podemos sustituir la funcin MOD por la expresin m-(m/n)*n. En
este caso, al tratarse de variables enteras, la divisin m/n obtendra el cociente de la
divisin entera (sin decimales).

PROGRAM DivideNum
IMPLICIT NONE

INTEGER :: n, m

!### ndivm.f90 ###

159

4. LA ESTRUCTURA CONDICIONAL

4
5
6

! Preguntamos por los nmeros


PRINT*, "Dime dos nmeros enteros"
READ*, n, m

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

CHARACTER (LEN=10) :: mes

4
5

!### nommes.f90 ###

PRINT*, "Dime el mes:"


READ*, mes

17

! Tenemos que tener cuidado con maysculas y minsculas


SELECT CASE (mes)
CASE ("Enero","Marzo","Mayo","Julio","Agosto","Octubre",&
&"Diciembre")
PRINT*, "Tiene 31 das"
CASE ("Febrero")
PRINT*, "Tiene 28 o 29 das"
CASE ("Abril","Junio","Septiembre","Noviembre")
PRINT*, "Tiene 30 das"
CASE DEFAULT
PRINT*, "No conozco ese mes"
END SELECT

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

!### triangulo.f90 ###

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

! Comprobamos si forman o no un tringulo


IF (LadoMayor<SumaOtros) THEN
PRINT*, "Los puntos s forman un tringulo"
! Comprobamos si es equiltero
IF ((AB==AC) .AND. (AB==BC)) THEN
PRINT*, "El tringulo es equiltero"
ELSE
PRINT*, "El tringulo no es equiltero"
ENDIF
ELSE
PRINT*, "Los puntos no forman un tringulo"
ENDIF

57

END

45
46
47
48
49
50
51
52
53
54
55

161

162

4.5. SOLUCIONES

También podría gustarte