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