Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida método adiciona. Aula 3 capítulo array

Boa noite para todos!

Estou com uma dúvida que provavelmente é um erro de lógica e não estou conseguindo solucionar.

O código abaixo está rodando certinho, porém o meu método adiciona da classe empresa, aparentemente está buscando apenas as informações dos funcionários da posição 0 (mesmo eu colocando duas posições na memória dentro do main). Existe algum erro dentro do método adiciona ou em algum outro método? Por que será que não estou conseguindo mostrar mais de uma posição na memória?

Só para entenderem melhor, sempre que crio um funcionário, ele acaba aparecendo 10 vezes, ao invés de mostrar o funcionário 0 e 1.

Se alguém puder me ajudar, vou agradecer demais. Estou quebrando a cabeça com isso hahaha.

class Funcionario{
    String nome;
    String depto;
    String rg;
    int matricula;
    double sal;
    Data admissao;

        void recebeAumento(double valorAumento){
            this.sal += valorAumento;
        }

        void calculoGanhoAnual(){
            this.sal = sal * 12;
        }

        void mostra()    {
            System.out.println("Matricula: " + this.matricula);
            System.out.println("Nome: " + this.nome);
            System.out.println("Data de admissao: " + this.admissao.getData());
            System.out.println("RG: " + this.rg);
            System.out.println("Departamento: " + this.depto);
            System.out.println("Salario: " + this.sal);
        }
}

class Data{
    int dia, mes, ano;

    void preencheData(int dia, int mes, int ano){
        this.dia = dia;
        this.ano = ano;
        this.mes = mes;
    }

    String getData(){
        return this.dia + "/" + this.mes + "/" + this.ano;
    }
}

class Empresa{
    String nome, cnpj;
    Funcionario[] vetorFunc;

    void adiciona(Funcionario f){
        for(int i = 0; i < vetorFunc.length; i++){
            this.vetorFunc[i] = f;
        }
    }

    void mostraFunc(){
        for(int i = 0; i < this.vetorFunc.length; i++){
            System.out.println("Funcionario na posiçao " + (i+1));
            System.out.println("Salario " + this.vetorFunc[i].sal);
            System.out.println("Nome " + this.vetorFunc[i].nome);
        }
    }

    void mostraInfo() {
        for (int i = 0; i < this.vetorFunc.length; i++) {
            System.out.println("Funcionario na posição: " + i);
            this.vetorFunc[i].mostra();
        }
    } 

    boolean contem(Funcionario func){
        for(int i = 0; i < this.vetorFunc.length; i++){
            if(func == this.vetorFunc[i]){
                return true;
            }
        }
        return false;
    }
}

class TestaFunc{
    public static void main(String[] args){

        Funcionario thiago = new Funcionario();
        thiago.nome = "Thiago Alexandre Ferrari";
        thiago.sal = 1796;
        thiago.matricula = 9325629;
        thiago.depto = "Tecnologia";
        thiago.rg = "491962344";

        thiago.admissao = new Data();
        thiago.admissao.dia = 04;
        thiago.admissao.mes = 02;
        thiago.admissao.ano = 2014;


        thiago.mostra();
    }
}

class TestaEmpresa{
    public static void main(String[] args){
        Empresa ibm = new Empresa();
        ibm.vetorFunc = new Funcionario[10];

        Funcionario f1 = new Funcionario();
        f1.admissao = new Data();

        f1.nome = "Thiago";
        f1.sal = 2000;
        f1.rg = "1234569";
        f1.depto = "Tecnologia";
        f1.matricula = 9139180;
        f1.admissao.preencheData(04,02,2015);
        ibm.adiciona(f1);

        Funcionario f2 = new Funcionario();
        f2.admissao = new Data();

        f2.nome = "Maria";
        f2.sal = 22500;
        f2.rg = "1212331";
        f2.depto = "DPCD";
        f2.matricula = 1271837;
        f2.admissao.preencheData(16,05,1992);
        ibm.adiciona(f2);

        ibm.mostraInfo();
    }
}
4 respostas

Thiago, Boa Noite!

Pelo que percebi , sua classe Empresa tem que verificar se a posição do atributo Variavel da empregados está vazia , e ai sim adicionar o funcionário a essa posição .

segue a classe como exemplo para verificar se é esse o problema:

