Lab1 Adriano Brasileiro

aluno: Adriano Brasileiro Silva
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 06/08/2008 (2)

Introdução

Nesta prática foram criadas diversas classes, cada uma com uma função diferente, a fim de podermos ter uma introdução à programação orientada a objetos e à linguagem java.

Desenvolvimento

Seis classes foram criadas, conforme o que foi pedido:

RelaQueue
Aluno
AlunoSafoPreguicoso
AlunoEsforcado
Relatorio
Professor

Classe RelaQueue

Esta classe teve por fim criar uma fila de objetos do tipo Relatorio, de modo que tanto os alunos criados pudessem interagir com ela (adicionando relatórios) quanto o professor (retirando relatórios). A fila criada utilizou o algoritmo mostrado em sala de aula, conforme podemos ver a seguir:

public class RelaQueue
{
 
    private Relatorio[] array = new Relatorio[10];     //aqui são definidas as variáveis, incluindo
    private int inicio;                                //a array que servirá de fila
    private int fim;
    private Relatorio valor;
 
    public RelaQueue()
    {
        inicio = 0;                            //aqui as variáveis são inicializadas
        fim = 0;
    }
 
    public void queue(Relatorio rela)                //este é o método que, chamado, enfileira um
    {                                                //relatório passado como argumento
        array[fim] = rela;
        fim = (fim + 1) % 10;
    }
 
    public Relatorio dequeue()        //este método retira um relatório da fila e retorna seu valor
    {
        if(inicio != fim)
        {
            valor = array[inicio];
            inicio = (inicio + 1) % 10;
            return valor;
        }
        else return null;
    }
}

Note que o método dequeue verifica se a fila está vazia antes de desenfileirar um Relatorio. Isso é importante para a classe Professor, como veremos adiante.

Classe Aluno

Esta classe serve principalmente para os alunos criarem os relatórios. Existem os dois tipos de alunos mencionados anteriormente, com atributos diferentes. Cada aluno criado, ao realizarem o método fazEEntregaRelatorio cria um relatório baseado em seus atributos e o enfileira na fila criada anteriormente. O código dessas classes são as seguintes:

Classe abstrata Aluno:

public abstract class Aluno
{
 
    private int conhecimento;
    private String nome;
    private RelaQueue queue;
 
    public Aluno(String x, RelaQueue y)
    {
        nome = x;
        queue = y;
        conhecimento = 0;
    }
 
//o método fazEEntregaRelatorio calcula os valores dos parâmetros qualidade e originalidade, baseado
//nos atributos dos alunos e repassa esses parâmetros no relatório enviado para a fila RelaQueue
 
    public void fazEEntregaRelatorio()
    {
        double qualidade = (2 * this.getDedicacao() + 1 * this.getInteligencia() ) / 3 ;
        double originalidade = (1 * this.getDedicacao() + 2 * this.getInteligencia() ) / 3 ;
        queue.queue(new Relatorio(qualidade, originalidade, this));
        conhecimento++;            //cada vez que o aluno entrega um relatório, seu conhecimento aumenta
    }
 
    public int getConhecimento()
    {
        return conhecimento;
    }
 
    public abstract double getInteligencia();    //estes dois métodos são abstratos e são substituidos
                                                 //por suas subclasses, pois retornam atributos que dependem
    public abstract double getDedicacao();       //dessas classes
 
    public String getNome()
    {
        return nome;
    }
 
}

As classes seguintes herdam o comportamento da classe Aluno e substituem seus métodos abstratos.

Classe AlunoSafoPreguicoso:

import java.util.*;
 
public class AlunoSafoPreguicoso extends Aluno
{
    private double inteligencia;
    private double dedicacao;
 
    public AlunoSafoPreguicoso(String nome, RelaQueue queue)
    {
        super(nome, queue);
        inteligencia = 1;
    }
 
    public double getInteligencia()    //este método retorna a variável inteligência desta classe, que sempre vale 1
    {
        return inteligencia;
    }
 
