Muitas das vezes que procuramos alguma coisa, quase que invariavelmente, encontramos outra.
Numa dessas procuras, acabei por encontrar um antigo código de teste/estudo feito em java.
Esse código tem 12 anos, (foi escrito em meados de 2004), para meros fins de estudo e testes.
Não sou programador java. Talvez por considerar essa linguagem um tanto quanto estranha para as tarefas triviais que costumo fazer com outras linguagens, não me aprofundei.
E também não gostei dela na época. Talvez hoje seja diferente, mas não tentei nada.
Sobre a aplicação, é algo bem simples: calcular o IMC, que é o índice de massa corpórea.
Consiste em pegar o valor do peso e dividir pelo quadrado da altura, que é p/a² onde:
p = peso
a = altura
Com base na tabela de resultados, a aplicação retorna uma mensagem com os valores e qual a condição física.
Segue a tabela, conforme o site: http://www.calculoimc.com.br/tabela-de-imc/ com os dados de hoje.
Obs: a tabela usada em 2004 tinha valores com pequena diferença. Utilizei os dados de 2004 mesmo.
Pode-se alterar se achar necessário. A grosso modo, não muda muito no resultado. Fica a seu critério.
Abaixo de 17 Muito abaixo do peso
Entre 17 e 18,49 Abaixo do peso
Entre 18,5 e 24,99 Peso normal
Entre 25 e 29,99 Acima do peso
Entre 30 e 34,99 Obesidade I
Entre 35 e 39,99 Obesidade II (severa)
Acima de 40 Obesidade III (mórbida)
Sabe-se lá porquê, há erros de cálculo quando usado valores com ponto flutuante.
A aplicação fecha sem mostrar resultado e não tem nada nos logs.
Solução Klingon: arredonda tudo pra cima, com valor inteiro e pronto, nada de erros! Por enquanto.
Atenção:
Mesmo com a solução implementada, e possibilidade de outros bugs aparecerem, existe.
Portanto, lembre-se que este micro-código é somente para estudo e testes, nada além disso.
O resultado apresentado tem o valor bem preciso, por usar float.
Usei float, int e double e nada de funcionar. Para não perder tempo e ficar queimando os parcos pseudo-neurônios que tenho, resolvi assim, arredondando tudo.
Por hora é assim que vai ficar e se alguém souber como resolver, pode aplicar a solução!!
No final do post, segue o código fonte para poder compilar.
Fiz a compilação no Linux com java, não com o openjava.
Para mostrar a versão do java utilize no terminal: java -version
A versão utilizada foi:
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
As instruções para instalação do java para Linux, você encontra numa pesquisa rápida pelo google.
Além de não ser o escopo do post a instalação do java, tem outro detalhe: fiz a instalação há uns anos e realmente não me lembro como se faz. Eu teria que procurar também.
Mas nem tudo está perdido, pois passarei os comando de como compilar e rodar a aplicação.
Crie um diretório para salvar o arquivo imc.java.
Sugestão de nome, mas pode ter qualquer nome, desde que respeite o famoso "case sensitive".
Lembre-se que Java é diferente de java, que é diferente de JAVA.
Outro detalhe, na linha onde se está:
public class imc - o nome a classe imc está minúsculo, portanto o nome da aplicação imc.java deve ser minúsculo.
Abra seu editor de textos preferido, copie e cole o código abaixo e salve com o nome imc.java
No diretório onde foi salvo o arquivo, acesse pelo terminal e digite os comandos.
javac imc.java
Se tudo correr bem, o java irá compilar o arquivo, gerar um outro com o nome de imc.class e retornar o prompt para a linha de baixo, sem emitir nenhuma mensagem.
Com o arquivo gerado, digite no mesmo diretório: java imc
A aplicação deverá abrir com o campo para digitar o peso, depois ao clicar em OK, será mostrado a próxima tela, que é para preencher com a altura.
Ao clicar em OK novamente será mostrado o resultado do IMC.
Obs: se o valor digitado for quebrado, por exemplo 85.7 para o peso, utilize ponto. Não utilize virgula.
Isso serve para o valor altura também.
Para cada resultado dentro da faixa da tabela acima, haverá uma mensagem indicando peso normal, sobrepeso e etc.
As telas da aplicação estão logo abaixo.
Fig. 1
Fig. 2
Fig. 3
Fig. 1: Tela para entrada de dados “peso”
Fig. 2: Tela para entrada de dados “altura”
Fig. 3: Resultado do IMC
No Linux pode-se colocar a aplicação em /usr/bin para que possa ser utilizado por qualquer usuário do sistema.
Se quiser pode também criar um atalho tanto para área de trabalho quanto para o menu.
A forma varia de distro para distro, portanto também não vou descrever nenhum método aqui.
Em Linux rodou tudo bem. Mas e no ruwindows? Será roda?
O slogan do java é:
"Write once, run anywhere" (WORA) ou algumas vezes
"write once, run everywhere" (WORE), segundo a extinta Sun Microsystems, criadora do java,
serve para ilustrar os benefícios da idéia cross-plataform.
Durante sua existência, o java teve inúmeros problemas, tanto que até o slogan virou piada.
Algo como:
"write once, debug everywhere", escreva uma vez, debug em todos os lugares.
"Write once, run away", escreva uma vez, fuja.
Estas foram algumas que me lembro.
Mas piadas a parte, tentei rodar o arquivo class no ruwindows, compilado no próprio ruwindows e curiosamente, não rodou. Que atípico hein!!!
Várias coisas podem ocorrer nesse caso.
Uma dos cenários, é a falta do java (SE, SDK, JRE) no ruwindows.
Pode ser que a codificação do arquivo texto original está em UTF-8 e o ruwindows usa o famigerado ISO-8859-15.
O padrão de EOF (end of file) dos arquivos Linux é diferente e o ruwindows nunca entende (normal).
Eu nem tentei corrigir nada para compilar e/ou rodar no ruwindows.
O post é sobre como fazer tudo no Linux, até mesmo gerar um arquivo jar, que roda tanto no Linux quanto no ruwindows. Esse funciona sim.
Então vamos criar os arquivos jar e manifest - dos aquivos java e class criados.
A compilação de um manifesto é externa, usando o -m. Nesse caso, por exemplo, os passos seriam:
javac imc.java – este comando cria o .class
Criar um arquivo manifest.mf com o seguinte conteúdo: Main-Class: imc
O comando para o nosso arquivo é:
jar cvmf manifest.mf imc.jar imc.class
Após a compilação, será criado o arquivo imc.jar.
Então, digite o comando:
java -jar imc.jar
Abrirá as mesmas telas mostradas anteriormente.
Pegue esse arquivo jar e copie para um ruwindows que tenha o java jre instalado.
No diretório onde copiou o arquivo jar, digite o último comando acima e ele abrirá exatamente como no Linux.
Como eu disse, criar atalhos, colocar em um path padrão e etc, fica por conta de cada um.
Para quem quiser criar executáveis para ruwindows do arquivo jar, tem a aplicação launch4j, também em java que gera o .exe a partir do .jar
Você pode baixar de http://launch4j.sourceforge.net
Baixe o arquivo, crie um diretório, descompacte o pacote, e nesse diretório digite o comando:
./launch4j
Uma breve pesquisa no site e terá mais detalhes de como utilizar.
Este site abaixo tem algumas instruções básicas:
http://www.geeksbr.com/2012/01/dica-transformar-um-jar-em-exe-com.html
Abaixo o código fonte da aplicação que chamo, de forma bem criativa, imc.
Aqui neste link estão os arquivos do projeto:
artigo-imc-v2-java-mario.pdf
imc.class
imc.jar
imc.java
imc-v2.exe
imc-v2.xml
manifest.mf
Segue o código fonte.
Com base na tabela abaixo, que a aplicação mostra as mensagens dos resultados.
/*
Programa em que calcula o IMC - Índice de Massa Corpórea, de uma pessoa.
Dado o seu peso e altura usando a fórmula do IMC = peso divido pelo quadrado da
altura e em seguida mostra a mensagem de acordo com tabela;
IMC Mensagem
------------ -------------------------
Até 19 Abaixo do peso, muito magro!
20 - 25 Peso Normal
26 - 30 Sobrepeso, um regiminho ajeita tudo
31 - 35 A coisa está ficando feia
36 - 40 Procure um SPA
Acima de 41 Procure um médico, sua saúde vai mal
Nome: imc
Autor: Mario Medeiros
Versão: 0.2
Data: 2016-10-07
Feito em Linux
Data da versão 0.1: Maio/2004.
*/
import javax.swing.*;
public class imc
{
public static void main(String args[])
{
float peso, altura, imc;
String entrada = new String();
entrada = JOptionPane.showInputDialog("Digite o peso");
peso = Float.parseFloat(entrada);
entrada = JOptionPane.showInputDialog("Digita a altura");
altura = Float.parseFloat(entrada);
imc = (peso)/(altura*altura);
if (imc <=19)
{
JOptionPane.showMessageDialog(null, "Abaixo do peso, muito magro " +imc);
}
if (imc >=20 && imc <=25)
{
JOptionPane.showMessageDialog(null, "Peso Normal " +imc);
}
if (imc >=26 && imc <=30)
{
JOptionPane.showMessageDialog(null, "Sobrepeso, um regiminho ajeita tudo " +imc);
}
if (imc >=31 && imc <=35)
{
JOptionPane.showMessageDialog(null, "A coisa está ficando feia " +imc);
}
if (imc >=36 && imc <=40)
{
JOptionPane.showMessageDialog(null, "Procure um SPA " +imc);
}
if (imc >=41)
{
JOptionPane.showMessageDialog(null, "Procure um médico, sua saúde vai mal " +imc);
}
}
}