# Bruch Konstruktor



## Hadyaner (9. Apr 2011)

Hey, habe nach langem mal wieder eine Aufgabe bekommen, die ich komplett nicht verstehe, da ich die letzen Wochen nicht in der Uni war (krankheitsbedingt)
Hier die Aufgabe :

Schreiben Sie eine Klasse Bruch, die eine Bruchzahl mit ganzzahligem Zähler und Nenner darstellt. 
Schreiben Sie folgende Methoden: 
•     Zwei sinnvolle Konstruktoren, 
•     Getter für Zähler und Nenner, 
•     Setter für Zähler und Nenner mit Überprüfung auf korrekte Parameter, 
•     eine Methode, die den Wert als Dezimalzahl vom Typ double zurück gibt, 
•     equals, 
•     hashCode. 

Randbedingungen: 
•     Ihre Klasse muss verhindern, dass der Nenner jemals Null ist. 
•     Ihre equals-Methode darf für die Brüche  1 / 2  und  2 / 4  false zurück geben. Auch die Hashcodes 
können unterschiedlich sein. Für zwei Brüche mit jeweils identischem Zähler und Nenner muss 
equals true zurück geben und die Hashcodes müssen gleich sein. 

Leider versteh ich nur Bahnhof .... könnte mir jemand dabei helfen ?


----------



## Haave (9. Apr 2011)

Hadyaner hat gesagt.:


> Leider versteh ich nur Bahnhof .... könnte mir jemand dabei helfen ?


Dann wird es Zeit für ein Java-Lehrbuch und die Suchfunktion dieses Forums 

Nein wirklich, *irgendwas* davon musst du doch schon mal gehört haben?! Getter und Setter, Konstruktoren, equals(), double, null … Das liegt doch jetzt nicht an einer Woche Krankgewesensein. Wenn du nichts davon kennst, fehlen ganz klar die Grundlagen.

Edit: Ok, sorry, hab mich mit der Woche verlesen. Dennoch gilt weiterhin: Es ist nicht Aufgabe des Forums, dir Java-Basiswissen beizubringen - das musst du dir selbst anlesen.


----------



## Hadyaner (9. Apr 2011)

Okay, ich kenne die Bedeutungen von allen Begriffen, aber weiß ich nicht, wie ich die richtig initialisiere etc.


----------



## Final_Striker (9. Apr 2011)

Schon mal eine eigene Klasse in Java geschrieben?


----------



## Haave (9. Apr 2011)

Hast du denn schon ein kleines bisschen Code, das du zeigen kannst? Weißt du, wie eine Klasse aufgebaut ist, und könntest du das exemplarisch für diese Klasse beschreiben?


----------



## Hadyaner (9. Apr 2011)

Natürlich weiß ich, wie ich eine Klasse schreibe etc. ich weiß nur nicht wie ich einen Getter und Setter initalisiere und das auch noch mit Brüchen ?


----------



## Haave (9. Apr 2011)

Getter und Setter sind nichts Magisches, sondern ganz normale Java-Methoden, falls du wegen der Begrifflichkeiten verwirrt bist. Sie werden bloß meist mit diesen Begriffen herausgestellt, weil man damit alle Methoden meint, die auf die Instanzvariablen eines Objekts zugreifen und diese lesen (get) oder verändern (set) können.


----------



## Hadyaner (9. Apr 2011)

alles klar, ich poste nachher mal meine Idee =) Danke, klingt aber echt simpel


----------



## b1zarRe (9. Apr 2011)

Hier eine kleine Starthilfe...: Wenn du mit der Aufgabenstellung aber garnicht klar kommst, dann hast du eine Menge aufzuholen... bzw. vllt den Kurs im nächsten Semester nochmal belegen.

Ansonsten überlege dir vor einer Aufgabe erst einmal was zu tun ist. Du sollst quasi nichts anderes machen, als eine Bruchzahl darzustellen. Woraus besteht eine Bruchzahl? -> Zähler und einem Nenner! Sowie einem Bruchstrich. Also, ist es schonmal gut, diese als Konstanten bzw. Instanzvariablen der Klasse zu setzen. Was passiert, wenn der Zaehler eine 0 hat? Oder wenn der Nenner eine 0 bekommt??? -> Beim ersten wird der komplette Bruch gekürzt auf 0 herauskommen... beim 2. verletzt dies eine Mathematische Bedingung, da nicht durch 0 geteilt werden darf! Wie kann man einen Bruch kürzen? (falls dies auch in der aufgabe enthalten ist)...genau, man braucht einen einen größten gemeinsamen Teiler.... usw usf

Hier ein Ansatz:

```
public class Bruchzahl {
	
	/* Instanzvariable einer Instanz. */
	private int zaehler;
	private int nenner;
	private final char bruch = "/";
	private int ganzzahl;

	
	/* Konstruktor fuer einen zaehler sowie nenner. */
	public Bruchzahl(int zaehler, int nenner) {
		this.zaehler = zaehler;
		this.nenner = nenner;
	}

	/* Konstruktor fuer einen zaehler "ohne" nenner. */
	public Bruchzahl(int zaehler) {
		this.zaehler = zaehler;
		this.nenner = 1;
	}

	/* Gibt Zaehler wieder. */
	public int gibZaehler() {
		return this.zaehler;
	}

	/* Gibt Nenner wieder. */
	public int gibNenner() {
		return this.nenner;
	}

	/* Gibt Bruch wieder. */
	public String gibBruch() {
		return this.zaehler + this.bruch + this.nenner;
	}

	/* Setzt Zaehler sowie nenner einem gewissen Wert zu. */
	public void setzeZaehlerUndNenner(int zaehler, int nenner) {
		if (zaehler == 0) {
			this.ganzzahl = 0;
		} else if  (nenner == 0) {
			this.ganzzahl = -1; 
		} else {
			this.zaehler == zaehler;
			this.nenner == nenner;
		}			 		
	}
		
}
```


