Operatoren Bruchrechner

kulle009

Mitglied
Hallo,

ich habe mal wieder ne Aufgabe die ich absolut nich hinbekomme und keinen Ansatz finde wie ich es machen kann und soll!

Die Aufgabe ist!

Schreiben Sie ein Java Programm Bruchrechner, das Brüche addiert, subtrahiert, multipliziert oder dividiert und das Ergebnis kürzt. Zur Ein- und Ausgabe soll die Eingabeaufforderung verwendet werden. Der Aufruf des Programms erfolgt dann mit einer Rechenoperation (add, sub, mul, div), gefolgt von vier ganzen Zahlen, also zum Beispiel „java Bruch add 1 2 3 4“. Das Ergebnis in diesem Beispiel wäre dann 1/2 + 3/4 = 5/4 .

Schon wie man den Bruch darstellt bzw. als Rechenoperation nutzen kann ist mir unklar!

Könnte mir jemand weiterhelfen?

Das wäre nett!

Danke an alle...
 

kulle009

Mitglied
Danke schon mal!

Ich verstehe richtig: Ich brauche da wahrscheinlich mehrere Klassen! Sage und schreibe 5?

Eine für die Addition, Subtraktion, Multiplikation und Division. Und eine für die Ausgabe der Brüche und dem Ergebnis????


Ist das richtig?:bahnhof:
 

kulle009

Mitglied
Vielen Dank für die Antworten,

habe mir mak nen Programm zusammen gebastelt. Jetzt bekomme ich aber in Zeile 56 error: cannot find symbol

String bruch_string=Utils.inputString(prompt); fehler zeigt er unter dem U !!!

und fehler in zeile 61 error cannot find symbol

