Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Calculador de equação de segundo grau, ora funciona, ora não


Posts recomendados

Boa noite,

 

Fiz uma calculadora para equações de segundo grau, para resolver a clássica:

ax²+bx+c=0

Usando a fórmula de Bhaskara para encontrar o "x".

Porém quando uso valores como:

a = 1
b = 1
c = -1

, funciona muito bem dando o resultado correto, porém quando uso por exemplo:

a=2
b=3
c=-5

, o resultado fica: 4 e -10, que está errado.

O código que fiz foi este( Compilei com o Free Pascal no Linux ):

program bhaskara;

var a, b, c, delta, x, bn, xp, xn : real;

begin
        write('Digite o valor de a: ');
        readln(a);
        if a = 0 then
        begin
                writeln('A não pode ser 0');
                exit;
        end
        else
        begin
                writeln('Valor de a está ok');
        end;
        write('Digite o valor de b: ');
        readln(b);
        write('Digite o valor de c: ');
        readln(c);
        writeln('Indo calcular delta');
        delta := (b*b)-(4*a*c);
        writeln(delta:0:6);
        writeln('Indo calcular b negativo');
        bn := (-1)*b;
        writeln('Indo calcular x negativo');
        xn := (bn - sqrt(delta))/2*a;
        writeln('Indo calcular x positivo');
        xp := (bn + sqrt(delta))/2*a;
        writeln('Duas raízes foram achadas: ', xp:0:6, ' ', xn:0:6);
end.

 

 

Grato desde já.

Link para o comentário
Compartilhar em outros sites

Ok, vou retirar esta parte, e explicar as variáveis em comentários: 

program bhaskara;

var a { a letra "a" }, b{ a letra "b"}, c { a letra "c"}, delta{ o delta }, x { o valor de x }, bn{ usei para transformar o b em um número negativo }, xp{ o x pode ter dois valores, este é do x positivo }, xn { x negativo} : real;

begin
        write('Digite o valor de a: ');
        readln(a); { recebe o valor de a }
        write('Digite o valor de b: ');
        readln(b); { recebe o valor de b }
        write('Digite o valor de c: ');
        readln(c); { recebe o valor de c }
        writeln('Indo calcular delta');
        delta := (b*b)-(4*a*c); { calcula o delta }
        writeln(delta:0:6); { mostrei o delta só por teste }
        writeln('Indo calcular b negativo');
        bn := (-1)*b; { aqui transforma o b em negativo para calcular o bhaskara }
        writeln('Indo calcular x negativo');
        xn := (bn - sqrt(delta))/2*a; { calcula um dos valores do x, no caso o negativo }
        writeln('Indo calcular x positivo');
        xp := (bn + sqrt(delta))/2*a; { calcula o valor positivo do x }
        writeln('Duas raízes foram achadas: ', xp:0:6, ' ', xn:0:6);
end.

 

adicionado 1 minuto depois

Só depois que percebi que nem usei a variável x, desculpe.

adicionado 2 minutos depois

O erro é este: sempre que tento, por exemplo o 2,3,-5 dá errado, diz que é 4,-10.

Mas só funciona com 1,1,-1 e alguns outros.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

@NomeUnderground, alguns pontos importantes:

 

12 horas atrás, NomeUnderground disse:

var
  a { a letra "a" }, b{ a letra "b"}, c { a letra "c"}

O que seria essas "letras" ? talvez uma referencia melhor seria chamá-los de "constantes" (no caso: "constante a", "constante b" e "constante c" ) ou respectivamente «coeficiente quadrático, coeficiente linear e coeficiente constante ou termo livre».

 

 

 

12 horas atrás, NomeUnderground disse:

delta{ o delta }

 

O Delta seria a "discriminante".

 

 

 

12 horas atrás, NomeUnderground disse:

bn{ usei para transformar o b em um número negativo }

Quem disse que b tem que ser transformado em um número negativo? na verdade, a fórmula simplesmente usa "-b", que por sua vez NÃO que dizer que está transformando em negativo (atenção nessa interpretação), mas sim usando o "oposto" ou "simétrico" (são coisas distintas). Pegue por exemplo b=-3, -b vai ser negativo?

 

 

 

12 horas atrás, NomeUnderground disse:

xp{ o x pode ter dois valores, este é do x positivo }, xn { x negativo} : real;

Essa informação sobre  "x positivo" e "x negativo" não procede também. Apenas consta que x pode ter 2 «duas raízes reais e distintas» (ou «duas raízes reais e iguais» ou «não possuir qualquer raiz real») ... poderia chamar, por exemplo, de x1 e x2.

 

Por sinal, você precisa tratar os casos especiais... como esses 3 citados em negrito acima, e também a questão citada por @Vitor Mattos:

13 horas atrás, Vitor Mattos disse:

"A" nunca pode ser 0 então acho desnecessário esta parte deste programa.

