Passar como argumento Array de Funcionário para classe Empresa (Não consigo)

15 respostas
rodrigo_salla

Por favor alguem pode me ajudar a prosseguir, não consigo passar como argumento um array de funcionario para minha classe empresa, não consigo fazer como o exercício pede…

public class Empresa 
{
	private String nome;
	private String cnpj;
	Funcionario[] funcionarios;
	
	public Empresa(String nome, String cnpj, Funcionario[] funcionarios)
	{
		this.nome = nome;
		this.cnpj = cnpj;
		this.funcionarios = funcionarios;
	}
	//nao entendi nada desse metodo
	public void adicionaFuncionariosNaEmpresa(Funcionario funcionarios)
	{
		int i;
		
		Funcionario[] f = new Funcionario[10];
		this.funcionarios[f.length] = funcionarios;
		
		for(i = 0; i <= f.length; i++);
		{
			System.out.println(f[i]);
		}
	}
	
	public String imprimiEmpresaComFuncionarios()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("Empresa      : " + this.nome + "\n");
		sb.append("CNPJ         : " + this.cnpj + "\n");
		sb.append("Funcionarios : " + this.funcionarios  + "\n");
		
		return sb.toString();
	}
}
  1. Volte ao nosso sistema de Funcionario e crie uma classe Empresa. A Empresa tem um nome, cnpj e uma array de Funcionario, além de outros atributos que você julgar necessário
class Empresa {

// outros atributos

Funcionario[] funcionarios;

String cnpj;

}
  1. A empresa deve ter um método adiciona que recebe uma referência a
    Funcionario como argumento, e guarda esse funcionario. Algo como:

    void adiciona(Funcionario f) {
    // algo tipo: this.funcionarios[ ??? ] = f;
    // …
    }

    Você deve inserir o Funcionario em uma posição da array que esteja livre. Existem várias maneira para você fazer isso: guardar um contador para indicar qual a próxima posição vazia ou procurar por uma posição vazia toda vez. O que seria mais interessante?

É importante reparar que o método adiciona não recebe nome, rg, salário, etc. Essa seria uma maneira nem um pouco estruturada, muito menos orientada a objetos de se trabalhar. Vocêantes cria um Funcionario e já passa a referência dele, que dentro do objeto possui rg,
salário, etc.

  1. Crie uma outra classe, que vai possuir o seu método main. Dentro dele crie algumas instâncias de Funcionario e passe para a empresa pelo método adiciona. Repare que antes Capítulo 5 Um pouco de arrays Página 51e Orientação a Objetos você vai precisar criar a array, pois inicialmente o atributo funcionarios da classe Empresa não se referencia a lugar nenhum (null):
Empresa empresa = new Empresa();

empresa.funcionarios = new Funcionario[10];

// 

Ou você pode construir a array dentro da própria declaração da classe Empresa. Crie alguns funcionários e passe como argumento para o adiciona da empresa:

Funcionario f1 = new Funcionario();

f1.salario = 1000;

empresa.adiciona(f1);

Você pode criar esses funcionários dentro de um loop se preferir.
Opcional: o método adiciona pode gerar uma mensagem de erro indicando que a arrayestá cheia.
4) Percorra o atributo funcionarios da sua instância da Empresa e imprima o salários de todos seus funcionários. Ou você pode chamar o método mostra() de cada Funcionario da sua array.

Cuidado: alguns índices do seu array podem não conter referência para Funcionario construído, isto é, ainda se referirem para null.

  1. (Opcional) Crie um método para verificar se um determinado Funcionario se encontra ou não como funcionario desta empresa:
    
    boolean contem(Funcionario f) {
    
    // …
    
    }
    
    Você vai precisar fazer um for na sua array, e verificar se a referência passada como argumento se encontra dentro da array. Evite ao máximo usar números hardcoded, isto é, use o .length.
    
  2. (Opcional) Caso a array já esteja cheia no momento de adicionar um outro funcionário, criar uma nova maior e copiar os valores. Isto é, fazer a realocação já que java não tem isso: uma array nasce e morre com o mesmo length.

15 Respostas

rockstorm

Especifique melhor o erro que vc esta tendo, pois assim fica dificil de saber…como você esta passando este parametro…???

