示例#1
0
            public void Dividir(TermoEquacao divisor, IEnumerable <TermoEquacao> listaTermos)
            {
                if (divisor.Valor == 0)
                {
                    throw new DivideByZeroException("Tentativa de dividir por zero");
                }

                var termos = listaTermos.ToArray();

                if (termos.Any(t => t.Tipo == TipoTermo.Divisor))
                {
                    var divisorExistente = termos.First(t => t.Tipo == TipoTermo.Divisor);
                    divisorExistente.Valor *= divisor.Valor;
                    return;
                }

                foreach (var termo in termos)
                {
                    termo.Valor /= divisor.Valor;
                    if (termo.Tipo == divisor.Tipo)
                    {
                        if (termo.Tipo == TipoTermo.Incognita)
                        {
                            termo.Potencia--;
                        }
                    }
                    else
                    {
                        termo.Tipo = TipoTermo.Incognita;
                    }
                }
            }
示例#2
0
            public void Multiplicar(TermoEquacao multiplicador, IEnumerable <TermoEquacao> listaTermos)
            {
                var termos = listaTermos.ToArray();

                foreach (var termo in termos.Where(t => t.Tipo != TipoTermo.Divisor))
                {
                    termo.Valor *= multiplicador.Valor;

                    if (termo.Tipo == multiplicador.Tipo)
                    {
                        if (termo.Tipo == TipoTermo.Incognita)
                        {
                            termo.Potencia++;
                        }
                    }
                    else
                    {
                        termo.Tipo = TipoTermo.Incognita;
                    }
                }

                //TODO testar simplificação
                //if (termos.Any(t => t.Tipo == TipoTermo.Divisor))
                //{
                //    var divisorExistente = termos.First(t => t.Tipo == TipoTermo.Divisor);

                //    //todos eles são divisíveis
                //    if (termos.All(t => t.Valor % divisorExistente.Valor == 0)) //se são divisíveis, simplificar
                //    {
                //        Dividir(divisorExistente, termos);

                //    }
                //}
            }
示例#3
0
        public void Subtrair(Lado ladoParaAplicar, TermoEquacao termo)
        {
            var listaTermos = ObterTermosDoLado(ladoParaAplicar);

            calculadora.Subtrair(termo, listaTermos);

            historicoOperacoes.RegistrarOperacao(new Subtracao(termo), ladoParaAplicar);
        }
示例#4
0
        public void Dividir(Lado ladoParaAplicar, TermoEquacao divisor)
        {
            var listaTermos = ObterTermosDoLado(ladoParaAplicar);

            calculadora.Dividir(divisor, listaTermos);

            historicoOperacoes.RegistrarOperacao(new Divisao(divisor), ladoParaAplicar);
        }
示例#5
0
        public void Multiplicar(Lado ladoParaAplicar, TermoEquacao multiplicador)
        {
            var listaTermos = ObterTermosDoLado(ladoParaAplicar);

            calculadora.Multiplicar(multiplicador, listaTermos);

            historicoOperacoes.RegistrarOperacao(new Multiplicacao(multiplicador), ladoParaAplicar);
        }
示例#6
0
            public void Adicionar(TermoEquacao termo, ICollection <TermoEquacao> listaTermos)
            {
                var termoDoMesmoTipo = listaTermos.FirstOrDefault(t => t.Tipo == termo.Tipo && t.Potencia == termo.Potencia);

                if (termoDoMesmoTipo != null)
                {
                    termoDoMesmoTipo.Valor += termo.Valor;
                }
                else
                {
                    listaTermos.Add(termo);
                }
            }
示例#7
0
        public static void RealizarOperacao(this Equacao equacao, TipoOperacao tipoOperacao, TermoEquacao termo, Lado lado)
        {
            switch (tipoOperacao)
            {
            case TipoOperacao.Adicao:
                equacao.Somar(lado, termo);
                break;

            case TipoOperacao.Subtracao:
                equacao.Subtrair(lado, termo);
                break;

            case TipoOperacao.Multiplicacao:
                equacao.Multiplicar(lado, termo);
                break;

            case TipoOperacao.Divisao:
                equacao.Dividir(lado, termo);
                break;

            default: throw new Exception(string.Format("Operação não suportada: {0}", tipoOperacao));
            }
        }
示例#8
0
        private void DeveTerRegistradoUmaOperacaoDe(TipoOperacao tipoEsperado, Lado lado, Equacao equacao, TermoEquacao termo, int noIndice)
        {
            var operacoes = equacao.HistoricoOperacoes.ObterOperacoes(lado);
            var operacao  = operacoes[noIndice];

            operacao.Tipo.Should().Be(tipoEsperado);
            operacao.Termo.Should().Be(termo);
        }
示例#9
0
 public Adicao(TermoEquacao termo) : base(TipoOperacao.Adicao, termo)
 {
 }
示例#10
0
 public Multiplicacao(TermoEquacao termo)
     : base(TipoOperacao.Multiplicacao, termo)
 {
 }
示例#11
0
 public Divisao(TermoEquacao termo)
     : base(TipoOperacao.Divisao, termo)
 {
 }
示例#12
0
 //controlar histórico das operações
 internal void AdicionarTermoLadoDireito(TermoEquacao termo)
 {
     termosDireita.Add(termo);
 }
示例#13
0
 //controlar histórico das operações
 internal void AdicionarTermoLadoEsquerdo(TermoEquacao termo)
 {
     termosEsquerda.Add(termo);
 }
示例#14
0
 public Subtracao(TermoEquacao termo) : base(TipoOperacao.Subtracao, termo)
 {
 }
示例#15
0
 public static TermoEquacao ElevadoA(this TermoEquacao termo, int potencia)
 {
     termo.Potencia = potencia;
     return(termo);
 }
示例#16
0
 private static void DeveTerSubstituido(TermoEquacao termoOriginal, TermoEquacao por, IEnumerable <TermoEquacao> no)
 {
     no.Should().NotContain(t => t == termoOriginal);
     no.Should().Contain(t => t == por);
 }
示例#17
0
 public Operacao(TipoOperacao tipo, TermoEquacao termo)
 {
     Tipo  = tipo;
     Termo = termo;
 }