Bruchrechner

Mrcl88

Neues Mitglied
Hallo,
ich bin seid neustem erst dabei Java zu lernen und bin deshalb noch nicht ganz so bewandert was das Thema angeht, und hoffe mir von euch etwas Hilfe. Und zwar geht es um folgende Aufgabe:

Schreiben Sie eine Java–Applikation als ausführbare Jar–Datei mit der Brüche addiert werden können. Die Anwendung
soll zwei Zahlenpaare einlesen, diese als Brüche interpretieren und dann die Summe als Bruch in Form eines Zahlenpaares ausgeben. Die Anwendung muss als Erweiterung um die Klasse Rechnen mit folgender Vorgabe realisiert werden.

Hier die Vorlage
Java:
package rechnen;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
/**
* @author Name, Vormae, Matrikelnummer
*/
public class UserInterface {
public static void main(String[] args) {
while (true) {
String[] userData = getData_Dialog();
if (userData == null) break;
int z1 = 0;
int n1 = 0;
int z2 = 0;
int n2 = 0;
try {
z1 = Integer.parseInt(userData[0]);
n1 = Integer.parseInt(userData[1]);
z2 = Integer.parseInt(userData[2]);
n2 = Integer.parseInt(userData[3]);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null,
"Bitte nur ganze Zahlen eingeben, Nenner != 0");
continue;
}
try {
JOptionPane.showMessageDialog(null,
"Summe: " + Rechnen.bruchAddition(z1, n1, z2, n2));
} catch (IllegalArgumentException e) {
JOptionPane.showMessageDialog(null,
"Mindestens eine der Zahlen war nicht im vorgebenen Bereich");
}
}
JOptionPane.showMessageDialog(null, "Danke und auf Wiedersehen!");
System.exit(0);
}
private static String[] getData_Dialog() {
JTextField z1TF = new JTextField();
JTextField n1TF = new JTextField();
JTextField z2TF = new JTextField();
JTextField n2TF = new JTextField();
Object[] message = {
"Zaehler 1", z1TF, "Nenner 1", n1TF,
"Zaehler 2", z2TF, "Nenner 2", n2TF};
Object[] options = { "Addition", "Abbruch" };
int n = JOptionPane.showOptionDialog(new JFrame(),
message,
"Brueche Addieren",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[0]);
if(n == JOptionPane.OK_OPTION){ // Zustimmung
return new String[]{
z1TF.getText(), n1TF.getText(),
z2TF.getText(), n2TF.getText()};
} else if(n == JOptionPane.NO_OPTION // Verneinung
|| n == JOptionPane.CLOSED_OPTION){ // Dialogfenster geschlossen
return null;
} else {
return null;
}
}
}

Die Klasse Rechnen muss folgenden JUnit-Test bestehen:
Java:
package rechnen;
import static org.junit.Assert.*;
import org.junit.Test;
public class RechnenTest {
@Test
public void test() {
assertEquals("Zaehler = 1 Nenner = 1",
rechnen.Rechnen.bruchAddition(1, 3, 2, 3));
assertEquals("Zaehler = 1 Nenner = 1",
rechnen.Rechnen.bruchAddition(5, 8, 3, 8));
assertEquals("Zaehler = 1 Nenner = 1",
rechnen.Rechnen.bruchAddition(10, 16, 3, 8));
assertEquals("Zaehler = 1 Nenner = 3",
rechnen.Rechnen.bruchAddition(-1, 3, 2, 3));
assertEquals("Zaehler = -1 Nenner = 2",
rechnen.Rechnen.bruchAddition(0, 2, -1, 2));
assertEquals("Zaehler = -2 Nenner = 3",
rechnen.Rechnen.bruchAddition(-1, 3, 1, -3));
try {
rechnen.Rechnen.bruchAddition(1, 1, 1, 0);
fail();
} catch (IllegalArgumentException e) {
assertTrue(true);
}
try {
rechnen.Rechnen.bruchAddition(Integer.MAX_VALUE, 1, 1, 1);
fail();
} catch (IllegalArgumentException e) {
assertTrue(true);
}
assertEquals("Zaehler = 1 Nenner = "+Integer.MAX_VALUE,
rechnen.Rechnen.bruchAddition(0, Integer.MAX_VALUE, 1, Integer.MAX_VALUE));
}
}

