Jump to content

[Snippet] Fórmula Resolvente


thoga31
 Share

Recommended Posts

Proponho este snippet-base, que encontrei nas minhas pastas muiiiito antigas aka 3 anos, aquando aprendiz verdinho. 😄

Sintam-se à vontade de propor aqui melhoramentos, inclusive com recurso a funções em vez de um programa tão linear. 🙂

Não coloquei na Wiki, para já, pois espero um snippet "mais-melhor". 😁

PROGRAM FormulaResolvente2;
USES crt;  (* Só para a utilização do ClrScr. *)

var a, b, c : real;  // Parâmetros de Ax^2 + Bx + C = 0
   d : real;        // Discriminante
   x1, x2 : real;   // Raízes reais
   vx, vy : real;   // Vértice
   opc : char;      // Opção de saída

BEGIN
    repeat
          ClrScr;
          writeln('FORMULA RESOLVENTE, ax^2 + bx + c = 0');
          writeln;

          repeat
                write('a? ');
                readln(a);
                if (a=0) then writeln('[ERRO! A=0]');
          until (a<>0);

          write('b? ');
          readln(b);

          write('c? ');
          readln(c);

          // Cálculo do discriminante
          d := sqr(b) - 4*a*c;

          // Cálculo das raízes
          if (d>=0) then begin
             x1 := (-b + sqrt(d)) / (2*a);
             x2 := (-b - sqrt(d)) / (2*a);
          end;

          // Cálculo dos pontos X e Y do vértice
          vx := -b / (2*a);
          vy := a*sqr(vx) + b*vx + c;

          // Output dos resultados
          writeln;
          writeln('DISCRIMINANTE:');
          writeln('   d = ',  d, '  (',  d:15:10, ')');

          writeln;
          writeln('RAIZES:');
          if (d>=0) then begin
             writeln('  x1 = ', x1, '  (', x1:15:10, ')');
             writeln('  x2 = ', x2, '  (', x2:15:10, ')');
             if (d=0) then writeln('  [ATENCAO: Raiz dupla!]');
          end else writeln('  [ERRO MATEMATICO: Sem raizes reais!]');

          writeln;
          writeln('VERTICE:');
          writeln('   X = ', vx, '  (', vx:15:10, ')');
          writeln('   Y = ', vy, '  (', vy:15:10, ')');

          // Controlo de saída
          writeln;
          write('ENTER = Repetir. ESC = Sair. ');
          repeat
                opc := ReadKey;
          until (opc in [#13, #27]);
    until (opc = #27);  // ESC
END.
 

Cumprimentos. 👍

EDIT:

Adaptei para o ideone, e o input que coloquei vai originar como resultado o famoso número de ouro 👍

Knowledge is free!

Link to comment
Share on other sites

Antes de mais, uma aulinha de matemática please...  ?

Quem??????  😄

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Antes de mais, uma aulinha de matemática please...  ?

Quem??????  😄

Eheh, ok 😄

Uma função quadrática é uma função do segundo grau cujo gráfico é uma parábola. Traduzindo:

1) função do segundo grau = função quadrática = função cuja variável independente toma como maior grau 2, ou seja, tem um x2 pelo meio, mas não tem potências superiores

  1.1) O grau de uma função define-se pela maior potência que a função tem na variável independente.

2) Parábola: se não estás a ver o que é, google imagens 😉

Uma função quadrática tem duas soluções pois pode interceptar o eixo dos xx num máximo de dois pontos.

A fórmula que determina esses valores é chamada de fórmula resolvente - o nome diz tudo. 🙂

Mas, para se aplicar esta fórmula, deves ter a função na forma canónica. WTH? Não, não tem a ver com graus da Igreja. 😕   É apenas uma forma pomposa de dizer formato padrão.

Estas duas funções, f e g, são exactamente as mesmas, mas g está na forma canónica e f não:

  • f(x) = 2(x+1)(x-2)
  • g(x) = 2x2 - 2x - 4

A forma canónica da quadrática é dada por ax2 + bx + c = 0. Na função g, a=2, b=-2 e c=-4.

E eis os valores a, b e c que eu peço no programa. É a partir destes que se resolve uma função quadrática.

Mas a função pode ter 2, 1 ou nenhuma raíz (aka solução). Nota: as raízes de uma função f são dadas por f(x) = 0.

Para a função quadrática é a fórmula resolvente que nos dá a solução:

x = (-b +- SQRT(b2 - 4ac)) / (2a)

Ora, uma coisa interessante é o que está dentro da raíz quadrada - é chamado de factor discriminante pois indica-nos quando é que há 2, 1 ou nenhuma soluções reais.

