CLASE 11
Computación 2018– FCAG-UNLP – Paula Benaglia
Bloque IFMás decisiones: con la sentencia ELSEIF
…....
if (<expr. lógica 1>) then
-----
elseif (<expr. lógica 2>) then
------
------
else
------
endif
….....
elseif (<expr. lógica 3>) then
Ejemplos: a) Sea un programa para llevar registro de movimientos bancarios. Se registra cuántas transacciones produjeron un crédito (variable credit), y cuántas un débito (variable debito). Se guarda la información por producto (crédito o débito) en una variable transc. Si se acreditó saldo, entonces transc ≥ 0. Si se debitó, entonces transc < 0.
….. if (transc .ge. 0.0) then credit = credit + 1 else debito = debito + 1endif…..
0 transc
Ejemplos. a)
….. if (transc .ge. 0.0) then credit = credit + 1 else debito = debito + 1endif…..
0 transc
debi
tos
cred
itos
Sea un programa para llevar registro de movimientos bancarios. Se registra cuántas transacciones produjeron un crédito (variable credit), y cuántas un débito (variable debito). Se guarda la información por producto (crédito o débito) en una variable transc. Si se acreditó saldo, entonces transc ≥ 0. Si se debitó, entonces transc < 0.
)
b) Sea un programa para etiquetar el rango etario del usuario:
program edades integer edad write (*,*) ‘ Por favor ingrese su edad:’ read (*,*) edad if (edad .le. 10) then write(*,*) ‘Ud está en la niñez’ else if (edad .gt. 10 .and. edad .lt. 50) then write(*,*) ‘Ud está en tramo complicado’ else write(*,*) ‘Ud debería tener elementos para disfrutar de la vida’endifend
(0 10 50
c1) Literal, canónico:
Literal, sin else: (¿por qué?)c2)
if (x .gt. 0.) then write(*,*) ‘x es positivo’ y = sqrt(x) else if (x .lt. 0.) then write(*,*) ‘x es negativo’ y = sqrt(-x) else if (x .eq. 0.) write(*,*) ‘x es cero’ y = 0.endifwrite(*,*) y
Literal, con bloque if dentro de bloque if:c3)
if (x .gt. 0.) then if (x .ge. y) then write(*,*) ‘x es positivo, x >= y’ else write(*,*) ‘x es positivo pero x < y’ endif else if (x .lt. 0.) then write(*,*) ‘x es negativo’else write(*,*) ‘x es cero’endif
?
d) Programa clasificador de raíces de la ecuación de 2do grado (ax2 + bx +c =0)
if (a .ne. 0.) then disc = b**2 – 4 * a * c if (disc .gt. 0.0) then write(*,*) ‘ Las raices son reales y distintas’ else if (disc .lt. 0.) then write(*,*) ‘ Las raices son complejos conjugados’ else write(*,*) ‘Las raices son reales e identicas’ endif else write(*,*) ‘ La ecuacion no es cuadratica’ endif
Supongamos que a, b, y c tienen valores asignados.
e) Sobre años bisiestosSi se quiere testear si un año ingresado es bisiesto o no:
integer anio.....if (mod(anio, 400) .eq. 0) then write(*,*) anio, ‘ es un año bisiesto’else if (mod(anio, 100) .eq. 0) then write(*,*) anio, ‘ no es un año bisiesto’else if (mod(anio, 4) .eq. 0) then write(*,*) anio, ‘ es un año bisiesto’else write(*,*) anio, ‘ no es un año bisiesto’endif.....
Funcion intrínseca mod(argumento1, argumento2) da el resto de dividir: argumento1 / argumento2
[años bisiestos: divisibles por 4, menos los divisibles por 100 (excepto los divisibles por 400)]
f) Cálculo de días de mes
if (mes .eq. ‘ABRIL’ . or. mes .eq. ‘JUNIO’ .or. mes .eq. ‘SEPTIEMBRE’ .or. mes .eq. ‘NOVIEMBRE’) then ndias = 30 elseif (mes. eq. ‘FEBRERO’) then ndias = 28else ndias = 31endif
*
f) Cálculo de días de mes
if (mes .eq. ‘ABRIL’ .or. mes .eq. ‘JUNIO’ .or. mes .eq. ‘SEPTIEMBRE’ .or. mes .eq. ‘NOVIEMBRE’) then ndias = 30 elseif (mes. eq. ‘FEBRERO’) then ndias = 28endif
*
ndias = 31
Más ejemplos• Calcular el número de día del año, dependiendo del mes
y día-del-mes que se ingrese.
Sentencia go to (en desuso)• Supongamos querer construir un programa y que corra
tantas veces como se quiera, sin volver a llamarlo
character preg
preg = ‘S’
10 if (preg.eq.’S’) then
….
write(*,*)’ Continúa? (S o N): ‘
read(*,*) preg
goto 10
else
stop ‘ Programa terminado –’
endif
end
Sentencia goto (en desuso)• Supongamos querer construir un programa y que corra
tantas veces como se quiera, sin volver a llamarlo
character preg
preg = ‘S’
10 if (preg.eq.’S’) then
….
write(*,*)’ Continúa? (S o N): ‘
read(*,*) preg
goto 10
else
stop ‘ Programa terminado –’
endif
end
IF aritmético (en desuso)
Forma general:
if (<expresión aritmética EA>) n1, n2, n3
n1: etiqueta de sentencia a la que va el programa si EA < 0
n2: etiqueta de sentencia a la que va el programa si EA = 0
n3: etiqueta de sentencia a la que va el programa si EA > 0
IF aritmético (en desuso)discri = b**2 – 4 * a * c
if (discri) 50, 60, 70
[ sentencias de cálculo de raíces complejas]
[ sentencias de cálculo de raíz real doble ]
[ sentencias de cálculo de raíces reales ]
write (*,*) < resultados >
50
60
70
go to 1000
go to 1000
1000
Con matrices
Escribir un código para realizar operaciones con matrices (suma, multiplicación por un escalar, trasposición y producto) de acuerdo a opción ingresada por el usuario.
Sean A(n x m), B(n x m), C(m x l) y k
• Suma: A + B = D; dij = aij + bij
• Multiplicación por escalar: k . A = kA; kaij = k . aij
• Trasposición: At = AT; atij = aji
• Producto: A . C = E; eij = ??
(obtener el elemento genérico cij = …. )
program matrop
parameter (n=5, m=4, l=6)
real A(n,m), B(n,m), C(m,l) , … , ...
write(*,*) ‘ Programa para realizar operaciones con matrices’
write(*,*) ‘ 0 : Terminar’
write(*,*) ’ 1 : Suma de dos matrices’
write(*,*) ’ 2 : Trasposición’
write(*,*) ’ 3 : Multiplicación de matriz por escalar’
write(*,*) ‘ 4 : Producto de dos matrices’
iopcion=0
dowhile (iopcion.ge.0.and.iopcion.le.4)
write(*,*) ‘ Ingrese opcion (0 a 4)’
read(*,*) iopcion
If (iopcion.eq.1) then
[ Lectura de elementos de A y B ]
do i= 1, n
do j= 1, m
d(i,j) = a(i,j) + b(i,j)
enddo
enddo
elseif (iopcion.eq.2) then
[ Lectura de elementos de A ]
do i= 1, n
do j=1, m
ta (j,i) = a (i,j)
enddo
enddo
elseif (iopcion.eq.3) then
[ Lectura de A y k ]
….... ka(i,j) = k * a(i,j)
elseif(iopcion.eq.4) then
[ Lectura de elementos de A y C ]
do i= 1, n
do k= 1, l
e(i,k) = 0.
do j = 1, m
e(i,k) = e(i,k) + a(i,j) * c(j,k)
enddo
enddo
enddo
else
stop ‘ Programa terminado –’
endif
enddo
write(*,*) ‘ Opción inválida.’
end
FIN CLASE 11