So hier mein Code für die Klasse Rechnen:
Java:
package rechnen;

public class Rechnen {


	public static String bruchAddition(int z1, int n1, int z2, int n2) {
		
		int Nenner = n1 * n2;
		if (Nenner == 0) {
			throw new IllegalArgumentException();
		} else {
			int Zaehler = (z1 * n2) + (n1 * z2);
			int Zaehlerkrz = Zaehler / ggt(Zaehler, Nenner);
			int Nennerkrz = Nenner / ggt(Zaehler, Nenner);
			return (Zaehlerkrz + "/" + Nennerkrz);
		}
	}

	public static int ggt(int a, int b) {

		while (a != b) {
			if (a > b)
				a = a - b;
			else
				b = b - a;
		}

		return a;
	}

}

Problem ist jetzt das ich mit meinem jetzigen Code den JUnit-Test nich bestehe, habe auch alle fälle mal einzeln eingeben und das Problem liegt wohl bei
Java:
assertEquals("Zaehler = -1 Nenner = 2",
rechnen.Rechnen.bruchAddition(0, 2, -1, 2));
assertEquals("Zaehler = -2 Nenner = 3",
rechnen.Rechnen.bruchAddition(-1, 3, 1, -3));
da mir bei der Eingabe der wert z.B. 0 ,2, -1, 2 das Programm einfach abschmiert und ich keine Ahnung habe warum :bahnhof: , und was ich auch nicht weiß wie ich es angehen soll ist dieser Teil:
Java:
try {
rechnen.Rechnen.bruchAddition(Integer.MAX_VALUE, 1, 1, 1);
fail();
} catch (IllegalArgumentException e) {
assertTrue(true);
}
assertEquals("Zaehler = 1 Nenner = "+Integer.MAX_VALUE,
rechnen.Rechnen.bruchAddition(0, Integer.MAX_VALUE, 1, Integer.MAX_VALUE));
}
}

Ich hoffe ihr könnt mir weiterhelfen und mein Code ist nicht zu schlimm programmiert und mache mich nicht lächerlich damit :rtfm:

Danke schonmal :applaus:
 

eMmiE

Bekanntes Mitglied
Tipp 1:
Code ordnen

Mach am Besten eine Struktur rein, a lá :
Code:
if () {
    anweisung();
} else {
    anweisung();
}

//@Einrücken

Auch das JOptionPane kann man besser schreiben

Mach eine Ordnung rein und geh dann deine Programmdurchläufe durch und schau, wo du Fehler sehen würdest.

Hilfreich dabei ist auch ein System.out.println("");

Einfach Variablen ausgeben u.Ä. und Fehler feststellen
 

Phash

Top Contributor
du machst lustige Sachen :D

dein JUnit Test erwartet, das:
Java:
assertEquals("Zaehler = -1 Nenner = 2",rechnen.Rechnen.bruchAddition(0, 2, -1, 2));

das bedeutet, links vom Komma muss gleich rechts vom Komma sein.

deine Methode rechnen.Rechnen.bruchAddition(0, 2, -1, 2) muss also den Text "Zaehler = -1 Nenner = 2" ausgeben.
Tut sie das? (mach mal System.out.println( rechnen.Rechnen.bruchAddition(0, 2, -1, 2)); über assertEquals(...)
dann siehst du, was deine Methode ausgibt, und was du ändern musst.

Ich gehe stark davon aus, dass

Java:
 return (Zaehlerkrz + "/" + Nennerkrz);
nicht den geforderten String liefert
 

Ähnliche Java Themen

Neue Themen


Oben