d = b2 - 4ac  (o "d" costuma ser um delta)

  • d > 0  -  há 2 raízes
  • d = 0  -  há 1 raíz - chama-se a este caso raíz dupla
  • d < 0  -  não há raízes reais. Nota: neste caso hverá 1 ou 2 raízes complexas devido à raíz de um número negativo.

Por isto é que faço o controlo com o discriminante no programa e informo quando é que há raíz dupla.

O vértice da parábola, ou seja, é um ponto, calcula-se a partir da sua coordenada X.

Vx = -b / (2a)

A coordenada Y calcula-se substituindo o valor de X na função (aproveitamos no programa a forma quadrática):

Vy = a*Vx2 + b*Vx + c

E pronto, eia a tão desejada aula de matemática. 🙂

Já compreendes o programa? 🙂

Knowledge is free!

Link to comment
Share on other sites

Antes de mais, uma aulinha de matemática please...  ?

Eu e a minha grande boca... (neste caso, dedos)  :wallbash:

Depois de ver esta tua excelente explicação, posso dizer com confiança que...

OK, vou dar a oportunidade a outros membros...  ? Não quero que pensem que eu não deixo os outros resolver os exercicios!  ?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Eu e a minha grande boca... (neste caso, dedos)  :wallbash:

Depois de ver esta tua excelente explicação, posso dizer com confiança que...

OK, vou dar a oportunidade a outros membros...  ? Não quero que pensem que eu não deixo os outros resolver os exercicios!  ?

Quero ver quantos vão participar se tu não colocares aqui os teus dedos... 😉🙂

Knowledge is free!

Link to comment
Share on other sites

É bom que sim... que eu e a matemática não somos os melhores amigos... 😉

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

:fartnew2: ? ?

Volta Fibonacci, estás perdoado...

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Aqui fica a minha proposta (no Ideone também).

Inicialmente ainda pensei em colocar o cálculo do discriminante numa função, ou então o cálculo do vértice, mas achei desnecessário.

program quad;

(* Abstraímos o input dos números para um procedimento
   separado, que nos permite verificar se o utilizador
   introduziu ou não um número, e continuar a pedir-lho
   se não tiver introduzido. *)
procedure prompt(t: string; var dest: real);
var
  e: integer = 1;
  s: string;
begin
  repeat
    write(t, ': ');
    readln(s);
    val(s, dest, e);
  until e <= 0;
end;

var
  a, b, c, d: real;  // a, b, c e o discriminante
  x1, x2: real;      // zeros da função
  vx, vy: real;      // coordenadas do vértice da parábola
begin
  repeat
    prompt('a', a);
  until a <> 0;      // função quadrática implica a <> 0
  prompt('b', b);
  prompt('c', c);

  d := sqr(b) - (4 * a * c);

  writeln('');
  writeln('Discriminante: ', d:0:2);

  writeln('');
  writeln('Soluções:');
  if d = 0 then
  begin
    x1 := -b / (2 * a);
    vx := x1;
    vy := 0;   // nestes casos a solução encontra-se em cima do eixo
    writeln('  x1: ', x1:0:2);
    writeln('');
    writeln('V(x,y) = (', vx:0:2, ',', vy:0:2, ')');
  end
  else if d < 0 then
    writeln('  Sem soluções em R.')
  else
  begin
    x1 := (-b + sqrt(d)) / 2 * a;
    x2 := (-b - sqrt(d)) / 2 * a;
    vx := -b / (2 * a);
    vy := a * sqr(vx) + b * vx + c;
    writeln('  x1: ', x1:0:2);
    writeln('  x2: ', x2:0:2);
    writeln('');
    writeln('V(x,y) = (', vx:0:2, ',', vy:0:2, ')');
  end;
end.
Link to comment
Share on other sites

Pois, são funções de utilização geral que se forem bem feitas podem até ser exportadas para um módulo reutilizável.

Sabes, comecei ontem (como forma de adiar o estudo) a fazer um módulo para construção de menus em programas.

Funciona tudo de forma procedural (sem objectos, vá) e obriga os utilizadores a separarem o seu programa em procedimentos diferentes. Fiz isto na brincadeira, mas estou a pensar em publicar por aqui para ajudar os novatos a fazer programas onde se focam pouco num interface e muito na lógica do programa (com a coisa boa de serem obrigados a partir o programa em segmentos lógicos).

Link to comment
Share on other sites

Também era interessante alguém dedicar-se a mostrar o funcionamento do FreeVision.

Desde já me meto fora disso! 😉 Não há tempo nem pachora...

Mas que era interessante, era!

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.