Difference between revisions of "Processamento de Dados (UFBA 2008.2): Correção da Prova II"
From AdonaiMedrado.Pro.Br
(New page: A prova está disponível para download no seguinte endereço: http://www.adonaimedrado.pro.br/wiki/documentos/professor/UFBA_2008_2_MATA045_PD_PROVA_2.pdf. Esta correção apresenta ape...) |
(→Questão 2) |
||
Line 16: | Line 16: | ||
== Questão 2 == | == Questão 2 == | ||
<code lang="fortran"> | <code lang="fortran"> | ||
+ | PROGRAM prova | ||
+ | IMPLICIT NONE | ||
+ | INTEGER :: i,n,Erro,Maior,SegundoMaior | ||
+ | INTEGER, DIMENSION(:),ALLOCATABLE :: a | ||
+ | |||
+ | WRITE (*,*) "Quantos números deseja digitar?" | ||
+ | DO | ||
+ | READ(*,*,IOstat=Erro) n | ||
+ | IF (Erro > 0) THEN | ||
+ | WRITE (*,*) "Número inválido. Digite novamente." | ||
+ | ELSE | ||
+ | EXIT | ||
+ | END IF | ||
+ | END DO | ||
+ | ALLOCATE(a(1:n)) | ||
+ | |||
+ | WRITE (*,*) "Digite uma sequencia de ",n," inteiros." | ||
+ | |||
+ | i = 1 | ||
+ | DO | ||
+ | READ(*,*,IOstat=Erro) a(i) | ||
+ | |||
+ | IF (Erro /= 0) THEN | ||
+ | WRITE (*,*) "Número inválido. Digite novamente." | ||
+ | ELSEIF (Erro == 0) THEN | ||
+ | i = i + 1 | ||
+ | IF (i>n) THEN | ||
+ | EXIT | ||
+ | END IF | ||
+ | END IF | ||
+ | END DO | ||
+ | |||
+ | OPEN (UNIT=10,FILE="saida.txt") | ||
+ | WRITE (*,*) RetornarSegundoMaior(a) | ||
+ | CLOSE(10) | ||
+ | CONTAINS | ||
+ | INTEGER FUNCTION RetornarSegundoMaior(V) | ||
+ | IMPLICIT NONE | ||
+ | INTEGER, DIMENSION(:), INTENT(IN) :: V | ||
+ | LOGICAL :: MaiorAtribuido = .FALSE., SegundoMaiorAtribuido = .FALSE. | ||
+ | INTEGER :: Maior,SegundoMaior | ||
+ | |||
+ | MaiorAtribuido = .FALSE. | ||
+ | SegundoMaiorAtribuido = .FALSE. | ||
+ | DO i = 1, SIZE(V) | ||
+ | IF (V(i)>Maior .OR. .NOT. MaiorAtribuido) THEN | ||
+ | Maior = V(i) | ||
+ | MaiorAtribuido = .TRUE. | ||
+ | END IF | ||
+ | END DO | ||
+ | |||
+ | DO i = 1, SIZE(V) | ||
+ | IF (V(i) /= Maior .AND. (V(i)>SegundoMaior .OR. .NOT. SegundoMaiorAtribuido)) THEN | ||
+ | SegundoMaior = V(i) | ||
+ | SegundoMaiorAtribuido = .TRUE. | ||
+ | END IF | ||
+ | END DO | ||
+ | |||
+ | IF (SegundoMaiorAtribuido) THEN | ||
+ | RetornarSegundoMaior = SegundoMaior | ||
+ | ELSEIF (MaiorAtribuido) THEN | ||
+ | RetornarSegundoMaior = Maior | ||
+ | ELSE | ||
+ | RetornarSegundoMaior = -1 | ||
+ | END IF | ||
+ | END FUNCTION RetornarSegundoMaior | ||
+ | END PROGRAM | ||
</code> | </code> | ||
Revision as of 21:29, 4 December 2008
A prova está disponível para download no seguinte endereço: http://www.adonaimedrado.pro.br/wiki/documentos/professor/UFBA_2008_2_MATA045_PD_PROVA_2.pdf.
Esta correção apresenta apenas o gabarito da questão de V ou F e possiveis soluções para os programas que deveriam ser desenvolvidos
Questão 1
- V
- V
- F (a linha referida aloca o vetor e é necessária para reservar memória para o mesmo)
- F (o quadrado e não a raiz quadrada)
- V
- V
- F (o CYCLE faz com que se vá para o próximo ciclo do comando DO)
- V
- V
Questão 2
PROGRAM prova IMPLICIT NONE INTEGER :: i,n,Erro,Maior,SegundoMaior INTEGER, DIMENSION(:),ALLOCATABLE :: a WRITE (*,*) "Quantos números deseja digitar?" DO READ(*,*,IOstat=Erro) n IF (Erro > 0) THEN WRITE (*,*) "Número inválido. Digite novamente." ELSE EXIT END IF END DO ALLOCATE(a(1:n)) WRITE (*,*) "Digite uma sequencia de ",n," inteiros." i = 1 DO READ(*,*,IOstat=Erro) a(i) IF (Erro /= 0) THEN WRITE (*,*) "Número inválido. Digite novamente." ELSEIF (Erro == 0) THEN i = i + 1 IF (i>n) THEN EXIT END IF END IF END DO OPEN (UNIT=10,FILE="saida.txt") WRITE (*,*) RetornarSegundoMaior(a) CLOSE(10) CONTAINS INTEGER FUNCTION RetornarSegundoMaior(V) IMPLICIT NONE INTEGER, DIMENSION(:), INTENT(IN) :: V LOGICAL :: MaiorAtribuido = .FALSE., SegundoMaiorAtribuido = .FALSE. INTEGER :: Maior,SegundoMaior MaiorAtribuido = .FALSE. SegundoMaiorAtribuido = .FALSE. DO i = 1, SIZE(V) IF (V(i)>Maior .OR. .NOT. MaiorAtribuido) THEN Maior = V(i) MaiorAtribuido = .TRUE. END IF END DO DO i = 1, SIZE(V) IF (V(i) /= Maior .AND. (V(i)>SegundoMaior .OR. .NOT. SegundoMaiorAtribuido)) THEN SegundoMaior = V(i) SegundoMaiorAtribuido = .TRUE. END IF END DO IF (SegundoMaiorAtribuido) THEN RetornarSegundoMaior = SegundoMaior ELSEIF (MaiorAtribuido) THEN RetornarSegundoMaior = Maior ELSE RetornarSegundoMaior = -1 END IF END FUNCTION RetornarSegundoMaior END PROGRAM
Questão 3
PROGRAM prova IMPLICIT NONE INTEGER :: linha,coluna INTEGER, DIMENSION(1:3,1:3) :: m,n,r WRITE (*,*) "Digite a primeira matriz." DO linha=1,3 READ (*,*) (m(linha,coluna),coluna=1,3) END DO WRITE (*,*) "Digite a segunda matriz." DO linha=1,3 READ (*,*) (n(linha,coluna),coluna=1,3) END DO DO linha = 1, 3 DO coluna = 1, 3 r(linha,coluna) = m(linha,1)*n(1,coluna)+m(linha,2)*n(2,coluna)+m(linha,3)*n(3,coluna) END DO END DO WRITE (*,*) "Resultado do produto:" DO linha=1,3 WRITE (*,"(3(I5))") (r(linha,coluna),coluna=1,3) END DO END PROGRAM prova