Fakultät

Gaga

Mitglied
Also ich habe hier ein Programm geschrieben das die Fakultät der eingegebenen Zahl ausrechnet
Ich möchte aber durch eine "JOptionPane" eine Fehler Medlung ausgeben wenn der Benutzer eine höherer Zahl als 65 eingibt ausgeben, denn er Datentyp long is das größte und es gehen einfach nicht mehr Zahlen.
Dies bekomm ich aber nicht hin.
Es geht rein um die Fehlermeldung.

Also hier der Quellcode
seit so nett und helft mir pls !!!!

FakultaetBL (BL = Business Layer)
Java:
public class FakultaetBL {

    private int num;
    private long fak = 1;

    public FakultaetBL(int n) {
        num = n;
    }

    public void berechne() {
        for (int i = 2; i <= num; i++) {
            fak *= i;
        }
    }

    public long getFakultaet() {
        return fak;
    }
}

und dann noch die GUI

FakultaetGUI
Java:
import javax.swing.JOptionPane;

public class FakultaetGUI extends javax.swing.JFrame {

    public FakultaetGUI() {
        initComponents();
        this.setLocationRelativeTo(null);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        pnlZahl = new javax.swing.JPanel();
        lbZahl = new javax.swing.JLabel();
        tfZahl = new javax.swing.JTextField();
        pnlFak = new javax.swing.JPanel();
        lbFaklutaet = new javax.swing.JLabel();
        tfFaklultaet = new javax.swing.JTextField();
        bt_berechne = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new java.awt.GridLayout(3, 1));

        pnlZahl.setLayout(new java.awt.GridLayout(1, 0));

        lbZahl.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lbZahl.setText("Zahl: ");
        pnlZahl.add(lbZahl);

        tfZahl.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        tfZahl.setText("0");
        tfZahl.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                onEnterGedrueckt(evt);
            }
        });
        pnlZahl.add(tfZahl);

        getContentPane().add(pnlZahl);

        pnlFak.setLayout(new java.awt.GridLayout(1, 0));

        lbFaklutaet.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lbFaklutaet.setText("Fakultät: ");
        pnlFak.add(lbFaklutaet);

        tfFaklultaet.setEditable(false);
        tfFaklultaet.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        tfFaklultaet.setText("1");
        pnlFak.add(tfFaklultaet);

        getContentPane().add(pnlFak);

        bt_berechne.setText("berechne");
        bt_berechne.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_berechneActionPerformed(evt);
            }
        });
        getContentPane().add(bt_berechne);

        pack();
    }// </editor-fold>

    private void onEnterGedrueckt(java.awt.event.ActionEvent evt) {                                  
    }                                 

    private void bt_berechneActionPerformed(java.awt.event.ActionEvent evt) {
        aktualisiere(Integer.parseInt(tfZahl.getText()));

        JOptionPane.showMessageDialog(tfZahl, "Bitte geben Sie keine Zahl ein die größer als 65 ist !!!!!");
    }

    private void aktualisiere(int zahl) {
        fak = new FakultaetBL(zahl);
        fak.berechne();
        long fakultaet = fak.getFakultaet();
        tfFaklultaet.setText("" + fakultaet);
        tfZahl.setText("" + zahl);
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new FakultaetGUI().setVisible(true);
            }
        });
    }
    private FakultaetBL fak;
    // Variables declaration - do not modify
    private javax.swing.JButton bt_berechne;
    private javax.swing.JLabel lbFaklutaet;
    private javax.swing.JLabel lbZahl;
    private javax.swing.JPanel pnlFak;
    private javax.swing.JPanel pnlZahl;
    private javax.swing.JTextField tfFaklultaet;
    private javax.swing.JTextField tfZahl;
    // End of variables declaration
}


:rtfm::rtfm::rtfm::rtfm::rtfm::rtfm::rtfm::rtfm::rtfm::rtfm:
 
Zuletzt bearbeitet von einem Moderator:
G

Gonzo17

Gast
Öhm naja, schau mir hier:

Java:
    private void bt_berechneActionPerformed(java.awt.event.ActionEvent evt) {
        aktualisiere(Integer.parseInt(tfZahl.getText()));
 
        JOptionPane.showMessageDialog(tfZahl, "Bitte geben Sie keine Zahl ein die größer als 65 ist !!!!!");
    }
 
    private void aktualisiere(int zahl) {
        fak = new FakultaetBL(zahl);
        fak.berechne();
        long fakultaet = fak.getFakultaet();
        tfFaklultaet.setText("" + fakultaet);
        tfZahl.setText("" + zahl);
    }

Da ist eigentlich dein ganzes "Problem" begraben. Du lässt die Fakultät sofort berechnen und zeigst dann hinterher erst den Dialog an. Sinnvoll wäre es, wenn du zuerst die Zahl aus dem JTextField liest, dann überprüfst ob sie <= 65 und falls das der Fall ist, dann lässt du den Dialog aufpoppen. Andernfalls soll einfach die Berechnung gestartet werden.
 

chalkbag

Bekanntes Mitglied
Hallo,

wenn du etwas abfragen willst, wieso find ich dann im ganzen Code kein "IF" ?
Oder steh ich auf dem Schlauch ?

Java:
 JOptionPane.showMessageDialog(tfZahl, "Bitte geben Sie keine Zahl ein die größer als 65 ist !!!!!");
wird jedes Mal aufgerufen, oder was bedeutet "es funktioniert nicht" ?

@offtopic
Ein Mitglied hier hat eine sehr treffende Signatur "Satzzeichen sind keine Rudeltiere".
 

Landei

Top Contributor
Mal ein Vorschlag: Warum nimmst du nicht BigInteger statt long, dann können die Nutzer problemlos 1000! berechnen (und für dich ist es kaum schwieriger zu programmieren). Und wenn es noch größere Zahlen werden sollen, gibt es eine hübsche Sammlung von (mehr oder weniger komplizierten) effizienteren Algorithmen: Fast Factorial Functions
 

Gaga

Mitglied
Ok auf ds mit der if Anweisung bin ich auch gekommen.
Nur bekomm ich die hier bei dem Programm nicht hin.

Deswegen bitte ich dich mir diese if Anweisung zu erläutern.
thx Kevin.
 

Antoras

Top Contributor
@Landei
weißt du ob für die schnellsten Algos (speziell PrimeSwing) irgendwo eine Doku verfügbar ist? Auf der Seite finde ich nur Source-Code aber sonst keine weiteren Erklärungen. Und ich tu mir ein bisschen schwer die mathematische Hintergründe anhand des Codes herzuleiten.
 

Landei

Top Contributor
IIRC werden irgendwo auf der Seite ganz grob die Algorithmen vorgestellt, aber eine richtige Doku habe ich nicht gefunden.
 

Neue Themen


Oben