Ybadoo - Soluções em Software Livre
Turmas
1º Semestre de 2017

Questão 01

Desenvolva a seguinte hierarquia de classes na linguagem de programação Java:

  • uma interface para representar qualquer forma geométrica, definindo métodos para o cálculo do perímetro e da área da forma geométrica;
  • uma classe abstrata para representar quadriláteros, cujo construtor receba os valores dos quatro lados;
  • uma classe para representar um quadrado, cujo construtor deve receber o tamanho do lado (a). A área é obtida pela fórmula a2, e o perímetro é obtido pela fórmula 4 * a;
  • uma classe para representar um retângulo, cujo construtor deve receber o tamanho da base (b) e da altura (h). A área é obtida pela fórmula b * h, e o perímetro é obtido pela fórmula 2 * (b * h);
  • uma classe para representar um círculo, cujo construtor deve receber o tamanho do raio (r). A área é obtida pela fórmula π * r2, e o perímetro é obtido pela fórmula 2 * π * r.
public interface Shape {
public double area();
public double perimeter();
}

public abstract class Quadrilateral implements Shape {
private double a;
private double b;
private double c;
private double d;

public Quadrilateral(double a, double b, double c, double d) {
this.a = validate(a);
this.b = validate(b);
this.c = validate(c);
this.d = validate(d);
}

protected double getA() {
return a;
}

protected double getB() {
return b;
}

protected double getC() {
return c;
}

protected double getD() {
return d;
}

private double validate(double value) {
if (value >= 0) {
return value;
}

throw new IllegalArgumentException();
}
}

public class Square extends Quadrilateral {
public Square(double a) {
super(a, 0.0, 0.0, 0.0);
}

public double getA() {
return super.getA();
}

public double area() {
return Math.pow(getA(), 2.0);
}

public double perimeter() {
return 4.0 * getA();
}
}

public class Rectangle extends Quadrilateral {
public Rectangle(double b, double h) {
super(0.0, b, h, 0.0);
}

public double getB() {
return super.getB();
}

public double getH() {
return super.getC();
}

public double area() {
return getB() * getH();
}

public double perimeter() {
return 2.0 * getB() * getH();
}
}

public class Circle extends Quadrilateral {
public Circle(double r) {
super(r, 0.0, 0.0, 0.0);
}

public double getR() {
return super.getA();
}

public double area() {
return Math.PI * Math.pow(getR(), 2.0);
}

public double perimeter() {
return 2.0 * Math.PI * getR();
}
}

Questão 02

(POSCOMP, 2015) Considere o seguinte código desenvolvido na linguagem de programação Java.

public class Animal {
public void fale() {
System.out.println("...");
}
}

public class Cao extends Animal {
public void fale() {
System.out.println("au au");
}
}

public class Gato extends Animal {
public void fale() {
System.out.println("miau");
}
}

public class GatoPersa extends Gato {
public void fale() {
System.out.println("miauuuu");
}
}

public class Tigre extends Gato {
public void fale() {
super.fale();
System.out.println("rrrrrr");
}
}

public class Principal {
public static void main(String[] args) {
Gato gato = new GatoPersa();
gate.fale();
Animal cao = new Cao();
cao.fale();
Gato tigre = new Tigre();
tigre.fale();
}
}

Ao executar o código, a saída impressa no console é:

a. miauuuu
   au au
   miau
   rrrrrr

b. miauuuu
   au au
   rrrrrr

c. miau
   ...
   miau
   miau

d. miau
   au au
   rrrrrr

e. miau
   ...
   miau
   rrrrrr

Questão 03

(POSCOMP, 2015) O conceito de encapsulamento abordado na programação orientada a objetos pode ser implementado na linguagem de programação Java por meio de:

a. métodos estáticos (static) e públicos (public).

b. métodos públicos (public), privados (private) e protegidos (protected).

c. classes abstratas (abstract) e métodos protegidos (protected).

d. interfaces (interface), métodos públicos (public) e métodos protegidos (protected).

e. herança (extends) e métodos estáticos (static).

Questão 04

