Difference between revisions of "Processamento de Dados (UFBA 2008.2): Correção da Prova II"
(→Questão 2) |
(→Questão 3) |
||
Line 87: | Line 87: | ||
== 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 |
Revision as of 21:45, 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
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." 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 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