rodrigo_salla

spark , você também terá dúvidas e vai postá-las, ai, pela sua conduta, acho que eu e o restante dos amigos lembrarão de você…

rockstorm, muito obrigado pela atenção, na verdade não estou conseguindo fazer o exercício 2.

  1. A empresa deve ter um método adiciona que recebe uma referência a
    Funcionario como argumento, e guarda esse funcionario. Algo como:

    void adiciona(Funcionario f) {
    // algo tipo: this.funcionarios[ ??? ] = f;
    // …
    }

    Você deve inserir o Funcionario em uma posição da array que esteja livre. Existem várias maneira para você fazer isso: guardar um contador para indicar qual a próxima posição vazia ou procurar por uma posição vazia toda vez. O que seria mais interessante?

É importante reparar que o método adiciona não recebe nome, rg, salário, etc. Essa seria uma maneira nem um pouco estruturada, muito menos orientada a objetos de se trabalhar. Vocêantes cria um Funcionario e já passa a referência dele, que dentro do objeto possui rg,
salário, etc.

S

Ok, dúvida todo mundo tem. Mas acho que exercício é exercício.
Se precisa de ajuda tenta rodar o programa e manda o log de erro pra gente. Senão não dá pra ajudá-lo.

flw

rockstorm

Rodrigo…
É que geralmente nos foruns não se coloca trabalhos ou exercicios para serem resolvidos…É melhor você postar o que vc já conseguiu fazer e assim podemos ajuda-lo com os erros e duvidas…
Sua duvida seria a criação de um metodo que recebe um array de funcionarios e armazena-la??? poste o que vc ja fez…

Arcadex

Fala Rodrigo… Não esquenta, vou te audar.

Primeiro. Vc esta indo pelo caminho errado. N entendeu muito bem o exercício.

Esse método aqui não deve receber um array como parametro.

public Empresa(String nome, String cnpj, Funcionario[] funcionarios)
[color=red]Deve ser assim:[/color]

public Empresa(String nome, String cnpj, Funcionario funcionario)

E nesse método aqui vc não deve receber “funcionário” como parametro. E nem deve retornar o void. Nele vc vai criar o array de funcionários para inserir na empresa

