Rechnungen mit Werten aus unterschiedlichen Objekten.

Status
Nicht offen für weitere Antworten.

vincent_vega

Mitglied
Hallo!
Bin neu in der OOP und weiß teilweise noch nicht so recht was ich so tun soll...

Ich wollte eine Klasse Bruch schreiben, die mir Objekte erzeugt, die 2 eingegebene Brüche Addiert, Subtrahiert, Dividiert und multipliziert.

Ich habe eine Klasse BruchTest geschrieben, die jeweils 2*2 Werte (d.h. 2 mal Zähler und nenner einließt):
Code:
import EAjava.*;

public class BruchTest {
	static Input eing = new Input();

	public static void main(String[] args) {
		int i,z,n; int[] a=new int[2];int[] b=new int[2];
		do {
			i = eingabe();
			switch (i) {
			case 1:a=werteeingeben();werteausgeben('a',a);break;
			case 2:a=werteeingeben();b=werteeingeben();
			       werteausgeben('a',a);werteausgeben('b',b);break;
			case 3:Bruch bra=new Bruch(a);Bruch brb=new Bruch(b);
			       
			case 4:
			case 0:break;
			}
		} while (i != 0);

	}

	public static int eingabe() {
		System.out.println("Bitte geben Sie eine der folgenden Optionen ein: ");
		System.out.println("0 für aufhören");
		System.out.println("1 für Bruch lesen und ausgeben");
		System.out.println("2 für Bruch a und b lesen und ausgeben");
		System.out.println("3 für a/d/m/s mit den Objektmehtoden");
		System.out.println("4 für a/d/m/s mit den Klassenmethoden");
		int i = eing.readInteger("->");
		return i;
	}
	public static int[] werteeingeben(){
		int[] c=new int[2];
		c[0]=eing.readInteger("Bitte Zähler eingeben: ");
		c[1]=eing.readInteger("Bitte Nenner eingeben: ");
		return c;		
	}
	public static void werteausgeben(char s,int[] c){
		System.out.println("Ausgabe für "+s+": "+c[0]+"/"+c[1]);
	}
}

Das Teilkonstrukt meiner Objekt-Klasse Bruch sieht wie folgt aus:

Code:
public class Bruch {
	int z, n,z1,n1;

	boolean ok;

	Bruch(int[] a) {
		z = a[0];
		n = a[1];
		if (n == 0)
			ok = false;
		else
			ok = true;

	}

	public void kuerze() {
		boolean he=false;
		if (ok){
			for (int i=z>n?n:z;i>0 && he==true;i--){			
				if (n%i==0 && z%i==0){
					n=n/i;z=z/i; he=true;
				}
			}
		}
	}

	public void mult(){
		z1=thisb.z*b.z;
		n1=a.n*b.n;
	}
	public void div(){
		z1=a.z*b.n;
		n1=a.n*b.z;
	}
	public void add(){
		
	}
}

Nun liegt das Problem bei den jeweiligen Rechenoperationen... Wie multipliziere ich die jeweiligen Werte aus den Objekten? Das aktuelle Objekt ruft man ja mit 'this' auf.


Könnt ihr mit helfen?
Gruß
 
Mal exemplarisch an:

Code:
public void mult(){
      z1=thisb.z*b.z;
      n1=a.n*b.n;
   }

b.z und b.n existieren doch gar nicht - woher soll der Computer wissen, was mit b gemeint ist? Und was passiert mit z1 und n1 nach Durchlaufen der Methode - die werden einfach gelöscht!

Code:
public Bruch mult(Bruch b) {
      int[] result = new int[2];
      result[0] = this.z * b.z;
      result[1] = this.n * b.n;

      return new Bruch(result);
}

Diese modifizierte Methode tut folgendes:

Sie nimmt als Parameter einen anderen Bruch entgegen und nennt ihn b (dieser Bruch ist der, mit dem multipliziert werden soll). Anschließend wird die Berechnung durchgeführt und in einem int-Array gespeichert, mit dessen Hilfe anschlie0end ein neuer Bruch konstruiert und zurückgegeben wird - damit mit dem Ergebnis auch was getan werden kann!

mpG
Tobias

P.S.: Schau dir mal das Immutable-Pattern an und informiere dich über den Sinn der Zugriffsspezifizierer. Das sind allerdings Hinweise, die etwas fortgeschrittenere Fragen des Designs behandeln und daher nicht drängend wenn auch wichtig sind.
Exceptions und deren Einsatz wären auch nicht verkehrt zu wissen.

*JA-ERSTER!*
 