----------



## Haave (9. Apr 2011)

b1zarRe hat gesagt.:


> [JAVA=6]private final char bruch = "/";[/code]


Das ist aber ein String, kein char. Schreib '/'.

Na dannn hat der TO ja jetzt eine Vergleichsmöglichkeit (oder Abschreibemöglichkeit, je nach dem…).


----------



## XHelp (9. Apr 2011)

@b1zarRe, dein Code wird nicht mal kompilieren. 
	
	
	
	





```
setzeZaehlerUndNenner
```
 ist auch irgendwie ziemlich kryptisch und falsch. 
	
	
	
	





```
gibBruch
```
 sollte besser in 
	
	
	
	





```
toString
```
 umbenannt werden und die überflüssigen 
	
	
	
	





```
this
```
 kannst du auch weglassen.


----------



## b1zarRe (10. Apr 2011)

Es ging hierbei nicht darum, dem Threadersteller ein fertiges Programm zu liefern, sondern einen ANSATZ zu schreiben. Dies habe ich grad in paar Minuten gemacht und ohne es selbst mal laufen zu lassen oder so. Deswegen auch nicht vollständig... aber stimmt, dass mit char muss natürlich in '' und nicht "". Klar, kann man this weglassen... ich finde es aber immer übersichtlicher this.nenner = nenner(parameter) zu schreiben, als nenner = nenner. Auch ist die Namenswahl toString wohl noch aussagekräftiger, dass stimmt.

Mir gings es aber eher darum, wie gesagt, ihm einen Ansatz zu geben und nicht ein fehlerfreies Programm auszuhändigen.


----------



## XHelp (10. Apr 2011)

b1zarRe hat gesagt.:


> Klar, kann man this weglassen... ich finde es aber immer übersichtlicher this.nenner = nenner(parameter) zu schreiben, als nenner = nenner.


Ne, nenner = nenner wäre falsch. Ich meinte das eher bei den Gettern und nicht Settern.


> Auch ist die Namenswahl toString wohl noch aussagekräftiger, dass stimmt.


Es geht hier auch nicht um die Namenswahl, sondern darum, dass du eine Methode von 
	
	
	
	





```
Object
```
 überschreibst. Dann kannst du auch bei 
	
	
	
	





```
System.out.println(einBruch)
```
 machen und eine sinnvolle Ausgabe bekommen.


----------



## enbesserwisser (10. Apr 2011)

b1zarRe hat gesagt.:


> /* Gibt Bruch wieder. */
> public String gibBruch() {
> return this.zaehler + this.bruch + this.nenner;
> }[/code]



Hier läuft man nicht Gefahr, Instanzvars mit nicht vorhandenen Methodenparametern zu verwechseln...


----------



## fastjack (10. Apr 2011)

> • Zwei sinnvolle Konstruktoren



1. Zähler + Nenner und 2. eine Zahl, der der man einen Bruch erstellen kann. Ob jetzt ein Konstruktor sinnvoll ist, der mir aus 7 -> 7/1, 5 -> 5/1, 3 -> 3/1 erstellt, glaube ich nicht. Bei den Konstruktoren mußt du auch Parameter prüfen, also hier die Setter von unten nutzen.



> • Getter für Zähler und Nenner,



int getNenner(), int getZaehler() auf die Instanzvariablen



> • Setter für Zähler und Nenner mit Überprüfung auf korrekte Parameter,



setNenner(), setZaehler() auf die Instanzvariablen, schmeiß IllegalArgumentExceptions, wenn die Parameter nicht korrekt sind. Wobei Brüche eigentlich imutable sein könnten...



> • eine Methode, die den Wert als Dezimalzahl vom Typ double zurück gibt,



double berechne() oder weis der Geier was.



> • equals,



die equals-Methode von Objekt überschreiben. Naja, was unterscheidet Brüche voneinander? Paß hier auf, weil jemand dir zum vergleichen eines Bruches auch ein Objekte der Klasse Apfel oder Ei unterschieben kann.



> • hashCode.



Objekte die equals sind, haben den gleichen Hashcode, auch bei mehrmaligem Aufruf der Hashfunktion. Aber Objekte mit gleichen Hashcode müssen nicht equals sein! Viel Spaß beim knobeln an der Hashfunktion (du mußt int's erzeugen)



> Randbedingungen:
> • Ihre Klasse muss verhindern, dass der Nenner jemals Null ist.



in dem setter halt, mit if prüfen



> • Ihre equals-Methode darf für die Brüche 1 / 2 und 2 / 4 false zurück geben.



damit wird's leichter



> Auch die Hashcodes können unterschiedlich sein. Für zwei Brüche mit jeweils identischem Zähler und Nenner muss
> equals true zurück geben und die Hashcodes müssen gleich sein.



auch damit hast Du einige Probleme weniger.

P.S.: lass Dir die Aufzeichnungen der Vorlesungen geben, die du versäumt hast.


----------



## Hadyaner (10. Apr 2011)

Sorry jungs -.- mir ist ein Fehler unterlaufen, dass ist erst die Aufgabe für in 2 Wochen, deswegen kam mir das alles ein bisschen komisch vor, weil wir das noch garnicht in der Vorlesung hatten. Ich werde den Topic dann wieder öffnen, aber danke für die schnelle Hilfe, echt ein Top Forum =)


----------

