Difference between revisions of "Processamento de Dados (UFBA 2008.2): Correção da Prova II"
(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...) |
|||
(8 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/ | + | 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"> | ||
+ | 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 | ||
</code> | </code> | ||
== 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
- 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)
- 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
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