public void adicionaFuncionariosNaEmpresa(Funcionario funcionarios) {
[color=red]Trocar para[/color]:

public Funcionario[] adicionaFuncionariosNaEmpresa() {

B

eu fiz mais ou menos assim..
não estou passando parâmetro nenhum pro método "adiciona" e estou usando o "cont" pra adicionar na primeira posição livre de "funcionarios". Ah... ai tb num vai ter como se referenciar ao funcionario pelo nome e sim pela posição no vetor..
como eu tô começando em java ainda, num sei se atende mais tah ai o q eu consegui.. pelo menos funciona
até mais

class Empresa {

	Funcionario[] funcionarios;
	String cnpj;
	int cont;
	
	void adiciona() {
		if (cont >= funcionarios.length) {
			System.out.println("Impossível adicionar, Vetor cheio!");
		}
		else {
			this.funcionarios[cont] = new Funcionario();
			cont++;
		}
	}
}
trainpotting

blz pessoal,
minha duvida eh a mesma do camarada.
minha solucao tb funciona mas eh manual e quero passar os dados como parametro mas naum consegui

uso a classe ¹AgenciaDeEmprego para instanciar as classes ²Empresa e ³Funcionario.
Para adicionar novos funcionarios uso o metodo adiciona onde aponto explicitamente o indice porque conheco e sei que esta vazio o que e muito esquisito.
como posso usar o enhanced-for ou length para descobrir qual indicie esta vazio e adicionar funcionarios sequencialmente?
Para esta situacao onde envolve outras classes como Clientes, Fornecedores e etc qual pattern consultar?

obrigado

¹http://trainspotting.pastebin.com/m5be1e61f
²http://trainspotting.pastebin.com/f5128baa
³http://trainspotting.pastebin.com/f746fdbb3

L
rodrigo_salla:
public class Empresa 
{
	private String nome;
	private String cnpj;
	Funcionario[] funcionarios;
	
	public Empresa(String nome, String cnpj, Funcionario[] funcionarios)
	{
		this.nome = nome;
		this.cnpj = cnpj;
		this.funcionarios = funcionarios;
	}
	//nao entendi nada desse metodo
	public void adicionaFuncionariosNaEmpresa(Funcionario funcionarios)
	{
		int i;
		
		Funcionario[] f = new Funcionario[10];
		this.funcionarios[f.length] = funcionarios;
		
		for(i = 0; i <= f.length; i++);
		{
			System.out.println(f[i]);
		}
	}
	
	public String imprimiEmpresaComFuncionarios()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("Empresa      : " + this.nome + "\n");
		sb.append("CNPJ         : " + this.cnpj + "\n");
		sb.append("Funcionarios : " + this.funcionarios  + "\n");
		
		return sb.toString();
	}
}

Gente!

Como ninguém aqui descobriu o problema? Não precisei nem rodar, bastou só olhar. O erro é esse aqui:
// você criou um outro array fixo sem necessidade
// aonde ele está sendo usado? além de apenas para obter o length?
Funcionario[] f = new Funcionario[10];
// o valor de f.length é sempre 10. SEMPRE!!!
// ou seja, sempre será colocado funcionario na posição 10
// afinal, é o tamanho do array f declarado  em cima
// Isso implica que:
// se o array funcionarios for null, vai dar NullPointerException
// se o array funcionarios for menor que 11, var dar ArrayIndexOfBoundsException
// se o array funcionarios for maior que 11, não vai dar exceção, mas o
// programa não vai funcionar, porque sempre será colocado na décima-primeira posição
this.funcionarios[f.length] = funcionarios;
rick_z

Bom pessoal, essa foi a minha humilde descoberta para esse exercicio, acho que funciona.logo…

class Empresa{

String nome;
int cnpj;
Funcionario [] funcionarios;

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

//na classe de teste…

class Teste{

public static void main(String args[]){
	
	Empresa empresa = new Empresa();
	empresa.funcionarios = new Funcionario[10];
}

}

sera criado o array predefinido com o seu comprimento(length) de 10, la no metodo que adiciona, sera inserido o valor na casa que estiver vasio,

falta ainda uma verificaçao para quando o array estiver completo informar que nao ha mais espaço nele, porem, estou aprendendo, rsrsrs

}

rick_z

:lol: :lol: :lol: :lol:

E isso mesmo, funcionou, nem acredito… rsrrsrsrs

Fiz o teste… vamos la.

classe empresa:

class Empresa{

String nome;
int cnpj;
Funcionario [] funcionarios;

public void adiciona(Funcionario f){
	for (int i = 0; i < funcionarios.length;i++){
		if (funcionarios[i] == null){
		funcionarios[i] = f;
		} // aqui deve haver outro if para validar quando o array de 10 posicoes estiver completo!!!! :) 
	} 
}

}
/*========================
classe teste… */

class Teste{

public static void main(String args[]){
	
	Empresa empresa = new Empresa();
	empresa.funcionarios = new Funcionario[10];
	
	Funcionario f1 = new Funcionario();
	f1.nome = "Henrique";  // funcionario que eu adicionei manualmente!!!!!!!!
	empresa.adiciona(f1);
            //agora vc pede p imprimir o nome do funcionario f1 que foi adicionado e chan channnn
            //na posicao 1, a primeira que estava vazia, foi inserido altomaticamente, 
            //logo, se eu inserir outro, ele vai para a segunda posicao do array altomatico
            //ate compretar as 10 posicoes.
            //la no metodo tem que ter um if para validar quando o array estiver completo
	
	System.out.println(empresa.funcionarios[1].nome);
}

}

rick_z

Resolvido o problema do preenchimento.
Quando executei a classe teste, percebi que o adiciona preenchia todos as posiçoes com o primeiro funcionario, entao;

class Empresa{

String nome;
int cnpj;
Funcionario [] funcionarios;

public void adiciona(Funcionario f){
	for (int i = 0; i < funcionarios.length;i++){
		if (funcionarios[i] == null){
		funcionarios[i] = f;
		break;  //isso aqui resolve.
		}
	}	
}

public void mostraFunc(){
	for(int i = 1; i < funcionarios.length; i++){
		if(funcionarios[i] != null){
		System.out.println("Nome do funcionario: "+funcionarios[i].nome);
		System.out.println("Salario do funcionario: "+funcionarios[i].salario);
		}else{
			break; // se nao tiver break, quando percorrer uma posicao vazia vai dar erro.
		}
	}
}

}

//Classe teste que utilizaei…

class Teste{

public static void main(String args[]){
	
	Empresa empresa = new Empresa();
	empresa.funcionarios = new Funcionario[10];
	
	Funcionario f1 = new Funcionario();
	f1.nome = "Pedro";
	f1.salario = 100;
	empresa.adiciona(f1);
	
	Funcionario f2 = new Funcionario();
	f2.nome = "Algusto";
	f2.salario = 200;
	empresa.adiciona(f2);
	
	Funcionario f3 = new Funcionario();
	f3.nome = "Pedro";
	f3.salario = 300;
	empresa.adiciona(f3);
	
	Funcionario f4 = new Funcionario();
	f4.nome = "Jose";
	f4.salario = 400;
	empresa.adiciona(f4);
	
	empresa.mostraFunc();
}

}

//espero ter ajudado ai a comu, embora meus conhecimentos sejam inferiores ao de um aprendiz… :wink:

V

mkaule


Bom já que não houve aqui, um resposta concreta!
Se alguém um dia for fazer o exercício, o mesmo se encontra na apostila da Caelum FJ-11.
Aqui vai uma solução.

/**
 * Uma simples classe, que segue um exercício da apostila FJ-11.
 * Até então, não está sendo utilizados, todos os conceitos de OO.
 * @author Thiago 
 * */

public class Empresa {
	String nome;
	String cnpj;
	Funcionario [] empregados;




	void adiciona(Funcionario funcionarioX){
		
		for (int i = 0 ,cont = 0; i < empregados.length; i++) {
			if(empregados[cont] == null){
				empregados[cont] = funcionarioX;
				break;
			}else{
				if(empregados[cont++] == null)
				empregados[cont] = funcionarioX;
				
			}
		}

	}

	/*
	 * Este método, imprime todos os Funcionários cadastrados. 
	 * Isso, pode ser feito também, com um foreach.
	 * Fica até mais elegante. 
	 */
	void mostraEmpregados(){
		for (int i = 0; i < empregados.length; i++) {
			System.out.println("Funcionário "+ empregados[i].nome+" na posição: "+ i);
		}
	}
}

E então, alguma solução melhor? Contribui ae, com a GALERA :smiley:

Marmojezz

Fala ae rapaziada,

Eu gostaria de desenterrar este item pois tenho uma duvida no seguinte trecho:

for (int i = 0 ,cont = 0; i < empregados.length; i++) {  
            if(empregados[cont] == null){  
                empregados[cont] = funcionarioX;  
                break;  
            }else{  
                if(empregados[cont++] == null)  
                empregados[cont] = funcionarioX;  
                  
            }  
        }

É possível reescrever este trecho de código utilizando um enhaced-for ao invez do tradicional? Estou tentando, sem sucesso, o seguinte codigo:

for(int i : empregados){
			if( empregados[i] == null){
				empregados[i] = f;
			}
		}

Porém estou recebendo o seguinte erro: "error: incompatible types: Funcionario can not be converted to int" (Imagem anexa)

Sabendo que, o objetivo principal é procurar a ultima posição vazia em um array dinâmico e preenche-la com o funcionário que foi passado para o método, pergunto:

1. Por que este erro esta ocorrendo?
2. Eu poderia utilizar o enhanced-for nessa situação?
3. Se sim, você poderia postar.

Desde já agradeço, Obrigado,
Jefferson

jweibe

O erro ta acontecendo por que você ta tentando atribuir a um int um objeto do tipo funcionário veja: for(int i : empregados).
Altere seu código para:

int posicao = 0;
for(Funcionario funcionario : empregados){  
    if(funcionario == null){  
        empregados[posicao] = f;  
    }  
    posicao++;
}
Criado 29 de dezembro de 2006
Ultima resposta 23 de jan. de 2015
Respostas 15
Participantes 12