Variablen Übergabe von eingelesenen Variablen in neue Klasse

F.lol

Mitglied
Ich habe folgendes Problem:
Ich soll in meinem Kurs ein Programm schreiben, in dem ich einen Bruch einlese, diesen in einer anderen Klasse kürze und dann wgekürzt wieder ausgebe.
irgendwie läuft das aber nicht so wie ich mir das vorstelle. Ich kann die Werte einlesen und Variablen zuordnen aber ich schaffe es nicht, diese Werte für die andere Klasse zu verwenden.
Kann mir da vlt. jemand helfen? Mein Programm sieht bisher so aus:

Java:
 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Haupt {
	

	

	public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new
                InputStreamReader(System.in));
                System.out.print("Bitte geben sie den Zähler ein ....: ");
                String StringA = reader.readLine();
                int Zaehler = Integer.parseInt(StringA);
                BufferedReader reader2 = new BufferedReader(new
                InputStreamReader(System.in));
                System.out.print("Bitte geben sie den Nenner ein ....: ");
                String StringB = reader.readLine();
                int Nenner = Integer.parseInt(StringB); 
                new Bruch (Zaehler, Nenner);
	}
}
	


class Bruch 
{
			public int Zaehler;
			public int Nenner;
	public Bruch (int Zaehler, int Nenner)
	{
		this.Zaehler = Zaehler;
		this.Nenner = Nenner;
	}
	public Bruch Clone ()
	{
		Bruch Result;
		Result = new Bruch (
				this.Zaehler,
				this.Nenner);
		return Result;
	}
	public void kuerzen()
	{
		int ggt = GGTLoop (Zaehler, Nenner);
		Zaehler = Zaehler / ggt;
		Nenner = Nenner / ggt;
		return;
	}
	protected int GGTLoop(int A, int B) 
	{
		return 0;
	}
	public void ausgeben ()
	{
		 String  u;
			u = (new Integer(Zaehler)).toString();
			String b;
			b = (new Integer(Nenner)).toString();
			System.out.println("Der gekürzte Bruch lautet " + u + "/" + b);
	}
}
 
Hi,
du rufst ja die Methode "kuerzen" gar nicht auf aus deinem Hauptprogramm.
Ausserdem solltest du da einen Rückgabewert zurück geben.

Beispiel:
hinter
Java:
new Bruch (Zaehler, Nenner);

Java:
rufst du die Mehtode "kuerzen" auf:
Bruch.kuerzen

Zudem würde ich (um es einfach zu halten) noch zwei Methoden schreiben. (Du könntest es auch mit einer Methode machen und könntest dann ein Objekt zurück geben aber das lassen wir jetzt mal)...
Also schreibst du zwei Methoden in deiner "Bruch" - Klasse z.B.
Java:
int getNenner()
{
return this.Nenner
}

int getZaehler
{
return this.getZaehler
}

eine weitere (allerdings unschöne) Alternative ist, da die du Nenner und Zähler ja sowiso schon public hast, kannst du diese im Hauptprogramm auch gleich abfragen mit
Java:
bruch.Zaehler
bruch.Nenner

hoffe das hilft dir weiter...
 
In wiefern funktioniert das Übergeben der Werte denn nicht?

Ich würde es ein bisschen anders machen als von dir beschrieben. Du erzeugst ja direkt eine Instanz der Klasse Bruch und gibst dieser den Nenner und den Zähler mit.
Ich würde zwar auch eine Instanz erstellen, aber die Methode kuerzen() gesondert mit eben diesem Objekt und den zwei Werten aufrufen.

Also meinetwegen Bruch bruch = new Bruch();
Und dann die Methode mit bruch.kuerzen(nenner, zaehler); aufrufen.

Und dass in GGTLoop return 0 steht so gewollt?

Edit:
Zu langsam. :rtfm:
 
um ehrlich zu sein...warum da return 0 da steht versteh ich auch nicht...das hab ich aus der Folie von meinem Prof so übernommen. macht wenig sinn gell? Ich hab mich das auch gefragt aber dachte mir das wird wohl einen von mir nicht ersichtlichen Grund haben.

Ich würde mal einfach sagen, weil ihr die Methode selbst implementieren sollt.
 
gleich mal zwei sachen: was heißt denn bitte dass wir das implementieren sollen? Hä?
und das andere ich habs jetzt so geändert:
Java:
public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new
                InputStreamReader(System.in));
                System.out.print("Bitte geben sie den Zähler ein ....: ");
                String StringA = reader.readLine();
                int Zaehler = Integer.parseInt(StringA);
                BufferedReader reader2 = new BufferedReader(new
                InputStreamReader(System.in));
                System.out.print("Bitte geben sie den Nenner ein ....: ");
                String StringB = reader.readLine();
                int Nenner = Integer.parseInt(StringB); 
                Bruch bruch =new Bruch (Zaehler, Nenner);
                bruch.kuerzen (Zaehler, Nenner);
                bruch.ausgeben (Zaehler, Nenner);
