aluno: Douglas Bokliang Ang Cunha
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 21/08/2008 (2)
Introdução
Neste primeiro laboratório foi feito um aplicativo em Java que representa a seguinte situação: alunos de dois diferentes tipos (safos e esforçados) fazem um relatório que fica guardado numa fila. Depois disso, os relatórios são retirados um a um (seguindo a ordem da fila) pelo professor, o qual deve seguir alguns parâmetros para retornar a nota final.
Desenvolvimento
Para simular essa situação em um programa em Java, foi necessário utilizar alguns conceitos de orientação objetos aprendidos em sala. Precisou-se criar diversas classes representando os diferentes elementos da situação (aluno, professor, relatório, fila de relatórios), assim como duas subclasses de aluno (a dos safos e a dos esforçados).
CLASSE RELA_QUEUE
Classe que implementa uma fila de relatórios.
Possui dois métodos, um para adicionar um elemento ao fim da fila (queue) e outro para remover um elemento do início da fila (dequeue).
public class RelaQueue {
Relatorio[] array = new Relatorio[10];
int inicio = 0;
int fim = 0;
//coloca um relatorio no fim da fila
public void queue (Relatorio elem) {
array[fim] = elem;
fim = (fim + 1) % 10;
}
//tira um relatorio da fila e o retorna
public Relatorio dequeue () {
if (inicio == fim) return null;
Relatorio valor = array[inicio];
inicio = (inicio + 1) % 10;
return valor;
}
}
CLASSE RELATÓRIO
Possui os valores de qualidade e originalidade do relatório de um referido aluno, que são mais tarde utilizados pelo Professor para dar as notas de cada um.
public class Relatorio {
private double qualidade;
private double originalidade;
private Aluno aluno;
//constructor
public Relatorio (double qualidade, double originalidade, Aluno aluno) {
this.aluno = aluno;
this.originalidade = originalidade;
this.qualidade = qualidade;
}
//getters
public Aluno getAluno() {
return aluno;
}
public double getOriginalidade() {
return originalidade;
}
public double getQualidade() {
return qualidade;
}
//setter
public void setAluno(Aluno aluno) {
this.aluno = aluno;
}
}
CLASSE ALUNO
Classe do tipo abstrata, uma vez que possui dois métodos abstratos que vão ser descritos dependendo da subclasse de aluno.
Objetos dessa classe possui as seguintes informações: nome e conhecimento, assim como a fila onde ele deve deixar seu relatório.
Possui um método que cria um relatório de acordo com as características do aluno (inteligência e dedicação) e coloca-o numa fila de relatórios.
public abstract class Aluno {
int conhecimento = 0;
String nome;
RelaQueue queue;
//constructor
public Aluno (String nome, RelaQueue queue) {
this.nome = nome;
this.queue = queue;
}
//metodo que calcula a qualidade e a originalidade do relatorio e usa esses parametros para
//criar um relatorio
public void fazEEntregaRelatorio () {
double qualidade = (2 * this.getDedicacao() + 1 * this.getInteligencia() ) / 3 ;
double originalidade = (1 * this.getDedicacao() + 2 * this.getInteligencia() ) / 3 ;
Relatorio rela = new Relatorio(qualidade, originalidade, this);
queue.queue(rela);
conhecimento++;
}
//getters
public int getConhecimento (){
return conhecimento;
}
public String getNome () {
return nome;
}
//metodos abstratos de aluno
public abstract double getInteligencia ();
public abstract double getDedicacao ();
}
SUBCLASSE ALUNO_SAFO_PREGUIÇOSO
Subclasse da classe abstrata Aluno descrita anteriormente. Possui duas caracterísitcas a mais: inteligência e dedicação, sendo que esta varia de 0 a 0.5 e aquela é sempre igual a 1.0.
Especifica os métodos abstratos da classe Aluno.
public class AlunoSafoPreguicoso extends Aluno {
double inteligencia = 1.;
public AlunoSafoPreguicoso (String nome, RelaQueue queue) {
super(nome,queue); //aproveita o constructor de Aluno
}
//metodos especificos da subclasse
public double getInteligencia () {
return inteligencia;
}
public double getDedicacao () {
return .5*Math.random();
}
}
SUBCLASSE ALUNO_ESFORÇADO
Outra subclasse da classe abstrata Aluno. Também possui as mesmas características adicionais em relação à classe Alunos: inteligência e dedicação, sendo que este possui valor 1.0 e aquele 0.5.
Especifica os métodos abstratos da classe Aluno.
public class AlunoEsforcado extends Aluno{
private double inteligencia = .5;
private double dedicacao = 1.;
public AlunoEsforcado (String nome, RelaQueue queue) {
super(nome,queue); //aproveita o constructor de Aluno
}
//getters
public double getInteligencia () {
return inteligencia;
}
public double getDedicacao () {
return dedicacao;
}
}
CLASSE PROFESSOR
Classe que recebe uma fila de relatórios (adicionados pelos alunos), e possui dois métodos para corrigí-los. O primeiro deles recebe um relatório e retorna a nota, ele é acessado pelo outro método, que tira cada um dos relatórios até que a fila fique vazia.
public class Professor {
private RelaQueue queue;
//constructor
public Professor (RelaQueue queue) {
this.queue = queue;
}
//metodo privado, retorna a nota do relatorio
private double corrigirRelatorio (Relatorio rela) {
double fatorAleatorioDe0a1 = Math.random();
return ( rela.getQualidade() + rela.getOriginalidade() + fatorAleatorioDe0a1 ) / 3 * 10;
}
//tira sempre o primeiro relatorio da fila e chama o metodo anterior para obter a nota
//faz isso ateh acabarem todos os relatorios da fila
public void corrigirRelatorios () {
Relatorio rela = queue.dequeue();
while (rela != null) {
double nota = this.corrigirRelatorio (rela);
System.out.println (rela.getAluno().getNome() + ": " + nota);
rela = queue.dequeue();
}
}
}
TESTE
O teste foi feito com o código pronto fornecido na instrução do laboratório. O resultado foi o seguinte:
Conclusão
Este primeiro laboratório foi importante principalmente para nos ambientar com a linguagem Java. Pode-se considerar que o nível de dificuldade não foi elevado, mas mesmo assim foi interessante por ter possibilitado um primeiro contato com a linguagem, assim como para aprender o conceito de herança.
Por favor, colora o código (use o botão code* para adicionar código colorido). Faltou executar testes de forma manual (você poderia ter feito um método main, por usar o Netbeans). Converta para BlueJ.