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

Interrompendo o For (exercício funcionários)

Olá,

Estou tentando realizar um loop que percorre toda a array "funcionarios", e caso ela tenha alguma referência null, o programa deve adicionar a referência do funcionário "f". No código abaixo, eu previamente preenchi funcionarios[i=0] e [i=3], ou seja, o programa deveria adicionar a referência "x1" em funcionarios[i=1].

class Empresa {
    String nome;
    String cnpj;
    Funcionario[] funcionarios;

    void adicionaFuncionario (Funcionario f){
        for (int i=0; i < this.funcionarios.length; i++){
            if(this.funcionarios[i]!=null){
                continue;
            }
            else {
                this.funcionarios[i] = f;
            }
        }
    }

    void mostraEmpresa(){
        System.out.println("Relacao de funcionarios da Empresa " + this.nome + ":\n\n");
        for (int i=0; i < this.funcionarios.length; i++){
            if (this.funcionarios[i]==null) continue;
            System.out.println(this.funcionarios[i].retornaFuncionario());
        }
    }
}

class TestaEmpresa {
    public static void main(String[] args) {
        Empresa coca = new Empresa();
        coca.nome = "Coca-Cola";
        coca.cnpj = "123456789";
        coca.funcionarios = new Funcionario[10];

        Funcionario x1 = new Funcionario();
        x1.nome = "Paulo";
        x1.departamento = "Contabil";
        //x1.admissao = 12/01/90;
        x1.salario = 5000;
        x1.rg = "12345678";
        x1.admissao = new Data();
        x1.admissao.dia = 12;
        x1.admissao.mes = 01;
        x1.admissao.ano = 90;

        coca.adicionaFuncionario(x1);

        coca.funcionarios[0] = new Funcionario();
        coca.funcionarios[0].nome = "Joao";
        coca.funcionarios[0].departamento = "Contabil";
        coca.funcionarios[0].salario = 5000;
        coca.funcionarios[0].rg = "12345678";
        coca.funcionarios[0].admissao = new Data();
        coca.funcionarios[0].admissao.dia = 12;
        coca.funcionarios[0].admissao.mes = 01;
        coca.funcionarios[0].admissao.ano = 90;

        coca.funcionarios[3] = new Funcionario();
        coca.funcionarios[3].nome = "Joao";
        coca.funcionarios[3].departamento = "Contabil";
        coca.funcionarios[3].salario = 5000;
        coca.funcionarios[3].rg = "12345678";
        coca.funcionarios[3].admissao = new Data();
        coca.funcionarios[3].admissao.dia = 12;
        coca.funcionarios[3].admissao.mes = 01;
        coca.funcionarios[3].admissao.ano = 90;

        coca.mostraEmpresa();
    }    
}

Entretanto, como é esperado, o programa adiciona o Funcionario "x1" em todas as referências null do array funcionarios[10]. Minha ideia foi colocar um break abaixo do else:

    void adicionaFuncionario (Funcionario f){
        for (int i=0; i < this.funcionarios.length; i++){
            if(this.funcionarios[i]!=null){
                continue;
            }
            else {
                this.funcionarios[i] = f;
                break;
            }
        }

Imaginei que, após igualar a primeira referência null com o Funcionario "f", o loop interromperia. Porém, o programa não chega nem a fazer essa substituição, mantendo a referência null! Alguém poderia explicar pq o break aparentemente está acontecendo ANTES da substituição, e como resolver esse problema?

Desde já obrigado, Arthur Torres

2 respostas
solução!

Olá, Xará!

Podemos melhorar o seu código para ele ficar mais claro. Ao invés de trabalhar com continue, o código abaixo é mais enxuto e simples de entender:

void adicionaFuncionario(Funcionario f){
    for (int i=0; i < this.funcionarios.length; i++){
        if(this.funcionarios[i] == null){
            this.funcionarios[i] = f;
            break;
        }
    }
}

Segundo, o problema está na ordem da execução do seu método main. Primeiro, você cria a variável x1 e usa o método adicionaFuncionario para salvar na lista.

Porém, logo abaixo, você cria outro funcionário também na posição 0, substituindo o a referência de x1 que você havia passado anteriormente!!!

Tente executar seu código com essa atribuição direto à posição 0 comentada:

class TestaEmpresa {
    public static void main(String[] args) {
        Empresa coca = new Empresa();
        coca.nome = "Coca-Cola";
        coca.cnpj = "123456789";
        coca.funcionarios = new Funcionario[10];

        Funcionario x1 = new Funcionario();
        x1.nome = "Paulo";
        x1.departamento = "Contabil";
        //x1.admissao = 12/01/90;
        x1.salario = 5000;
        x1.rg = "12345678";
        x1.admissao = new Data();
        x1.admissao.dia = 12;
        x1.admissao.mes = 01;
        x1.admissao.ano = 90;

        coca.adicionaFuncionario(x1);

        //coca.funcionarios[0] = new Funcionario();
        //coca.funcionarios[0].nome = "Joao";
        //coca.funcionarios[0].departamento = "Contabil";
        //coca.funcionarios[0].salario = 5000;
        //coca.funcionarios[0].rg = "12345678";
        //coca.funcionarios[0].admissao = new Data();
        //coca.funcionarios[0].admissao.dia = 12;
        //coca.funcionarios[0].admissao.mes = 01;
        //coca.funcionarios[0].admissao.ano = 90;

        coca.funcionarios[3] = new Funcionario();
        coca.funcionarios[3].nome = "Joao";
        coca.funcionarios[3].departamento = "Contabil";
        coca.funcionarios[3].salario = 5000;
        coca.funcionarios[3].rg = "12345678";
        coca.funcionarios[3].admissao = new Data();
        coca.funcionarios[3].admissao.dia = 12;
        coca.funcionarios[3].admissao.mes = 01;
        coca.funcionarios[3].admissao.ano = 90;

        coca.mostraEmpresa();
    }    
}

Xará, muito obrigado! O que eu não tava enxergando era que o For tava de fato fazendo a substituição, mas que depois eu tava substituindo manualmente com esse código que vc omitiu. Obrigado pela ajuda!