(Resolvido) Array, For e Herança

11 respostas
java
R

Alguém poderia me ajudar em uma questão.

O programa está compilando, porém, mesmo eu mudando o número de cpf, deixando igual de dois clientes ele ainda adiciona, mas não deveria acontecer isso.

Instanciei os clientes do meu arranjo no método main.

Classe Gerente

public class Gerente extends Pessoa implements InterfaceGerente{
private static final String tipo = "G";
private Cliente[] clientes;
private int numClientes;
private int valorContaCorrente;
private int valorDaDivida;


Gerente(String nome, int cpf){
super(nome, cpf);
clientes = new Cliente[20];
numClientes = 0;
}

String retornaTipo() {
return tipo;
}

void imprimirClientes(){
Cliente atual;
System.out.println("\tNumero de clientes: " + numClientes);
for (int c=0; c < numClientes; c++){
atual = clientes[c];
System.out.println("\t" + (c+1) + "\t" + atual.retornaTipo() + "\t" + atual.nome + "\t" + atual.cpf + "\t" + atual.getValorContaCorrente() + "\t" + atual.getValorDaDivida() + "\t" + atual.negativado());
}
}


public boolean adicionarCliente(Cliente cliente) {

if ( this.numClientes == 20) {
return false;
}
for ( int j=0; j < numClientes; j++) { // Perorrer o arranjo.  
if ( this.clientes[j].cpf == cliente.cpf ) {
return false;
    }
}
for(int k=0; k < numClientes; k++) {
if( this.clientes[k].cpf != cliente.cpf) {
clientes[numClientes] = cliente;
numClientes += 1;
return true;
}
}
return true;
 }

public static void main(String[] args){

Cliente c1 = new Cliente("Cliente A", 27855, 10000);
Cliente c2 = new Cliente("Cliente B", 24564, 10000);
Cliente c3 = new Cliente("Cliente C", 27444, 10000);
Cliente c4 = new Cliente("Cliente D", 2222, 10000);
Cliente c5 = new Cliente("Cliente E", 2222, 10000);
Cliente c6 = new Cliente("Cliente F", 2222, 10000);
Cliente c7 = new Cliente("Cliente G", 2222, 10000);
Cliente c8 = new Cliente("Cliente H", 2222, 10000);
Cliente c9 = new Cliente("Cliente I", 2222, 10000);
Cliente c10 = new Cliente("Cliente J", 2232, 10000);
Cliente c11 = new Cliente("Cliente K", 2222, 10000);
Cliente c12 = new Cliente("Cliente L", 2222, 10000);
Cliente c13 = new Cliente("Cliente M", 2222, 10000);
Cliente c14 = new Cliente("Cliente N", 2222, 10000);
Cliente c15 = new Cliente("Cliente O", 2222, 10000);
Cliente c16 = new Cliente("Cliente P", 2222, 10000);
Cliente c17 = new Cliente("Cliente Q", 2222, 10000);
Cliente c18 = new Cliente("Cliente R", 2222, 10000);
Cliente c19 = new Cliente("Cliente S", 2222, 10000);
Cliente c20 = new Cliente("Cliente T", 2222, 10000);


if (ger1.adicionarCliente(c1)) System.out.println("Cliente '"  +c1.nome + "' adicionado corretamente.");
else System.out.println("Cliente '"  + c1.nome + "' nao pode ser adicionado.");


}
}

Classe Cliente

Cliente(String nome, int cpf, int valorInicial){
    super(nome, cpf);
    valorContaCorrente = valorInicial;
    valorDaDivida = 0;
    }

11 Respostas

S

O último return do método adicionarCliente deveria retornar false.

Outra coisa, um CPF não pode ser int, tem que ser String pois o CPF pode iniciar com 0 e os tipos numéricos não possuem 0 à esquerda.

R

Então alterei e agora ele fala que não pode adicionar nenhum cliente
image

O primeiro por exemplo ele tinha que ser adicionado pq é o primeiro e meu arranjo não está cheio e seu cpf não está cadastrado no meu arranjo, mas ainda retornou false, ele tinha que ir na minha 3 condição ali.

Por exemplo: estou usando o cpf como um código para distinguir uma pessoa da outra, pq se eu adicionar a primeira pessoa ela vai ter um código, ai quando eu adicionar a segunda pessoa ela vai ter outro código diferente e ser adicionado normalmente e meu arranjo precisa ter 2 posições ocupadas já, como eu coloquei ali clientes[numClientes] = cliente; depois se o terceiro cliente q eu tentar adicionar tiver um código igual o primeiro ele não pode adicionar o terceiro.

Favor da uma luz pra mim.

D
for(int k=0; k < numClientes; k++) {
if( this.clientes[k].cpf != cliente.cpf) {
clientes[numClientes] = cliente;
numClientes += 1;
return true;
}
}

Supondo que será adicionado o primeiro cliente, numClientes é zero, o que vai acontecer naquele trecho?

R

Ele vai verificar se no meu arranjo de clientes usando o cpf for diferente do cpf do cliente que quero adicionar, se for ele adicionar o cliente no arranjo clientes [numClientes], eu poderia trocar para clientes [k], incremento mais 1 pq foi adicionado e retorna true.

eu mudei para visualizar melhor, tirei o último FOR:

for ( int j=0; j < numClientes; j++) { // Perorrer o arranjo.  
if ( this.numClientes == 20) {  // O número de clientes  contabiliza 20 não pode adicionar mais. 
return false;
} else if ( this.clientes[j].cpf == cliente.cpf ) { // Se o objeto cliente  estiver no arranjo não adicione. 
return false;
    } else { // No último caso adicionar o cliente no arranjo cliente.
clientes[j] = cliente; // Adicionando o objeto cliente no arranjo clientes. 
numClientes += 1; // Adicionando mais um na variável numClientes. 
return true;
}
}
return false;
}
D

