# Bruch-kürzen



## Gaga (15. Mrz 2011)

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

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

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


----------



## SlaterB (15. Mrz 2011)

```
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 (15. Mrz 2011)

Gaga hat gesagt.:


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

```
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 (16. Mrz 2011)

Schreibs doch einfach so:

```
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 (16. Mrz 2011)

Andi_CH hat gesagt.:


> 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 (16. Mrz 2011)

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

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 ;-)


```
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);
	}
}
```


----------