class Empresa {

    String cnpj ;
    String nome;
    Funcionario[] empregados;
    int livre = 0;

    void adiciona(Funcionario funcionario){

        if(this.empregados[this.livre] == null) {
        this.empregados[this.livre] = funcionario;

        this.livre++;}        
    }

    void mostraEmpregados(){

        for(int i =0; i < this.empregados.length; i++){

            if(this.empregados[i] == null) continue;

            System.out.println("Funcionario na posição :" +i);
            System.out.println("R$" + this.empregados[i].salario);
        }

    }

    void mostraTodasInformacosEmpregados(){

        for(int i =0; i < this.empregados.length; i++){

            if(this.empregados[i] == null) continue;
            System.out.println("Funcionario na posição :" +i);
            this.empregados[i].mostra();

        }
    }

    boolean contem(Funcionario f){
        for(int i = 0; i < this.livre; i++){

            if(f == this.empregados[i]){
                return true;
        }


    }
        return false;
}
}

Espero ter ajudado, Bons Estudos.

solução!

Olá Thiago! O problema com seu código está no seu método adiciona()

Repare:

    void adiciona(Funcionario f){
        for(int i = 0; i < vetorFunc.length; i++){
            this.vetorFunc[i] = f; 
        }
    }

Em seu método, você utiliza um for(). No entanto, vamos interpretar esse for(). Veja que segundo o seu for() uma ação será repetida enquanto o valor da variável i for menor que o tamanho de sua Array. Porém, tal ação será atribuir a determinada variável de índice i de sua Array o Funcionario f passado como parâmetro. Ou seja se sua Array tiver tamanho 10 o que acontecerá no loop será o seguinte:

this.vetorFunc[0] = f;
this.vetorFunc[1] = f;  
this.vetorFunc[2] = f; 
this.vetorFunc[3] = f; 
this.vetorFunc[4] = f; 
this.vetorFunc[5] = f; 
this.vetorFunc[6] = f; 
this.vetorFunc[7] = f; 
this.vetorFunc[8] = f; 
this.vetorFunc[9] = f;

Ou seja, perceba que todas as variáveis de sua Array recebem a referencia de um mesmo objeto. Por isso, quando você utiliza o método mostraInfo()para imprimir ele imprime o mesmo Objeto, pois todos realmente "apontam" para o mesmo objeto.

Para resolver isso, você pode retirar o loop e fazer com que cada objeto seja adicionado a uma única variável da Array por vez. Da seguinte forma:

int contador = 0;

    void adiciona(Funcionario f){
            this.vetorFunc[contador] = f;
            contador++;
    }

Veja que dessa forma, o objeto so é adicionado uma vez e ao ser adicionado a variável contador é incrementada passando a ser 1 logo o próximo objeto que eu adicionar irá ser atribuído a variável da array de índice 1.

Então isso resolve o problema. No entanto acaba gerando outro. Perceba que a Array criada por você tem 10 variáveis:

ibm.vetorFunc = new Funcionario[10];

No entanto pelas sua classe TestEmpresa apenas são adicionados dois objetos. Logo 8 dessas variáveis estão vazias, ou seja null. No entanto quando você chama o método mostraInfo() você utiliza um for() para percorrer toda a Array e imprimir todas as suas variáveis. Porém, ao tentar imprimir as variáveis null o java dará um erro. Pois não é possível imprimir um objeto vazio (não irei me aprofundar nisso pois você verá isso mais adiante no curso). Para resolver tal problema basta adicionar um if() fazendo apenas imprimir as variáveis que não forem iguais a null. Ficando seu métodomostraInfo() da seguinte forma:

void mostraInfo() {
        for (int i = 0; i < this.vetorFunc.length; i++) {
            if(vetorFunc[i] != null){
                System.out.println("Funcionario na posição: " + i);
                this.vetorFunc[i].mostra();
            } 
        }
    }

Enfim, Espero ter ajudado! Bons Estudos!

Realmente era isso que acontecia. Eu não estava entendendo muito bem a lógica do método adiciona() e era nele o erro mesmo.

Obrigado pelas respostas!

Que bom que te ajudamos Thiago! Apenas feche o tópico marcando uma resposta como solução caso sua dúvida foi solucionada. Obrigado!