Você está na página 1de 21

Exercícios de Programação

Sistemas Informáticos – MIEBIOM/MIEF


Departamento de Engenharia Informática

Este documento reúne, em várias secções, um conjunto de exercícios de programação de suporte às


aulas práticas de Sistemas Informáticos. Os exercícios devem ser resolvidos usando a linguagem
Java e servem para colocar em prática os conhecimentos adquiridos durante as aulas e desenvolver
as suas competências de resolução de problemas. Servem também como preparação para os
exercícios de avaliação que irão ser publicados ao longo do semestre e que deverão ser entregues
pelos alunos em inforestudante (as datas de publicação e também de entrega de cada exercício de
avaliação estão disponíveis, desde o início do semestre, em inforestudante). Nenhum dos problemas
apresentados neste documento será objeto de avaliação.

Todos os exercícios estão marcados com um sinal indicador do seu grau de dificuldade. Assim, são
usados os seguintes sinais:

T ß Para problemas muito fáceis, de resolução trivial;

F ß Para problemas fáceis;

M ß Para problemas de dificuldade média;

D ß Para problemas que requerem reflexão e tempo.

Por altura da publicação de cada exercício de avaliação, encontrará um conjunto de regras que
devem ser cumpridas para poder submeter o trabalho com sucesso para avaliação. Dessas regras,
salientamos:
i) A obrigatoriedade de submeter o código fonte que se encontra em ficheiros de extensão .java (os
ficheiros com extensão .class são o resultado da compilação e não contêm código fonte);
ii) A submissão em formato .zip (não use outro formato, pois os ficheiros serão pré-processados,
antes de serem avaliados, por um programa que necessita deste formato como input).

O seu código deve ainda seguir boas práticas e não utilizar cedilhas, acentos, e outros caracteres
especiais em nomes de variáveis ou nomes de ficheiros. Se tiver dúvidas em como construir o
ficheiro .zip para submissão, confirme atempadamente numa das Práticas Laboratoriais.

Note também que pode sempre alterar uma submissão prévia de uma solução para um exercício
(por exemplo, se descobriu um problema no código que, entretanto, corrigiu), desde que o faça
dentro do prazo. Submissões de trabalhos fora do prazo, ou que não usem o respetivo formulário
de submissão em inforestudante, não serão aceites para avaliação.

Por altura da submissão de cada exercício de avaliação é obrigatório que envie também informação
acerca do esforço total despendido em: i) horas gastas em aula; ii) horas extra-aula. Por isto, é
essencial que todas as semanas (desde a primeira) mantenha um pequeno registo semanal de tempo
gasto em aulas e extra-aula, para que os valores finais representem o que realmente foi gasto.

1/21
1. Introdução Semana 1 – Semana 5

1.1 Lógica e Interação com o utilizador


Objetivos:
• Familiarização com o ambiente de desenvolvimento.
• Familiarização com a estrutura básica de aplicações em Java.
• Compreensão de operações básicas de aritmética e lógica.
• Interação com o utilizador.
Requisitos:
• Instalação do software indicado para as aulas.
• Conceitos dados nas aulas teórico-práticas.
Material de Apoio:
• Slides das aulas teórico-práticas.

Nos exercícios desta secção, apenas deve interagir com o utilizador a partir do exercício 10.

1. F Defina um novo projeto Java no eclipse e crie uma classe de nome Exercicio1 com
um método main vazio.
a) Declare as seguintes variáveis: um inteiro, um double, um carácter, um boolean e
uma String.
b) Tente imprimir o valor de uma destas variáveis (que não têm ainda valor
definido). O que acontece? O que pode concluir?
c) Tente agora atribuir os seguintes valores às variáveis que definiu: 5; 100; c; true;
ola.
d) Complete o programa para imprimir os valores das variáveis, separados por
espaços, numa só linha.

2. T Utilizando o código desenvolvido no exercício anterior, verifique que influência tem


a indentação (o espaçamento horizontal colocado antes de cada linha de código) na
execução do código. Para isto deve alterar manualmente essa indentação e experimentar
executar o programa que desenvolveu. Indentação correta é obrigatória em Python. E
em Java?

