Bruch-kürzen

Gaga

Mitglied
Bitte um Hilfe !!!!!!!!!!
Das Programm will nicht ganz.

Erstelle ein Programm, das Zähler und Nenner einer Bruchzahl einliest, den Bruch, wenn möglich, kürzt und das Ergebnis ausgibt.
Erstelle die Klassen BruchGUI und BruchKuerzenBL. In der Methode kuerzen() werden zaehler und nenner durch den ggt gekürzt. In der Methode ggt() wir der größte gemeinsame Teiler (ggt) zweier Zahlen berechnet und das Ergebnis zurückgegeben. Die Berechnung des ggt ist dem Struktogramm zu entnehmen (achte auf den Unterschied zwischen Abbruch- und Laufbedingung!).

BruchkürzenBL
Java:
public class BruchkürzenBL {

    private int zaehler, nenner;

    public BruchkürzenBL(int z, int n)
    {
        zaehler = z;
        nenner = n;
    }

    public void kuerzen()
    {
        int zA = zaehler, zB = nenner;

        do
        {
            while (zB < zA)
            {
                zA = zA - zB;
            }
            while (zB > zA)
            {
                zB = zB - zA;
            }
        } 
        
        while (zB == zA);

        zaehler = zaehler / zA;
        nenner = nenner / zB;
        System.out.println(zA);
        System.out.println(zB);
    }

    public int getZaehler()
    {
        return zaehler;
    }

    public int getNenner()
    {
        return nenner;
    }

    public void ggt(int za, int zb)
    {
        int zA = zaehler;
        int zB = nenner;
        zA = za;
        zB = zb;



        while (zA != zB)
        {
            while (zA > zB)
            {
                zA = zA - zB;
            }
            while (zB > zA)
            {
                zB = zB - zA;
            }
        }
    }
}

BruchkürzenGUI
Java:
public class BruchkürzenGUI extends javax.swing.JFrame {

    public BruchkürzenGUI() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jPanel1 = new javax.swing.JPanel();
        lbBruch = new javax.swing.JLabel();
        tfZaehler = new javax.swing.JTextField();
        lbBStrich = new javax.swing.JLabel();
        tfNenner = new javax.swing.JTextField();
        btKürzen = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        lbOutB = new javax.swing.JLabel();
        tfOutZ = new javax.swing.JTextField();
        lbOutBSt = new javax.swing.JLabel();
        tfOutN = new javax.swing.JTextField();

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

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Eingabe"));
        jPanel1.setLayout(new java.awt.GridBagLayout());

        lbBruch.setText("Bruch:  ");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        jPanel1.add(lbBruch, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        jPanel1.add(tfZaehler, gridBagConstraints);

        lbBStrich.setText("---------------");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        jPanel1.add(lbBStrich, gridBagConstraints);

        tfNenner.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tfNennerActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        jPanel1.add(tfNenner, gridBagConstraints);

        getContentPane().add(jPanel1);

        btKürzen.setText("kürzen");
        btKürzen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btKürzenActionPerformed(evt);
            }
        });
        getContentPane().add(btKürzen);

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Ausgabe gekürzt"));
        jPanel2.setLayout(new java.awt.GridBagLayout());

        lbOutB.setText("Bruch:   ");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        jPanel2.add(lbOutB, gridBagConstraints);

        tfOutZ.setEditable(false);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        jPanel2.add(tfOutZ, gridBagConstraints);

        lbOutBSt.setText("---------------");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        jPanel2.add(lbOutBSt, gridBagConstraints);

        tfOutN.setEditable(false);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        jPanel2.add(tfOutN, gridBagConstraints);

        getContentPane().add(jPanel2);

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

    private void btKürzenActionPerformed(java.awt.event.ActionEvent evt) {                                         

        int nenner = 0, zaehler = 0;
//      BruchkürzenBL obj = new BruchkürzenBL (zaehler,nenner);
        String str = this.tfNenner.getText();
        nenner = Integer.parseInt(str);
        String str1 = this.tfZaehler.getText();
        zaehler = Integer.parseInt(str);
        BruchkürzenBL obj = new BruchkürzenBL();
        obj.kuerzen();
        nenner = obj.getNenner();
        zaehler = obj.getZaehler();
//      BruchkürzenBL obj = new BruchkürzenBL (Zaehler,Nenner,zA,zB);

        obj.kuerzen();
        str = Integer.toString(nenner);
//        str = "fdg";
//        str1 = "df";
        this.tfOutN.setText(str);
        str = Integer.toString(zaehler);
        this.tfOutZ.setText(str1);

    }                                        

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

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new BruchkürzenGUI().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton btKürzen;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JLabel lbBStrich;
    private javax.swing.JLabel lbBruch;
    private javax.swing.JLabel lbOutB;
    private javax.swing.JLabel lbOutBSt;
    private javax.swing.JTextField tfNenner;
    private javax.swing.JTextField tfOutN;
    private javax.swing.JTextField tfOutZ;
    private javax.swing.JTextField tfZaehler;
    // End of variables declaration
}


