C UFES - CENTRO TECNOLÓGICO C DEPARTAMENTO DE

Propaganda
C
C
C
C
C
C
UFES - CENTRO TECNOLÓGICO
DEPARTAMENTO DE INFORMÁTICA
Prof. Thomas W. Rauber
http://www.inf.ufes.br/~thomas
1ª Prova (1ª Prova Substitutiva) de PROCESSAMENTO DE DADOS II
para Engenharia Civil (INF 02628) - 2006/2
C Elabore subprogramas em FORTRAN 77 para:
C 1.(1.0) Calcular a distância Euclidiana entre dois pontos (x1,y1) e (x2,y2)
C
pela formula d = raizquadrada [(x1-x2)^2 + (y1-y2)^2]; Ajuda: Use uma função;
C 2.(1.0) Verificar se um ponto (x,y) faz parte da reta definida pelos
C
pontos (x1,y1) e (x2,y2), isto é,
C
satisfazendo x(y1-y2) + y(x2-x1) + (x1y2 - x2y1) = 0
C 3.(1.0) Calcular a*z, sem usar multiplicação, sendo z um número inteiro
C
(Ajuda: z pode ser negativo)
C 4.(1.0) Calcular a função-monômio axn de x, dado o coeficiente a e o grau n,
C
sendo a um número real e n um número natural.
C 5.(1.0) Inverter o sinal de todos os n elementos de um vetor de números inteiros.
C 6.(1.0) Criar um vetor de n números reais que contém o maior valor da
C
posição correspondente de dois vetores.
C
Exemplo: (2,3,1,2) e (1,4,1,3) --> (2,4,1,3).
C 7.(1.0) Criar um vetor de n valores lógicos que contém o fato que o
C
valor da posição correspondente de um vetor de números inteiros é
C
positivo. Exemplo: (2, -3, 1, 2) --> (TRUE,FALSE,TRUE,TRUE).
C 8.(1.0) Verificar, se uma seqüência de n números inteiros está decrescendo
C 9.(1.0) Verificar, se uma seqüência de n números inteiros está decrescendo
C
até a posição do meio e depois crescendo até a última posição,
C
sendo n impar. Exemplo (3, 2, 1, 4, 7 ) -- > TRUE
C 10.(1.0) Inverter a posição dos elementos de um vetor.
C
Exemplo: (8, 2, 3, 1, 4) --> (4, 1, 3, 2, 8).
C Observações:
C Desenvolva somente funções e sub-rotinas. Não existe um programa principal.
C Nenhum dos subprogramas lê ou exibe dados (não devem aparecer
C
comandos read ou write no seu código)
C Um subprograma deve ser obrigatoriamente uma função se isso for
C
possível e o tipo de subprograma (função ou sub-rotina)
C
não for definido a priori.
C Boa prova!
program pd2ec06p1a
C Autor: Thomas W. Rauber, Dept. de Informática, UFES, Brasil
C
http://www.inf.ufes.br/~thomas
implicit none
real distEuclid, x, y, monomio, multiplicar
logical naReta, descrescendo, descrescendoCrescendo, DC
integer n, i
parameter( n = 5 )
integer seq(n) / 2, -3, 1, -5, 2 / ! Sequência de cinco inteiros
integer seq2(n)
/ 5, 2, 1, 4, 7 /
real vec1(n) / 1.0, 2.0, 3.0, 4.0, 5.0 /
real vec2(n) / 3.0, 5.0, 2.0, 2.0, 1.0 /
real vecmax(n)
logical fatos(n)
write(*,*)
write(*,*) "!!! 1.) !!!"
write(*,*) "Distancia Euclideana entre (1,2) e (3,4) = ",
.
distEuclid(1.0,2.0,3.0,4.0)
write(*,*)
write(*,*) "!!! 2.) !!!"
write(*,*) "Ponto na reta definida por (1,2) e (4,5)?"
x=0
y=0
write(*,*) "(",x,",",y,")=", naReta( x, y, 1., 2., 4., 5. )
x=2
y=3
write(*,*) "(",x,",",y,")=", naReta( x, y, 1., 2., 4., 5. )
write(*,*)
write(*,*) "!!! 3.) !!!"
write(*,*) "3.1 * 4 = ", multiplicar( 3.1, 4 )
write(*,*) "3.1 * 0 = ", multiplicar( 3.1, 0 )
write(*,*) "3.1 * -4 = ", multiplicar( 3.1, -4 )
write(*,*)
write(*,*) "!!! 4.) !!!"
write(*,*) "3.5 * 1.2^4 = ", monomio( 1.2, 3.5, 4 )
write(*,*)
write(*,*) "!!! 5.) !!!"
C Imprimindo vetor, usando 'do' implícito
write(*,*) "Sequencia= ", (seq(i), i=1,n)
call inverter( seq, n )
write(*,*) "Sequencia invertida no sinal= ", (seq(i), i=1,n)
write(*,*)
write(*,*) "!!! 6.) !!!"
write(*,*) " Vetor 1 = ", (vec1(i), i=1,n)
write(*,*) " Vetor 2 = ", (vec2(i), i=1,n)
call maxvetor( vec1, vec2, vecmax, n )
write(*,*) "Vetor dos maiores = ", (vecmax(i), i=1,n)
write(*,*)
write(*,*) "!!! 7.) !!!"
write(*,*) "Sequencia= ", (seq(i), i=1,n)
call verificaPositivo( seq, fatos, n )
write(*,*) "Elementos positivos?= ", (fatos(i), i=1,n)
write(*,*)
write(*,*) "!!! 8.) !!!"
write(*,*) "Sequencia= ", (seq(i), i=1,n)
DC = descrescendo(seq,n)
write(*,*) "Descrescendo= ", DC
do i=1,n
seq(i) = n-i
end do
write(*,*) "Sequencia= ", (seq(i), i=1,n)
DC = descrescendo(seq,n)
write(*,*) "Descrescendo= ", DC
write(*,*)
write(*,*) "!!! 9.) !!!"
write(*,*) "Sequencia= ", (seq(i), i=1,n)
DC = descrescendoCrescendo(seq,n)
write(*,*) "Descrescendo e Crescendo= ", DC
write(*,*) "Sequencia= ", (seq2(i), i=1,n)
DC = descrescendoCrescendo(seq2,n)
write(*,*) "Descrescendo e Crescendo= ", DC
write(*,*)
write(*,*) "!!! 10.) !!!"
write(*,*) "Sequencia= ", (seq(i), i=1,n)
call inverterPos( seq, n )
write(*,*) "Sequencia invertida na posicao= ", (seq(i), i=1,n)
end program pd2ec06p1a
C===== 1. ===========================================================
real function distEuclid( x1, y1, x2, y2 )
C Determinar a distância Euclidiana entre dois pontos
implicit none
real x1, y1, x2, y2
distEuclid = sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) )
return
end
C===== 2. ===========================================================
logical function naReta( x, y, x1, y1, x2, y2 )
C Verificar se um ponto (x,y) faz parte de uma reta
implicit none
real x, y, x1, y1, x2, y2
naReta = x * (y1-y2) + y * (x2-x1) + (x1*y2 - x2*y1) .eq. 0
return
end
C===== 3. ===========================================================
real function multiplicar( x, z )
C multiplicar sem usar operador *
implicit none
real x
integer z, i
if( z .eq. 0 ) then
multiplicar = 0
return
endif
multiplicar = x
do i=2, abs(z)
multiplicar = multiplicar + x
end do
if( z .lt. 0 ) multiplicar = -multiplicar
return
end
C===== 4. ===========================================================
real function monomio( x, a, n )
C monômio, sem usar potenciação
implicit none
real x, a, xn
integer n, i
xn = x
do i=2, n
xn = xn * x
end do
monomio = a * xn
return
end
C===== 5. ===========================================================
subroutine inverter( v, n )
C Inverter o sinal de todos os n elementos de um vetor de números inteiros.
implicit none
integer n, v(n), i
do i = 1, n
v(i) = -v(i)
end do
return
end
C===== 6. ===========================================================
subroutine maxvetor( v1, v2, vmax, n )
C calcular um vetor de n números que em cada elemento contém
C o maior dos elementos de dois vetores na mesma posição
C
implicit none
integer n, i
real v1(n), v2(n), vmax(n)
do i = 1, n
if( v1(i) .ge. v2(i) ) then
vmax(i) = v1(i)
else
vmax(i) = v2(i)
endif
end do
return
end
C===== 7. ===========================================================
subroutine verificaPositivo( v, fatos, n )
C Criar um vetor de n valores lógicos que contém o fato que o
C valor da posição correspondente de um vetor de números inteiros é
C positivo. Exemplo: (2, -3, 1, 2) --> (TRUE,FALSE,TRUE,TRUE).
implicit none
integer n, v(n), i
logical fatos(n)
do i = 1, n
fatos(i) = v(i) .gt. 0
end do
return
end
C===== 8. ===========================================================
logical function descrescendo( v, n )
C Verificar, se uma seqüência de n números inteiros é decrescendo
implicit none
integer n, v(n), i
descrescendo = .true.
i=1
do while( descrescendo .and. i .lt. n )
descrescendo = v(i) .ge. v(i+1)
i=i+1
end do
return
end
C===== 9. ===========================================================
logical function descrescendoCrescendo( v, n )
C Verificar, se uma seqüência de n números inteiros é decrescendo e
C depois crescendo
implicit none
integer n, v(n), i
descrescendoCrescendo = .true.
i=1
do while( descrescendoCrescendo .and. i .le. n/2 )
descrescendoCrescendo = v(i) .ge. v(i+1)
i=i+1
end do
do while( descrescendoCrescendo .and. i .lt. n )
descrescendoCrescendo = v(i) .le. v(i+1)
i=i+1
end do
return
end
C===== 10. ===========================================================
subroutine inverterPos( v, n )
C Inverter a posição dos elementos de um vetor
implicit none
integer n, v(n), i, tmp
do i = 1, n/2
tmp = v(i)
v(i) = v(n-i+1)
v(n-i+1) = tmp
end do
return
end
Download