Pular para o conteúdo

Raízes da equação de segundo grau (Bhaskara) através do prompt em shell

Da série "scripts inúteis" ou "inutilitários".

Este script recebe três números inteiros ou decimais via linha de comando, correspondentes a "a", "b" e "c", na equação de segundo grau ax²+bx+c=0 e retorna os dois valores para os quais x valida a equação, transformando a expressão em zero. Ele também fornece as raízes complexas conjugadas.

Os valores são impressos na tela por uma linha cada totalizando duas linhas impressas.

O script foi testado até onde pude contra possíveis bugs. Nada impede de haver algum.

Exemplo de funcionamento

$ ./bhaskara-0001.sh 1 2 1
-1.000000000000000
-1.000000000000000

Outro exemplo:

$ ./bhaskara-0001.sh 1 2 3
-1.000000000000000 - 1.414213562373095i
-1.000000000000000 + 1.414213562373095i

Vejam a letra "i" ao final de cada linha, indicando a raiz complexa.

Se tiver coragem, ainda pretendo fazê-lo funcionar para parâmetros complexos.
Perfil removido removido
Hits: 3.491 Categoria: Shell Script Subcategoria: Avançado
  • Download
  • Nova versão
  • Indicar
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Descrição

Da série "scripts inúteis" ou "inutilitários".

Este script recebe três números inteiros ou decimais via linha de comando, correspondentes a "a", "b" e "c", na equação de segundo grau ax²+bx+c=0 e retorna os dois valores para os quais x valida a equação, transformando a expressão em zero. Ele também fornece as raízes complexas conjugadas.

Os valores são impressos na tela por uma linha cada totalizando duas linhas impressas.

O script foi testado até onde pude contra possíveis bugs. Nada impede de haver algum.

Exemplo de funcionamento

$ ./bhaskara-0001.sh 1 2 1
-1.000000000000000
-1.000000000000000

Outro exemplo:

$ ./bhaskara-0001.sh 1 2 3
-1.000000000000000 - 1.414213562373095i
-1.000000000000000 + 1.414213562373095i

Vejam a letra "i" ao final de cada linha, indicando a raiz complexa.

Se tiver coragem, ainda pretendo fazê-lo funcionar para parâmetros complexos.
Download bhaskara-0001.sh Enviar nova versão
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Esconder código-fonte

#!/bin/bash

export escala=15
export errorlevel=0

# verifica ponto e virgula
vpv="s/\,/\./"

# verifica ponto, virgula e sinal
vps="s/^\-?[0-9]*\.?[0-9]*$//"

# verifica zero
vz="s/^0*\.?0*$//g"

# corta zero
cz="s/0//g"

# corta ponto
cp="s/\.//g"

# corta digito
cd="s/[0-9]//g"

# corta zero final
czf="s/^([0-9]*\.[0-9])0*$/\1/g"

calc () {

   echo "$@" | bc -l

}

if [ $# -ne 3 ]
then
   echo -e "Use $0 a b c.\nValores reais."
   exit 16
fi

a=`echo -n $1 | sed -r "$vp"`
b=`echo -n $2 | sed -r "$vp"`
c=`echo -n $3 | sed -r "$vp"`

ver_a=`echo -n $a | sed -r "$vps"`
ver_b=`echo -n $b | sed -r "$vps"`
ver_c=`echo -n $c | sed -r "$vps"`

zero_a=`echo -n $a | sed -r "$vz"`

if [ -z "$zero_a" ]
then
   echo "Valor de a nao pode ser zero."
   let errorlevel+=8
fi

if [ -n "$ver_a" ]
then
   echo "Valor de a fora de formato."
   let errorlevel+=1
fi

if [ -n "$ver_b" ]
then
   echo "Valor de b fora de formato."
   let errorlevel+=2
fi

if [ -n "$ver_c" ]
then
   echo "Valor de c fora de formato."
   let errorlevel+=4
fi

if [ $errorlevel -ne 0 ]
then
   exit $errorlevel
fi

delta=`calc "scale=$escala; $b*$b-4*$a*$c"`
delta=`echo $delta | sed -e "$cz" -e "$cp"`
sinal=`echo $delta | sed -r -e "$cd" -e "$cp"`

if [ "$sinal" = "-" ]
then

   sgn=-1
   r_delta=`calc "scale=$escala; sqrt(-1*$delta)"`

elif [ -z "$sinal" -a -z "$delta" ]
then

   sgn=0
   delta=0
   r_delta=0

else

   sgn=1
   r_delta=`calc "scale=$escala; sqrt($delta)"`

fi

r_delta=`echo -n $r_delta | sed -r "$czf"`

re=`calc "scale=$escala; -1*$b/2*$a"`
re=`echo -n $re | sed -r "$czf"`

im=`calc "scale=$escala; $r_delta/2*$a"`
im=`echo -n $im | sed -r "$czf"`

if [ "$sgn" -eq "-1" ]
then

   im=`echo $im | sed -r "s/^\-//g"`
   echo -e "$re - $im"i"\n$re + $im"i

elif [ "$sgn" -eq 0 ] 
then

   echo -e "$re\n$re"

else

   r1=`calc "scale=$escala; $re-$im"`
   r2=`calc "scale=$escala; $re+$im"`

   echo -e "$r1\n$r2"   

fi

exit 0
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Meu firewall

Relatório minuto a minuto de todas as conexões do servidor

Cálculo de Horas

Fedora autenticando no LDAP.

Instalação completa de servidor de e-mail

#1 Comentário enviado por removido em 01/06/2017 - 01:13h
Nota: fora este script ser um legítimo POG, ele tem (ao menos) um BUG que será corrigido em breve. Quem consegue descobrir?

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden

Contribuir com comentário

Entre na sua conta para comentar.