Bräuchte bitte drigenst Hilfe muss es nämlich um 24 Uhr fertig haben
 
S

SlaterB

Gast
Java:
        do
        {
            while (zB < zA)
            {
                zA = zA - zB;
            }
            while (zB > zA)
            {
                zB = zB - zA;
            }
        } 
        
        while (zB == zA);
die einzige Möglichkeit, die Schleife ein zweites Mal zu durchlaufen,
ist die Erfüllung der Bedingung, also zB == zA

in diesem Fall machen die inneren Schleifen aber nichts mehr, zB bleibt gleich, zA bleibt gleich, die Bedingung weiter erfüllt -> Endlosschleife


einfachst herauszufinden indem z.B. in jeder Schleife ein System.out.println("test"); reinkommt
 

Haave

Top Contributor
Bitte um Hilfe !!!!!!!!!!
Das Programm will nicht ganz.
Gibt's denn a) eine Fehlermeldung oder b) läuft das Programm, aber tut nicht, was es soll? Falls a), was ist die Fehlermeldung, falls b), welche Ausgaben erwartest du und was passiert stattdessen?

Den größten gemeinsamen Teiler kann man ganz leicht mit einem rekursiven Einzeiler herausfinden:
Java:
public int ggt(int a, int b) {
    return (b == 0) ? a : ggt(b, a%b);
}

Dann jeweils Zähler und Nenner durch den herausgefundenen GGT teilen und schon ist gekürzt.
 

Andi_CH

Top Contributor
Schreibs doch einfach so:
Java:
	public int ggt(int a, int b) {
		if (b==0)
			return a;
		else
			return ggt(b, a%b);
	}

dann verstehen es auch Anfänger

Ja, das "else" könnte man weglassen wenn man will.
 

Haave

Top Contributor
Schreibs doch einfach so:

dann verstehen es auch Anfänger
Schon, wobei ich denke, dass eher die Rekursion Verständnisprobleme bereiten wird und weniger der ternäre Operator. Letzteren versteht man wahrscheinlich, wenn man es einmal erklärt bekommt, Rekursion hingegen vielleicht nicht mal nach dem zehnten Mal.
 

Andi_CH

Top Contributor
Der :? sollte in der nächsten java Version verboten werden :D

Wieso deine Rekursion den richtigen ggt findet hab nicht einmal ich verstanden - aber sie tut es, also warum sollte ich sie analysieren.

Das ist übrigens auch eine Variante, aber ich müsste mir auch erst wieder überlegen wie ich damals darauf gekommen bin ;-)

Java:
private static long getGGT(long a, long b) {
	if (a==0)
		return 1;
	if (a == b) {
		return a;
	} else if (a < b) {
		return getGGT(a, b - a);
	} else {
		return getGGT(a - b, b);
	}
}
 

Neue Themen


Oben