Difference between revisions of "Processamento de Dados (UFBA 2008.2): Correção da Prova II"

From AdonaiMedrado.Pro.Br
Jump to: navigation, search
(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

  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 (*,*) 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