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

From AdonaiMedrado.Pro.Br
Jump to: navigation, search
(Questão 2)
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
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.  
+
A prova está disponível para download no seguinte endereço: http://www.adonaimedrado.pro.br/wiki/documentos/professor/UFBA_2008_2_MAT045_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
+
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 ==
 
== Questão 1 ==
Line 11: Line 11:
 
#V
 
#V
 
#F (o CYCLE faz com que se vá para o próximo ciclo do comando DO)
 
#F (o CYCLE faz com que se vá para o próximo ciclo do comando DO)
 +
#F (função que retornar valor, subrotina não, exceto se utilizarmos INTENT(out), INTENT(inout) quando ela retorna em um parâmetro)
 
#V
 
#V
 
#V
 
#V
  
 
== Questão 2 ==
 
== Questão 2 ==
 +
Decidiu-se na sala que esta questão seria feita para números diferentes. Isto facilitava um pouco a solução, porém o programa mostrado abaixo não assume tal restrição e calcula corretamente para todos os casos sem ordenar o vetor.
 +
 +
Ele escreve no arquivo saida.txt o segundo maior valor no caso de existir no mínimo dois valores diferentes ou -1 caso não exista.
 +
 +
 
<code lang="fortran">
 
<code lang="fortran">
 
PROGRAM prova
 
PROGRAM prova
Line 24: Line 30:
 
     DO
 
     DO
 
       READ(*,*,IOstat=Erro) n
 
       READ(*,*,IOstat=Erro) n
       IF (Erro > 0) THEN
+
       IF (Erro > 0 .OR. n < 2) THEN
 
           WRITE (*,*) "Número inválido. Digite novamente."
 
           WRITE (*,*) "Número inválido. Digite novamente."
 
       ELSE  
 
       ELSE  
Line 38: Line 44:
 
         IF (Erro /= 0) THEN
 
         IF (Erro /= 0) THEN
 
             WRITE (*,*) "Número inválido.  Digite novamente."
 
             WRITE (*,*) "Número inválido.  Digite novamente."
         ELSEIF (Erro == 0) THEN
+
         ELSE
 
             i = i + 1
 
             i = i + 1
 
             IF (i>n) THEN
 
             IF (i>n) THEN
Line 53: Line 59:
 
       IMPLICIT NONE
 
       IMPLICIT NONE
 
       INTEGER, DIMENSION(:), INTENT(IN) :: V
 
       INTEGER, DIMENSION(:), INTENT(IN) :: V
       LOGICAL :: MaiorAtribuido = .FALSE., SegundoMaiorAtribuido = .FALSE.
+
       LOGICAL :: MaiorAtribuido, SegundoMaiorAtribuido
 
       INTEGER :: Maior,SegundoMaior
 
       INTEGER :: Maior,SegundoMaior
 
        
 
        
Line 74: Line 80:
 
       IF (SegundoMaiorAtribuido) THEN
 
       IF (SegundoMaiorAtribuido) THEN
 
         RetornarSegundoMaior = SegundoMaior
 
         RetornarSegundoMaior = SegundoMaior
      ELSEIF (MaiorAtribuido) THEN
 
        RetornarSegundoMaior = Maior
 
 
       ELSE
 
       ELSE
 
         RetornarSegundoMaior = -1
 
         RetornarSegundoMaior = -1
Line 84: Line 88:
  
 
== Questão 3 ==
 
== Questão 3 ==
 +
Esta questão era bastante simples, porém necessitava de um pouco de reflexão para conseguir "explicar" ao programa a lógica de multiplicação de duas matrizes.
 +
 +
Com poucas alterações o programa abaixo pode funcionar para N matrizes.
 +
 +
Uma outra solução possível seria executar a operação "manualmente", instruindo o computador como calcular todas as 9 posições da matriz resultado.
 +
 
<code lang="fortran">
 
<code lang="fortran">
 
PROGRAM prova
 
PROGRAM prova

Latest revision as of 02:25, 18 December 2008

A prova está disponível para download no seguinte endereço: http://www.adonaimedrado.pro.br/wiki/documentos/professor/UFBA_2008_2_MAT045_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. F (função que retornar valor, subrotina não, exceto se utilizarmos INTENT(out), INTENT(inout) quando ela retorna em um parâmetro)
  9. V
  10. V

Questão 2

Decidiu-se na sala que esta questão seria feita para números diferentes. Isto facilitava um pouco a solução, porém o programa mostrado abaixo não assume tal restrição e calcula corretamente para todos os casos sem ordenar o vetor.

Ele escreve no arquivo saida.txt o segundo maior valor no caso de existir no mínimo dois valores diferentes ou -1 caso não exista.


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 .OR. n < 2) 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."
        ELSE
            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, SegundoMaiorAtribuido
      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
      ELSE
        RetornarSegundoMaior = -1
      END IF
    END FUNCTION RetornarSegundoMaior
END PROGRAM

Questão 3

Esta questão era bastante simples, porém necessitava de um pouco de reflexão para conseguir "explicar" ao programa a lógica de multiplicação de duas matrizes.

Com poucas alterações o programa abaixo pode funcionar para N matrizes.

Uma outra solução possível seria executar a operação "manualmente", instruindo o computador como calcular todas as 9 posições da matriz resultado.

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