Ganz einfach:
Du hast eine Klasse Bruch, die (oh Wunder) ein Bruch darstellt:
Code:
public class Bruch{
  private int nenner, zaehler;

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

  public int getNenner(){
    return nenner;
  }

  public int getZaehler(){
    return zaehler;
  }

  * // Code siehe unten
}

Ich denke, am einfachsten ist es, eine statische Methode z.B. für die Multiplikation zu machen:
Code:
public static Bruch mul( Bruch a, Bruch b ){
  return new Bruch( a.getNenner() * b.getNenner(), a.getZaehler() * b.getZaehler() );
}

Diese Methode kann in einer beliebigen Klasse stehen, die Klasse "Bruch" wäre wohl am passendsten (dort bei dem * einfügen).

Später kannst du die Methode aufrufen indem du...
Code:
Bruch x = ...
Bruch y = ...

Bruch xy = Bruch.mul( x, y );
...schreibst
 
Hi,

seid ihr alle in einer Klasse?
Schon mindestens zwei Leute hier die das package EAjava.* inkludieren und mit einer Input-Klasse arbeiten 🙂

SRY ist mir nur mal grad aufgefallen 🙂

greetz
SLi
 
Hehe, ja das mag sein. Ein Komilitone erwähnte dieses Forum, und die Klausur naht 😉
EAjava ist ein stupides Paket, welches unser Dozent geschrieben hat, welches die Eingabe ein wenig vereinfacht...
DANKE für die Anworten!

Gruß
 
So hallo nochmal!

Ich habe nochmal nachgeschaut... Ich soll das in Objektmethoden und darüberhinaus auch noch mit Klassenmethoden realisieren.
Über Klassenmethjoden dürfte eiegtich kein Problem darstellen, wie aber kann ich das über Ojektmethoden realisieren??
GRUSS
 
Code:
public static Bruch mul( Bruch a, Bruch b ){
  return new Bruch( a.getNenner() * b.getNenner(), a.getZaehler() * b.getZaehler() );
}
das ist ja ein Bsp für eine Klassenmethode

Code:
public void mul( Bruch b ){
  nenner = nenner * b.getNenner();
  zaehler = zaehler * b.getZaehler();
}
wäre ein bsp für eine instanzmethode
 
vincent_vega hat gesagt.:
EAjava ist ein stupides Paket, welches unser Dozent geschrieben hat, welches die Eingabe ein wenig vereinfacht...
Sowas hat unserer damals auch geschrieben... da gab's dann so tolle Sachen wie "Tastatur.liesString()" oder "Bildschirm.schreib()" :roll:
 
normalerweise würde man den Bruch "immuteable" machen

und also die mul Methode als Instanzmethode implementieren, die einfach einen neuen Bruch zurückgibt

siehe BigInteger

Code:
public class Bruch{

  private final int nenner;
  private final int zaehler;

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

  public int getNenner(){
    return nenner;
  }

  public int getZaehler(){
    return zaehler;
  }

  public Bruch mul(Bruch b){
  return new Bruch( this.getNenner() * b.getNenner(), this.getZaehler() * b.getZaehler() );
}
}
 
Ok VIELEN DANK!
Nach 2 1/2 Stunden harten Kopfzerbrechens hab ich nun endlich das Projekt fertig gestellt, und es funktioniert 😉

hab allerdings dire von euch vielfach angeworbenen Instanzmethoden getZaehler und getNennet nicht benutzt, wobei ich diese im Prinzip nicht brauche, da ich der 'Einfachheit' halber mit Srings als Rückgabewert bearbeutet hab:
also z.B.
Code:
	public String mult(Bruch b) {
		if (this.istGueltig() & b.istGueltig()) {
			Bruch help = new Bruch(this.z * b.z, this.n * b.n);
			help.kuerze();
			return "Division ergibt: " + toStringg() + " - " + b.toStringg()
					+ " = " + help.toStringg();
		} else
			return "Division ist nicht möglich!";
	}

Vielen Dank nochmal!
gruß
vincent_vega
 
Mit Strings zu arbeiten ist nicht sehr objektorientiert... Was machst du, wenn du einen Term wie (1/2 - 1/4 * 1/8) berechnen willst?

Und die Methoden getNenner() und getZähler() sind Ausdruck eines wesentlichen Prinzips der OO Programmierung: Information-hiding. Stell dir vor, du möchtest beim Zugriff auf Nenner oder Zähler überprüfen, ob der Bruch gekürzt worden ist - das ist ohne getter-Methode so unmöglich (Es gibt natürlich andere Wege, aber ich denke, es wird deutlich, was ich meine).

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben