O ponto chave nesse desafio é construir uma classe capaz de seguir os passos matemáticos de resolução de equações. Para isso utilizaremos algumas propriedades matemáticas e também a fórmula de Bhaskara.
Vamos iniciar criando uma classe contendo os atributos que sabemos que ela terá e os seus valores iniciais.
class Equation { constructor(a = 0, b = 0, c = 0) {
this.a = a
this.b = b
this.c = c
}
}
Agora vamos lidar por etapas com o método de obter as raízes. Uma forma simples e razoavelmente organizada de fazer isso é utilizando IFs com retornos cedo, ou seja, uma condicional que fará o método retornar e encerrar ali a sua execução. O primeiro caso que iremos tratar será o de parâmetros não informados, quando todos o valores de a, b e c forem iguais a 0. Ao invés de atirarmos um erro na execução vamos simular isso apenas retornando uma mensagem.
class Equation {
constructor(a = 0, b = 0, c = 0) {
this.a = a
this.b = b
this.c = c
}
getRoots() {
if (this.a === 0 && this.b === 0 && this.c === 0) {
return 'Erro! Nenhum parâmetro informado.'
}
}
}
Com essa parte resolvida podemos agora tratar os casos de parâmetros parciais, ou seja, quando apenas c é fornecido, o que resulta em uma constante sem nenhuma raiz, e quando apenas b e c são fornecidos, o que resulta em uma equação de primeiro grau.
Com apenas o valor de c tudo que precisamos retornar é um array vazio. Além disso temos que descrever os passos da resolução. Para isso poderíamos usar muitas outras formas, como um objeto contendo tanto as raízes quanto os passos da resolução, por exemplo, mas vamos simplificar utilizando apenas um console.log().
Já com a equação de primeiro grau temos que descrever os passos da resolução. Mais uma vez utilizaremos o console.log().
class Equation {
constructor(a = 0, b = 0, c = 0) {
this.a = a
this.b = b
this.c = c
}
getRoots() {
if (this.a === 0 && this.b === 0 && this.c === 0) {
return 'Erro! Nenhum parâmetro informado.'
}
if (this.a === 0 && this.b === 0) {
console.log('1. Parâmetros insuficientes.\\nNenhuma raiz real.')
return []
}
if (this.a === 0) {
console.log(`1. ${this.b}x + ${this.c} = 0`)
console.log(`2. ${this.b}x = ${this.c * -1}`)
console.log(`3. x = ${this.c * -1} / ${this.b}`)
console.log(`4. x = ${- this.c / this.b}`)
return [- this.c / this.b]
}
}
}
Por fim, resta apenas lidar com as equações de segundo grau, ou seja, quando a, b e c são todos diferentes de 0. Podemos então aplicar a fórmula de Bhaskara, calculando o delta e encontrando as raízes, se existirem.
class Equation {
constructor(a = 0, b = 0, c = 0) {
this.a = a
this.b = b
this.c = c
}
getRoots() {
if (this.a === 0 && this.b === 0 && this.c === 0) {
return 'Erro! Nenhum parâmetro informado.'
}
if (this.a === 0 && this.b === 0) {
console.log('1. Parâmetros insuficientes.\\nNenhuma raiz real.')
return []
}
if (this.a === 0) {
console.log(`1. ${this.b}x + ${this.c} = 0`)
console.log(`2. ${this.b}x = ${this.c * -1}`)
console.log(`3. x = ${this.c * -1} / ${this.b}`)
console.log(`4. x = ${- this.c / this.b}`)
return [- this.c / this.b]
}
const delta = this.b ** 2 - 4 * this.a * this.c
console.log(`1. Δ = ${this.b}² - 4 * ${this.a} * ${this.c}`)
console.log(`2. Δ = ${delta}`)
if (delta < 0) {
console.log(`3. Δ < 0.\\nNenhuma raiz real.`)
return []
}
console.log(`3. x' = (-(${this.b}) + √${delta}) / 2 * ${this.a}`)
console.log(`4. x" = (-(${this.b}) - √${delta}) / 2 * ${this.a}`)
console.log(`5. x' = ${this.b * -1} + √${delta} / ${this.a * 2}`)
console.log(`6. x" = ${this.b * -1} - √${delta} / ${this.a * 2}`)
const x1 = (-this.b + Math.sqrt(delta)) / (2 * this.a)
const x2 = (-this.b - Math.sqrt(delta)) / (2 * this.a)
if (Number.isInteger(Math.sqrt(delta))) {
console.log(`7. x' = ${this.b * -1} + ${Math.sqrt(delta)} / ${this.a * 2}`)
console.log(`8. x" = ${this.b * -1} - ${Math.sqrt(delta)} / ${this.a * 2}`)
console.log(`9. x' = ${x1}`)
console.log(`10. x" = ${x2}`)
}
return x1 === x2 ? [x1] : [x1, x2]
}
}