allerdings musste ich dann hierfür diese beiden zeilen:
Java:
public void kuerzen()

public void ausgeben()
in diese hier ändern
Java:
public void kuerzen(int Zaehler, int Nenner)

public void ausgeben(int Zaehler, int Nenner)
und laufen tuts deswegen totzdem nicht. 🙁
beim ausführen im debugger läuft das main und dann erscheint in der Console die Fehlermeldung:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Bruch.kuerzen(Haupt.java:59)
at Haupt.main(Haupt.java:23)
 
Hört sich so an, als würde irgendwo durch 0 geteilt werden.

Was steht denn konkret in der kuerzen() Methode?

und so wie das aussieht denk ich mal: Da GGTLoop ja return 0 ausgibt und dann Nenner und Zaehler durch GGT geteilt werden teilen die sich beide durch 0 oder?
und was heißt denn dieses implementieren???

also GGTLoop errechnet mir den Größten Gemeinsamen Teiler der Werte Zaehler und Nenner. Das Programm is fehlerfrei geschrieben. und dann wird eben Zaehler durch den GGT geteilt und Nenner durch den GGT geteilt damit ist der Bruch dann auf sein Minimum gekürzt.
 
was heißt denn bitte dass wir das implementieren sollen?

Das heißt, dass du in der Methode den Code schreiben sollst, der den größten gemeinsamen Teiler von a und b berechnet.


allerdings musste ich dann hierfür diese beiden zeilen:

Das ist falsch, die Methoden sollten schon so bleiben wie sie sind.


und laufen tuts deswegen totzdem nicht. 🙁

Weil du hier :

Java:
        Zaehler = Zaehler / ggt;
        Nenner = Nenner / ggt;

durch 0 teilst, und das ist nicht erlaubt.
 
Wenn ich aber die beiden Methoden lasse wie sie sind, unterringelt mir Eclipse aber
Java:
bruch.kuerzen (Zaehler, Nenner);
bruch.ausgeben (Zaehler, Nenner);
diese beiden Anweisungen mit der Warnung: The method Kuerzen/ausgeben is not aplliciable for the arguments (int, int)

okay und das GGT Loop Programm kritzel ich dann einfach da rein wo jetzt noch return 0 steht und "returne" dann einfach den eigentlich errechneten wert?!
 
Wenn ich aber die beiden Methoden lasse wie sie sind, unterringelt mir Eclipse aber
Java:
bruch.kuerzen (Zaehler, Nenner);
bruch.ausgeben (Zaehler, Nenner);
diese beiden Anweisungen mit der Warnung: The method Kuerzen/ausgeben is not aplliciable for the arguments (int, int)

Deine Methoden müssten dann auch so aussehen:

Java:
public void kuerzen(int zaehler, int nenner) { 
    //todo something
}

public void ausgeben(int zaehler, int nenner) {
   //todo something else
}


okay und das GGT Loop Programm kritzel ich dann einfach da rein wo jetzt noch return 0 steht und "returne" dann einfach den eigentlich errechneten wert?!

Richtig, dann kannste auch mit dem GGT-Loop arbeiten....
 
YES 🙂
läuft
aber eins versteh ich noch nicht. Warum müssen bei den Methoden die Variablen klein geschrieben werden???
also (int zaehler, int nenner) also warum läuft das Programm nicht wenn man diese beiden groß schreibt?

und nochwas:
was genau passiert hier:
Java:
int getNenner()
{
return this.Nenner;
}
			 
int getZaehler ()
{
return this.Zaehler;
}
 
Zuletzt bearbeitet:
YES 🙂
läuft
aber eins versteh ich noch nicht. Warum müssen bei den Methoden die Variablen klein geschrieben werden???
also (int zaehler, int nenner) also warum läuft das Programm nicht wenn man diese beiden groß schreibt?

Es läuft auch wenn man beides groß Schreibt, dann lag der fehler woanders, aber generell schreibt man in Java Methoden und Variablen in camelCase.
Also

public void trinkBier()
public void rechnen()
public void holMirMaNeFlascheBier()

und genauso:

int zahl
int bierFlaschen
int maximalErreichbarePunkte

usw.


PS:
Ich glaub ich brauch nachher nen Feierabend Bier xD
 
Hmm, kann net mehr editieren, dann halt in nem neuen posting:
YES 🙂
läuft
aber eins versteh ich noch nicht. Warum müssen bei den Methoden die Variablen klein geschrieben werden???
also (int zaehler, int nenner) also warum läuft das Programm nicht wenn man diese beiden groß schreibt?

und nochwas:
was genau passiert hier:
Java:
int getNenner()
{
return this.Nenner;
}
			 
int getZaehler ()
{
return this.Zaehler;
}

Hier gibts du die (hoffentlich private gesetzten) Variablen deiner Klasseninstanz zurück, da du normalerweise von außen nicht auf private Variablen zugreifen kannst, dafür gibt es die getter() und setter() methoden, da es normalerweise "Regel"-Konform ist Klassenvariablen private zu setzen um den zugriff von außen zu beschränken.
 

Zurück
Oben