Cotação: 15 valores Duração: 2h30 Exame sem consulta
Nome: ________________________________________________________ Número: _____________
1
Considere o seguinte código e responda às questões enunciadas.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public class Carro {
String matricula; int quilometragem; double velocidade;
public Carro (String matricula) { matricula = matricula;
quilometragem = 0; velocidade = 0; }
public void acelera() { velocidade ++;
} }
a) Os elementos matricula, quilometragem e velocidade designam-se por atributos da classe.
b) Se quisermos que a expressão da linha 8 seja alterada de modo a afectar a matricula da instância do Carro, como deveríamos reescrevê-la? this.matricula = matricula
c) acelera() é um método da classe. Quanto a Carro(String matricula), designa-se mais especificamente por um construtor da classe.
d) Se quisermos que o comportamento de acelera(), para além de aumentar a velocidade passe também a retornar o seu valor actual, como deveríamos reescrever o seu código?
public double acelera() { velocidade ++;
return velocidade; }
e) Escreva um método chamado contaquilometros para se acrescentar à classe que, dado o número de quilómetros percorrido numa viagem, actualize e retorne a quilometragem do Carro.
public int contaquilometros (int quilometros) { quilometragem += quilometros;
return quilometros; }
2
Complete o seguinte programa com as expressões adequadas.3
Considere o seguinte programa e responda às duas questões colocadas.a) Que vector resulta da execução de int[] resultado = fazCoisas(new int[] {1, 2, 3, 4, 5, 6}); ?
[ 2, 2, 4, 1, 6, 1 ]
b) Diga quais são as duas características que o vector parâmetro de entrada deverá ter - e que deverão estar no contrato - para que o programa funcione sem erros.
- O vector deve ter um número par de elementos (senão dá erro na última iteração do ciclo pois não existe vector[i+1]).
- O valor das posições de índice par devem ser diferentes de zero (senão dá erro na divisão). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public class Dado {
private Random gerador; private int numeroFaces; private int faceVoltadaAcima;
public Dado( int n) { gerador = new Random (); numeroFaces = n;
}
public void lancar(){
faceVoltadaAcima = gerador.nextInt( numeroFaces ) + 1; }
public int obterValor(){ return faceVoltadaAcima; } } 1 2 3 4 5 6 7 8 9 10 11 12 13
public int[] fazCoisas(int[] vector) {
int[] novoVector = new int[vector.length];
for (int i=0; i<vector.length; i++) { if (i%2 == 0)
novoVector[i] = vector[i+1]; else
novoVector[i] = vector[i] / vector[i-1]; }
return novoVector; }
4
Escreva um método int ultimoNulo(double [] v, double delta) que encontre o índice do último elemento de valor 0.0 num vector de números reais.public static int ultimoNulo(double [] v, double delta) {
for (int i = v.length - 1; i > 0; i--) { if (v[i] > -delta && v[i] < delta)
return i; }
return 0; }
5
Mostre como o programa anterior está correcto, escrevendo a evolução dos valores de todas as variáveis quando se aplica o método ultimoNulo ao vector seguinte:[1.4, 0.0, 4.7, 0.0, 2.6, 5.8], com delta = 0.001.
6
Escreva um método int geraNumero(int max) que retorne um número aleatório entre um e max utilizando a classe Random (não se esqueça que o método nextInt(n) desta classe retorna um inteiro entre zero e n-1).public static int geraNumero(int max) {
Random gerador = new Random();
return gerador.nextInt(max) + 1;
}
7
Preencha os comentários Javadoc em falta e proponha um bom nome para o seguinte método: /*** Este método verifica se o número j existe num vector de inteiros
* @param vector O vector de inteiros a pesquisar
* @param j O número a encontrar
* @return true se o número existe no vector, false caso contrário
*/
public boolean existe (int[] vector, int j){ for (int i: vector) {
if (i == j)
return true; }
return false; }
8
Escreva um programa int[] chaveDoTotoloto() que, recorrendo aos dois métodos anteriores, retorne uma chave válida para o Totoloto (ou seja, seis números entre 1 e 49 não repetidos). O programa deverá recorrer a um vector de seis inteiros para armazenar a chave.private static int[] chaveDoTotoloto() {
int[] chave = new int[6];
for (int i = 0; i < chave.length; i++) { int num = 0;
do {
num = geraNumero(49);
} while (existe (chave, num));
chave[i] = num; }
return chave; }
9
Pretende-se agora criar algum código de suporte a uma aplicação para uma pizzaria no que diz respeito às encomendas efectuadas pelos clientes. Comece por completar a seguinte classe:public class Ingrediente { private String nome;
private boolean ehBase; // Indica se é base ou recheio da pizza private double preco;
public Ingrediente (String nome, boolean base, double preco) {
this.nome = nome;
this.ehBase = base;
this.preco = preco; }
public String getNome() { return nome;
}
public boolean isBase() {
return ehBase;
}
public double getPreco() {
return preco; }
}
10
Crie uma classe Pizza que tenha como atributos um vector de ingredientes e a indicação do tamanho da pizza (que pode ser pequena, média ou grande) com um tipo de dados apropriado. Escreva um construtor com dois parâmetros - o tamanho da pizza e o número de ingredientes – que inicialize o tamanho e crie um vector com a dimensão apropriada para conter os ingredientes.public class Pizza {
Ingrediente[] ingredientes;
char tamanho; // é discutível a utilização de char // (seria preferível um tipo enumerado)
public Pizza (char tamanho, int numIngredientes) { this.tamanho = tamanho;
ingredientes = new Ingrediente[numIngredientes]; }
11
Escreva um método que permita acrescentar um ingrediente à pizza. Deverá percorrer o vector de ingredientes até encontrar a primeira posição com valor null e adicionar o ingrediente nessa posição. Se não existir qualquer posição null o ingrediente não é adicionado.public void adiciona(Ingrediente ingrediente) {
int i = 0; while (i < ingredientes.length) { if (ingredientes[i] == null) { ingredientes[i] = ingrediente; return; } i++; } }
12
Escreva um método que permita obter o preço total da pizza, somando o preço de todos os seus ingredientes. Se a pizza tiver mais do que dois recheios (ingredientes que não são base) deve ter um desconto de 10% do preço total.public double precoTotal() {
double total = 0.0; int recheios = 0;
for (Ingrediente ing : ingredientes) { total += ing.getPreco();
if ( !ing.isBase() ) recheios ++; }
return recheios > 2 ? total : total * 0.9; }
13
Escreva um método boolean ehPizza(Pizza pizza) que determine se o conjunto de ingredientes de uma pizza é válido. Para que isso aconteça, a pizza deve conter um e um só ingrediente que seja base. Para além disso, uma pizza pequena deve ter exactamente dois recheios, uma média deve ter três ou quatro recheios e uma grande deve ter pelo menos cinco recheios.public boolean ehPizza (Pizza pizza) {
int bases = 0, recheios = 0;
for (Ingrediente ing : pizza.ingredientes) { if (ing.isBase()) bases ++; else recheios ++; } if ((bases != 1) ||
(pizza.tamanho == 'P' && recheios != 2) ||
(pizza.tamanho == 'M' && (recheios < 3 || recheios > 4)) || (pizza.tamanho == 'G' && recheios < 5))
return false;
return true; }
14
Escreva um método double totalPedido(Pizza[] pizzas) que dado um vector de Pizzas (que representa um pedido de um cliente) retorne o preço total do pedido desde que todas as pizzas tenham um conjunto válido de ingredientes. Caso alguma pizza não seja válida, o pedido irá ser anulado e a função deverá retornar um número negativo.public double totalPedido(Pizza[] pizzas) {
double total = 0.0;
for (Pizza pizza : pizzas) {
if (!ehPizza(pizza)) return -1; total += pizza.precoTotal(); } return total; }
15
Teste parcialmente o seu código com uma função static void testaEncomenda(). O programa deverá pedir dados ao utilizador, que os introduzirá pelo teclado. Inicialmente deverá ser pedido ao utilizador o número de pizzas pretendidas, sendo criado um vector de pizzas com essa dimensão. Seguidamente, e para cada pizza, o utilizador deverá indicar o tamanho, o número de ingredientes e para cada ingrediente o nome e o preço. Considere que o primeiro ingrediente introduzido para cada pizza será a base. No final, o programa deverá indicar o preço total do pedido caso este seja válido, indicando uma mensagem de erro caso contrário.public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Introduza o nº de pizzas: "); int numPizzas = scan.nextInt();
Pizza[] pizzas = new Pizza[numPizzas];
for (int i = 0; i < pizzas.length; i++) {
System.out.println("Tamanho da pizza " + (i+1) + ": "); char tam = scan.next().charAt(0);
System.out.println("Nº de ingredientes da pizza " + (i+1) + ": "); int ing = scan.nextInt();
pizzas[i] = new Pizza(tam, ing);
for (int j = 0; j < ing; j++) {
System.out.println("Nome do ingrediente " + (j+1) + ": "); String nome = scan.next();
System.out.println("Preço do ingrediente " + (j+1) + ": "); Double preco = scan.nextDouble();
Boolean base = j == 0 ? true : false;
Ingrediente novoIngrediente = new Ingrediente(nome, base, preco); pizzas[i].adiciona(novoIngrediente);
} }
Double total = totalPedido(pizzas);
if (total < 0)
System.out.print("Pedido inválido!"); else
System.out.print("Total: " + total); }