O atalho Ctrl Shift f no Eclipse permite formatar o seu código de acordo com um padrão
configurável (para que não fique desorganizado). Vamos agora adicionar um padrão de
formatação ao eclipse que permite uma boa legibilidade do código.
Aceda ao menu, em sistemas Windows: Window à preferences à java à code style à
formatter (ou em OS X: Eclipse à preferences à java à code style à formatter) e faça import
do ficheiro bsd-style-for-eclipse.xml disponibilizado em inforestudante, como ilustrado na
Figura 1.

2/21
Figura 1 – Local de importação de definições de formatação de código.

3. T Escreva um programa que calcule o volume total de uma caixa rectangular a partir
das suas dimensões. Os valores (inteiros) de cada dimensão devem ser definidos em
constantes no código.

4. T Desenvolva um programa que o ajude a calcular a nota de um aluno em particular,


sabendo que esta é definida da seguinte forma:
• 50% - média de 3 testes da disciplina
• 25% - média de 2 trabalhos práticos
• 25% - trabalho final

Defina as classificações de cada teste/trabalho usando constantes no código.

5. T O que imprime cada uma das seguintes linhas de código? Explique cada resultado.
a) System.out.println(2 + "bc");
b) System.out.println(2 + 3 + "bc");
c) System.out.println((2+3) + "bc");
d) System.out.println("bc" + (2+3));
e) System.out.println("bc" + 2 + 3);

6. T Assumindo x = 10 e y = 20, indique o resultado da avaliação das seguintes expressões


lógicas:
a) x > 10
b) x > 1 && y < 15
c) x == 10 && y == 10
d) x == 10 || y == 10
e) x > 5 || !(y == 10)

Compare os seus resultados, testando agora as expressões no eclipse.

3/21
7. F O papagaio Perry é um bocado irritante e causa problemas se falar entre as 22h e as
7h. Defina uma expressão lógica que é avaliada em true sempre que o papagaio causa
problemas.
Comece por: 1) identificar as variáveis de que necessita; 2) atribuir um valor a essas
variáveis; 3) criar uma expressão, utilizando operadores relacionais e/ou lógicos que
represente o cenário descrito. Não se esqueça de testar o seu programa!

8. F Um ISP decidiu limitar o acesso à internet dos seus clientes. Para isto, pediu a um
programador que criasse uma expressão lógica que permita saber se, em determinadas
condições, um cliente deve ter acesso à Internet, ou não. A expressão é avaliada em true
em caso afirmativo (o cliente tem acesso à Internet) e false em caso negativo. O cliente
tem acesso à internet quando os 3 pontos seguintes se verificam em simultâneo:
• idade é maior que 16
• id (um identificador do cliente) está entre 1000 e 2000 (inclusive)
• O período de utilização é noturno (noite = true) ou está num período especial de
utilização designado por happyHour (happyHour = true)

9. F Reescreva as soluções dos exercícios 3 e 7 para pedir ao utilizador os valores


necessários para a execução dos programas.

10. F Crie um programa que simule um pagamento nos seguintes termos.


Pagamento: Visa, Mastercard, Multibanco, ou Dinheiro?
> Visa (por exemplo)

Introduza o valor a pagar em euros:


> 15.5 (por exemplo)
Pagamento de 15.3 euros efectuado com Visa
Payment of 18.6 US dollars with Visa

Dependendo da configuração do seu sistema, para que possa inserir ‘.’ como separador decimal
(ao ler do teclado), pode ser necessário definir inicialmente o Locale correto, usando por exemplo
a instrução: Locale.setDefault(Locale.US);
Caso contrário poderá ter de usar outros caracteres ( ‘,’ ou mesmo ‘$’ em alguns casos).

11. M O Hospital PanoramixUC decidiu criar um programa para verificar se um


determinado paciente deve ter prioridade no atendimento. Um paciente é definido pelo
seu nome, pela sua idade, se toma ou não medicamentos e tempo atual de espera (em
minutos). O atendimento deve ser prioritário quando, para um paciente, as seguintes 3
condições se verificam em simultâneo:
• Idade é maior que 65 ou idade é menor que 10
• O doente usa medicamentos
• O tempo atual de espera é superior ou igual a 30

4/21
Se o atendimento se verifica prioritário para um paciente, o programa imprime
‘Atendimento Prioritário Paciente [nome_do_paciente] = true’ no ecrã. Nos restantes
casos, true é substituído por false.
Todos os dados devem ser pedidos ao utilizador.

