Exercícios para Prova 1

Questão 1

Escreva um programa que leia uma lista contendo o peso de uma série de indivíduos em um vetor denúmeros reais. A lista possui 150 elementos. Depois que a lista foi toda inserida o programa deve procurar e imprimir qual a posição no vetor onde está o menor peso.

Abaixo tem um exemplo de como gerar um peso aleatório para inicialização do vetor.


In [2]:
import java.util.Random;

Random rand = new Random();

double r = rand.nextGaussian()*10 + 60; //Valor em distribuição Gaussiana com média 60 e desvio padrão 10. 
System.out.println(r)


63.58877981799239

Resposta 1


In [10]:
import java.util.Random;

Random rand = new Random();

double[] weights = new double[150];

for (int i=0; i < 150; i++)
{
    weights[i] = rand.nextGaussian()*10 + 60;
}

double min = Double.POSITIVE_INFINITY;

for (int i=0; i < 150; i++)
{
    if (weights[i] < min) {
        min = weights[i];
    } 
}

System.out.println(min);


38.760579320451264

Questão 2

A linguagem Java dispõe de um suporte nativo a vetores, que exige a definição de seu tamanho nomomento da instanciação. Depois de instanciado, o tamanho do vetor não pode ser modificado. Escreva uma classe chamada Vetor cujos objetos simulem vetores de tamanho variável. A classe define osseguintes métodos:

Método Descrição
construtor recebe como parâmetro o tamanho inicial do vetor
insert recebe como parâmetro uma string e a coloca na próxima posição disponível do vetor; note que o vetor cresce automaticamente, portanto, se a inserção ultrapassar o tamanho inicial estabelecido na criação, por exemplo, o vetor deve aumentar seu tamanho automaticamente.
get recebe como parâmetro uma posição do vetor e retorna a string que estiver naquela posição; se a posição não estiver ocupada ou ultrapassar o tamanho do vetor, este método retorna nulo
size retorna o número de elementos inseridos no vetor (independente do tamanho do mesmo)

O java dispõe de classes – tal como a Vector – que realizam a tarefa solicitada nesta questão. Taisclasses não devem ser usadas. É possível resolver esta questão apenas usando o sistema de vetorespreexistente do Java, sem nenhum comando especial extra

Resposta 2


In [3]:
public class MyVector {
    
    int totalSize;
    String [] vec;
    int size = 0; // variable to track the last position with value in the vector
    
    public MyVector(int size) {
        this.totalSize = size;
        this.vec = new String[this.totalSize];
    }
    
    public void doubleSize() {
        String[] auxVec = new String[this.totalSize*2];
        
        for (int i=0; i < this.totalSize; i++)
        {
            auxVec[i] = this.vec[i];
        }
        
        this.totalSize = this.totalSize*2;
        this.vec = auxVec;
    }
    
    public void insert(String s) {
        
        if (size == totalSize)
            doubleSize();
        
        this.vec[size] = s;
        size++;
    }
    public String get(int p) {
        if (p >= size) {
            return null;
        }
        
        return vec[p];
    }
    
    public int size() {
        return this.size;
        
    }
    
}

MyVector v = new MyVector(2);
v.insert("oi");
System.out.println(v.get(0));
System.out.println(v.get(1));
v.insert("olá");
v.insert("valor extra");
System.out.println(v.get(2));
v.insert("outra string");
System.out.println(v.get(3));


oi
null
valor extra
outra string

Questão 3

Dada uma classe Equipamento na qual cada objeto representa um conjunto de N equipamentos de uma empresa com seus respectivos valores, cujo diagrama UML está representado a seguir:

Método Descrição
construtor recebe como parâmetro o número de equipamentos e cria um vetor de valores do respectivo tamanho
getNumeroEquipamentos retorna o número de equipamentos
getValor recebe como parâmetro o número do equipamento (começando de zero) e retorna seu valor.
setValor recebe como parâmetro o número do equipamento e seu valor e o registra

Cada equipamento possui um código numérico sequencial, começando de zero, que corresponde a sua posição no vetor.Escreva uma classe, herdeira da classe Equipamento, denominada EquipamentoCorrigido em que cada objeto representa os mesmos equipamentos com valor corrigido, conforme diagrama UML parcialrepresentado anteriormente.Todo equipamento só é corrigido anualmente no mês em que foi comprado, por este motivo a classe deve acrescentar para cada equipamento um registro do seu mês de compra. Além disto, deve possuir os métodos:

Método Descrição
construtor recebe como parâmetros o número de equipamentos e o mês corrente.
getMesCompra recebe como parâmetro o número do equipamento (começando de zero) e retorna seu mês de compra.
setMesCompra recebe como parâmetro o número do equipamento e seu mês de compra e o registra.
corrige este método recebe como parâmetro apenas o percentual de correção e corrige todos os equipamentos cujo mês de compra seja igual ao mês corrente; O objeto deve manter registrado em um atributo o mês corrente. Cada vez que este método é chamado, após a correção, o mês é incrementado de um e, se estiver em dezembro, retorna para janeiro
substitui recebe como parâmetro um outro objeto da classe EquipamentoCorrigido e substitui o valor e o mês de compra de todos os equipamentos do objeto corrente pelos do objeto recebido como parâmetro; a operação só será realizada se ambos os objetos possuírem o mesmo número de equipamentos

Note que o atributo “valor” da classe Equipamento é privado, portanto, só poderá ser acessadoindiretamente, até mesmo pela classe herdeira.

Resposta 3


In [11]:
public class Equipamento
{
    int [] valor;
    int NumeroEquipamentos;
    public Equipamento (int size){
        this.valor = new int[size];
        this.NumeroEquipamentos = size;
    }
    
    public int getNumeroEquipamentos() {
        return this.NumeroEquipamentos;
    }
    
    public int getValor(int numero) {
        return this.valor[numero];
    }
    
    public void setValor(int numero, int valor)
    {
        this.valor[numero] = valor;
    }
}

public class EquipamentoCorrigido extends Equipamento
{
    int [] mesCompra; //Armazena mês de compra de cada equipamento [1-12]
    int mesCorrente;
    
    public EquipamentoCorrigido(int numeroTotal, int mesCorrente)
    {
        super(numeroTotal);
        this.mesCompra = new int[numeroTotal];
        this.mesCorrente = mesCorrente;
    }
    
    public int getMesCompra(int numero) {
        return this.mesCompra[numero];
    }
    
    public void setMesCompra(int numero, int mes) {
        this.mesCompra[numero] = mes;
    }
    
    public void corrige(int percentual) {
        for (int i = 0; i < this.getNumeroEquipamentos(); i++) {
            int corrigido = getValor(i);
            if (this.mesCompra[i] == this.mesCorrente)
            {
                corrigido *= percentual/100;
                setValor(i, corrigido);
            }
        }
        this.mesCorrente++;
    }
    
    public int getMesCorrente(){
        return this.mesCorrente;
    }
    
    public void setMesCorrente(int mes){
        this.mesCorrente = mes;
    }
    
    public void substitui(EquipamentoCorrigido ec) {
        
        if (this.getNumeroEquipamentos() == ec.getNumeroEquipamentos()){
            for (int i = 0; i < this.getNumeroEquipamentos(); i++) {
                this.setMesCompra(i, ec.getMesCompra(i));
                this.setValor(i, ec.getValor(i));
                this.setMesCorrente(ec.getMesCorrente());
            }
        }    
    }
}