Lab2 Igor Aquino

aluno: Igor Oliveira Aquino
ano/sem: 2008/2o.
data do laboratório (4ª semana) : 06/08/2008 (2)

Introdução

Neste laboratório foi feita uma extensão do laboratório anterior. Foram adicionados novos comportamentos de alunos, os alunos agora podem ser classificados também por universidade, sendo que cada universidade tem características de comportamento distintas. Foi criada também uma classe Simulador, que recebe dados do usuário via linha de comando.

Desenvolvimento

A seguir, serão mostradas as principais classes deste laboratório. Os comentários relevantes foram feitos no próprio código.

Diagrama de Classes

diagramaDeClasses.JPG

PERGUNTA: o BlueJ cria automaticamente as linhas de relação entre as classes. Você prefere que as todas as linhas sejam deixadas como foram criadas ou prefere que apenas algumas linhas, como de herança, sejam deixadas? A figura está com uma aparência meio poluída.

Classe Simulador (Primeira)

Nesta classe foi implementado um simulador relativo ao programa desenvolvido no laboratório passado. O usuário interage com ele via linha de comando.

import java.util.*;
 
public class Simulador{
 
    public void main(){
        Scanner x = new Scanner(System.in);
        RelaQueue queue = new RelaQueue();
        Professor prof = new Professor(queue);
        Aluno[]  arrayAluno = new Aluno[30];
 
        System.out.print("Digite o numero de alunos a ser adicionado: ");
        String numero = x.nextLine();
        int n = Integer.parseInt(numero);
        if (n > 0) {
           System.out.println("Digite o(s) nome(s) e comportamento(s) do(s) aluno(s)"); 
           System.out.println("Comportamentos possiveis: Esforcado, SafoPreguicoso");
        }
        for (int i = 0; i < n; i++){
            System.out.print("Nome do " + (i+1) + "o aluno: ");
            String nome = x.nextLine();
            System.out.print("Comportamento do " + (i+1) + "o aluno: ");
            String tipo = x.nextLine();
            while (!tipo.equalsIgnoreCase("esforcado") && !tipo.equalsIgnoreCase("safopreguicoso")){
                System.out.print("Digite ESFORCADO ou SAFOPREGUICOSO: ");
                tipo = x.nextLine();
            }
            if (tipo.equalsIgnoreCase("esforcado"))
                arrayAluno[i] = new AlunoEsforcado(nome, queue);
            if (tipo.equalsIgnoreCase("safopreguicoso"))
                arrayAluno[i] = new AlunoSafoPreguicoso(nome, queue);
        System.out.println("11");
        }
        System.out.println("22");
        for (int i = 0; i < n; i++)      
            arrayAluno[i].fazEEntregaRelatorio();       
 
        prof.corrigirRelatorios();                        
    }
}

Classe Aluno

Esta classe agora não é mais abstrata, como era no último laboratório. Foi criada uma variável comportamento, que guardará qual o comportamento daquele aluno. Também foi criado o método setComportamento, que definirá o comportamento do aluno.

public class Aluno
{
    //variaveis privadas
    private int conhecimento = 0;
    private Comportamento comportamento;
    private String nome;
    private RelaQueue queue;
 
    //contrutor de Aluno. note que o comportamento inicial setado
    //para todo aluno eh Esforcado
    public Aluno (String oNome, RelaQueue fila){
        nome = oNome;
        queue = fila;
        comportamento = new Esforcado(this);
    }
 
    //retorna o conhecimento do aluno
    public int getConhecimento(){
        return conhecimento;
    }
 
    //retorna a dedicaçao do aluno
    public float getDedicacao(){
        return comportamento.getDedicacao();
    }
 
    //retorna a inteligencia do aluno
    public float getInteligencia(){
        return comportamento.getInteligencia();
    }        
 
    //retorna o nome do aluno
    public String getNome(){
        return nome;
    }
 
    //determina o comportamento do aluno.
    //observe que neste metodo eh lançada uma exceçao.
    //as regras de determinação de comportamentos possiveis
    //para um aluno sao baseadas na universidade que esse aluno
    //estuda. este metodo serah sobrescrito nas subclasses de 
    //aluno e, cada uma delas, tratará a exceção de uma forma
    public void setComportamento(Comportamento tipo) throws Exception {
        comportamento = tipo;
    }
 
    //cria um relatorio e coloca-o na fila de relatorios
    public void fazEEntregaRelatorio(){
        float qualidade = (2 * this.getDedicacao() + this.getInteligencia()) / 3;
        float originalidade = (this.getDedicacao() + 2 * this.getInteligencia()) / 3;
        Relatorio rela = new Relatorio(qualidade, originalidade, this);
        queue.queue(rela);
        conhecimento++;
    }  
}

Subclasse AlunoITA