5/21
1.2 Instruções de controlo condicional
Objetivos:
• Compreender os mecanismos de interação com o utilizador.
• Treinar operações básicas de aritmética e lógica.
• Compreender as instruções de controlo condicionais.
• Aplicar validação de dados (tipos e valores).
Requisitos:
• Conceitos dados nas aulas teórico-práticas.
Material de Apoio:
• Slides das aulas teórico-práticas.

12. T Escreva um programa que peça um valor inteiro ao utilizador e indique se o número
introduzido é superior, igual, ou inferior a 1000.

13. F Escreva um programa que peça três doubles ao utilizador (a, b, c) e imprima o total
de valores iguais (0, 2, ou 3). Certifique-se que o utilizador insere de facto 3 doubles e
apresente uma mensagem de erro se tal não se verificar.

14. F Escreva um programa que realize operações aritméticas básicas. O programa deve
pedir dois valores numéricos ao utilizador e um operador (“+”, “-“, “*”, “/”). Deve de
seguida fazer a operação aritmética correspondente, imprimir o resultado e sair da
aplicação. A calculadora não deverá permitir divisões por zero ou a introdução de
operandos ou operações inválidas.

15. F Escreva um programa que peça 3 inteiros, 2 doubles, e 1 String ao utilizador. Se o


utilizador não inserir os tipos de dados corretos, o programa conclui a execução. Caso
contrário, o programa deve testar se as seguintes três regras [a), b), c)] se verificam:
a) Dois dos inteiros pedidos são superiores ao valor da média dos três inteiros
b) A String introduzida é igual a “UC” e pelo menos um dos doubles pedidos é inferior
a 1000
c) A soma dos três inteiros é um número par e a soma dos 2 doubles é um número ímpar

O programa termina informando que condições foram cumpridas [a), b), c), ou
nenhuma].

6/21
16. M Por motivos de possível sobreaquecimento, as máquinas de um laboratório
farmacêutico devem operar durante um período máximo de tempo que varia com o tipo
de máquina. Dado o momento de início de operação (horas e minutos) de uma máquina
e o tempo máximo (horas e minutos) que essa máquina deve operar, calcule o momento
(horas e minutos) em que máquina deve ser desligada. Considere que nenhuma
máquina opera durante mais do que 2 dias seguidos.

17. M Um vendedor vende fruta de acordo com um preço tabelado. No entanto, se o cliente
comprar mais do que uma certa quantidade, o peso a mais é vendido com desconto, de
acordo com a seguinte tabela.

Fruta Preço Normal Quantidade Limite Desconto


Maçã 0.5 € 3 Kg 75%
Pera 0.9 € 2 Kg 70%

Adicionalmente, caso o cliente atinja um determinado valor total de compras e desde


que tenha comprado ambos os tipos de fruta, o vendedor aplica um desconto ao valor
total de compras de acordo com a seguinte tabela.

Total de compras Desconto


20€ 0.5%
50€ 1%
100€ 3%

Escreva um programa que, dada a quantidade comprada de cada fruta, calcula o valor
total a pagar. Se o utilizador do programa inserir dados inválidos (i.e., quantidades
inválidas), a aplicação deve imprimir uma mensagem de erro e terminar.

7/21
1.3 Controlo de fluxo: Ciclos
Objetivos:
• Compreender o controlo de fluxo com utilização de ciclos;
• Conhecer a sintaxe dos ciclos for e while;
Requisitos:
• Conceitos dados nas aulas teórico-práticas.
Material de Apoio:
• Slides das aulas teórico-práticas.

Não efetue qualquer tipo de validação de dados nos exercícios desta secção e das seguintes
(exceto quando explicitamente pedido).

18. T Escreva um programa que use um ciclo for para imprimir, por ordem crescente, os
números inteiros ímpares entre dois valores X e Y (limite inferior e superior) pedidos ao
utilizador. Verifique também o que acontece no seu programa se Y for menor que X.

19. T Use um ciclo while para criar uma nova versão do programa pedido na pergunta
anterior.

20. F Escreva um programa que some todos os números introduzidos no teclado, até o
utilizador inserir um número negativo. No final deverá imprimir a média desses
números.

