Lab1 Leonardo Bruno

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

Introdução

Foi simulado uma situação muito comum em meios academicos. Foram criadas duas classes principai: aluno e professor. No contexto da classe aluno, foram criadas duas subclasses: uma de aluno safo e outra de um aluno esforçado. Também foi criada uma classe que descreve relatorios e uma classe que representará uma fila de relatorios. Assim, os alunos deverao fazer o relatorio e colocá-lo na fila. O professor deverá retirar um relatório de cada vez da frente da fila, corrigí-lo e lançar uma nota para o aluno que fez aquele relatório. O professor deve corrigir todos os relatorios que estiverem na fila e lançar a nota de todos os alunos.

Desenvolvimento

Cite os principais trechos do código usando:

Foi primeiramente criada a classe aluno. Esta classe terá como variaveis de instacia o conhecimento, o nome, e a fila de relatorios. O principal metodo da classe sera o que faz e entrega os relatorios. O código segue abaixo:
 
public abstract class Aluno
{
    // variaveis de instancia
    private int conhecimento=0;
    private String nome;
    public RelaQueue queue;
 
    public void setNome(String n) { nome=n;} //Configurador que seta o nome de um aluno
    abstract double getDedicacao();
    abstract double getInteligencia();
    public String getNome() //contrutor da classe Aluno
    {
 
        return nome;
    }
 
    public int getConhecimento()  //metodo que retorna o conhecimento do aluno, uma vez que esta eh uma variavel privada
    {
        // put your code here
        return conhecimento;
    }
 
    public void fazEEntregaRelatorio() //Metodo que manda o Aluno fazer e entregar um realtorio
    {
        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=conhecimento+1;
    }
}
A seguir, foram criadas duas subclasses de Aluno, uma para aluno safo e outra para o aluno esforcado.
A do aluno safo segue logo abaixo, e ela tem como variavel de instancia a inteligencia do aluno safo que é máxima e igual a 1. O construtor dessa classe recebe o nome e a fila de relatorios como parametros.  A dedicacao do aluno safo sera algo aleatorio mas sempre baixo em comparacao com a do aluno esforcado.
 
public class AlunoSafoPreguicoso extends Aluno
{
    // varivel de instancia
    private double inteligencia=1;
 
    //contrutor da subclasse do aluno safo
    public AlunoSafoPreguicoso(String n, RelaQueue q)
    {
        this.setNome(n);
        queue=q;
    }
 
    //metodo que retorna a dedicacao aletoria do aluno safo   
    public double getDedicacao()
    {
 
       Random generator = new Random();
        double r = generator.nextDouble();
        return r * 0.5;
    }
    //metodo publico que retorna a variavel protegida inteligencia
    public double getInteligencia()
    {
     return inteligencia;        
    }
}
A seguir segue a classe do aluno esforcado. Aqui, teremos como variaveis de instancia a inteligencia que é igual a metade da inteligencia do aluno safo e a dedicacao que é sempre igual a 1.
 
import java.util.*;
 
public class AlunoEsforcado extends Aluno
{
    // variaveis de instancia
    private double inteligencia=0.5;
    private double dedicacao=1;
 
    //Metodo construtor da subclasse do aluno esforcado
    public AlunoEsforcado(String n, RelaQueue q)
    {
        // initialise instance variables
        this.setNome(n);
        this.queue=q;
    }
 
    //metodo publico que retorna a inteligencia do aluno
   public double getInteligencia()
    {
     return inteligencia;        
    }
 
    //metodo publico que retorna a dedicação do aluno esforcado
    public double getDedicacao()
    {
     return dedicacao;        
    }
}
Então, criamos a classe professor. Como variavel de instancia teremos apenas a fila de relatorios. Teremos varios metodos, mas os principais serão aqueles que corrigirao os relatorios e atribuirão as notas. O professor irá retirar o relatorio da fila, corrigir, e atribuir uma nota. Corrigirá até que a fila esteja vazia.
 
