Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1.- INTRODUCCIN:
Hasta ahora, todas las sentencias que forman los programas se ejecutan. Sin embargo, hay ocasiones en que un
determinado conjunto de sentencias se deben ejecutar slo si una determinada condicin es cierta y sino no. Los valores
lgicos: constantes, variables y expresiones lgicas, permiten controlar la ejecucin de las sentencias de un programa.
Hay dos tipos de expresiones lgicas: las expresiones lgicas relacionales y las expresiones lgicas condicionales.
2.- EXPRESIONES LGICAS RELACIONALES:
Las expresiones lgicas relacionales comparan los valores de dos expresiones aritmticas o dos expresiones de tipo
carcter.
La evaluacin de una expresin lgica relacional produce un resultado de tipo lgico: .TRUE. o .FALSE.
La sintaxis de una expresin lgica de tipo relacional es: operando1 OPERADOR_LGICO_RELACIONAL operando2
Donde operando es una expresin, variable o constante aritmtica o de tipo carcter.
El OPERADOR_LGICO_RELACIONAL puede ser:
OPERADOR LGICO RELACIONAL
F77
F90/95 SIGNIFICADO
.EQ.
.NE.
.LT.
.LE.
.GT.
.GE.
==
/=
<
<=
>
>=
IGUAL
DISTINTO
MENOR QUE
MENOR O IGUAL QUE
MAYOR QUE
MAYOR O IGUAL QUE
OPERACIN
RESULTADO
3<=i
.TRUE.
j**2-1>=0
.TRUE.
I == j
.FALSE.
I /=10
.TRUE.
ANA<PEPE
.TRUE.
La ltima expresin lgica relacional ANA< PEPE es cierta porque los caracteres se evalan en orden alfabtico.
Son invlidas las siguientes expresiones lgicas relacionales:
<=5
Falta operando1 al lado izquierdo.
8.44/='XYZ'
No se pueden comparar reales con caracteres.
i=3
No es una expresin lgica relacional, sino una sentencia de asignacin! No confundir el operador
lgico relacional de
igualdad con el operador de asignacin.
4.-EXPRESIONES LGICAS COMBINACIONALES
La evaluacin de una expresin lgica combinacional produce un resultado de tipo lgico: .TRUE. o .FALSE.
La sintaxis de una expresin lgica de tipo combinacional es: operando1 OPERADOR_LGICO_COMBINACIONAL
operando2
operando es una expresin relacional, variable lgica o constante lgica. Operando1 no existe cuando el operador lgico
usado es unario.
EL OPERADOR_LGICO_COMBINACIONAL puede ser:
OPERADOR
TIPO
SIGNIFICADO
.NOT.
.AND.
.OR.
.EQV.
SON .FALSE.
.NEQV.
UNARIO
BINARIO
BINARIO
BINARIO
ES
ES
ES
ES
LO OPUESTO A OPERANDO2
.TRUE. SI Y SLO SI OPERANDO1 Y OPERANDO2 SON .TRUE.
.TRUE. SI UNO DE LOS DOS OPERANDOS O LOS DOS ES .TRUE.
.TRUE. SI Y SLO SI LOS DOS OPERANDOS SON .TRUE. O LOS DOS OPERANDOS
BINARIO
Sean operando1 y operando2 A y B, respectivamente, la tabla de verdad de los operadores lgicos combinacionales es:
A
.NOT.B
.TRUE.
.FALSE.
.TRUE.
.FALSE.
.FALSE.
.TRUE.
.FALSE.
.TRUE.
A.AND.B
A.OR.B
A.EQV.B
A.NEQV.B
.TRUE.
.TRUE.
.FALSE.
.FALSE.
.TRUE.
.FALSE.
.FALSE.
.FALSE.
.TRUE.
.TRUE.
.TRUE.
.FALSE.
.TRUE.
.FALSE.
.FALSE.
.TRUE.
.FALSE.
.TRUE.
.TRUE.
.FALSE.
[CASE DEFAULT
bloque de sentencias n]
END SELECT
El bloque SELECT CASE ejecuta un bloque determinado de sentencias cuando el valor de la expresin caso
coincide o pertenece al rango dado de su correspondiente selector de caso.
Opcionalmente puede existir un CASE DEFAULT en un bloque SELECT CASE. El bloque de sentencias de este
caso por defecto se ejecuta cuando el valor de la expresin caso no coincide con ningn selector de caso.
expresin caso es una expresin entera, lgica o de caracteres.
Selector de caso es una lista de uno o ms valores posibles del mismo tipo que la expresin caso. Cada selector
de caso debe ser mutuamente excluyente. Los valores pueden escribirse como:
valor
valormin : valormax
: valormax
valormin:
una combinacin de las formas anteriores separadas por comas.
Es recomendable poner nombre a un bloque SELECT CASE largo y complicado. Por un lado, el programador
estructura mejor los programas y, por otro, el compilador encuentra errores en su cdigo de forma ms
precisa.
EJEMPLOS:
1.- Consideremos, como ejemplo de una estructura de seleccin, el diseo e implementacin de un algoritmo para
calcular las races de una ecuacin cuadrtica ax 2+ bx +c = 0; cuya solucin esta dado por:
x(1,2)=
b b 24 ac
2a
Solucion:
La naturaleza de estas races depender del signo del discriminante D=b 2-4ac, lo cual nos lleva a implementar una
estructura de seleccin: si D > 0 las races sern nmeros reales, de lo contrario sern nmeros complejos conjugados
uno del otro. Por otra parte, al ingresar los coeficientes, deberamos asegurarnos que el coeficiente a no es nulo, pues,
de lo contario la frmula conducira a una divisin por cero. Nuevamente, una estructura de decisin permite verificar
esto. El pseudocdigo de nuestro algoritmo y el programa en Fortran es el siguiente .
PROGRAM ecuadratica
Leer a; b; c
! --------------------------------------------------Si a = 0 entonces
! Se calculan las races de la ecuacin cuadrtica
Escribir La ecuacin no es cuadrtica.
ax**2+bx+c=0
Salir.
! --------------------------------- Declaracin de tipos
fin_si.
IMPLICIT NONE
Calcular D = b2 - 4ac.
REAL :: a,b,c ! coeficientes de la ecuacin
REAL :: discr ! discriminante de la ecuacin
Si D >= 0 entonces
REAL :: x1,x2 ! variables para soluciones
Calcular x1 = (-b+raiz(D))/2a
REAL :: term,den
Calcular x2 = (-b-raiz(D))/2a
! -------------------------------------------------! Entrada de
sino
datos
Calcular x1 = (-b+ i raiz(D))/2a
PRINT*,"Ingrese coeficientes a,b,c"
Calcular x2 = x1
READ*,a,b,c
IF( a == 0 ) THEN
fin_si.
PRINT*,"La ecuacin no tiene trmino cuadrtico"
Imprimir x1 y x2.
STOP
ENDIF
! ----------------- Bloque de procesamiento y salida
! ------------------discr = b**2 - 4.0*a*c
den = 2.0*a
term = SQRT(ABS(discr))
IF (discr >= 0 ) THEN
x1 = (-b+term)/den
x2 = (-b-term)/den
PRINT*,"x1 = ", x1
PRINT*,"x2 = ", x2
ELSE
x1 = -b/den
x2 = term/den
!Caso raices complejas
PRINT*,"x1 = (", x1, " ,", x2, ")"
PRINT*,"x1 = (", x1, " ,", -x2, ")"
ENDIF
!------------------------------ Terminar
STOP
END PROGRAM ecuadratica
termino
2.-Se tiene el siguiente programa, diga Ud. a que puede atribuirse el resultado que se obtiene?
PROGRAM test_igualdad
IMPLICIT NONE
1/2 es igual a 0.5
real :: a
1/10 es distinto a 0.1
a = 2.0
Press
any
key
to
IF (1.0/a == 0.5) THEN
continue
PRINT*,"1/2 es igual a 0.5"
ELSE
PRINT*,"1/2 es distinto a 0.5"
ENDIF
a = 10.0
IF (1.0/a == 0.1) THEN
PRINT*,"1/10 es igual a 0.1"
ELSE
PRINT*,"1/10 es distinto a 0.1"
ENDIF
STOP
END PROGRAM test_igualdad
3.- Determinar si un nmero entero entre 1 y 10 es par o impar y visualizar un mensaje adecuado en consecuencia.
PROGRAM USO_SELECT
INTEGER :: valor
PRINT*,"INGRESE UN VALOR ENTERO ENTRE 1 A 10"
READ*,Valor
SELECT CASE (valor)
CASE (1, 3, 5, 7, 9)
PRINT*,"el valor es impar"
CASE (2, 4, 6, 8, 10)
PRINT*,"el valor es par"
CASE (11:)
PRINT*,"el valor es demasiado grande"
CASE DEFAULT
PRINT*,"el valor es negativo o cero"
END SELECT
END PROGRAM USO_SELECT
PROGRAM IF_ANIDADO
REAL :: nota
PRINT*,"INGRESE UNA NOTA"
READ*,nota
IF (nota < 0 .OR. nota > 10) THEN
PRINT*,"NOTA INCORRECTA"
ELSE IF (nota < 5) THEN
PRINT*,"SUSPENSO"
ELSE IF (nota < 7) THEN
PRINT*,"APROBADO"
ELSE IF (nota < 9) THEN
PRINT*,"NOTABLE"
ELSE IF (nota < 10) THEN
PRINT*,"SOBRESALIENTE"
ELSE
PRINT*,"MATRICULA DE HONOR"
END IF
0 Nota <
5 Nota <
7 Nota <
9 Nota <
Nota = 10
5
7
9
10
Suspenso
Aprobado
Notable
Sobresaliente
Matricula de Honor
PROBLEMAS PROPUESTOS
10.- Un examen se considera desaprobado si la nota obtenida es menor que 4 y aprobado en caso contrario. Si la nota
est entre 7 y 9 (inclusive) el examen se considera destacado, y entre 9 y 10 (inclusive) sobresaliente. Implementar un
programa para indicar el estatus de un examen en base a su nota .
ESTRUCTURAS DE REPETICIN
La estructura de control iterativa permite la repeticin de una serie determinada de instrucciones. Este conjunto de
instrucciones a repetir se denomina bucle (loop, en ingls) y cada repeticin del mismo se denomina iteracin. Podemos
diferenciar dos tipos de bucles:
Bucles donde el nmero de iteraciones es desconocido de antemano. En este caso el bucle se repite mientras se
cumple una determinada condicin (bucles condicionales).
Para estos dos tipos de bucles disponemos de sendas formas bsicas de la estructura de control iterativa.
Comencemos con un bucle cuyo nmero de iteraciones es conocido a priori. La estructura iterativa, en tal caso, puede
expresarse en pseudocdigo como sigue.
Desde ndice = valor inicial hasta valor final hacer
Instrucciones del bucle
fin_desde
El ndice es una variable entera que, actuando como un contador, permite controlar el nmero de ejecuciones
del ciclo.
Los valor inicial y valor final son valores enteros que indican los lmites entre los que vara ndice al comienzo y
final del bucle.
Est implcito que en cada iteracin la variable ndice toma el siguiente valor, incrementndose en una unidad.
En seguida veremos que en Fortran se puede considerar incrementos mayores que la unidad e incluso
negativos.
El nmero de iteraciones del bucle es N = valor final - valor inicial +1.
Dentro de las instrucciones del bucle no es legal modificar la variable ndice. Asimismo, al terminar todas las
iteraciones el valor de la variable no tiene porque tener un valor definido, por lo tanto, la utilidad de la variable
ndice se limita a la estructura de iteracin.
ndice es una variable entera que se usa como contador del bucle.
Inicio, fin y paso son cantidades enteras y constituyen los parmetros del ndice del bucle. Controlan los valores
de la variable ndice durante la ejecucin. Pueden ser constantes, variables o expresiones enteras.
Las sentencias entre la sentencia DO y la sentencia END DO se llaman cuerpo del bucle. Para mejorar la lectura
del cdigo es recomendable endentar el cuerpo del bucle con dos o ms espacios.
Inicio marca el valor inicial que toma ndice cuando comienza la ejecucin del bucle DO.
Fin marca el valor final que puede tomar ndice.
Paso indica el incremento con que ndice es modificado despus de cada ejecucin del bucle DO. Es un
parmetro opcional, cuando no aparece, su valor por defecto es 1. Puede ser positivo o negativo.
Cuando se ejecuta una sentencia DO, tienen lugar la secuencia de operaciones siguiente:
Si los parmetros del ndice del bucle son expresiones enteras se calculan sus valores antes del comienzo de la
ejecucin del bucle.
Se asigna el valor inicio a la variable de control ndice. Si la condicin ndice * paso fin * paso, el programa
ejecuta las sentencias del cuerpo del bucle.
Despus, se recalcula el valor de ndice como: ndice = ndice + paso. Si an se cumple la condicin anterior
ndice * paso fin * paso, el programa ejecuta otra vez las sentencias del cuerpo del bucle.
Se repite el punto anterior hasta que deja de cumplirse la condicin de desigualdad dada, en cuyo caso la
ejecucin salta a la primera sentencia siguiente a la sentencia END DO.
El nmero de iteraciones que se llevan a cabo en el bucle DO se puede calcular a partir de la siguiente
ecuacin:
N ITERACIONES = (FIN INICIO + PASO) / PASO
Precauciones:
No est permitido modificar el valor de ndice en el cuerpo del bucle. La mayora de los compiladores Fortran
suelen reconocer este problema y generan un error en tiempo de compilacin si se intenta modificar su valor.
Caso de que el compilador no detectara este problema, se podra dar el caso de un bucle infinito.
La nica manera de parar la ejecucin de un programa cuando ste contiene un bucle infinito es matar el
programa pulsando control CTRL+C.
En muchos computadores, el valor de ndice despus de la finalizacin normal del bucle DO, est definido por el
siguiente valor asignado como resultado del incremento. Esto es lo que ocurre en el compilador de la Salford
FTN95. Sin embargo, su valor es indefinido oficialmente en el Fortran estndar, de modo que algunos
compiladores pueden producir resultados diferentes. Por lo tanto, no conviene nunca usar el valor del ndice de
un bucle en las siguientes sentencias del programa Fortran.
Si paso toma el valor 0 se puede dar un bucle infinito.
Puede ocurrir que el cuerpo de un bucle no se ejecute nunca, si inicio * paso > fin * paso.
Ejemplos
Ejemplo 1:
PROGRAM DO_1
INTEGER I
DO I = 1,10,1
PRINT*,2*I
END DO
PRINT*,I
END PROGRAM DO_1
Ejemplo 2:
PROGRAM DO_2
INTEGER I,J
PRINT*,"INGRESE VALOR DE I,J"
READ*,I,J
DO L = I,J,1
PRINT*,2*L
END DO
END PROGRAM DO_2
Ejemplo 3:
PROGRAM DO_3
INTEGER I,J,K
PRINT*,"INGRESE VALOR DE I,J,K"
READ*,I,J,K
DO L = I,J,K
PRINT*,L
END DO
END PROGRAM DO_3
2
4
6
8
10
12
14
16
18
20
11
Press any key to continue
INGRESE VALOR DE I,J
1 6
2
4
6
8
10
12
Press any key to continue
de prueba debe cambiar, de otra manera, nosotros se estar inmerso en un bucle infinito El formato de la declaracin
DO WHILE es:
DO WHILE <Condicin es Verdadera>
[Bloque de instrucciones]
END DO
Cuando se ingresa al bucle primero, la prueba se realiza para lo cual los resultados permitidos nicos son verdaderos o falsos. Si la
condicin es verdadera, el bloque de instrucciones es ejecutado. Pero si la condicin de prueba es falsa, el bucle termina y realiza un salto
la operacin despus del fin del bucle
Ejemplo1
Una demostracin de como trabaja la declaracin WHILE DO, se presume que nosotros deseamos calcular el promedio de peso de los
conejos en un laboratorio. Donde los conejos se multiplican tan rpidamente, nosotros nunca sabemos por adelantado cuntos habr.
Nosotros establecemos el bucle para leer los pesos, de uno en uno, hasta que uno de los pesos sea mayor de 500 gramos. Cuando esto
ocurre, el bucle parar. Nosotros a veces llamamos este valor especial como Valor Centinela. El bucle se establece para que nosotros
miremos a este valor como clave,
PROGRAM USO_DO_WHILE
!Nosotros usaremos 500 como centinela
! Valor de control del loop
TOT = 0.0
NUM = 0
PESO =0.0
DO WHILE (PESO<=500.0)
PRINT*,"Ingrese peso"
READ*, PESO
TOT = TOT+PESO
NUM = NUM+1
END DO
PROME=(TOT-PESO)/(NUM-1)
PRINT*, "Promedio de Pesost=",PROME
END PROGRAM USO_DO_WHILE
Ingrese peso
100
Ingrese peso
200
Ingrese peso
300
Ingrese peso
400
Ingrese peso
500
Ingrese peso
600
Promedio de Pesos= 300.000000
Press any key to continue
Ingrese peso
200
Ingrese peso
100
Ingrese peso
300
Ingrese peso
-100
Error en ingreso de dato, ingrese nuevo valor
Ingrese peso
400
Ingrese peso
600
Promedio de Pesos= 250.000000
Press any key to continue
END DO
PROME=TOT/NUM
PRINT*, "Promedio de Pesos=",PROME
END PROGRAM USO_DO_EXIT_CYCLE
PROBLEMAS RESUELTOS
1.- Elaborar un programa que lea 5 nmeros reales y obtenga el promedio.
PROGRAM Media
IMPLICIT NONE
! Clculo de la media de 5 valores ledos por teclado
Ingrese 5 numeros reales
! Declaracin de variables
NUMERO
1
REAL :: v, tot, med
12.5
INTEGER::I
NUMERO
2
tot = 0
! Leemos 5 datos por teclado y los vamos acumulando en la variable tot 10.2
NUMERO
3
PRINT*, "Ingrese 5 numeros reales"
20.3
DO I=1,5
NUMERO
4
PRINT*,"NUMERO ",I
11.4
READ*, v
NUMERO
5
tot = tot + v
9.5
END DO
La media es 12.78000
! Calculamos e imprimimos la media de los 5 datos
Press any key to continue
med = tot / 5.0
PRINT*, "La media es ",med
END PROGRAM Media
2.- Modifique el programa anterior de tal forma que el programa lea N
reales ingresados
PROGRAM PROMEDIO_N_NUMEROS
IMPLICIT NONE
! Clculo de la media de N valores ledos por teclado
! Declaracin de variables
REAL :: v, tot, med
INTEGER :: I,N
PRINT*, "Cuantos numeros vamos a ingresar"
READ*, N
tot = 0
! Leemos N datos por teclado y los vamos acumulando en la variable tot
PRINT*,"Dame ",N," numeros reales"
DO I=1,N
PRINT*,"NUMERO ",I
READ*, v
tot = tot + v
END DO
! Calculamos e imprimimos la media de los N datos
med = tot / N
PRINT*, "La media es ",med
END PROGRAM PROMEDIO_N_NUMEROS
3.-Elabore um programa donde visualice La tabla de multiplicar del nmero ingresado por teclado
PROGRAM TablaMultiplicar
IMPLICIT NONE
Ingrese el numero de la tabla a
! Calcular la tabla de multiplicar de un nmero
multiplicar
INTEGER :: n,i
5
PRINT*, "Ingrese el numero de la tabla a multiplicar"
5 x
1 =
5
READ*, n
5 x
2 =
10
DO i=1,12
5 x
3 =
15
PRINT*, n," x ",i," = ",n*i
5 x
4 =
20
END DO
5 x
5 =
25
END PROGRAM TablaMultiplicar
5 x
6 =
30
5 x
7 =
35
5 x
8 =
40
5 x
9 =
45
5 x
10 =
50
5 x
11 =
55
5 x
12 =
60
Press any key to continue
4.-El siguiente programa es un ejemplo de bucle anidad, es decir existe dos ciclos de repeticin uno dentro de otro, al
ejecutar nos mostrara un resultado.
PROGRAM Salida
IMPLICIT NONE
! Declaracin de variables
El valor de N es
32
INTEGER :: N, i, k
Press any key to continue
N=0
!Bucle anidado, por cada repeticion de i, el valor de k se ejecuta completamente
DO i=1,2,1
DO k=1,4
N=N+i+k
END DO
END DO
PRINT*, "El valor de N es ",N
END PROGRAM Salida
5.- Programa que muestra las salida para cada bucle de repeticin, analice la variable de control o ndice de repeticin
c1, c2, c3 y c4
PROGRAM Iteraciones
IMPLICIT NONE
c1
30
c3
INTEGER :: c1, c2, c3, c4
c1
1
28
c3
! Bucle 1
c1
2
DO c1=30, 1, -2
26
c3
PRINT*,c1 ,c1
c1
3
END DO
24
c3
print*
c1
4
! Bucle 2
22
c3
DO c2=30, 1, 2
c1
5
20
c3
PRINT*,c2 ,c2
c1
6
END DO
18
c3
print*
c1
7
! Bucle 3
16
c3
DO c3=1, 30
c1
8
PRINT*,c3 ,c3
c3
END DO
9
c3
print*
10
! Bucle 4
c3
DO c4=30, 1
11
PRINT*,c4 ,c4
c3
END DO
12
print*
c3
13
PRINT*,"c1= ",c1," c2=",c2," c3=",c3," c4=",c4
c1=
0 c2=
30 c3=
31
c3
END PROGRAM Iteraciones
c4=
30
14
c3
15
c3
7.program prob7
1
integer::I
3
I=1
5
do while(I<=9)
7
print *,I
9
I=I+2
hasta luego
end do
print*,"hasta luego" Press any key to continue
end program prob7
8.Program prob8
integer::suma, suma2, x
do
if(x==-1) exit
print*,"ingrese un numero o -1 para
terminar"
read*,x
suma=suma+x
end do
suma2=suma+1
print*,"la suma es", suma2
end program prob8
11
55
PROBLEMAS PROPUESTOS
1.- Elaborar un programa que sume todos los nmeros naturales desde el 1 hasta el 150, ambos incluidos.
2.- Sumar todos los nmeros naturales pares desde el 20 hasta el 200, ambos incluidos.
3.- Calcular el valor de aplicando la frmula: = 4* ( 1 1 / 3 +1 / 5 1/7) incluyendo hasta el trmino 1 / 99.
4.-Programa que pida la estatura (en metros) y sexo (V/M) de un nmero indeterminado de personas (mientras el
operador quiera).
Posteriormente escribir la estatura media de los varones y la estatura media de las mujeres.
10