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

06 Cadastro de muitas contas

Bom dia a todos!

Não consegui implementar o código para cadastrar mais contas do que o tamanho do array permitia. Consultei a "opinião do instrutor" e repliquei o código. Ele compila, mas dá erro (exception) quando tento selecionar a conta adicionada no combobox de contas (comboContas).

Estou acostumado com PHP, onde não é preciso definir o tamanho de um array. No C# é bem diferente, só é possível declarar um array com um determinado tamanho.

Eu não sabia, mas um amigo me ensinou que em C# existem 3 "tipos" de array, o array propriamente dito, nativo do C#; e duas classes, arraylist e list. No array, é preciso definir o tamanho, no arraylist e no list não é necessário.

A princípio eu não vi sentido para isso, mas meu amigo me explicou que o ganho do array é na performance (por exemplo, quando se envolvem cálculos complexos, de matrizes, etc.).

Aguardo alguém que possa me ajudar! :-)

5 respostas

Segue o código:

using Caelum.CaixaEletronico.Modelo;
using Caelum.CaixaEletronico.Modelo.Contas;
using Caelum.CaixaEletronico.Modelo.Usuarios;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CaixaEletronico
{
    public partial class Form1 : Form
    {
        //Conta [] contas;
        private Conta[] contas;
        private int quantidadeDeContas;

        private Conta[] novo;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            contas = new Conta[3];
            //contas = new Conta[10];

            //novo = null;

            Conta contaDoVictor = new ContaCorrente();
            contaDoVictor.Titular = new Cliente();
            contaDoVictor.Titular.Nome = "Victor";
            contaDoVictor.Numero = 1;
            contas[0] = contaDoVictor;

            Conta contaDoGuilherme = new ContaPoupanca();
            contaDoGuilherme.Titular = new Cliente();
            contaDoGuilherme.Titular.Nome = "Guilherme";
            contaDoGuilherme.Numero = 2;
            contas[1] = contaDoGuilherme;

            Conta contaDoMauricio = new ContaInvestimento();
            contaDoMauricio.Titular = new Cliente();
            contaDoMauricio.Titular.Nome = "Mauricio";
            contaDoMauricio.Numero = 3;
            contas[2] = contaDoMauricio;

            foreach (Conta conta in this.contas)
            {
                if (conta != null)
                {
                    comboContas.Items.Add(conta);
                    destinoDaTransferencia.Items.Add(conta);

                    //comboContas.Items.Add(conta.Titular.Nome);
                    //destinoDaTransferencia.Items.Add(conta.Titular.Nome);
                }
            }
        }

        // continua...
private void button1_Click(object sender, EventArgs e)
        {
            string textoValorSaque = valorOperacao.Text;

            double valorDeposito = Convert.ToDouble(textoValorSaque);

            int indiceSelecionado = comboContas.SelectedIndex;

            Conta contaSelecionada = this.contas[indiceSelecionado];
            contaSelecionada.Deposita(valorDeposito);

            this.MostraConta(contaSelecionada);
        }

        private void button2_Click(object sender, EventArgs eA)
        {
            string textoValorSaque = valorOperacao.Text;

            double valorSaque = Convert.ToDouble(textoValorSaque);
            Conta contaSelecionada = this.BuscaContaSelecionada();

            try { 
                contaSelecionada.Saca(valorSaque);
                MessageBox.Show("Dinheiro Liberado");
            }
            catch (SaldoInsuficienteException e)
            {
                MessageBox.Show("Saldo insuficiente. " + e.Message);
            }
            catch (ArgumentException e)
            {
                MessageBox.Show("Não é possível sacar um valor negativo. " + e.Message);
            }

            this.MostraConta(contaSelecionada);
        }

        private void MostraConta(Conta conta)
        {
            textoTitular.Text = conta.Titular.Nome;
            textoSaldo.Text = Convert.ToString(conta.Saldo);
            textoNumero.Text = Convert.ToString(conta.Numero);
        }

        private Conta BuscaContaSelecionada()
        {
            int indiceSelecionado = comboContas.SelectedIndex;
            return this.contas[indiceSelecionado];
        }


        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string titularSelecionado = comboContas.Text;
            Conta contaSelecionada = this.BuscaContaSelecionada();
            this.MostraConta(contaSelecionada);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();

            int indiceDaContaDestino = destinoDaTransferencia.SelectedIndex;

            Conta contaDestino = this.contas[indiceDaContaDestino];

            string textoValor = valorOperacao.Text;
            double valorTransferencia = Convert.ToDouble(textoValor);

            contaSelecionada.TransferePara(contaDestino, valorTransferencia);

            this.MostraConta(contaSelecionada);

        }

        private void testeEquals_click(object sender, EventArgs e)
        {
            Cliente guilherme = new Cliente("Guilherme");
            guilherme.Rg = "12345678-9";

            Cliente paulo = new Cliente("Paulo");
            paulo.Rg = "12345678-9";
            //paulo.Rg = "98765432-1"; teste diferente
            MessageBox.Show(guilherme.ToString() + "\n é igual a \n" + paulo.ToString() + " ? \n\n" + guilherme.Equals(paulo));
        }

        public void AdicionaConta(Conta conta)
        {
            if (this.quantidadeDeContas == this.contas.Length)
            {
                int q = this.quantidadeDeContas * 2;
                novo = new Conta[q];

                for (int i = 0; i < this.quantidadeDeContas; i++)
                {
                    novo[i] = this.contas[i];
                }

                this.contas = novo;
            }

            this.contas[this.quantidadeDeContas] = conta;
            this.quantidadeDeContas++;
            comboContas.Items.Add(conta);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            CadastroDeConta formularioDeCadastro = new CadastroDeConta(this);
            formularioDeCadastro.ShowDialog();
            //formularioDeCadastro.ShowDialog(CadastroDeConta.ActiveForm);
        }

        private void button6_Click(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();

            novo = new Conta[this.quantidadeDeContas];

            for (int i = 0; i < this.quantidadeDeContas; i++)
            {
                if (this.contas[i].Numero != contaSelecionada.Numero)
                {
                    novo[i] = this.contas[i];
                }
            }

            this.contas = novo;

            comboContas.Items.Clear;
            destinoDaTransferencia.Items.Clear;
            foreach (Conta conta in this.contas)
            {
                if (conta != null)
                {
                    comboContas.Items.Add(conta);
                    destinoDaTransferencia.Items.Add(conta);

                    //comboContas.Items.Add(conta.Titular.Nome);
                    //destinoDaTransferencia.Items.Add(conta.Titular.Nome);
                }
            }
        }
    }
}
solução!

Oi Jonas, tudo bom?

Obrigado por compartilhar o código. Dando uma olhada por cima aqui me parece tudo ok. Posso ter deixado escapar algo.

Você pode compartilhar com a gente aqui o erro que apareceu? =)

Assim fica mais fácil encontrar a possivel causa do problema.

Aguardo retorno.

Abraço!

Boa tarde André! Tinha uma pequenas diferenças entre meu código e o arquivo disponibilizado no fim da aula. Eu abri os dois, comparei, alterei, compilou e rodou! Obrigado pela resposta! Abraço! :-)

Opa, fico feliz que tenha resolvido =)

Qualquer problema é só abrir outra duvida aqui!

Abraço e bons estudos.