21. F Escreva um programa que peça 2 inteiros ao utilizador (‘min’ e ‘max’). Se ‘min’ for
maior ou igual a ‘max’ o programa deve apresentar uma mensagem de erro e terminar.
Caso contrário, pede 1 inteiro (N) ao utilizador. Seguidamente, deve pedir N inteiros
ao utilizador. Antes de sair da aplicação deve apresentar a média dos N inteiros
introduzidos que sejam maiores que ‘min’ e menores que ‘max’.

22. F Escreva um programa para calcular a soma dos dígitos de um número inteiro, como
ilustrado de seguida.
- 43 à 7
- 432 à 9
- 3271 à 13

8/21
23. M A série harmónica é dada pela expressão:
1
ri = ri−1 +
i
Considere r0 = 0 e calcule o valor aproximado da série quando é conhecido o erro
máximo admissível. O erro é definido como a diferença entre dois valores consecutivos,
ri e ri−1 .

24. M Escreva um programa que desenhe uma escada descendente de asteriscos. A altura
da escada deve ser escolhida pelo utilizador. Exemplo para altura da escada = 6:
*
*
*
*
*
*
a) Apresente uma versão que como use apenas ciclo(s) for como estrutura de iteração.
b) Apresente uma versão que use apenas ciclos(s) while como estrutura de iteração.

25. M Escreva um programa que consiga desenhar um triângulo de asteriscos de acordo


com a figura em baixo. A altura do triângulo deve ser especificada pelo utilizador.

*
* *
* *
* *
* *
* *
* *
* *
* *
*******************

9/21
1.4 Arrays
Objetivos:
• Aprender a criar e manipular arrays;
Requisitos:
• Conceitos dados nas aulas teórico-práticas.
Material de Apoio:
• Slides das aulas teórico-práticas.

26. T Declare um array de inteiros com 10 posições e atribua (por altura da declaração)
valores a cada posição. Crie um ciclo para imprimir o conteúdo do array. Quais são os
índices válidos a que pode aceder no array? O que acontece se tentar aceder a um índice
inválido (e.g., -1 ou 12)?

27. T Declare um array de inteiros com 6 posições. Crie um ciclo que itera sobre o array e
coloca um valor aleatório (no intervalo [10, 20]) em cada posição. Imprima o conteúdo
do array.

28. T Declare um array bidimensional de inteiros e atribua (por altura da declaração)


valores a cada posição. Imprima o conteúdo do array usando dois ciclos for.

29. F Escreva um programa para aplicar a seguinte transformação a uma matriz, como
ilustrado na figura seguinte. A matriz deve estar definida no código (i.e., não deve ser
pedida ao utilizador).

0 1 2 3 3 2 1 0
4 5 6 7 7 6 5 4
8 9 10 11 11 10 9 8
12 13 14 15 15 14 13 12

30. M Declare um array bidimensional de inteiros e preencha-o com valores de zero a N,


de acordo com as seguintes probabilidades:
20% à valor ‘0’;
30% à valor ‘1’;
50% à um valor aleatório no intervalo ]1,N].

Antes de terminar a aplicação imprima:


- O conteúdo do array;
- Uma listagem dos elementos que aparecem mais que uma vez na matriz.

10/21
1.5 Strings: Cadeias de carateres
Objetivos:
• Aprender a criar e manipular Strings;
Requisitos:
• Conceitos dados nas aulas teórico-práticas.
Material de Apoio:
• Slides das aulas teórico-práticas.

Uma String é um objeto que permite armazenar e manipular cadeias de caracteres. A


linguagem Java permite criar uma String fazendo simplesmente:

String nome = "John";

Outros tipos de objetos apenas podem ser criados com auxílio do operador new (por
exemplo, objetos do tipo Scanner). Um caractere de uma String é referido pela sua posição
ou índice na String (os índices válidos são de zero até tamanho-1, inclusive).

A Tabela I descreve alguns dos métodos da classe String (funções que podemos executar
sobre uma dada String). A definição de cada método inclui (na tabela à esquerda): tipo de
dados de retorno, nome do método, argumentos de entrada.

Tabela I – Exemplos de métodos disponibilizados pela classe String.