Em LISP, funções são elementos de primeira classe, ou seja, é possível fazer com funções qualquer coisa que se pode fazer com outros valores, como por exemplo, armazená-las em variáveis, passá-las como argumento para outras funções ou até mesmo criar novas funções em tempo de execução, permitindo o uso de várias técnicas interessantes na criação de um programa. Considere o conjunto de funções escritas na linguagem de programação LISP apresentadas a seguir.

(defun aux (N)
(if (zerop N)
1
(* N (aux(- n 1)))
)
)

(defun xpto (N P)
(/ (aux N) (* (aux P) (aux (- N P))))
)

A execução da expressão (xpto 4 3) retorna

a. 1

b. 2

c. 3

d. 4

e. 5

Questão 05

Considere o programa desenvolvido na linguagem de programação Java apresentado a seguir.

public class MyRunnable implements Runnable {
public void run() {
System.out.println("run");
throw new RuntimeException("exception");
}

public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
System.out.println("end");
}
}

Agora, considere as seguintes saídas a serem apresentadas ao usuário, na execução de um programa.

  1. java.lang.RuntimeException: exception
  2. run
    java.lang.RuntimeException: exception
  3. end
    java.lang.RuntimeException: exception
  4. end
    run
    java.lang.RuntimeException: exception
  5. run
    end
    java.lang.RuntimeException: exception

Quais das saídas apresentadas são plausíveis de serem visualizadas pelo usuário, na execução da classe MyRunnable.

a. apenas a saída I.

b. apenas a saída II.

c. apenas a saída III.

d. apenas as saídas II e III.

e. apenas as saídas IV e V.

Questão 06

Na lógica matemática e na ciência da computação, lambda cálculo é um sistema formal que estuda funções recursivas computáveis, no que se refere à teoria da computabilidade e fenômenos relacionados, como variáveis ligadas e substituição, sendo o mecanismo formal empregado pela família de linguagens de programação concebida por John McCarthy em 1958, popularmente conhecida como LISP. Desenvolva uma função recursiva computável denominada invert, escrita na linguagem de programação LISP, que apresente os elementos presentes numa lista na ordem invertida, como por exemplo:

(invert '(A B C D))
(D C B A)
(defun invert (L)
(if (null L)
nil
(append (invert (rest L)) (list (first L)))
)
)

Questão 07

Suponha que existe num banco de dados um número finito de fatos Prolog da forma conhece(A, B), onde A e B são duas pessoas distintas, conforme apresentado a seguir.

conhece(fulano, ciclano).
conhece(beltrano, ciclano).
conhece(beltrano, maria).
conhece(jose, maria).
conhece(maria, eva).
conhece(eva, adao).

Escreva um predicado na linguagem de programação Prolog ligadas(A, B) que é satisfeito quando A e B são ligadas, isto é, existe uma cadeia de conhecidos que leva de A até B, como por exemplo:

?- ligadas(fulano, eva).
true
conhecidos(X, Y) :- conhece(X, Y).
conhecidos(X, Y) :- conhece(Y, X).

ligadas(X, Y) :- conhecidos(X, Y).
ligadas(X, Y) :- ligadas(X, Z), conhecidos(Y, Z).

Questão 08

A linguagem de programação Prolog é uma linguagem de uso geral que é especialmente associada com a inteligência artificial e linguística computacional, se enquadrando no paradigma de programação em lógica matemática. O Prolog é uma linguagem declarativa, significando que em vez de o programa estipular a maneira de chegar à solução, passo a passo (como nas linguagens procedimentais ou imperativas), limita-se a fornecer uma descrição do problema que se pretende computar, utilizando para tal uma coleção base de dados de fatos e de relações lógicas (regras) que exprimem o domínio relacional do problema a ser resolvido. Considere a coleção de regras Prolog apresentado a seguir.

xpto([H]  , [R]  , P) :- P is H * R.
xpto([H|T], [R|S], P) :- xpto([H], [R], M), xpto(T, S, U), P is M + U.

Qual a saída apresentada para a pergunta

?- xpto([1, 2, 3], [4, 5, 6], N), write(N), nl.

a. 21

b. 32

c. 90

d. 126

e. 720