Boa tarde pessoal, estou fazendo o exercicio 10 do capito 7 da caelum vou postar o que fiz:
O que ocorre é o seguinte na hora que executa sai isto na tela:
C:\Fabio Java>java TesteBancos
Numero de contas Criadas ja chegou ao limite maximo!
Numero de contas Criadas ja chegou ao limite maximo!
Numero de contas Criadas ja chegou ao limite maximo!
Saldo Anterior: 1000.0
Saldo Final: 1010.0
Saldo Anterior: 999.9
Saldo Final: 1019.898
Saldo Anterior: 1000.0
Saldo Final: 1030.0
Porque a mensagem é impressa primeiro, isso que nao estou entendendo e conseguindoresolver poderiam me ajudar? Desde ja Obrigado
flws
[code]/10) (Opcional, Trabalhoso) Crie uma classe Banco que possui um array de Conta. Repare que num array de
Conta você pode colocar tanto ContaCorrente quanto ContaPoupanca. Crie um método void adiciona(Conta
c), um método Conta pegaConta(int x) e outro int pegaTotalDeContas(), muito similar a relação anterior
de Empresa-Funcionario.Faça com que seu método main crie diversas contas, insira-as no Banco e depois, com um for, percorra
todas as contas do Banco para passá-las como argumento para o AtualizadorDeContas./
class Bancos{
protected Conta[] contas;
public Bancos(int valor){
this.contas = new Conta[valor];
}
public void adiciona(Conta c){
for(int i=0;i < contas.length; i++){
if(this.contas[i]== null){
this.contas[i] = c;
break;
}
else{
System.out.println("Numero de contas Criadas ja chegou ao limite maximo!");
}
}
}
public Conta pegaConta(int x){
return contas[x];
}
public int pegaTotalDeContas(){
int totalContas = 0;
for(int i=0;i < contas.length; i++){
if(this.contas[i] == null){
totalContas += 0;
}
else{
totalContas += 1;
}
}
return totalContas;
}
}
class TesteBancos{
public static void main(String[] args){
Bancos banco;
Conta c = new Conta();
Conta cc = new ContaCorrente();
Conta cp = new ContaPoupanca();
AtualizadorDeContas adc = new AtualizadorDeContas(0.01);
banco = new Bancos(3);
c.deposita(1000);
cc.deposita(1000);
cp.deposita(1000);
banco.adiciona(c);
banco.adiciona(cc);
banco.adiciona(cp);
for(int i=0; i < banco.pegaTotalDeContas(); i++){
if(banco.pegaTotalDeContas() != 0){
adc.roda(banco.pegaConta(i));
}
else{
System.out.println("Não ha nenhuma conta criada.");
}
}
}
}[/code]
public void adiciona(Conta c){
for(int i=0;i < contas.length; i++){
if(this.contas[i]== null){
this.contas[i] = c;
break;
}
else{
System.out.println("Numero de contas Criadas ja chegou ao limite maximo!");
}
}
}
O problema está aí. Acho que esse if não está muito consistente. Toda a vez que vc varrer o vetor ele vai exibir a mensagem para cada posição não nula, e depois então adicionar sua conta na primeira posição nula.
Desculpe a ignorancia porem não entendi ainda. Se ele inciializa no null ele entraria somente no if, minha duvida é porque inicialmente ele entra logo no else para depois entrar no if entendeu?
Obrigado
Opa, e aí blz?
Então, pela breve olhada que dei no código, ele entra no if sim!
Você não percebe pq vc só exibe uma mensagem quando entra no ELSE.
Perceba o fluxo do teste:
Chama 1º - banco.adiciona©
: como array está vazio, ele entra no IF, adiciona a conta no array e dá o BREAK;
Chama 2º - banco.adiciona(cc)
: nessa chamada, array.size() = 1, então, na primeira iteração do FOR, ele cai no else
: assim, exibe a sua mensagem lá: “Numero de contas…”
: na 2ª iteração, ele entra no IF, e adiciona a conta cc ao array e BREAK;
Chama 3º - banco.adiciona(cp)
: na terceira vez, para ele adicionar a conta cp, ele precisa iterar no array até a posição 2, certo?
: então, ele vai entrar no ELSE mais 2x, ou seja, mostrando a mensagem: “Numero de contas…” 2x no console.
Ou seja, ele entra no IF primeiro sim. As 3 mensagens que aparecem são os casos em que ele percorre
o array e a posição já está ocupada. Conseguiu entender?
Obs: Uma dica, em vez de iterar sobre todo o array toda vez para adicionar uma Conta, tente utilizar uma variável
que represente o total de contas. Assim, você já sabe a posição correta onde adicionar.
flws…
blz brotehr e vc tranquilo?
to começando a enteder, so nao conseguir ver como consertaria este erro. Pelo o que vc me aconselhou eu teria que colocar uma variavel para controle é isso? poderia me explicar como sairia deste erro?
obrigado
Então, uma sugestão seria criar uma váriavel na sua classe Bancos chamada totalContas, por exemplo, e o seu método
adiciona(…) ficaria mais ou menos assim:
public void adiciona(Conta c){
// verifica se array ainda tem espaço p/ adicionar +1 conta..
if (totalContas < contas.length) {
contas[totalContas] = c;
totalContas++;
} else {
// Não há mais espaço. Pode colocar sua mensagem aqui.
}
}
Verifica se funciona aí pra você.
Realmente deste jeito não apareceu a mensagem no inicio, porem o programa não rodou corretamente olha so a saida:
C:\Fabio Java>java TesteBancos
Saldo Anterior: 1000.0
Saldo Final: 1030.0
Saldo Anterior: 1030.0
Saldo Final: 1060.9
Saldo Anterior: 1060.9
Saldo Final: 1092.727
Ele está pegando o saldo anterior o saldo final da ultima conta adicionado e isto está errado sendo que foi depositado 1000 para as 3 contas, vou colocar aqui as classes que estou utilizando:
[code]class Conta{
protected double saldo;
void deposita(double valor){
this.saldo += valor;
}
void saca(double valor){
this.saldo -= valor;
}
double getSaldo(){
return this.saldo;
}
void atualiza(double taxa){
this.saldo += this.saldo * taxa;
}
}
class ContaCorrente extends Conta{
void atualiza(double taxa){
this.saldo += (super.atualiza(taxa)) * 2;
}
void deposita(double valor){
this.saldo += valor - 0.10;
}
}
class ContaPoupanca extends Conta{
void atualiza(double taxa){
this.saldo += (super.atualiza(taxa)) * 3;
}
}[/code]
[code]class AtualizadorDeContas {
private double saldoTotal = 0;
private double selic;
AtualizadorDeContas(double selic){
this.selic = selic;
}
void roda(Conta c){
double d;
System.out.println("Saldo Anterior: "+ c.getSaldo());
c.atualiza(this.selic);
System.out.println("Saldo Final: "+c.getSaldo());
setSaldoTotal(c.getSaldo());
}
public double getSaldoTotal(){
return this.saldoTotal;
}
public void setSaldoTotal(double valor){
this.saldoTotal += valor;
}
}[/code]
as outras ja estao postadas o que falo para corrigir o erro das mensagens pq, imprime a mensagem primeiro para depois imprimir os valores
Obrigado
Cara, muito estranho ele ter atualizado a mesma conta. Tem que certeza q tá tudo certo?
Bom, tem outras coisas para ver.
-
O código das classes ContaCorrente e ContaPoupanca não devem compilar!
No método atualiza(), você chama super.atualiza(…), e usa seu retorno em uma expressão, mas o retorno de super.atualiza() é void!
this.saldo += (super.atualiza(taxa)) * 2;
Corrija a função nas duas classes
-
Na classe Bancos, vi que a lógica do pegaTotalDeContas() estava parecida com a da outra função lá. Tente mudar para:
public int pegaTotalDeContas(){
return this.totalContas; // esse é o atributo que você utiliza em adiciona(), lembra? Apenas retorne seu valor aqui.
}
Verifica se deu certo.
Se não, posta sua classe Bancos denovo, com as alterações p/ gente ver o qq tá acontecendo.
flws…
Brother mas a função atualiza ela não retorna nada mesmo nao, ele atualiza a variavel saldo que está disponivel paras as classes de ContaPOupanca e ContaCorrenta ja que são filhas da classe conta e na outra função pegaTotalContas estou usuando uma variavel local se colcoar ela como this. vai ocorrer erro entendeu?
Obrigado t+
Sei que a função atualiza() não deve retornar nada, mas você tentou compilar as classes ContaCorrente e ContaPoupança? Não vai compilar.
Por exemplo, para a classe ContaCorrente, de acordo com a apostila, deveria ser assim:
void atualiza(double taxa) {
this.saldo += this.saldo * taxa * 2;
}
ou então, se você quisesse utilizar o método atualiza(…) da superclasse Conta, seria algo como:
void atualiza(double taxa) {
super.atualiza(taxa * 2);
}
Você tem que fazer isso para a classe ContaPoupanca também.
Se colocar “this.totalContas” vai dar erro, então quer dizer que não existe nenhum atributo na classe definido com este nome. Como q esta sua classe Bancos?
Por favor, poste sua classe aqui.
é realmente minha classe contapoupanca e contacorrente nao estava rodadno fiz as alterações que voce observou e rodou normalmente está ai minha classe bancos
[code]class Bancos{
protected Conta[] contas;
public Bancos(int valor){
this.contas = new Conta[valor];
}
public void adiciona(Conta c){
for(int i=0;i < contas.length; i++){
if(this.contas[i]== null){
this.contas[i] = c;
break;
}
else{
System.out.println("Numero de contas Criadas ja chegou ao limite maximo!");
}
}
}
public Conta pegaConta(int x){
return contas[x];
}
public int pegaTotalDeContas(){
int totalContas = 0;
for(int i=0;i < contas.length; i++){
if(this.contas[i] == null){
totalContas += 0;
}
else{
totalContas += 1;
}
}
return totalContas;
}
}[/code]
Em relação a classe Bancos, você não modificou o método adiciona(…), como eu tinha sugerido?
Bom, vou postar a classe de como ficaria com as minhas sugestões:
class Bancos{
protected Conta[] contas;
private int totalContas;
public Bancos(int valor){
this.contas = new Conta[valor];
}
public void adiciona(Conta c){
if(totalContas < contas.length){
this.contas[totalContas] = c;
totalContas++;
}
else{
System.out.println("Numero de contas Criadas ja chegou ao limite maximo!");
}
}
public Conta pegaConta(int x){
return contas[x];
}
public int pegaTotalDeContas(){
return totalContas;
}
}
Tente com estas modificações, deve funcionar agora.
Agora deu certo… eu tinha colocado oq eu voce sugeriu antes, mas como deu errado coloquei o anterior… mas ja sei o que tinha errado eu não tinha tirado o for e meu metodo pegaTotalDeContas estava diferente do seu acho que era por isso que estava atualizando a mesma conta… mas agora deu certo e eu entendi mto obrigado brother… e aqui uma ultima duvida se eu usasse o this.totalContas funcionaria? pq não usou o this?
Obrigado
Ah tá.
Então, no seu caso, usar com o this ou não seria indiferente, faria a mesma coisa. (pode testar aí que funciona)
O this representa a referencia para o próprio objeto ali, no caso, um objeto Bancos. Então, ao usar “this.totalContas”,
você está utilizando o atributo totalContas do objeto Bancos.
Geralmente, o uso do this é para evitar o famoso shadowing (sombreamento), que ocorre quando você tem uma váriavel local e um atributo
com o mesmo nome. Nesse caso, como diferenciar entre os dois ? É aí que você utiliza o this para referenciar para o atributo.
Exemplo:
class Exemplo {
private int contador = 10; // atributo da classe
public void method(){
int contador = 5; // veja que aqui voce declarou e inicializou uma nova variavel LOCAL.
System.out.println(contador); // imprime: 5
this.contador = this.contador + 1; // usando o this: está referenciando o atributo da classe
System.out.println(this.contador); // imprime: 11
}
}
O ideal mesmo é você evitar esses casos de atributos e váriaveis locais com o mesmo nome, pois fica fácil de confundir.
Se isso for tudo, por favor, coloque [RESOLVIDO] no título do tópico. 
flws…
entendi brother brigadao agora vou passaar pro outro capitulo hehehe 8)
Obrigado a todos
t+