Método Descrição
char charAt (int index) Devolve o caractere armazenado na posição index.
int compareTo (String anotherString) Compara uma String com anotherString. Devolve 0 se forem
iguais, um valor negativo se String < anotherString, um valor
positivo no caso contrário.
boolean contains(CharSequence s) Devolve true se a String contiver a cadeia de caracteres passada
como argumento
boolean startsWith(String prefix) Devolve true quando a String começa com o prefixo passado
como parâmetro
int indexOf(int ch) Devolve a posição numa String do caractere ch.
int length() Devolve o número de caracteres de uma String.
String[] split(String regex) Separa componentes de uma String delimitados pela String
regex. Devolve um array de Strings preenchido com os
componentes da String original.
Exemplo:
String str = “hello world”;
String[] tmp = str.split(“ “);
//tmp tem agora tamanho 2. Em tmp[0] encontra-se ‘hello’; em
tmp[1] encontra-se ‘world’
... ...

11/21
Por exemplo, para determinar o tamanho de nome basta a instrução:

int tamanho = nome.length();

O Eclipse permite-nos ver facilmente todos os métodos e descrições bastando colocar um


ponto a seguir a uma String (ou outro objeto) para serem mostradas as sugestões:

O atalho Ctrl^Space força também o aparecimento das sugestões disponíveis num


determinado contexto. Verifique, usando o Eclipse, que métodos a classe String
disponibiliza.

31. T Escreva um programa que aplique as seguintes operações a esta String:

I have a dream that one day this nation will rise up and live out the true meaning of its creed:
‘We hold these truths to be self-evident: that all men are created equal.’

1) Converte todos os caracteres alfabéticos para letras maiúsculas e imprime o


resultado;
2) Converte todos os caracteres alfabéticos para letras minúsculas e imprime o
resultado;
3) Imprime o tamanho da String;
4) Imprime o índice (i.e., a posição) da palavra dream.

32. T Escreva um programa que a partir de uma frase e uma palavra introduzidas pelo
utilizador mostra o número de ocorrências dessa palavra na frase. Use o IDE para
explorar os métodos disponibilizados pela classe String que podem ser úteis na
resolução deste problema.

12/21
33. F Escreva um programa que calcule a distância de Hamming entre duas Strings. A
distância de Hamming define-se como sendo o número de posições em que as Strings
divergem.

34. F Crie um programa que permita remover caracteres duplicados em uma dada String.
Exemplo: ABBCCCCCBBA B à ABCBA B.

35. M Escreva um programa que peça uma frase ao utilizador e inverta palavras
individuais nessa frase. Por exemplo, a frase:
The quick brown fox jumps over the lazy dog

Deve ser transformada em:


ehT kciuq nworb xof spmuj revo eht yzal god

Para simplificar, neste exercício deve considerar que os caracteres de pontuação são
tratados como caracteres alfabéticos.

36. M Escreva um programa para identificar uma frase constituída por palavras que
formam uma cadeia. Numa cadeia palavras adjacentes têm o mesmo tamanho e diferem
em exatamente uma letra. Exemplo: BOLA BOLO COLO COLA.

37. M Escreva um programa que consiga construir um array de palavras ordenadas por
tamanho (ordem descendente). O programa pede palavras ao utilizador e, para cada
palavra, determina a posição do array onde deve ser colocada (de modo a que a ordem
seja cumprida) e coloca a palavra no array.

13/21
2. Programação Orientada a Objetos Semana 6 – Semana 9

Objetivos:
• Definição e utilização de classes e métodos.
• Conceitos básicos de Programação Orientada a Objetos (OOP);
Requisitos:
• Conceitos dados nas aulas teórico-práticas.
Material de Apoio:
• Slides das aulas teórico-práticas.

Nos exercícios de treino desta secção não deve fazer uso de qualquer interação com o
utilizador (i.e., leitura de informação do teclado). Apesar de isso ser obviamente possível,
deve concentrar-se exclusivamente na aprendizagem dos conceitos OOP.

