sábado, 6 de abril de 2019

Lista de Exercícios em Java: Classes


Compartilhe!

Lista de Exercícios em Java: Classes

Lista de Exercícios 2

Classes

(Exercícios do professor André Santanchè.)

1. Escreva uma classe cujos objetos representam alunos matriculados em uma disciplina. Cada objeto dessa classe deve guardar os seguintes dados do aluno: matrícula, nome, 2 notas de prova e 1 nota de trabalho. Escreva os seguintes métodos para esta classe:

média: calcula a média final do aluno (cada prova tem peso 2,5 e o trabalho tem peso 2)
final: calcula quanto o aluno precisa para a prova final (retorna zero se ele não for para a final)

In [1]:
public class Aluno{

    private int matricula;
    private String nome;
    private double n1, n2, trabalho;
    
    public Aluno(int m, String n, double n1, double n2, double t){
        matricula = m;
        nome = n;
        this.n1 = n1;
        this.n2 = n2;
        trabalho = t;
    }
    
    public double media(){
        return ((n1+n2)*2.5+trabalho*2)/7;
    }
    
    public double aFinal(){
        double media = media();
        if(media<2.5 || media>=5)
            return 0;
            
        return 10-media; 
    }
}

//Para deixar o resultado para apenas duas casas decimais:
public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = Math.round(value);
    return (double) tmp / factor;
}

//Utilização
Aluno eu = new Aluno(123, "Léo", 8, 1, 5);
System.out.println("A média é: "+round(eu.media(),2)+" e é necessário mais "+round(eu.aFinal(),2)+" para ser aprovado.");
A média é: 4.64 e é necessário mais 5.36 para ser aprovado.

2. A linguagem Java dispõe de um suporte nativo a vetores, que exige a definição de seu tamanho no momento 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 os seguintes métodos:

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).

In [2]:
public class Vetor{

    int n = 0, 
        t = 0;
    String v[];

    public Vetor(int t){
    
        if(t<1)
            return;
            
        this.t = t;
        v = new String[t];
    }

    public void insert(String s){
        if(n+1>t)
            duplique();

        v[n++] = s;
    }
    
    private void duplique(){
        
        if(t<1)
            t = 1;
    
        t *= 2;
        String novo[] = new String[t];
        for(int i = 0; i<n; i++)
            novo[i] = v[i];
            
        v = novo;
    }
    
    public String get(int i){
    
        if(i<0 || i>n-1)
            return null;
        
        return v[i]; 
    }
    
    public int size(){
        return n;
    }
}

//Utilização
Vetor meuVetor = new Vetor(2);

System.out.println("Tamanho: "+meuVetor.size());
System.out.println("Posição 0: "+meuVetor.get(0));
System.out.println("Posição 1: "+meuVetor.get(1));
System.out.println("Posição 2: "+meuVetor.get(2));

System.out.println();

meuVetor.insert("Ser");
System.out.println("Tamanho: "+meuVetor.size());
meuVetor.insert("ou");
System.out.println("Tamanho: "+meuVetor.size());
meuVetor.insert("não ser");
System.out.println("Tamanho: "+meuVetor.size());

System.out.println();

System.out.println("Posição 0: "+meuVetor.get(0));
System.out.println("Posição 1: "+meuVetor.get(1));
System.out.println("Posição 2: "+meuVetor.get(2));
System.out.println("Posição 3: "+meuVetor.get(3));
Tamanho: 0
Posição 0: null
Posição 1: null
Posição 2: null

Tamanho: 1
Tamanho: 2
Tamanho: 3

Posição 0: Ser
Posição 1: ou
Posição 2: não ser
Posição 3: null

3. Crie uma classe VetorOrdenado que é uma variante da classe anterior, com as seguintes modificações e acréscimos:

insert: recebe uma string como parâmetro e a insere em uma posição tal que o vetor de nomes se mantenha sempre em ordem alfabética.
merge: recebe como parâmetro um outro objeto da classe VetorOrdenado e retorna um terceiro objeto da classe VetorOrdenado (criado dentro do método) que contém o merge do vetor corrente com aquele recebido como parâmetro.

In [3]:
public class VetorOrdenado{

    int n = 0, 
        t = 0;
    String v[];

    public VetorOrdenado(int t){
    
        if(t<1)
            return;
            
        this.t = t;
        v = new String[t];
    }

    public void insert(String s){
    
        int i;
        boolean achou = false;
        String aux = "", aux2;
        
        if(n+1>t)
            duplique();
        
        //Percorra todo o vetor v
        for(i = 0; i<n && !achou; i++){
            //Percorra os caracteres de s
            int k = 0;
            for(; k<s.length() && k<v[i].length() && !achou; k++){
            
                //Se o caractere k do elemento i de v for maior que caractere k de s
                if (Character.toLowerCase(v[i].charAt(k)) > Character.toLowerCase(s.charAt(k))){
                    achou = true;
                }
                else //Se for menor, vá para próxima palavra
                    if (Character.toLowerCase(v[i].charAt(k)) < Character.toLowerCase(s.charAt(k)))
                        break;
            }
            //Verifique se não achou porque s é igual a v[i-1] até a posição k-1
            //Nesse caso, s será colocado na posição i-1
            if(!achou)
                if(k>=s.length())
                    achou = true;
        }  
            
        aux = s;
        if(achou){

            aux = v[i-1];
            v[i-1] = s;

            for(int k = i; k < n; k++){
                aux2 = v[k];
                v[k] = aux;
                aux = aux2;
            }  
        }
        
        v[n++] = aux;
    }
    
    private void duplique(){
        
        if(t<1)
            t = 1;
    
        t *= 2;
        String novo[] = new String[t];
        for(int i = 0; i<n; i++)
            novo[i] = v[i];
            
        v = novo;

    }
    
    public String get(int i){
    
        if(i<0 || i>n-1)
            return null;
        
        return v[i];
    }
    
    public int size(){
        return n;
    }
    
    
    public VetorOrdenado merge(VetorOrdenado s){

        //Crie um vetor que possa comportar v e s.v[]
        int n2 = s.size();
        VetorOrdenado resultado = new VetorOrdenado(n+n2);

        for (int a = 0; a < n; a++)
            resultado.insert(v[a]);

        for (int a = 0; a < n2; a++)
            resultado.insert(s.get(a));

        return resultado;
    }
}

//Utilização
VetorOrdenado v1 = new VetorOrdenado(2);
VetorOrdenado v2 = new VetorOrdenado(2);

v1.insert("Mar");
v1.insert("Azul");
v1.insert("Aman");
v1.insert("Cor");
System.out.println("Tamanho de v1: "+v1.size());


v2.insert("Dia");
v2.insert("Ama");
v2.insert("Poema");
v2.insert("Verde");
v2.insert("Verdade");
v2.insert("Instante");
System.out.println("Tamanho de v2: "+v2.size());

VetorOrdenado v3 = v1.merge(v2);
System.out.println("Tamanho de v3: "+v3.size());

System.out.println();

for(int i = 0; i<v3.size(); i++)
    System.out.print(v3.get(i)+" ");
Tamanho de v1: 4
Tamanho de v2: 6
Tamanho de v3: 10

Ama Aman Azul Cor Dia Instante Mar Poema Verdade Verde