    public double getDedicacao()    //já este método retorna um número aleatório ente 0 e 0.5
    {
        Random generator = new Random();
        dedicacao = generator.nextDouble();
        return dedicacao * 0.5;
    }
 
}

Para esta classe foi necessário importar o pacote de utilidades do java, a fim de gerar um número aleatório.

Classe AlunoEsforcado:

public class AlunoEsforcado extends Aluno
{
    private double inteligencia;
    private double dedicacao;
 
    public AlunoEsforcado(String nome, RelaQueue queue)
    {
        super(nome, queue);
        inteligencia = 0.5;
        dedicacao = 1;        
    }
 
//diferente da classe anterior, os métodos desta classe sempre retornam valores fixos, conforme definidos acima
 
    public double getInteligencia()
    {
        return inteligencia;
    }
 
    public double getDedicacao()
    {
        return dedicacao;
    }
 
}

Em ambas as classes derivadas da classe Aluno, foi necessário colocar no construtor o construtor da superclasse, com a função super.

Classe Relatorio

Cada Relatorio tem uma qualidade, uma originalidade e um autor, parâmetros estes que podem ser obtidos através de seus métodos getAtributo. Quando o professor retira um relatório da fila de relatórios, este vêm com os atributos já citados para que o professor possa corrigí-lo.

public class Relatorio
{
    private Aluno aluno;
    private double qualidade;
    private double originalidade;
 
    public Relatorio(double x, double y, Aluno z)
    {
        qualidade = x;
        originalidade = y;
        aluno = z;
    }
 
//a partir do relatório, podemos obter sua qualidade, sua originalidade e seu autor através dos métodos abaixo
//eles serão necessários para quando o professor for corrigir estes relatórios
 
    public double getQualidade()
    {
        return qualidade;
    }
 
    public double getOriginalidade()
    {
        return originalidade;
    }
 
    public Aluno getAluno()
    {
        return aluno;
    }
 
}

Classe Professor

Com o método corrigirRelatorios, o professor vai retirando Relatorios da fila, corrige-os com o método corrigirRelatorio e imprime o resultado no formato indicado. Caso o professor retire um relatório da fila e esta retorne null, o professor pára de corrigir os relatórios, pois a fila está vazia. Aqui também foi necessário incluir o pacote de utilitários para que se pudesse gerar um número aleatório.

import java.util.*;
 
public class Professor
{
 
    private RelaQueue queue;
 
    public Professor(RelaQueue x)
    {
        queue = x;
    }
 
//tendo um relatório, que é passado no método corrigirRelatórios, o método seguinte calcula sua nota,
//conforme pedido na prática, e retorna esse valor
 
    private double corrigirRelatorio(Relatorio rela)
    {
        Random generator = new Random();
        double r = generator.nextDouble();
        double nota = ( rela.getQualidade() + rela.getOriginalidade() + r ) / 3 * 10;
        return nota;
    }
 
//o método seguinte vai esvaziando a fila de relatórios até que ela fique totalmente vazia, corrigindo
//os relatórios no processo e exibindo no terminal essas notas.
 
    public void corrigirRelatorios()
    {
        Relatorio rela = queue.dequeue();
        while(rela != null)
            {
                System.out.println(rela.getAluno().getNome() + ": " + corrigirRelatorio(rela));
                rela = queue.dequeue();
            }
    }
 
}

Resultados

Criadas estas classes e compiladas, e incluindo a classe de teste, obtemos o seguinte diagrama de classes:

lab11.png

Por fim, ao executar a classe de testes, obtemos o seguinte resultado:

lab12.png

com a janela de teste mostrando que o mesmo foi bem sucedido e a janela de terminal exibindo os resultados das notas dos relatórios dos três alunos restantes.

Conclusão

Houveram algumas dificuldades na realização desta prática, principalmente devido à falta de experiência com a linguagem e com o tipo de programação em geral. Na época em que foi passado o laboratório ainda não haviam sido passados alguns conceitos necessários para a realização da prática, como o conceito de construtor e sua finalidade. No entanto, após ter feito esta prática, acredito estar mais seguro para realizar práticas futuras.

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License