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

From AdonaiMedrado.Pro.Br
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_MAT045_PD_PROVA_1.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. F
  3. F
  4. F
  5. F

Questão 2

Solução abaixo foi, com pequenas alterações, apresentada por um aluno e se refere apenas ao programa que deveria ser construído.

PROGRAM velocidade
	IMPLICIT NONE
	INTEGER :: S,T
	REAL :: V
	WRITE (*,*) "Digite o deslocamento."
	READ (*,*) S
	WRITE (*,*) "Digite o espaço de tempo."
	READ (*,*) T
	IF (T<=0) THEN
		WRITE (*,*) "Erro: Espaço de tempo inválido."
	ELSE
		V = (S*1.0) / T
		WRITE (*,*) "A velocidade escalar média é",V
	END IF
END PROGRAM

A maioria dos alunos esqueceu-se de que S inteiro dividido por T inteiro seria igual a um inteiro e não a um real, motivo pelo qual se necessita fazer S*1.0 ou REAL(S).

Questão 3

Esta questão, apesar de ter sido formulada para ser respondida utilizando-se CASE também era possível fazer utilizando IF. A maioria dos alunos seguiu a última opção. Seguem duas possíveis soluções, também feitas por alunos, mas postas aqui com pequenas alterações.

Solução com IF

PROGRAM aliquota
	IMPLICIT NONE
	INTEGER :: A
	WRITE (*,*) "Digite o valor da renda anual."
	READ (*,*) A
	IF (A <= 1500) THEN
		WRITE (*,*) "Isento."
	ELSE
		IF (A>1500 .AND. A<=2500) THEN
			WRITE (*,*) "2%"
		ELSE
			IF (A>2500 .AND. A<=5000) THEN
				WRITE (*,*) "5%"
			ELSE
				IF (A>5000 .AND. A<=10000) THEN
					WRITE (*,*) "10%"
				ELSE
					IF (A>10000) THEN
						WRITE (*,*) "15%"
					END IF
				END IF
			END IF
		END IF
	END IF
END PROGRAM aliquota

Muitos alunos utilizaram .OR. ao invés do .AND. necessário à solução.

Solução com CASE

PROGRAM aliquota
	IMPLICIT NONE
	INTEGER :: R
	WRITE (*,*) "Informe sua renda anual."
	READ (*,*) R
	WRITE (*,*) "O valor da aliquota será:"
	SELECT CASE (R)
		CASE (:1500)
			WRITE (*,*) "Isento"
		CASE (1501:2500)
			WRItE (*,*) "2%"
		CASE (2501:5000)
			WRITE (*,*) "5%"
		CASE (5001:10000)
			WRITE (*,*) "10%"
		CASE (10001:)
			WRITE (*,*) "15%"
	END SELECT
END PROGRAM aliquota

Existiram muitos erros na sintaxe do CASE.

Questão 4

Esta questão tinha sido informada que iria estar na prova. Várias soluções diferentes foram apresentadas, mas todas seguiram a mesma lógica básica. Segue um das soluções apresentadas por um aluno.

PROGRAM resto
	INTEGER :: A,B,C,D
	WRITE (*,*) "Digite o dividendo."
	READ (*,*) A
	WRITE (*,*) "Digite o divisor."
	READ (*,*) B
	IF (B==0 .OR. A<0) THEN
		WRITE (*,*) "Número inválido."
	ELSE IF (A<B .OR. A==0) THEN
		C = A
		WRITE (*,*) "A divisão de ",A," por ",B," é zero e o resto é ",C
	ELSE
		C = A
		D = 0
		DO
			C = C - B
			D = D + 1
			IF (C<B) THEN
				WRITE (*,*) "A divisão tem como quociente ",D," e resto ",C
				EXIT
			END IF
		END DO
	END IF
END PROGRAM resto