veja, se a=0, deixará de ser uma equação do segundo grau, pois "0" vezes "x^2" é igual a zero! (viraria uma equação de primeiro grau, já que o grau é medido pelo maior expoente de x)... Daí, ou você trata o caso, como você estava fazendo, ou estipula que não vai aceitar!!! De um modo geral, a sua verificação no seu primeiro código está no caminho certo, apenas não precisa do trecho do else.

 

 

 

12 horas atrás, NomeUnderground disse:

O erro é este: sempre que tento, por exemplo o 2,3,-5 dá errado, diz que é 4,-10.

 

12 horas atrás, NomeUnderground disse:

sqrt(delta))/2*a

A fórmula para encontrar as raízes está errada, pois você está dividindo o numerador apenas por 2, e depois multiplicando o resultado por a, mas a fórmula diz que você precisa dividir todo numerador por 2*a (e não apenas por 2). (apenas coloque 2*a entre parênteses, para mudar a prioridade da operação). obs.: veja, dividir antes e multiplicar depois tem resultados diferentes nesse contexto. Daí, o Pascal segue a regra do PEMDAS.

 

 

No aguardo.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Sobre o B, eu sei que nem sempre vai ser negativo, pois se for negativo, quando fizer o cálculo vai ficar positivo, quanto aos comentários, alguns estão errados, pois fiz rapidamente, para dar o retorno o mais rápido possível.

Muito obrigado, na verdade só usei o termo "letra", pois me pediram para explicar as variáveis. Quanto a que nem sempre o X vai ter um negativo e um positivo, também sei, só coloquei isso pois me veio na cabeça na hora. 

Ok, vou recolocar o if para ver se a é 0.

Obrigado por me avisar do erro do 2*a, nem me liguei nisso, afinal comecei no Pascal faz um pouco mais de um dia. Vou editar o código. Muito obrigado e funcionou com esta correção do 2*a para (2*a), nem me liguei que isso não faria o que eu queria.

program bhaskara;

var a {  constante "a" }, b{ a constante "b"}, c { a constante "c"}, delta{ o delta }, x { o valor de x }, bn{ usei para transformar o valor simétrico do b }, x1{ o primeiro x}, x2 { o segundo x} : real;

begin
        write('Digite o valor de a: ');
        readln(a); { recebe o valor de a }
        if a = 0 then
        begin
                writeln('A não pode ser 0');
                exit;
        end;
        write('Digite o valor de b: ');
        readln(b); { recebe o valor de b }
        write('Digite o valor de c: ');
        readln(c); { recebe o valor de c }
        writeln('Indo calcular delta');
        delta := (b*b)-(4*a*c); { calcula o delta }
        writeln(delta:0:6); { mostrei o delta só por teste }
        writeln('Indo calcular b negativo');
        bn := (-1)*b; { aqui transforma o b em negativo para calcular o bhaskara }
        writeln('Indo calcular x negativo');
        x2 := (bn - sqrt(delta))/(2*a); { calcula um dos valores do x, no caso o negativo }
        writeln('Indo calcular x positivo');
        x1 := (bn + sqrt(delta))/(2*a); { calcula o valor positivo do x }
        writeln('Duas raízes foram achadas: ', x1:0:6, ' ', x2:0:6);
end.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Para reforçar:

12 minutos atrás, NomeUnderground disse:

Quanto a que nem sempre o X vai ter um negativo e um positivo, também sei, só coloquei isso pois me veio na cabeça na hora. 

 

Então precisa corrigir o código:

8 minutos atrás, NomeUnderground disse:

        writeln('Indo calcular b negativo');
        bn := (-1)*b; { aqui transforma o b em negativo para calcular o bhaskara }

Essa etapa do "b negativo" não é necessária (lembrando que seria "oposto" ou "simétrico". Falar como "negativo" é literalmente um erro). Você pode simplesmente usar algo como:

x1:=(-b + sqrt(delta))/(2*a)
x2:=(-b - sqrt(delta))/(2*a)

 

 

Idem para o tal de "x negativo" e "x positivo". Você precisará usar outra terminologia, pois essa relação não existe... e lembrar que precisa tratar dos casos especiais. (nem sempre tem duas raízes reais e distintas!), ou seja, essas resposta "Duas raízes foram achadas: " depende do valor da discriminante. Se não me engano existem 4 possibilidades de resposta!

 

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
4 minutos atrás, NomeUnderground disse:

não sabia que funcionava, por isso preferi inverte-lo em uma variável

O raciocínio está corretíssimo, apenas estava "errando" ou "dando a entender que está errando" na nomenclatura da operação. Como você sugere, você "já entendia" que não era "tornar negativo", mas ao se referi que era, acaba cometendo essa impressão. Quis reforçar pois é um detalhe importante e interessante. 

 

Adendo: talvez o termo "negativo" também se refira a "oposto", ou seja, "o negativo de -7 é +7". Mas... ao falar em "aqui transforma o b em negativo", dá a impressão que esse coeficiente ficará negativo em si (um valor menor que zero).

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!