38. T Crie uma package calc e defina uma classe Calculadora nessa package. Esta classe deve
possuir 4 métodos static correspondentes às 4 operações aritméticas tradicionais: soma,
subtração, divisão e multiplicação. Todas as operações devem aceitar 2 inteiros como
argumento. Crie uma classe Exercicio51 numa package de nome test. Nesta classe deve
testar todas as operações implementadas pela calculadora.
Apenas a classe Exercicio51 deve ter um método main e a utilização de métodos static está
também limitada ao início deste exercício. Note que o facto de estar a usar classes e
métodos não significa que esteja a usar Programação Orientada a Objetos (porquê?). Se
remover agora todas as palavras static do seu código, que outras alterações precisa para
que o programa volte a funcionar?

39. F Crie uma package ex2 e uma classe Pessoa nessa package. Neste contexto, uma pessoa
tem três atributos: nome, idade, telefone. A classe Pessoa deve suportar as seguintes
operações:
• Construtor que aceita um nome, uma idade e um telefone como argumento e
inicializa os atributos de uma pessoa com esses valores.
• public String toString() – Devolve uma String com a informação completa
acerca de uma pessoa. A implementação deste método permite que
posteriormente consiga fazer System.out.print(umaPessoa); sendo o resultado
apresentado exatamente no formato que definiu no método toString(). Caso a
classe não defina este método, ao fazer System.out.print(umaPessoa); obterá apenas
a impressão de uma referencia para o objeto (sem informação útil, do ponto de
vista do domínio Pessoa)
• public String getTelefone() – Devolve uma String com o número de
telefone de uma pessoa;

14/21
• public void setTelefone (String phone) – Define ou altera o número de
telefone de uma pessoa;
• public boolean isOlder(Pessoa outraPessoa) – Determina se a pessoa
atual é mais velha que uma outra pessoa passada como argumento. Devolve true
em caso afirmativo e false caso outraPessoa seja mais velha ou tenha a mesma idade
que a pessoa atual.

Recorde que, como vimos nas aulas, em Programação Orientada a Objetos os atributos
de uma classe devem ser privados e os métodos públicos (excepto em casos específicos
em que outro tipo de visibilidade é mais apropriada).

a) Crie um método main na classe Pessoa e crie agora dois objetos Pessoa. Teste as
operações que acabou de implementar.
b) Crie agora uma nova classe Teste na package ex2 e repita os testes que fez na alínea
anterior. Note que se definiu os atributos de Pessoa como privados, não tem agora
acesso aos seus valores. Porque não precisou fazer import da classe Pessoa?

40. F Defina uma classe Retangulo com atributos altura, largura e posição (x e y) num
plano. A classe deve suportar as seguintes operações:
• Construtor vazio (i.e., sem argumentos) que cria um retângulo de altura=10 e
largura=20 e o coloca nas coordenadas (0,0);
• Construtor que aceita 4 atributos como argumento (altura, largura, x, y) e
inicializa um retângulo com esses valores;
• Getters & Setters para cada um dos 4 atributos (eclipse: Source à Generate
Getters and Setters);
• public int calculaArea() – Devolve a área do retângulo atual;

• public double distancia(Retangulo outroRetangulo) – Calcula e devolve


a distancia entre o retângulo atual e um outro passado como argumento;
• public boolean isBiggerThan(Retangulo outroRetangulo) – Verifica se
o retângulo atual tem uma área superior ao retângulo passado como argumento,
devolvendo true em caso afirmativo e false caso contrário.

Não se esqueça de testar as operações que implementou!

15/21
41. F Com base na classe Retangulo criada no exercício 40, crie uma classe RetanguloNovo
que deve conter os mesmos métodos e atributos que a classe Retangulo, à exceção dos
inteiros x,y (que representam a posição do retângulo) que devem ser agora
representados por um só atributo: um objeto da seguinte classe Point.

public class Point


{
private int x;
private int y;

public Point()
{
this.x = 0;
this.y = 0;
}

public Point(int x, int y)


{
this.x = x;
this.y = y;
}

public double distance(Point anotherPoint)


{
int dx = this.x - anotherPoint.x;
int dy = this.y - anotherPoint.y;
return Math.sqrt(dx * dx + dy * dy);
}
}

Deve tirar partido dos construtores e do método definidos na classe Point para
implementar os métodos da classe RetanguloNovo.

42. M Crie um mapa bidimensional de dimensões constantes I_MAX=10, J_MAX=20 onde,