public class AlunoITA extends Aluno
{         
    //construtor, igual ao da duperclasse Aluno
    public AlunoITA(String oNome, RelaQueue fila){
        super(oNome, fila);
    }   
 
    //metodo setComportamento sobrescrito. o comportamento "burro" nao pode
    //ser atribuido a um aluno do ITA
    public void setComportamento(Comportamento comportamento) throws Exception {
        if(comportamento instanceof Burro) throw new Exception();
        super.setComportamento(comportamento);
    }
}

Subclasse AlunoUSP

public class AlunoUSP extends Aluno
{         
    //construtor, igual ao da duperclasse Aluno
    public AlunoUSP(String oNome, RelaQueue fila){
        super(oNome, fila);
    }   
 
    //metodo setComportamento sobrescrito. Os comportamentos "Summa" e
    //"SafoPreguicoso nao podem ser atribuidos a um aluno da USP
    public void setComportamento(Comportamento comportamento) throws Exception {
        if(comportamento instanceof Summa || comportamento instanceof SafoPreguicoso) throw new Exception(); 
        super.setComportamento(comportamento);
    }
}

Subclasse AlunoUnicamp

É idêntica à subclasse AlunoUSP, recebe o mesmo tratamento de exceção.

Classe Comportamento

Esta é uma classe abstrata cujas subclasses determinarão os possíveis comportamentos dos alunos.

//Classe abstrata Comportamento
public abstract class Comportamento
{
    //variaveis privadas
    private Aluno aluno;
    private float inteligencia;
    private float dedicacao;
 
    //construtor. recebe como parametro um Aluno, que terá seu
    //comportamento alterado. Este metodo será sobrescrito nas
    //subclasses.
    public Comportamento(Aluno al){
        aluno = al;
    }
 
    //métodos abstratos. serão definidos nas subclasses.
    public abstract float getDedicacao();
    public abstract float getInteligencia();     
}

Subclasses da classe Comportamento

Estas subclasses são bem parecidas entre si. Todas utilizam o construtor da classe Comportamento e implementam os métodos getInteligencia() e getDedicacao(). A diferença entre elas é que em algumas os valores de conhecimento e dedicacao são fixo, 0.5 ou 1.0, e em outras esses valores são randômicos. O exemplo de duas dessas subclasses segue logo abaixo:

Subclasse Summa

public class Summa extends Comportamento{
 
    private float inteligencia = 1.0f;
    private float dedicacao = 1.0f;
 
    public Summa(Aluno oAluno){
        super(oAluno);
    }      
 
    public float getDedicacao(){
        return dedicacao;
    }
 
    public float getInteligencia(){
        return inteligencia;
    }
}

Subclasse Imprevisivel

import java.util.*;
 
public class Imprevisivel extends Comportamento{
 
    private float inteligencia;
    private float dedicacao;
 
    public Imprevisivel(Aluno oAluno){
        super(oAluno);
    }      
 
    public float getDedicacao(){
        Random generator = new Random();
        dedicacao = generator.nextFloat() * 1.0f;
        return dedicacao;
    }
 
    public float getInteligencia(){
        Random generator = new Random();
        inteligencia = generator.nextFloat() * 1.0f;
        return inteligencia;
    }
}

Classe Simulador (Final)

import java.util.*;
 
//classe simulador
public class Simulador{
 