Não vai verificar e nem adicionar se o numClientes for zero, no loop está k < numClientes, k = 0 e numClientes = 0, então 0 < 0 é false e não será executado.

Está pior que antes, faça por partes:

// verifica se número de clientes  contabiliza 20 não pode adicionar mais
if (this.numClientes == 20) { return false; }

// verifica se cliente está no arranjo
for ( int j=0; j < numClientes; j++) {
  if ( this.clientes[j].cpf == cliente.cpf ) {
    return false;
  }
}

// adicionar o cliente no arranjo
/** FAZER **/

return true;
R

Tá vou corrigir.

R

Agora ele está adicionando e comparando usando o cpf corretamente obrigado pela dica, porém, tenho outro problema, se eu adicionei o cliente na minha variável numClientes quando eu imprimir o número de clientes no meu método imprimirClientes() ele tinha q falar a quantidade q tem, mas ele tá dizendo que é 0.

image

R

Esse é o código agora, coloquei um método main embaixo só para fazer os testes.

public class Gerente extends Pessoa implements InterfaceGerente{
private static final String tipo = "G";
private Cliente[] clientes;
private int numClientes;
private int valorContaCorrente;
private int valorDaDivida;

/* Construtor da Classe Gerente
* Este construtor invoca o construtor da classe Pessoa e inicializa os dois atributos
* do objeto que esta sendo instanciado.
*/
Gerente(String nome, int cpf){
super(nome, cpf);
clientes = new Cliente[20];
numClientes = 0;
}

/* Metodo que retorna o valor do atributo tipo do objeto atual */
String retornaTipo() {
return tipo;
}


/* Metodo para imprimir informacoes sobre os clientes gerenciados pelo gerente atual
*/
void imprimirClientes(){
Cliente atual;
System.out.println("\tNumero de clientes: " + numClientes);
for (int c=0; c < numClientes; c++){
atual = clientes[c];
System.out.println("\t" + (c+1) + "\t" + atual.retornaTipo() + "\t" + atual.nome + "\t" + atual.cpf + "\t" + atual.getValorContaCorrente() + "\t" + atual.getValorDaDivida() + "\t" + atual.negativado());
}
}

public boolean adicionarCliente(Cliente cliente) {
// Verifica se o número de clientes contabiliza 20 não pode adicionar mais.
if ( this.numClientes == 20) {
return false;
}
// Verificar se cliente já estiver no arranjo.
for ( int j=0; j < numClientes; j++) {
if ( this.clientes[j].cpf == cliente.cpf ) {
return false;
    }
}
// Adicionar o cliente no arranjo.
if( numClientes < 20) {
clientes[numClientes] = cliente;
numClientes += 1;
return true;

}
return false;
}

public void cobrarTodosEmprestimos() {

if ( valorDaDivida == 0) {
valorContaCorrente = valorContaCorrente;
}
if ( valorContaCorrente  >= valorDaDivida ) {
valorContaCorrente = valorContaCorrente - valorDaDivida;
}
if ( valorContaCorrente < valorDaDivida) {
valorDaDivida = valorDaDivida - valorContaCorrente;
valorContaCorrente = 0;
}

}

public static void main( String[] args) {

        System.out.println("*** Instanciando Clientes **************************************");
Cliente c1 = new Cliente("Cliente A", 222222226, 10000);// Nome, CPF, Valor.
Cliente c2 = new ClienteEspecial("Cliente B", 333336760, 2000);
Cliente c3 = new Cliente("Cliente C", 44444, 30000);
Cliente c4 = new Cliente("Cliente D", 44444, 10);

System.out.println("*** Instanciando Gerentes **************************************");
Gerente ger1 = new Gerente("Gerente 1", 12345); //Nome e CPF.
Gerente ger2 = new Gerente("Gerente 2", 12121);

ger1.imprimirClientes();
ger2.imprimirClientes();

System.out.println("*** Adicionando Clientes ao Gerente 1 **************************");

if (ger1.adicionarCliente(c1)) System.out.println("Cliente '"  +c1.nome + "' adicionado corretamente.");
else System.out.println("Cliente '"  + c1.nome + "' nao pode ser adicionado.");

if (ger1.adicionarCliente(c2)) System.out.println("Cliente '"  +c2.nome + "' adicionado corretamente.");
else System.out.println("Cliente '"  + c2.nome + "' nao pode ser adicionado.");

if (ger1.adicionarCliente(c2)) System.out.println("Cliente '"  +c2.nome + "' adicionado corretamente.");
else System.out.println("Cliente '"  + c2.nome + "' nao pode ser adicionado.");

if (ger1.adicionarCliente(c3)) System.out.println("Cliente '"  + c3.nome + "' adicionado corretamente.");
else System.out.println("Cliente '"  + c3.nome + "' nao pode ser adicionado.");

System.out.println("*** Adicionando Clientes ao Gerente 2 **************************");

if (ger2.adicionarCliente(c3)) System.out.println("Cliente '"  + c3.nome + "' adicionado corretamente.");
else System.out.println("Cliente '"  + c3.nome + "' nao pode ser adicionado.");

if (ger2.adicionarCliente(c4)) System.out.println("Cliente '"  + c4.nome + "' adicionado corretamente.");
else System.out.println("Cliente '"  + c4.nome + "' nao pode ser adicionado.");
}
}
R

O gerente 1 que eu instanciei tinha q ter 3 clientes e o gerente 2 tinha q ter 1 cliente.

D

O imprimirClientes tem que estar depois de adicionar os clientes.

R

Obrigado Diego, corrigi.

Criado 13 de junho de 2020
Ultima resposta 14 de jun. de 2020
Respostas 11
Participantes 3