Ir ao conteúdo
  • Cadastre-se

Erro com fatorial


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Galera estou perdendo meus cabelos, mas não desistirei do java.

 

Tenho que mostrar o fatorial de um número digitado em um JTextField, usando um MenuItem para calcular o fatorial, algo está dando errado, quando digito um número inteiro ele retorna 0.

 

Segue meu código:

package criandomenu;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JTextField;public class CriarMenu extends JFrame implements ActionListener {    public double fator = 1;    public double num;    public boolean processou = true;    JLabel jlb = new JLabel("Informe um número: ");    JTextField txt = new JTextField();    JMenuItem calc = new JMenuItem("Calcular");    JMenu menu = new JMenu("Arquivo");    JMenuBar adMenu = new JMenuBar();    public CriarMenu() {        this.setLocation(50, 50);        this.setSize(300, 400);        this.setLayout(null);        this.setTitle("Calcular Fatorial");        this.setDefaultCloseOperation(EXIT_ON_CLOSE);        this.add(jlb);        this.add(txt);        this.add(menu);        this.add(adMenu);        jlb.setLocation(10, 10);        jlb.setSize(150, 20);        txt.setLocation(140, 10);        txt.setSize(40, 20);        menu.add(calc);        calc.addActionListener(this);        adMenu.add(menu);        setJMenuBar(adMenu);    }    public Double Fatorial() {        num = Double.parseDouble(txt.getText());        while (num > 1) {            fator = fator * (num - 1);            num--;        }        return fator;    }    public double ProcessaNumero(String Mensagem) {        try {            return Double.parseDouble(txt.getText());        } catch (NumberFormatException NF) {            JOptionPane.showMessageDialog(null, "Digite um número do tipo inteiro.");            processou = false;            return 0.0;        }    }    public static void main(String[] args) {        new CriarMenu().setVisible(true);    }    @[member="override"]    public void actionPerformed(ActionEvent e) {        if (e.getSource() == calc) {            if (processou) {                ProcessaNumero(txt.getText());                JOptionPane.showMessageDialog(null, "O fatorial do número " + num + " é: " + fator);            } else {                JOptionPane.showMessageDialog(null, "Erro ao processar os dados.");            }        }    }}
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Davi Nascimento_770787

 

Se você está passando o parâmetro tipo String em ProcessaNumero(txt.getText()), dentro do método ProcessaNumero você deve usar a variável passada lá, ou seja, tem que usar "Mensagem" e não txt.


Onde você chama o método Fatorial()?

Link para o comentário
Compartilhar em outros sites

Eu estava colocando o cálculo do fatorial no lugar errado.

 

Fiz assim e deu certo:

   @[member="override"]   public void actionPerformed(ActionEvent e) {        if (e.getSource() == calc) {            if (processou) {                double num;                double fator=1;                num = Double.parseDouble(txt.getText());                for (double i=num;i>=1;i--){                    fator=fator*(i);                }                ProcessaNumero(txt.getText());                JOptionPane.showMessageDialog(null, "O fatorial do número " + num + " é: " + fator);            } else {                JOptionPane.showMessageDialog(null, "Erro ao processar os dados.");

No entanto, não mostra o erro quando se digita uma letra.

Não calcula, mas não mostra a mensagem de erro

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
  • Solução

Olá.

Essa postagem é inicialmente apenas para sugestões de correções de alguns detalhes... ok?

Abaixo seu código até o momento. (juntei o original com correção da sua última postagem)
 

package criandomenu;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JTextField;public class CriarMenu extends JFrame implements ActionListener {    public double fator = 1;    public double num;    public boolean processou = true;    JLabel      jlb = new JLabel("Informe um número: ");    JTextField  txt = new JTextField();    JMenuItem  calc = new JMenuItem("Calcular");    JMenu      menu = new JMenu("Arquivo");    JMenuBar adMenu = new JMenuBar();    public CriarMenu() {        this.setLocation(50, 50);        this.setSize(300, 400);        this.setLayout(null);        this.setTitle("Calcular Fatorial");        this.setDefaultCloseOperation(EXIT_ON_CLOSE);        this.add(jlb);        this.add(txt);        this.add(menu);        this.add(adMenu);        jlb.setLocation(10, 10);        jlb.setSize(150, 20);        txt.setLocation(140, 10);        txt.setSize(40, 20);        menu.add(calc);        calc.addActionListener(this);        adMenu.add(menu);        setJMenuBar(adMenu);    }    public Double Fatorial() {        num = Double.parseDouble(txt.getText());        while (num > 1) {            fator = fator * (num - 1);            num--;        }        return fator;    }    public double ProcessaNumero(String Mensagem) {        try {            return Double.parseDouble(txt.getText());        } catch (NumberFormatException NF) {            JOptionPane.showMessageDialog(null, "Digite um número do tipo inteiro.");            processou = false;            return 0.0;        }    }    public static void main(String[] args) {        new CriarMenu().setVisible(true);    }    @[member="override"]    public void actionPerformed(ActionEvent e) {        if (e.getSource() == calc) {            if (processou) {                double num;                double fator=1;                num = Double.parseDouble(txt.getText());                for (double i=num;i>=1;i--){                    fator=fator*(i);                }                ProcessaNumero(txt.getText());                JOptionPane.showMessageDialog(null, "O fatorial do número " + num + " é: " + fator);            } else {                JOptionPane.showMessageDialog(null, "Erro ao processar os dados.");            }        }    }}

 
 
Vamos lá:
 
1) Sobre o método ProcessaNumero();
 
Veja a declaração do método ProcessaNumero().

    public double ProcessaNumero(String Mensagem) {

Ou seja, ele RETORNA um double. Mas você está usando:
 

}                ProcessaNumero(txt.getText()); //<-- aqui!                JOptionPane.showMessageDialog(null, "O fatorial do número " + num + " é: " + fator);            } else {

Para onde está indo o retorno??? Se você não vai utilizar ele, o método teria que ser void. Entende?
 
Então, na verdade, acho que o método está no caminho certo, mas o uso que está errado. A ideia do ProcessaNumero é "tentar fazer a conversão, e retornar o valor convertido nela mesma. E caso não consiga, exibir uma mensagem de erro". Mas durante o programa, você está usando um tal de Double.parseDouble(). Ora! Se eu tenho um método que PROCESSA O NÚMERO, por quê eu vou tentar processar eu mesmo? Resumidamente: Use apenas o ProcessaNumero() para converter o número e pronto!
 
Algo como:

num = ProcessaNumero(txt.getText());

E após isso verifica a sua flag (variável de controle, no caso o processou), entende?
 
 
 
2) Sobre o método Fatorial().
 
Ué? para que ele foi criado? Experimente apagar o método e compilar para ver o que acontece... (o método não está sendo usado)
 
Então, ai cai na mesma lógica anterior... o método está mais ou menos já estruturado, falta usar!
 
Obs.: acho que precisa ajustar ela, pois acredito que não é bom utilizar variável globais em procedimentos, ou seja, talvez seria utilizar variável locais (declaradas dentro do método) e que o valor para cálculo seja repassado por parâmetro...
 
No aguardo.

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

Visitante
Este tópico está impedido de receber novas respostas.

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...