public class Professor
{
    //variavel de instancia    
    public RelaQueue queue;
 
    //metodo construtor da classe Professor
    public Professor(RelaQueue q)
    {
        this.queue=q;
 
    }
 
    //metodo que retorna um numero de 0 a 1
    public double fatorAleatorioDe0a1()
    {
        Random generator = new Random();
        double r = generator.nextDouble();
        return r ;
    }
 
    //metodo privado que corrige um relatorio
    private double corrigeRelatorio(Relatorio rela)
    {
        double nota = (( rela.getQualidade() + rela.getOriginalidade() + fatorAleatorioDe0a1() ) / 3) * 10;
       return nota;       
    }
 
    //metodo publico que faz com que o professor corriga toda a fila de relatorios   
    public void corrigirRelatorios()
    {
      Aluno a;
      String nome;
      double nota;        
      Relatorio r;
      r=queue.dequeue();
 
      while(r!=null)
      {
          nota=corrigeRelatorio(r);
          a=r.getAluno();
          nome=a.getNome();
          System.out.println(nome+": "+nota);
 
          r=queue.dequeue();          
        }               
    }    
}
Uma classe para o relatorio tambem foi criada. Cada relatorio terá uma qualidade, uma originalidade e um autor. Estas serão as variáveis de instancia da classe. Há metodos de consulta destas variaveis.
 
public class Relatorio
{
    //variavies de instancia
    private double qualidade;
    private double originalidade;
    private Aluno autor;
 
    //construtor da classe relatorio
    public Relatorio(double q, double o, Aluno a)
    {
        //incializacao das variaveis de instancia
        qualidade = q;
        originalidade = o;
        autor = a;
    }
 
    //metodo publico que retorna a qualidade do relatorio
    public double getQualidade()
    {
        return qualidade;
    }
 
    //metodo publico que retorna a originalidade do relatorio
    public double getOriginalidade()
    {
        return originalidade;
    }
    //metodo publico que retorna o aluno que fez o relatorio
    public Aluno getAluno()
    {
        return autor;
    }
}
Por último, foi feita a classe mais importante do código, a classe da fila de relatorios. A fila de relatorios será ciclica, e será controla por duas variaveis que representão o fim e o inicio da fila. Cabem no máximo dez relatórios nesta fila. Há um método para adicionar um relatório na fila, e outro para retirar um relatorio da frente da fila. Caso a fila esteja vazia este metodo irá avizar retornando um null.
 
public class RelaQueue
{
    // variaveis  de instancias
    private Relatorio[] array = new Relatorio[10];
    private int inicio=0;
    private int fim=0;
 
    //metodo construtor da classe relaqueue
    public RelaQueue()
    {
        // inicializacao das variaveis de instancia
        fim=0;
        inicio=0;
    }
 
    //metodo que poe um relatorio na fila
    public void queue(Relatorio r)
    {
        array[fim]=r;
        fim=(fim+1)%10;        
    }
 
    // metodo que retira o relatorio da frente da fila e o retorna
    public Relatorio dequeue()
    {
        if(fim-inicio==9||inicio-fim==1) return null;
        else
        {
        Relatorio r;
        r=array[inicio];
        inicio=(inicio+1)%10;
        return r;
       }
    }
}
lab1.JPG
lab1_2.JPG

Conclusão

Este laboratório foi uma ótimo oportunidade para um primeiro contato com o java. Aparentemente complicado para iniciantes, mas de muita ajuda, pois possibilitou o exercício e a aplicação de modo mais concreto dos conceitos envolvidos na progaramação orientada a objetos. Após este labotório pude entender melhor como funciona e começar a entender qual a filosofia deste estilo de programação. Não tenho nenhuma crítica a realizar. Gostei do laboratório, apesar de ter demandado uma considerável parcela de tempo.

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