• Nenhum resultado encontrado

1 Considere o seguinte código e responda às questões enunciadas.

N/A
N/A
Protected

Academic year: 2021

Share "1 Considere o seguinte código e responda às questões enunciadas."

Copied!
8
0
0

Texto

(1)

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)

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; }

(3)

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.

(4)

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; }

(5)

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]; }

(6)

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; }

(7)

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; }

(8)

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); }

Referências

Documentos relacionados