bruch_string.sustring(bruch_strich_pos+1, fehler zeigt er unter dem Punkt.


Hier mein Code:

Java:
class Bruch{
	
	long zaehler;
	long nenner;
	
	public Bruch (long z, long n){
		this.zaehler = z; 
		this.nenner = n;
		this.kuerzen();
	}
	public Bruch mult (long z) {
		return new Bruch(this.zaehler * z,
			this.nenner);
	}
	public Bruch mult (Bruch br){
		return new Bruch(this.zaehler * br.zaehler,
			this.nenner * br.nenner);
	} 
	public Bruch add (Bruch br){
		long z1 = this.zaehler * br.nenner;
		long z2 = br.zaehler * this.nenner;
		long n = this.nenner * br.nenner;
		return new Bruch(z1 + z2, n);
	} 
	public Bruch add_to(Bruch br){
		long z1 = this.zaehler * br.nenner;
		long z2 = br.zaehler * this.nenner;
		long n = this.nenner * br.nenner;
		this.zaehler = z1 + z2;
		this.nenner = n;
		this.kuerzen();
		return this;
	} 
	public String toString(){
		String str=this.zaehler + "/" + this.nenner;
		return str;
	} 
	private Bruch kuerzen(){
		long limit=Math.min(this.zaehler,
			this.nenner);
		for (long i=2; i < limit;i++) {
			while (this.zaehler % i ==0 &&
				this.nenner % i == 0) {
			this .zaehler = this.zaehler / i;
			this.nenner = this.nenner / i;
				}
		}
		return this;
	} 
	public static Bruch einlesen(String prompt){
		boolean ok;
		long z=0;
		long n=1;
		do {
			ok = true;
			String bruch_string=Utils.inputString(prompt);
			int bruch_strich_pos=bruch_string.indexOf("/");
			String nenner_string, zaehler_string;
			try {
				nenner_string=
				bruch_string.sustring(bruch_strich_pos+1,
					bruch_string.length());
				zaehler_string=bruch_string.substring(0,
					bruch_strich_pos);
				z = Long.parseLong(zaehler_string);
				n = Long.parseLong(nenner_string);
				if (n==0L) throw new Exception();
			}catch (Exception e) {
				ok = false;
				System.err.println("'" + bruch_string +
					"' ist kein gueltiger Bruch");
			}
		} while (! ok);
		return new Bruch(z,n);
	}
	public static void main(String argv[]){
		Bruch b1 = new Bruch(13,3);
		Bruch b2 = new Bruch(3,13);
		Bruch b3 = b2.mult(b1);
		System.out.println("b2 = "+b2+"; b3 = "+b3);
		Bruch b4 = einlesen("Bruch angeben:");
		b3.add_to(b4);
		System.out.println("b3 = " + b3);
		System.out.println("b4 = " + b4);
	}
}

Hoffe ihr könnt mir helfen!

Danke!:toll:
 

turtle

Top Contributor
Laut Aufgabenstellung muss dein Programm Bruchrechnungsaufgaben der Form
HTML:
java Bruch add 1 2 3 4
bearbeiten können.
Daher muss dein Programm die Übergabeparameter auswerten, die Bruchaufgabe berechnen und hinterher ausgeben.

Daher kümmert sich dein Programm hier nicht richtig darum, obwohl im Programm gute Ansätze zu finden sind.

Ich glaube, das diese Aufgabe sich gut für TDD(Test-driven-development) eignet.

Daher würde ich an deiner Stelle einen jUnit-Test scheiben, BEVOR du mit der Arbeit am Programm beginnst
Ein solcher Test kann zum Beispiel so aussehen:
Java:
	@Test
	public void test() {
		BruchProgramm bruchProgramm = new BruchProgramm("add 1 2 3 4");
		assertEquals("add", bruchProgramm.getOperation());
		Bruch[] bruchZahlen = bruchProgramm.getBruchZahlen();
		assertEquals(2, bruchZahlen.length);
		int[] bruch1 = new int[] { 1, 2 };
		int[] bruch2 = new int[] { 3, 4 };
		Bruch bruch = bruchZahlen[0];
		assertEquals(bruch1[0], bruch.getZaehler());
		assertEquals(bruch1[1], bruch.getNenner());
		bruch = bruchZahlen[1];
		assertEquals(bruch2[0], bruch.getZaehler());
		assertEquals(bruch2[1], bruch.getNenner());
		Bruch add = bruchZahlen[0].add(bruchZahlen[1]);
		assertEquals(5, add.getZaehler());
		assertEquals(4, add.getNenner());
	}
Dieser Test prüft, ob 1/2 + 3/4 als Ergebnis 5/4 liefert und testet zugleich, das diese Aufgabe via String Parameter übergeben werden kann.

Dieser Test läuft insbesondere OHNE Benutzereingaben und kann sehr schnell ausgeführt werden.

Dein Problem mit der Eingabe einer solchen Aufgabe über Tastatureingaben würde ich DANACH lösen, weil du ja nun weißt, das deine Implementierung dieser einfach Bruch-Addition funktioniert.

Die anderen Rechen-Operationen kannst du ähnlich lösen. Bei TDD startest du immer mit einem Testfall und dann schreibst du Code, der diesen Testfall abdeckt. Insbesondere kannst du danach dein Programm beliebig umbauen, solange alle deine Tests weiterhin laufen.
 

kulle009

Mitglied
Schaut mal.

Ich scheiter schon daran überhaupt aus zwei zahlen nen Bruch machen zu lassen! Wie geht das denn?

Java:
import java.util.Scanner;
public class Bruch

	{
		public static void main(String[] args)
		{
		Scanner scan = new Scanner( System.in );
		long z;
		long n;
		long bruch;
		{
			System.out.print("Geben Sie die erste Zahl ein");
			
			z = scan.nextInt();
			
			System.out.print("Geben Sie die zweite Zahl ein");
			
			n = scan.nextInt();
						
			System.out.println(??????);		}
	}
}

Die Darstellung als Bruch ist nicht das Problem sondern dann damit rechnen zu können!
 

turtle

Top Contributor
Java:
package axel;

import java.util.Scanner;

public class Bruch {
	private int zaehler;
	private int nenner;

	public Bruch(int zahehler, int nenner) {
		this.zaehler = zahehler;
		this.nenner = nenner;
	}

	private Bruch add(Bruch bruch2) {
		// TODO Auto-generated method stub
		return null;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int z;
		int n;
		System.out.print("Geben Sie die erste Zahl ein");

		z = scan.nextInt();

		System.out.print("Geben Sie die zweite Zahl ein");

		n = scan.nextInt();
		Bruch bruch1 = new Bruch(z, n);
		System.out.print("Geben Sie die dritte Zahl ein");

		z = scan.nextInt();

		System.out.print("Geben Sie die vierte Zahl ein");

		n = scan.nextInt();
		Bruch bruch2 = new Bruch(z, n);
		Bruch resultat = bruch1.add(bruch2);

	}
}
 

Phash

Top Contributor
solltest ihm vielleicht noch sagen, dass er

Java:
private Bruch add(Bruch bruch2) {
        // TODO Auto-generated method stub
        return null;
    }
noch implementieren muss... und zwar so, wie man eben einen Bruch addiert
 
Zuletzt bearbeitet:

kulle009

Mitglied
Vielen Dank für die Antworten

bringt mir aber so nicht viel!

Ich habe es jetz so das ich schon mal rechnen kann!

Java:
import java.util.Scanner;

public class Bruchrechnen {
  public static void main(String[] args) {
    new Bruchrechnen().top();
  }
  
  void top() {
      int a = einlesen ("Zaehler erster Bruch (a)");
      int b = einlesen ("Nenner erster Bruch (b)");
      int c = einlesen ("Zaehler zweiter Bruch (c)");
      int d = einlesen ("Nenner zweiter Bruch (d)");
      
      int neuZaehler = a * d + c * b;
      int neuNenner  = b * d;
      
      int ggT    = ggT(neuZaehler, neuNenner);
      neuZaehler = neuZaehler / ggT;
      neuNenner  = neuNenner  / ggT;
      
      System.out.print(a + "/" + b + " + " + c + "/" + d + " = " + neuZaehler);
      if(1 != neuNenner) {
          System.out.println("/" + neuNenner);
      }
  }

  int ggT(int a, int b) {
      if(0 == a % b) {
          return b;
      }
      return ggT(b, a%b);
  }
  
  Scanner sc = new Scanner(System.in);
  int einlesen(String frage) {
    System.out.println(frage + ": ");
    return sc.nextInt();
  }
}

Aber das ist noch nicht sind der Sache! Es soll ja zum Beispiel add 1 2 3 4 eingegeben werden und dann erscheinen: 1/2 + 3+4 = 5/4

Ich komme zwar mit dem Construct auch auf das Ergebenis aber nicht Sinn der Sache!!

Könnt ihr mir da helfen, dass es so eingegeben "add 1 2 3 4" und so "1/2 + 3+4 = 5/4" ausgegeben wird???
 

huffle

Mitglied
Dann nimm dir den eingegebenen string und frießel ihn mit indexOf und substring auseinander.

Java:
...
String input = "add 1 2 3 4";
String rechenart = input.substring(0,input.indexOf(" "));
...
 

kulle009

Mitglied
Hallo habe nun doch den etwas unkomplizierteren Weg gefunden.

Aber wie mach ich es nun das er addiert wenn im ersten Argument das add steht!

Java:
class Bruch{
	static int neuZ;
	static int neuN;	
	
	static void add(int z1,int n1,int z2,int n2){
		neuZ = (z1*n2)+(z2*n1);
		neuN = n1*n2;
	}
	static void sub(int z1,int n1,int z2,int n2){
		neuZ = (z1*n2)-(z2*n1);
		neuN = n1*n2;
	}	
	static void mul(int z1,int n1,int z2,int n2){
		neuZ = z1*z2;
		neuN = n1*n2;
	}
	static void div(int z1,int n1,int z2,int n2){
		neuZ = z1*n2;
		neuN = n1*z2;
	}
	
	
	public static void main(String[]args){
		
			
		int z1 = Integer.parseInt(args[0]);
		int n1 = Integer.parseInt(args[1]);
		int z2 = Integer.parseInt(args[2]);
		int n2 = Integer.parseInt(args[3]);
		
		add(z1, n1, z2, n2); //Das add müsste ja args[0] sein oder??? Aber wie mache ich nun die Anweisung das er das auch so macht dann! Irgendwie mit if????
		
		System.out.println(z1 + "/" + n1 + "/" + " + " + z2 + "/" + n2 + " = " + neuZ + "/" + neuN);
		
		
		
	}
}

Das add müsste ja args[0] sein oder??? Aber wie mache ich nun die Anweisung das er das auch so macht dann! Irgendwie mit if????
 

Phash

Top Contributor
ja, irgendwie mit if :)

args[0] solltest du auch nicht auf int parsen, sondern erst ab args[1]

if (args[0].equals("add)){//addiere...}
else if (args[0].equals("divide")){//dividiere...}
 

kulle009

Mitglied
Hallo

da macht er mir nix...

Hatte es mal so

Java:
if(args[0].equals("add")){
		int add; //Hier soll die static void add ausgeführt werden!!!
		}

Hat er zwar angenommen aber nur s*****e berechnet :bloed:

Und so geht es auch nicht

Java:
if(args[0].equals("add")){
		void add; //Hier soll die static void add ausgeführt werden!!! Also die Methode!!!
		}
 

kulle009

Mitglied
Hallo

das mit der Berechnung geht jetz wunderbar!

Nun möchte ich noch den euklidschen algorithmus zum kürzen einbauen! Wie mache ich das denn?
 

Ähnliche Java Themen

Neue Themen


Oben