em cada ponto i,j, é possível colocar um polígono de quaisquer dimensões e que pode
ser um retângulo ou um triângulo. Cada polígono (retângulo ou triângulo) implementa
pelo menos os seguintes métodos (com funcionalidade semelhante aos exercícios 40 e 41
e com eventuais adaptações):
• public double calculaArea()
• public double distancia(Poligono outroPoligono)
• public boolean isBiggerThan(Poligono outroPoligono)
• public String toString() – Devolve “R” ou “T”, dependendo se o polígono
é um retângulo ou um triângulo (respetivamente).

O seu programa deve colocar aleatoriamente um retângulo e um triângulo no mapa,


imprimir o mapa numa grelha bidimensional (cada ponto não ocupado pode ser
representado com ‘.’) e mostrar a que distância está o retângulo do triângulo. Note que
cada posição do mapa será igual a null até que tenha um objeto.

16/21
43. M Uma pilha é uma estrutura de dados que tipicamente suporta pelo menos duas
operações: push e pop. push adiciona um elemento à pilha; pop remove e devolve o último
elemento que foi adicionado à pilha. Por outras palavras, o funcionamento típico de uma
pilha segue uma política LIFO (last-in first-out). Assim, considerando uma pilha capaz
de guardar valores inteiros (e inicialmente vazia), a execução das seguintes operações:

push(3); push(1); push(8); pop(); pop(); pop();

resulta na devolução de: 8, 1 e 3. De um modo similar, a execução das seguintes


operações:

push(3); push(1); pop(); push(8); pop(); pop();

resulta na devolução de: 1, 8 e 3.

Crie uma classe Pilha, suportada por um array interno de inteiros, que possua os
seguintes construtores e operações:
• Construtor que aceita um inteiro como argumento. Este inteiro define o tamanho
inicial do array interno (inicialmente vazio).

• Construtor sem argumentos: Cria uma Pilha com capacidade para comportar 10
elementos. O array interno da pilha é inicializado com tamanho 10.

• public void push(int value) - Adiciona um elemento à pilha (i.e., o inteiro


passado como argumento é colocado no array interno da pilha). Caso o array interno
não possua espaço livre para alojar o novo elemento, deverá copiar todos os
elementos atuais para um novo array, com o dobro do tamanho do anterior, e
substituir o array anterior pelo recém-criado.
• public int getCurrentSize() - Devolve o número de elementos presentes na pilha.

• public int pop() - Remove e devolve o elemento no topo da pilha (i.e., remove o
último elemento adicionado à pilha). Caso a pilha esteja vazia este método deve devolver -
1.

• public String toString() - Devolve uma String com uma representação horizontal
da pilha no seguinte formato (após push(5); push(7); push(9);): [ 5 7 9 ]

17/21
3. Sockets Semana 10 – Semana 12

Objetivos:
• Criação de sistemas distribuídos simples;
• Implementação de protocolos simples para comunicação entre aplicações;
• Familiarização com a API de Sockets
Requisitos:
• Conceitos dados nas aulas teórico-práticas.
Material de Apoio:
• Slides das aulas teórico-práticas.

44. F Usando o código anexo a este documento (os ficheiros HelloClient.java e


HelloServer.java que se encontram na diretoria “3-code-sockets”) como base, construa um
servidor que disponibilize um serviço ‘Quote of the Day’ e um cliente para consultar este
serviço.
a. Servidor:
i. O servidor escuta no porto 7000 e executa num ciclo infinito esperando
novas ligações e mensagens vindas de clientes;
ii. A aplicação servidor deve manter um array com pelo menos 3 frases
(quotes) disponíveis para consulta;
iii. À chegada de uma mensagem igual a ‘quote’ ou ‘q’ (maiúsculas são
também aceites, o servidor é case-insensitive) por parte de um cliente, o
servidor envia uma resposta. Esta resposta será uma frase retirada
aleatoriamente do array de frases mantido em memória;
iv. Caso a mensagem lida do cliente não corresponda a nenhuma das referidas
anteriormente, o servidor deve responder com ‘PROTOCOL_ERROR’.
b. Cliente:
i. O cliente deve começar por pedir um comando ao utilizador. Este
comando será enviado pela rede até ao servidor.
ii. Após o envio do comando, deve aguardar por uma resposta do servidor.
Se esta resposta for ‘PROTOCOL_ERROR’, deve imprimir uma mensagem
user-friendly. Caso contrário, deve imprimir a mensagem recebida do
servidor. A aplicação termina após a impressão da mensagem recebida.

