thoga31 Posted March 21, 2012 at 07:10 PM Report #444970 Posted March 21, 2012 at 07:10 PM 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!
nunopicado Posted March 21, 2012 at 07:48 PM Report #444977 Posted March 21, 2012 at 07:48 PM 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.
thoga31 Posted March 21, 2012 at 09:55 PM Author Report #445008 Posted March 21, 2012 at 09:55 PM 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!
nunopicado Posted March 21, 2012 at 10:13 PM Report #445013 Posted March 21, 2012 at 10:13 PM Antes de mais, uma aulinha de matemática please... ? Eu e a minha grande boca... (neste caso, dedos) 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.
thoga31 Posted March 21, 2012 at 10:15 PM Author Report #445014 Posted March 21, 2012 at 10:15 PM Eu e a minha grande boca... (neste caso, dedos) 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!
nunopicado Posted March 21, 2012 at 10:20 PM Report #445015 Posted March 21, 2012 at 10:20 PM É 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.
thoga31 Posted March 21, 2012 at 10:27 PM Author Report #445018 Posted March 21, 2012 at 10:27 PM Em 21/03/2012 às 22:20, nunopicado disse: É bom que sim... que eu e a matemática não somos os melhores amigos... 🙂 Ah, mas esta não é difícil. Se visses coisas como eu já vi... ui ui! 😕 😉 Knowledge is free!
nunopicado Posted March 21, 2012 at 10:34 PM Report #445021 Posted March 21, 2012 at 10:34 PM :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.
thoga31 Posted March 21, 2012 at 10:36 PM Author Report #445022 Posted March 21, 2012 at 10:36 PM :fartnew2: ? ? Volta Fibonacci, estás perdoado... Estás a ver? Eu bem disse, eheheh 😉 Knowledge is free!
pwseo Posted March 22, 2012 at 11:42 AM Report #445104 Posted March 22, 2012 at 11:42 AM 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.
thoga31 Posted March 23, 2012 at 08:46 PM Author Report #445377 Posted March 23, 2012 at 08:46 PM Gostei do teu prompt, também pensei em fazer isso e precisamente com o mesmo nome devido ao facto de programar em TI-Basic e teres os comandos Input e Prompt. 😉 Knowledge is free!
pwseo Posted March 23, 2012 at 08:52 PM Report #445380 Posted March 23, 2012 at 08:52 PM 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).
thoga31 Posted March 23, 2012 at 09:02 PM Author Report #445388 Posted March 23, 2012 at 09:02 PM Esse módulo será, decerto, muito bem-vindo. Força nisso! 😉 Knowledge is free!
nunopicado Posted March 23, 2012 at 09:05 PM Report #445391 Posted March 23, 2012 at 09:05 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now