Logo Passei Direto
Buscar
LiveAo vivo
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

<p>Nome: _____________________________________________________________</p><p>Nº de aluno: ___________</p><p>1º Teste intercalar de POO (Teste-exemplo)</p><p>Resolução</p><p>Duração: 1h20m</p><p>Regras e notas:</p><p>● Não se esqueça de preencher o cabeçalho desta página com seu nome e número de aluno.</p><p>● Mantenha um documento de identificação em cima da mesa desde o início da prova.</p><p>● O telemóvel deve estar desligado e guardado.</p><p>● Não destaque as folhas nem use folhas de rascunho.</p><p>● Não é permitido sair da sala até entregar a prova e o enunciado.</p><p>● Só pode sair da sala após 40 minutos de prova.</p><p>● Pode escrever as suas respostas a lápis, desde que fique bem legível.</p><p>● Pode utilizar o verso das páginas como rascunho ou para continuar/reescrever uma resposta.</p><p>● Caso as suas respostas sejam muito compridas face ao espaço reservado para o efeito, pondere se</p><p>estará a ir na direção certa.</p><p>● Ao longo do enunciado estão mencionadas sucintamente algumas classes/operações das</p><p>bibliotecas do Java que poderão (ou não) ser utilizados na sua resolução das questões.</p><p>● Ao escrever o código das respostas, não é necessário:</p><p>○ escrever declarações de importação (imports);</p><p>○ validar parâmetros de entrada nos métodos, a menos que isso seja solicitado.</p><p>● Acreditamos que o enunciado é bastante explícito para quem estiver por dentro da matéria, pelo</p><p>que não serão esclarecidas dúvidas individualmente. No entanto, caso encontre alguma gralha ou</p><p>algum aspeto que não esteja claro, chame a atenção do docente.</p><p>2</p><p>Grupo A (3 + 3 + 3). Considere um sistema de informação para gestão de</p><p>equipas de futebol, onde as equipas e jogadores são representados por</p><p>objetos das classes Team e Player, respetivamente. Cada equipa tem um</p><p>nome, e pode conter diversos jogadores. Cada jogador tem atributos que</p><p>representam o nome, número e idade. Assume-se que a classe Player já</p><p>existe e está bem implementada. A classe Team deverá ter um construtor e</p><p>métodos para: adicionar um jogador à equipa; obter o número de jogadores</p><p>da equipa; e calcular a média de idades dos seus jogadores.</p><p>Desenvolva a classe Team tendo em conta a descrição dada.</p><p>java.util.ArrayList<E></p><p>add(E): boolean get(int): E size(): int</p><p>public class Team {</p><p>private String name;</p><p>private List<Player> players = new ArrayList<>();</p><p>public Team(String name) {</p><p>this.name = name;</p><p>}</p><p>public void add(Player p) {</p><p>players.add(p);</p><p>}</p><p>public int size() {</p><p>return players.size();</p><p>}</p><p>public double ageAvg() {</p><p>int total = 0;</p><p>for (Player p : players)</p><p>total += p.getAge();</p><p>return (double) total / size();</p><p>}</p><p>Player</p><p>- name: String</p><p>- number: int</p><p>- age: int</p><p>+ getName(): String</p><p>+ getNumber(): int</p><p>+ getAge(): int</p><p>+ create(String): Player</p><p>3</p><p>Desenvolva um método para construir um objeto Team com base num ficheiro. O nome do ficheiro é dado</p><p>pelo nome da equipa (argumento) concatenado com a extensão ".txt". O ficheiro tem um conjunto de</p><p>linhas, onde cada uma delas contém informação referente a um jogador. Note que a classe Player contém</p><p>um método fábrica, public static Player create(String line), que devolve um jogador construído</p><p>com base em informação proveniente de uma linha do ficheiro (não precisa por isso de se preocupar com</p><p>o formato das linhas do ficheiro).</p><p>java.util.Scanner</p><p>new Scanner(File) nextLine(): String next(): String</p><p>hasNextLine(): boolean hasNext(): boolean close(): void</p><p>public class Team {…</p><p>public static Team read(String teamName) throws IOException {</p><p>Team newTeam = new Team(teamName);</p><p>Scanner s = new Scanner(new File(teamName + ".txt"));</p><p>while (s.hasNextLine())</p><p>newTeam.add(Player.create(s.nextLine());</p><p>s.close()</p><p>return newTeam;</p><p>}</p><p>Desenvolva uma classe TeamSizeComparator que</p><p>implementa o interface Comparator com o intuito de</p><p>posteriormente se poderem ordenar equipas por ordem</p><p>decrescente de número de jogadores. Escreva uma</p><p>expressão lambda para instanciar um comparador equivalente ao da classe desenvolvida.</p><p>public class TeamSizeComparator implements Comparator<Team> {</p><p>@Override</p><p>public int compare(Team t1, Team t2) {</p><p>return t2.size() – t1.size();</p><p>}</p><p>}</p><p>Expressão lambda equivalente:</p><p>Comparator<Team> comp = (t1, t2) -> t2.size() – t1.size();</p><p>public interface Comparator<T> {</p><p>int compare(T o1, T o2);</p><p>}</p><p>4</p><p>Grupo B (3 + 3) Considere a seguinte classe genérica ObjExporter<T> e o interface ObjToLine<T>:</p><p>Pretende-se exportar os dados dos jogadores para um ficheiro de texto. Nesse sentido, defina o método</p><p>exportPlayers(…), da classe Team, que manipula corretamente um objeto ObjExporter para exportar os</p><p>dados. Quanto ao objeto compatível com ObjToLine, este deverá ser definido com uma expressão lambda</p><p>de forma a que seja possível obter o número e o nome do jogador, separados por vírgula.</p><p>public class Team { …</p><p>public void exportPlayers(File file) throws IOException {</p><p>ObjExporter<Player> oe = new ObjExporter<>(file);</p><p>oe.export(players, p -> p.getNumber() + "," + p.getName());</p><p>}</p><p>Explique sucintamente o que faria caso se pretendesse transformar a classe Team numa classe de objetos</p><p>iteráveis (Iterable). Ilustre a utilização da nova versão iterável de Team, desenvolvendo um método</p><p>externo countOlder(…), que usa um iterador para percorrer os jogadores da equipa com o intuito de contar</p><p>quantos têm mais de 30 anos.</p><p>public interface Iterable<T> {</p><p>Iterator<T> iterator();</p><p>}</p><p>public interface Iterator<E> {</p><p>boolean hasNext();</p><p>E next();</p><p>}</p><p>public class ObjExporter<T> {</p><p>private File file;</p><p>public ObjExporter(File file) {</p><p>this.file = file;</p><p>}</p><p>public void export(List<T> list, ObjToLine<T> ol) throws IOException {</p><p>PrintWriter pw = new PrintWriter(file);</p><p>list.forEach(t -> pw.println(ol.toLine(t));</p><p>pw.close();</p><p>}</p><p>}</p><p>public interface ObjToLine<T> {</p><p>String toLine(T t);</p><p>}</p><p>5</p><p>Explicação:</p><p>1. implementar o interface Iterable<Player> na classe Team</p><p>2. no método iterator(), devolver o iterador da lista players</p><p>static int countOlder(Team team) {</p><p>Iterator<Player> it = team.iterator();</p><p>int cnt = 0;</p><p>while (it.hasNext())</p><p>if (it.next().getAge() > 30)</p><p>cnt++;</p><p>return cnt;</p><p>}</p><p>Grupo C (2.5 + 2.5) Considere a classe abstrata GameElement, que representa personagens de um jogo.</p><p>Cada personagem tem uma imagem que pode ser desenhada na posição (x,y) de uma grelha de jogo (para</p><p>simplificar não se validam as coordenadas).</p><p>Defina a classe Skeleton, derivada de GameElement, que tem um atributo booleano que indica se esse</p><p>personagem tem uma espada ou não. Caso tenha, a imagem correspondente é "armed_skeleton.png";</p><p>caso contrário é "skeleton.png". Deverá ser possível criar objetos Skeleton com ou sem espada.</p><p>public abstract class GameElement {</p><p>private int x, y;</p><p>public GameElement(int x, int y) {</p><p>this.x = x;</p><p>this.y = y;</p><p>}</p><p>public void move(int dx, int dy) {</p><p>x += dx;</p><p>y += dy;</p><p>}</p><p>public abstract String getImageName();</p><p>}</p><p>6</p><p>public class Skeleton extends GameElement {</p><p>private boolean hasSword;</p><p>public Skeleton(int x, int y, boolean hasSword) {</p><p>super(x, y);</p><p>this.hasSword = hasSword;</p><p>}</p><p>@Override</p><p>public String getImageName() {</p><p>if (hasSword) return "armed_skeleton.png";</p><p>return "skeleton.png";</p><p>}</p><p>}</p><p>Defina uma outra classe derivada de GameElement, chamada Guard, sem atributos adicionais e cuja imagem</p><p>devolvida</p><p>é sempre "guard.png". Nos objetos Guard, o método move(…) não deverá surtir nenhum efeito.</p><p>Por outro lado, deverão existir duas operações, marchRight() e marchLeft(), para mover o objeto uma</p><p>unidade para a direita ou para esquerda ao longo do eixo dos x’s.</p><p>public class PatrolGuard extends GameElement {</p><p>public PatrolGuard(int x, int y) {</p><p>super(x, y);</p><p>}</p><p>@Override</p><p>public String getImageName() {</p><p>return "guard.png";</p><p>}</p><p>@Override</p><p>public void move(int dx, int dy) {}</p><p>public void marchLeft() {</p><p>super.move(-1,0);</p><p>}</p><p>public void marchRight() {</p><p>super.move(1,0);</p><p>}</p><p>}</p><p>7</p>

Mais conteúdos dessa disciplina