Aspetos adicionais da implementação:


- Os detalhes de protocolo e ligação descritos nos pontos acima devem ser totalmente
respeitados;
- Deve usar as classes DataOutputStream/DataInputStream para ler e escrever Strings
em ambas as aplicações (usando os métodos readUTF e writeUTF), tal ilustrado no
código exemplo.
- Não é necessário, neste exercício, implementar tratamento de exceções no cliente e
servidor (i.e., não é necessário usar blocos try/catch).

18/21
45. F Altere o cliente/servidor que implementou no exercício anterior de acordo com os
seguintes requisitos:
• O cliente passa a executar em ciclo. Em cada iteração o programa pede um comando
ao utilizador.
• Se o comando inserido for ‘quote’ ou ‘q’ (case-insensitive) a mensagem é enviada para
o servidor. Caso contrário, é pedida uma nova mensagem ao utilizador repetindo-se
a análise para envio.
• Sempre que o utilizador inserir ‘exit’ (e apenas neste caso) a aplicação cliente envia
essa mensagem para o servidor e termina.

Note que, em casos reais e como este exercício ilustra, quando construímos aplicações
distribuídas, não é apenas o servidor que deve estar preparado para lidar com casos de
erro (que podem surgir, por exemplo, devido a um bug no cliente). Também o cliente
deve impedir que mensagens inválidas sejam enviadas para o servidor. Isto permite
diminuir o tráfego na rede, evita que o servidor efetue processamento desnecessário e
não expõe o servidor a eventuais casos limite (para os quais pode não estar devidamente
preparado).

19/21
4. Remote Method Invocation Semana 13 – Semana 16

Objetivos:
• Criação de sistemas distribuídos simples baseados em Java RMI;
• Exploração de mecanismos básicos para tolerância a falhas em aplicações distribuídas;
Requisitos:
• Conceitos dados nas aulas teórico-práticas.
Material de Apoio:
• Slides das aulas teórico-práticas.

46. F Usando o código anexo a este documento como base (os ficheiros na diretoria “4-
code-rmi”), implemente uma calculadora distribuída que permita realizar as 4 operações
aritméticas simples usando Java RMI. A implementação deve cumprir os seguintes
requisitos:
• A aplicação servidor (MathServer) lança o RMI Registry no porto 8000;
• O servidor coloca no Registry um objecto remoto associado ao nome
‘aMinhaCalculadoraDistribuida’;
• A aplicação cliente executa em ciclo infinito. Em cada iteração, o utilizador da
aplicação cliente insere operandos e operador e, após a introdução destes dados, é
invocado o respectivo método remoto, disponibilizado pelo objeto remoto do
servidor. Assuma que não há erros na introdução destes dados.

Tolerância a falhas: Se numa dada iteração existir uma falha na comunicação com o
servidor, a aplicação cliente deve aguardar 3 segundos e voltar a tentar executar a
operação remota. Pode simular falhas de comunicação terminando o servidor no Eclipse,
ou pressionando Ctrl^C se estiver a executar na linha de comandos.

Para fazer a Thread atual da sua aplicação cessar a execução temporariamente pode
utilizar o seguinte código:

try
{
Thread.sleep(3000); // sleeps for 3 seconds
}
catch (InterruptedException e1)
{
// do nothing
}

20/21
47. F Altere agora o exercício anterior para permitir as seguintes funcionalidades.
a. As operações do servidor passam a aceitar como argumento uma variável do tipo
Operands – uma classe que deve agora criar e que servirá como contentor dos
operandos que circulam entre cliente e servidor. Não se esqueça que a sua nova
classe tem de ser Serializável.
b. O servidor passa a guardar um histórico dos operandos que recebe. Isto é, por
cada operação executada no servidor, é adicionada uma nova entrada no histórico
que contém a informação enviada pelo cliente. Para manter este histórico pode,
por exemplo, usar a classe ArrayList.
c. Crie um método, disponível para invocações remotas, que devolva o histórico da
calculadora (i.e., devolve uma lista de objetos Operands). Não se esqueça de testar
o seu novo método!

21/21

Você também pode gostar