Introdução
Brincando hoje com o dc resolvi criar um código que retorne as raízes reais de uma equação do segundo grau. Por incrível que pareça todos os códigos do dc podem ser one-lines, ou seja, com apenas uma linha de código podemos realizar tarefas complexas.
O código
A linha seguinte calcula as raízes de uma equação do segundo grau:
1 _2 _3 sc _1 * sb sa _4 la lc * * lb 2 ^ + v sd lb ld + 2 la * / lb ld – la 2 * / f
Explicando:
1)
1 _2 _3
Esses são os coeficientes da equação x^2 – 2x – 3. Veja que os coeficientes negativos devem ser precedidos de ‘_’ e não de ‘-‘. Caso você queira testar com outros coeficientes, modifique somente esses 3 primeiros números.
2)
sc _1 * sb sa
Em seguida o código guarda nos registradores a, b e c os coeficientes da equação. Como o valor positivo de b não nos interessa, então é gravado o valor de -b.
3)
_4 la lc * * lb 2 ^ + v sd
Esse é o valor de raiz de delta (chamarei de rdelta). Antes do ‘+’ está o valor de delta e o “v sd”, tira a raiz dele e o sd, armazena rdelta no registrador d.
4)
lb ld + 2 la * /
Essa expressão calcula o valor da primeira raiz. Os valores de b e d são empilhados e uma soma entre eles é realizada. Logo depois empilha-se o 2 e o valor de a. Calcula-se 2*a e depois divide-se o valor de b+rdelta por 2a. Só estamos seguindo as regrinhas do nosso querido Bhaskara…
5)
lb ld – la 2 * /
Agora a segunda raiz. Empilhamos b e rdelta, mas agora realizamos uma subtração entre eles. Em seguida empilha-se o valor de a e a constante 2. Realiza-se a operação 2*a e divide a subtração b-rdelta por 2*a.
6)
f
Daqui para frente temos dois valores na pilha, que na verdade são os valores das duas raízes. Assim, para mostrar o conteúdo da pilha utiliza-se o comando f.
Script que calcula as raizes de uma equação
O script seguinte calcula as raizes de uma equação do segundo grau. As raizes devem ser obrigatoriamente reais caso contrário o script retorna erro (raiz de número negativo).
#!/bin/bash # Autor: Daemonio (Marcos Paulo Ferreira) # Contato: undefinido gmail com # # Script que calcula as raizes reais de # uma equacao do segundo grau. # # Fri Jun 10 11:28:04 BRT 2011 # function calc_raiz_dc() { echo $1 $2 $3 '5k sc _1 * sb sa _4 la lc * * lb 2 ^ + v sd lb ld + 2 la * / lb ld - la 2 * / f' | dc } # Coeficientes coe_a= coe_b= coe_c= # Leitura dos coeficientes read -p 'coeficiente a: ' coe_a read -p 'coeficiente b: ' coe_b read -p 'coeficiente c: ' coe_c # Troca o sinal '-' por '_' coe_a=${coe_a/-/_} coe_b=${coe_b/-/_} coe_c=${coe_c/-/_} # Chama a funcao e formata a saida com o sed calc_raiz_dc $coe_a $coe_b $coe_c | sed 'N;s/^/raiz1: /;s/\n/&raiz2: /'
Baixe o código em: http://www.vivaolinux.com.br/script/Raizes-de-equacoes-do-2o-grau-no-dc (confira também o comentário)