Introdução
Na postagem anterior, apresentei Bhaskalc, uma calculadora em Java que soluciona equações do segundo grau usando a fórmula de Bhaskara dentro do conjunto dos Números Reais. Nessa postagem irei ensiná-lo a desenvolver Bhaskalc em prompt. O algoritmo de cálculo é o mesmo usado na versão com interface gráfica, a diferença é que esta será em prompt, porém com o mesmo princípio: localizar as raízes reais de uma equação do segundo grau usando a fórmula de Bhaskara.
Equações de Segundo Grau
Uma equação do segundo grau é uma equação polinomial cujo termo de maior grau tem grau igual a dois. Simplificando, veja a imagem a seguir:
Onde a, b e c são números reais e a ≠ 0. Estes são denominados coeficientes da equação do segundo grau, sendo usados na fórmula de Bhaskara para obtenção das raízes. Observe que, nem sempre a equação do segundo grau se apresenta a forma acima. Há ocasiões em que algum coeficiente (com exceção de a) é igual a zero. Nesses casos o termo não aparece na equação. Exemplos:
Em todo caso, a fórmula de Bhaskara também pode solucionar essas equações denominadas incompletas.
Existem várias formas e técnicas para solucionar uma equação do segundo grau, entretanto usar essa fórmula é mais eficaz no nosso contexto.
A Fórmula de Bhaskara
Nesta seção, apresento uma das possíveis deduções da fómula de Bhaskara.
Temos a equação inicial:
Dividimos a equação pelo coeficiente a:
Subtraímos c/a de ambos os membros:
Adicionamos (b/2a)2 a ambos os membros:
Observe que o primeiro membro é um trinômio quadrado perfeito. Nesse caso, o colocamos na forma fatorada:
Somando as frações do segundo membro, temos:
Simplificando:
A expressão b2-4ac é chamada discriminante da equação. Se o valor da expressão for zero, significa que as raízes X1 e X2 da equação são iguais. Se for menor que zero, a equação não possui raízes dentro do conjunto dos números reais (somente nos complexos). Por fim, se for maior que zero, significa que a equação possui duas raízes distintas. Devido ao discriminante ter esse papel fundamental, por muitas vezes a expressão é resumida em:
Onde:
Exemplos
Vamos resolver as equações a seguir:
Para a primeira equação temos:
Para a segunda equação temos:
Desenvolvendo a Calculadora
Inicialmente, você deve ter JDK instalado e configurado em seu computador para poder fazer a calculadora. É necessário ter um editor de textos simples como o Bloco de Notas ou o Notepad++. Caso você já tenha hábito ou prática em alguma IDE, também pode usar. Entretanto, devido a simplicidade do código, é interessante usar um editor de textos simples.
Planejando
Aqui iremos planejar o funcionamento do programa e a ordem em que cada ação será executada.
Apresentação
Neste ponto o programa irá exibir detalhes sobre como o usuário deve inserir dados e que dados são aceitos. Nesse caso, podemos exibir o nome do programa "Bhaskalc em prompt", o nome do desenvolvedor e as instruções sobre como usuário deve inserir os valores dos coeficientes.
Para a exibição do nome e instruções, podemos usar os métodos de "System.out".
Inserindo Dados
O programa deve oferecer suporte ao usuário para que o mesmo possa inserir os valores dos coeficientes da equação do segundo grau. Para isso podemos usar a classe "Scanner".
Validando as Informações
O programa deve analisar se os valores inseridos pelo usuário são válidos. Por exemplo, se o usuário inserir um caractere inválido ou um valor que impossibilite a execução do cálculo, o programa deve informar isso ao usuário.
Cálculo das Raízes da Equação
Para isso podemos criar métodos que calculem o discriminante, a primeira raiz, a segunda raiz e um método que integre os três retornando uma mensagem para o usuário com o resultado do cálculo.
Implementando o Algoritmo
Inicialmente vamos criar os métodos que calculam o discriminante, a primeira raiz e a segunda raiz dentro de uma única classe.
Abra o editor de textos da sua preferência ou uma IDE.
Crie uma classe com o nome "BhaskaraAlg".
Crie um método com modificadores public e static que retornará Double, que recebe como argumentos três valores double (os coeficientes) e com nome "discriminante", como segue abaixo:
Este método deve retornar o valor do discriminante com base nos valores dos coeficientes recebidos como argumento. Para isso vamos passar a expressão matemática para a mesma sintaxe de Java:
Dessa forma o método fica:
Agora vamos criar os métodos que calculam as raízes da equação. Inicialmente, vamos converter a fórmula para a sintaxe da linguagem Java:
Os métodos serão idênticos, com exceção do nome (os nomes serão "x1 e x2") e o sinal entre o coeficiente "b" e a raiz.
Segue abaixo a classe já com os métodos:
Observe o "if" nos métodos. Caso o coeficiente "a" seja igual a zero, a equação não é do segundo grau, logo é impossível resolvê-la pela Fórmula de Bhaskara. Se o valor do discriminante (nesse caso a variável "delta") for menor que zero, a solução da equação está fora do Conjunto dos Números Reais. Em ambos os casos, o método automaticamente retorna "null". Dessa forma, saberemos que, caso usarmos esses métodos e tivermos como retorno o valor "null", significa que não foi possível solucionar a equação devido a um desses problemas e poderemos informar ao usuário.
Agora vamos criar um método que irá integrar os métodos criados anteriormente e retornar a solução da equação ao usuário. Observe a imagem abaixo, com o método "calc", que fará o papel que queremos:
Inicialmente usamos o método "x1" para calcular a primeira raiz da equação. Se o valor da raiz for null
, automaticamente sabemos que o valor do coeficiente "a" é zero ou que o valor do discriminante é menor que zero. Dessa maneira, o método "calc" retorna uma mensagem ao usuário passando essa informação:
"\n**Nao foi possivel calcular as raizes da equacao com base nos coficientes apresentados**\n Possiveis causas podem ser:\n -Discriminante negativo;\n -Valor do coeficiente \"a\" igual a zero;\n\n"
Como a mensagem será exibida em prompt, usamos caracteres de escape como "\n" para novas linhas e dispensamos os caracteres especiais e acentos, pois estes não são exibidos corretamente em janela de prompt.
Caso o valor não seja "null", o método calcula o valor da segunda raiz e retorna uma String com a mensagem para o usuário:
"\nA solucao da equacao, com base nos coeficientes apresentados e:\n X1 = %s;\n X2 = %s;\n\n"
Os caracteres "%s" representam os valores das raízes na String formatada.
Salve a classe "BhaskaraAlg" em formato ".java" (exatamente assim: "BhaskaraAlg.java"). Caso esteja usando uma IDE, em geral ela faz isso automaticamente.
Agora vamos criar a classe principal. Abra um novo arquivo de texto (ou uma nova classe na IDE). Crie uma classe chamada "BhaskalcPrompt" e já crie o método "main":
No método "main", utilize o método "System.out.println(String)" para exibir o nome do programa e o nome de quem desenvolveu. O nome será "BHASKALC EM PROMPT". No nome do desenvolvedor, coloque seu nome, por exemplo:
Agora vamos utilizar a classe "Scanner". Criaremos um objeto a partir dessa classe para obter os valores dos coeficientes digitados pelo usuário:
Antes de prosseguir com o método "main", iremos criar outro método, com nome "prompt" que será necessário. Esse método irá receber os valores digitados pelo usuário, validá-los e irá usar o método "calc" da classe BhaskaraAlg para calcular os valores das raízes. Em seguida, ele retornará o valor que o método "calc" retornar. Lembre-se que "calc" irá retornar uma String com a mensagem para o usuário pronta, o papel do método "prompt" é para mera validação das informações antes do cálculo ser realizado.
Inicialmente, vamos impor a condição de que os valores de "a", "b" e "c" não sejam "null" e retornar uma mensagem de erro em caso positivo:
Para garantir que as variáveis não tenham espaços inúteis nas extremidades, usaremos o método "String.trim()" que os removerá:
Criaremos uma expressão regular para validar os valores de "a", "b" e "c". Caso eles não sigam o padrão da expressão regular, uma mensagem de erro será retornada. Segue a expressão regular que utilizaremos:
[+-]{0,1}[0-9]{1,}([.]{1}[0-9]{1,}){0,1}
Para entender melhor o que é uma expressão regular, sugiro que dê uma olhada nos links de referência ao final dessa postagem, porém segue uma explicação básica:
"Expressões regulares tem como finalidade determinar um padrão de texto em uma seqüência de caracteres". Exemplos: os endereços de e-mail seguem um padrão especifico (nome@dominio.[tipo de domínio]); os CEP’s residenciais ([seqüência de 5 dígitos]-[seqüência de 5 dígitos]); número de CPF ([seqüência de 3 dígitos].[ seqüência de 3 dígitos]. [seqüência de 3 dígitos]-[seqüência de 2 dígitos]); etc. Agora vamos analisar a expressão:
- [+-]{0,1} – significa que a expressão deve começar com "+" ou "-" apenas uma vez ou nenhuma vez;
- [0-9]{1,} – uma seqüência de dígitos do zero ao nove que deve conter no mínimo um dígito e sem limite máximo;
- ([.]{1}[0-9]{1,}){0,1} – entre parênteses temos um grupo com uma expressão regular. Essa expressão regular deve ser repetida uma única vez ou nenhuma vez. Já a expressão dentro dos parênteses indica que o padrão deve iniciar com um único ponto obrigatório, seguido de uma seqüência de dígitos do zero ao nove que deve conter no mínimo um dígito e sem limite máximo.
Voltando ao método, essa expressão será atribuída a uma variável String e a validação das variáveis "a", "b" e "c" será feita usando o método "String.matches(String)", onde a String recebida como argumento é a nossa expressão regular. Caso a String não esteja no padrão da expressão regular, o método retornará uma mensagem informando isso ao usuário:
Após a validação positiva, vamos precisar converter o valor das variáveis "a", "b" e "c" para um tipo numérico e dessa forma passar para o método "BhaskaraAlg.calc(double, double, double)". Por razões claras, converteremos para o tipo double usando o método "Double.parseDouble(String)" e atribuiremos os valores para variáveis "double":
Por fim, o método "prompt" irá invocar o método "BhaskaraAlg.calc(double, double, double)" e retornará o mensagem do método "calc":
Voltando agora para o método "main", usaremos o método "System.out.println(String)" para exibir as instruções de utilização da calculadora:
"Insira o valor dos coeficientes a, b e c da equacao do segundo grau e pressione enter.
\nNo lugar de virgula use ponto. Nao insira outros caracteres que nao sejam numeros ou o ponto.\n"
Antes de usarmos "Scanner" para obter os coeficientes digitados pelo usuário, iremos criar um "loop while" que, respeitando uma determinada condição, irá obter os coeficientes, invocar o método "prompt" para validar as informações e retornar o resultado e, após a mensagem positiva ou não em relação ao cálculo, irá perguntar ao usuário se ele deseja efetuar ou não um novo cálculo. Nesse ponto, o usuário deverá digitar um determinado valor se quiser continuar ou outro caso contrário. Para essa finalidade, criaremos uma variável "double" com nome "check" que irá receber esse valor. Na condição do "loop while" especificaremos que, caso a variável "check" seja igual a zero, o loop continua, senão ele termina. Eis o código:
Observe que, para obter o valor digitado pelo usuário na janela de prompt, usamos o método "next()" da classe "Scanner" e que para obter a resposta do usuário em continuar ou não o cálculo usamos o método "nextDouble()" que obtém o valor e atribui a variável "check".
Outro ponto importantíssimo: para poder usar a classe Scanner, é necessário importá-la. Para isso acrescente a seguinte linha no topo da sua classe:
import java.util.Scanner;
Salve a classe "BhaskalcPrompt" no formato ".java" no mesmo diretório da classe "BhaskaraAlg".
Compilando o Programa
Caso você esteja usando uma IDE, a compilação varia de acordo coma IDE, caso contrário use os passos a seguir:
- Abra o Prompt de Comando;
- Observe o diretório que consta na sua tela de prompt;
- Copie os arquivos "BhaskalcPrompt.java" e "BhaskaraAlg.java" para este mesmo diretório;
- Execute o comando "javac BhaskalcPrompt.java" em sua tela de prompt para que o programa seja compilado. Caso ocorra algum erro na compilação, verifique seu código novamente e compare-o com as imagens dessa postagem.
Para executar o programa, execute o comando "java BhaskalcPompt".
Código Fonte
Para realizar o download do código fonte apresentado nesta postagem, clique no link: Bhaskalc em Prompt
Referências
- Wikipédia, expressões regulares - https://pt.wikipedia.org/wiki/Express%C3%A3o_regular
- Portal Brasileiro e Expressões Regulares - http://aurelio.net/regex/
- Esse tal de Bhaskara (Prof. Edigley Alexandre) - http://www.prof-digleyalexandre.com/2011/02/esse-tal-de-bhaskara.html
- Matemática Essencial - http://www.uel.br/projetos/matessencial/
- Livro "Idéias e relações", 8ª série. Cláudia Miriam Tosatto, Edilaine do Pillar F. Peracchi, Violeta Maria Estephan; Editora Positivo, 2002
- Livro "Matemática". Volume Único, Dante. Editora Ática, 2009
Nenhum comentário:
Postar um comentário