Processamento de Dados (UFBA 2008.2): Correção da Prova II

From AdonaiMedrado.Pro.Br
Revision as of 21:31, 4 December 2008 by Adonaimedrado (Talk | contribs) (Questão 2)

Jump to: navigation, search

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

  1. V
  2. V
  3. F (a linha referida aloca o vetor e é necessária para reservar memória para o mesmo)
  4. F (o quadrado e não a raiz quadrada)
  5. V
  6. V
  7. F (o CYCLE faz com que se vá para o próximo ciclo do comando DO)
  8. V
  9. 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 (10,*) 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