    public void main(){
        Scanner x = new Scanner(System.in);     //cria o objeto 'x', atraves do qual serah chamado o metodo 'nextLine()' para ler entradas do teclado
        RelaQueue queue = new RelaQueue();
        Professor prof = new Professor(queue);
        Aluno[]  arrayAluno = new Aluno[30];    //array de Alunos para receber os alunos digitados pelo usuario
 
        System.out.println("..:: INSERCAO DE ALUNOS ::..");
        System.out.print("Digite o numero de alunos a ser adicionado: ");
        String numero = x.nextLine();           //recebe o numero de alunos a ser digitado
        int n = Integer.parseInt(numero);
        if (n > 0) {
           System.out.println("Digite o(s) nome(s), instituicao(oes) e comportamento(s) do(s) aluno(s)"); 
           System.out.println("Comportamentos possiveis: \nEsforcado, SafoPreguicoso, Burro, Pemba, Imprevisivel, Summa");
           System.out.println("Instituicoes possiveis: \nITA, USP, Unicamp");  
        }
        //recebe os dados dos alunos
        for (int i = 0; i < n; i++){
            System.out.print("Nome do " + (i+1) + "o aluno: ");
            String nome = x.nextLine();
            System.out.print("Instituicao do " + (i+1) + "o aluno: ");
            String inst = x.nextLine();
            while (!inst.equalsIgnoreCase("ITA") && !inst.equalsIgnoreCase("USP") && !inst.equalsIgnoreCase("Unicamp")){
                System.out.print("Digite uma instituicao valida: ");
                inst = x.nextLine();
            }
            System.out.print("Comportamento do " + (i+1) + "o aluno: ");
            String tipo = x.nextLine();
            while (!tipo.equalsIgnoreCase("esforcado") && !tipo.equalsIgnoreCase("safopreguicoso") && !tipo.equalsIgnoreCase("imprevisivel") && !tipo.equalsIgnoreCase("summa") && !tipo.equalsIgnoreCase("pemba") && !tipo.equalsIgnoreCase("burro")){
                System.out.print("Digite um comportamento valido: ");
                tipo = x.nextLine();
            }           
           //CRIACAO DO ALUNO DE ACORDO COM A FACULDADE
            if (inst.equalsIgnoreCase("ITA"))
                arrayAluno[i] = new AlunoITA(nome, queue);
            if (inst.equalsIgnoreCase("USP"))
                arrayAluno[i] = new AlunoUSP(nome, queue);
            if (inst.equalsIgnoreCase("Unicamp"))
                arrayAluno[i] = new AlunoUnicamp(nome, queue);
 
           //DETERMINACAO DOS COMPORTAMENTOS, atentando para as EXCEÇÕES
           if (tipo.equalsIgnoreCase("Esforcado")){
               try{
                   arrayAluno[i].setComportamento(new Esforcado(arrayAluno[i]));
               } catch (Exception e){
                    System.out.println("Voce tentou fazer algo impossivel!!!");
                 }
           }
           if (tipo.equalsIgnoreCase("SafoPreguicoso")){
               try{
                   arrayAluno[i].setComportamento(new SafoPreguicoso(arrayAluno[i]));
               } catch (Exception e){
                    System.out.println("Voce tentou fazer algo impossivel!!!");
                 }
           }
           if (tipo.equalsIgnoreCase("Summa")){
               try{
                   arrayAluno[i].setComportamento(new Summa(arrayAluno[i]));
               } catch (Exception e){
                    System.out.println("Voce tentou fazer algo impossivel!!!");
                 }
           }
           if (tipo.equalsIgnoreCase("Burro")){
               try{
                   arrayAluno[i].setComportamento(new Burro(arrayAluno[i]));
               } catch (Exception e){
                    System.out.println("Voce tentou fazer algo impossivel!!!");
                 }
           }  
           if (tipo.equalsIgnoreCase("Pemba")){
               try{
                   arrayAluno[i].setComportamento(new Pemba(arrayAluno[i]));
               } catch (Exception e){
                    System.out.println("Voce tentou fazer algo impossivel!!!");
                 }
           }        
           if (tipo.equalsIgnoreCase("Imprevisivel")){
               try{
                   arrayAluno[i].setComportamento(new Imprevisivel(arrayAluno[i]));
               } catch (Exception e){
                    System.out.println("Voce tentou fazer algo impossivel!!!");
                 }
           }                
        }
        //criação e entrega dos relatórios de todos os alunos
        for (int i = 0; i < n; i++)      
            arrayAluno[i].fazEEntregaRelatorio();       
        //correção dos relatorios pelo professor
        prof.corrigirRelatorios();                        
    }
}

Classe Queue<T>

import java.util.Vector; //importando
 
public class Queue<T>{
 
    //variaveis privadas
    private Vector<T> array = new Vector<T>(); //criando o vector
    private int inicio = 0;
    private int fim = 0; 
 
    public void queue(T obj){
        array.add(fim, obj);        //insere o objeto 'obj' em array
        fim = (fim + 1) % 10;       //incrementa o numero de objetos em array
    }
 
    public T dequeue(){
        if (fim == inicio)          //verifica se há elementos em array
            return null;
        else{
            T aux;
            aux = array.get(inicio);      //toma um objeto de array
            inicio = (inicio + 1) % 10;
            return aux;                   //retorna o objeto tomado
        }        
    }
}

Classes Professor, Relatorio e RelaQueue

Estas classes não sofreram alteração em relação ao laboratório anterior, portanto não foram detalhadas aqui.

Classe Teste

O resultado da execução da classe Teste fornecida para este laboratório está na imagem a seguir:

testesAutomaticos.JPG

Testes Manuais no Simulador

Foram feitos alguns testes manuais no programa através do Simulador. Os resultados estão apresentados logo abaixo:

testesSimulador.JPG

Códigos fonte de todas as classes criadas.

Link da pasta com todos os arquivos e códigos referentes ao primeiro laboratório.

Conclusão

A solução adotada para o problema da inserção de Universidade e novos comportamentos para os alunos foi muito boa. O uso do tratamento de exceções também é considerado um bom aprendizado, pois é algo bem importante serve para evitar que usuários entrem dados inválidos na aplicação desenvolvida. A criação do Simulador facilitou a entrada de dados, que antes era feita através do BlueJ.

Não consegui encontrar uma forma melhor do que a sugerida nesse laboratório para solucionar os problemas expostos no item 2 do roteiro.

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