Java-Projekt Bruchrechnen

Neue Frage »

Auf diesen Beitrag antworten »
yoyo Java-Projekt Bruchrechnen

Meine Frage:
hallo alle zsm,
undzwar muss ich ein Projekt mit drei klassen schreiben, dass dem benutzer ermöglicht unterschiedliche bruchrechnungen durchzuführen.
diese 3 klassen sind einmal bruch, bruchrechnen und rechnen. Die Klasse bruch kapselt die erforderlichen Daten und Methoden zur grundsätzlichen Erfassung und Handhabung eines Bruches. die klasse rechnen soll methoden zum rechnen mit brüchen zur verfügung stellen, also genauer gesagt wie man zwei brüche dividiert, subtrahiert, addiert und multipliziert, dabei soll man aber keine neue variablen deklarieren, sondern auf vorhandene in der klasse bruch zugreifen, was ich schon mal nicht kann. :S
due klasse bruchrechnen soll sozusagen die verbindung zum benutzer sein und als steuerprogramm für den anwender dienen, also auf vorhandene methoden zurückgreifen (in "rechnen" und"bruch") und diese "System.out.print" machen.
habt ihr schon ungefähr ne vorstellung was ich machen muss? für profis klingt das vllt ganz einfach, aber ich kann das irgendwie einfach nicht, ich hab erst informatik seit einem halben jahr und der lehrer erwartet von uns das wir sowas alles selbstständig können.!

Meine Ideen:
jedenfalls hab ich schon mal was an quelltext geschrieben, aber der funktioniert von kopf bis fuß nicht und deswegen komm ich nicht weiter... hier:
KLASSE BRUCH:
public class bruch{
private int zaehler;
private int nenner;

public bruch(int z, int n){
zaehler = z;
nenner = n;
}

public String bruchString(){
return zaehler+"/"+nenner;
}

public void erweitern(int erweiterungszahl){
zaehler=zaehler*erweiterungszahl;
nenner=nenner*erweiterungszahl;
}

public void kürzen(int kuerzungszahl){
zaehler=zaehler/kuerzungszahl;
nenner=nenner/kuerzungszahl;
}

public String gemischteDarstellung(){
if(zaehler>nenner){
neu=zaehler/nenner;
}
}
public void einfachsteDarstellung(){
int einfach = zaehler/nenner;
new zaehler = zaehler/einfach;
new nenner = nenner/einfach;
}
}
//möglichkeiten für methoden:kürzen, gemischte darstellung, to string, dezimal, kehrwert
// das kürzen, erweitern, 4 rechenarten , ausgabe funktion, min. 2 weitere funktionen (bsp.: ein
//fachste darstellung, gemischte darstellung, kehrwert etc.)
KLASSE BRUCHRECHNEN:
public class bruchrechnen{
bruch b1;
bruch b2;

public void bruch1(int z, int n){
bruch b1 = new bruch (z,n);
System.out.print(b1.bruchString());
}
public void bruchrechnen(int zaeh1er1,int nenner1,int rechenzeichen,int zaehler2,int nenner2){
switch(rechenzeichen){
case "+":System.out.println(bruchAddition(bruch1,bruch2));break;
case "-":System.out.println(bruchSubtraktion(bruch1,bruch2));break;
case "*":System.out.println(bruchMultiplikation(bruch1,bruch2));break;
case "/":System.out.println(bruchDivision(bruch1, bruch2));break;
}
}
}
//public String Erweitern(int z, int n, int erweiterungszahl){
//bruch b1 = new bruch(z,n);
//System.out.print(b1.erweitern(z,n));
//}

//public void bruchKehrwert(int z, int n){
//bruch b1 = new bruch(z,n);
//System.out.print(Kehrwert(z,n));
// }
//}
KLASSE RECHNEN:
public class rechnen{
public bruchAddition(bruch(int z1,int n1),bruch(int z2,int n2)){
return new bruch(a.gibZaehler()*b.gibNenner()+b.gibZaehler()*a.gibNenner(),a.gibNenner
()*b.gibZaehler()+b.gibNenner()*a.gibZaehler);
}

public bruchSubstraktion(bruch a, bruch b){
return new bruch(a.gibZaehler()*b.gibNenner()-b.gibZaehler()*b.gibNenner(),a.gibNenner
()*b.gibZaehler()+b.gibNenner()*a.gibZaehler);
}

public bruchMultiplikation(bruch a, bruch b){
return new bruch(a.gibZaehler()*b.gibZaehler,a.gibNenner()*b.gibNenner());
}b

public bruchDivision(bruch a, bruch b){
return new bruch(a.gibZaehler()*b.gibNenner(),a.gibNenner()*b.gibZaehler());
}

public String Kehrwert(int zaehler, int nenner){
zaehler = nenner;
nenner = zaehler;
return nenner+"/"+zaehler;
}

private String gibZaehler(int zaehler){
return zaehler;
}
private String gibNenner(int nenner){;
return nenner;
}
}

also zunächst muss ich sagen, dass das was ich hinter "//" geschrieben hab Notizen sind, oder Methoden die irgendwie nicht funktionieren, ich aber schreiben muss ._.
könnt ihr mir weiterhelfen?? ich brauche dringend hilfe !! vielleicht könnt ihr mir erst mal sagen wir ich +,-,x,: als methoden in rechnen schreiben soll...irgendwas ist da ja falsch... :S
 
Auf diesen Beitrag antworten »
aal

Warum müsst ihr das immer so kompliziert machen ?

Der Aufbau eines Rechners in der einfachsten Form ist:

Eine Klasse
mit:
Ein Scanner für erste Zahl
Ein Scanner für den Operator ( + - / *)
Ein Scanner für die zweite Zahl
Eine vier If-Bedingungen oder Switch-Case ,für jeden Operator z.B.
If ( operator.equals("+"))
{
ergebnis = zahl1+zahl2;
}

Und eine Ausgabe z.B. System.out.println("ergebnis");

mehr ist da echt nicht !

und die "//" sind keine Methoden ,sondern Kommentare !
Auf diesen Beitrag antworten »
ed209

Zitat:
Original von aal
mehr ist da echt nicht !


Ich glaub du hast die Aufgabenstellung mißverstanden, wenn Du dir die Klasse Bruch ansiehst ist es mit einem einfachen zahl1 + zahl2 nicht getan.

Bei der Aufgabe kann ich jetzt auch nicht helfen, weil ich nicht weiß wo genau das Problem (oder die Probleme) liegen.

Gruß,
ED
Auf diesen Beitrag antworten »
yoyo

das problem ist jetzt nur noch wie ich die 4 rechenarten +,-,*,/ schreiben soll in der klasse rechnen mit den variablen aus der klasse bruch, d.h. ich darf keine neuen variablen in rechnen deklarieren, sondern muss sie durch "a.gibNenner" aus der anderen klasse herholen, soweit ich weiß, was aber irgendwie nicht funktioniert. also könnt ihr mir vielleicht dabei helfen, die 4 rechenarten zu schreiben? unglücklich
 
Auf diesen Beitrag antworten »
MaBa

Hallo yoyo,

("Limit" gelesen? *gg*)

Ich fang einfach mal an:

(1) Was soll
code:
1:
String gemischteDarstellung()
machen ?

Es sollte ein String zurückgeliefert werden, was aber nicht der Fall ist. Außerdem verwendest du eine Variable die nirgendwo deklariert ist.

Evtl. ist sowas gemeint:

code:
1:
String neu="" + zaehler + "/" + nenner; return neu;

? Aber das ist nur eine Vermutung.


(2) Was soll
code:
1:
void einfachsteDarstellung()
machen?

Hier stimmt irgendwie gar nix. Das Schlüsselwort "new" wird verwendet um ein Objekt zu erstellen. Auf der linken Seite hat es also nichts verloren. Außerdem gibt es keine Klasse Zähler und auch keine Klasse Nenner.

Was hier evtl. gemacht werden soll ist das Ergebnis als Gleitkommazahl (gerundet) auszugeben. Aber auch hier: Reine Spekulation. (aufgabenstellung?)

(3)
code:
1:
bruchrechnen(int zaeh1er1,int nenner1,int rechenzeichen,int zaehler2,int nenner2)


soll der Konstruktor sein, daher: kein Rückgaebtyp.

(4) Die Aufrufe
code:
1:
bruchAddition(bruch1,bruch2)
sollten

code:
1:
bruchAddition(b1,b2)
heißen, da die Parameter der Methode verwendet werden müssen.

(5) Ohje, ich merke gerade es wird unübersichtlich. bruchAddition(b1,b2) sind Methoden deiner Klasse "rechnen". Um diese aufrufen zu können müsstest du die Klasse erst instanziieren. Das ist sehr verwirrend. Implementiere die Operationen besser innerhalb der Klasse Bruch, denn da gehören sie auch hin:

z.B.:

public bruch addiere( bruch a)
{
int neuerZaehler = zaehler * a.getNenner()
+ nenner * a.getZaehler();
int neuerNenner = nenner * a.getNenner();

return new bruch( neuerZaehler , neuerNenner );
}

Benenne die Getter & Setter am besten auch mit get... und set...

Wenn die Klassenstruktur vorgegeben ist, würde ich dann in der Klasse rechnen die Aufrufe einfach weiterleiten, also z.B.
code:
1:
public bruchAddition(bruch b1, bruch b2) {  return b1.addiere(b2); }


In deinem Code sind noch einige andere Probleme, versuch erst mal das ein paar der Probleme zu beseitigen. Wenn weitere Probleme auftreten, meld dich einfach nochmal.

Viele Grüße,
MaBa
Auf diesen Beitrag antworten »
yoyo

Implementiere die Operationen besser innerhalb der Klasse Bruch, denn da gehören sie auch hin:

z.B.:

public bruch addiere( bruch a)
{
int neuerZaehler = zaehler * a.getNenner()
+ nenner * a.getZaehler();
int neuerNenner = nenner * a.getNenner();

return new bruch( neuerZaehler , neuerNenner );
}

Benenne die Getter & Setter am besten auch mit get... und set...
Auf diesen Beitrag antworten »
yoyo

das da oben,was ich eigentlich asl zitat schreiben wollte :'D hab ich nicht so verstanden, also muss man "get und set" nochmal als als eigene methode schreiben ? und in welcher klasse wenn ja? wie würde das dann aussehen? weil ich dachte das aufrufe nur mit methoden funktionieren also a.vertikalVerschieben(5); mit vertikal Verschieben als eigene methode nicht?
aber den rest hab ich verstanden danke smile nur halt diese 4 rechenarten das klappt irgendwie nicht ._.
Auf diesen Beitrag antworten »
Ibn Batuta

Zitat:
Original von yoyo
das da oben,was ich eigentlich asl zitat schreiben wollte :'D hab ich nicht so verstanden, also muss man "get und set" nochmal als als eigene methode schreiben ? und in welcher klasse wenn ja? wie würde das dann aussehen? weil ich dachte das aufrufe nur mit methoden funktionieren also a.vertikalVerschieben(5); mit vertikal Verschieben als eigene methode nicht?
aber den rest hab ich verstanden danke smile nur halt diese 4 rechenarten das klappt irgendwie nicht ._.


Immerhin hast du deine Variablen als private deklariert, dann mußt du diese Methoden auch schreiben, nämlich in der Klasse bruch (die sich übrigens groß geschrieben gehört, da Klassen immer groß geschrieben werden - ist ´ne Konvention...). Wie möchtest du sonst den Zähler und den Nenner in einer anderen Klasse manipulieren wollen?

Wenn du etwas als private deklarierst, kannst du von einer anderen Klasse auf diese Variablen (manipulierender Absicht) nicht zugreifen. Dafür mußt du dann get- und set-Methoden zurechtlegen, mit denen du mittels eines Objektes dieser Klasse darauf zugreifst.


Ibn Batuta

PS: Die Fälle für den Fall, dass der Nenner mal 0 werden könnte, sind noch gar nicht abgedeckt.
Auf diesen Beitrag antworten »
MaBa

Zitat:
Wenn du etwas als private deklarierst, kannst du von einer anderen Klasse auf diese Variablen (manipulierender Absicht) nicht zugreifen.


Als kurze Ergänzung: private Variablen sind überhaupt nicht für andere Klassen sichtbar, auch nicht für den lesenden (nicht manipulierenden) Zugriff.

Kurzes Beispiel zu Getter & Setter:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
public class Bruch
{ 

  private int zaehler; 
  private int nenner;  

  public Bruch(int z, int n)
  { 
    zaehler = z; 
    nenner = n; 
  }

//...


  ///////////
  //GETTER
  ///////////

  int getZaehler()
  {
    return zaehler;
  }

  int getNenner()
  {
   return nenner; 
  }

  ///////////
  //SETTER
  ///////////

  void setZaehler(int z)
  {
   zaehler = z; 
  }

  void setNenner(int n)
  {
    if(n != 0) {
      nenner = n;
    } else {
     //...Fehlerbehandlung 
    }
  }
}



Das Prinzip hast du aber auch schon verwendet, allerdings heißen die Methoden bei dir "gibZaehler" und "gibNenner". Syntaktisch ist das völlig o.k. wird aber üblicherweise so benannt wie oben erläutert.
Das Problem liegt darin, dass die Methoden in der falschen Klasse definiert werden, da die Variablen in bruch deklariert werden und die methoden in rechnen implementiert sind.

Aber um Ordnung in deinen Code zu bringen: Welcher Code bzw. welche Struktur wurde denn vorgegeben?

Viele Grüße,
MaBa
Auf diesen Beitrag antworten »
Ibn Batuta

Zitat:
Original von MaBa
Wenn du etwas als private deklarierst, kannst du von einer anderen Klasse auf diese Variablen (manipulierender Absicht) nicht zugreifen.


Das meinte ich damit auch. Da es hier um Manipulation des Zählers und Nenners geht, habe ich es so erklärt.
Natürlich ist deine Erklärung umfassender.

Ibn Batuta
Auf diesen Beitrag antworten »
yoyo

danke für die umfangreiche hilfe smile )

es klappt zwar noch nicht so ganz, aber immerhin komm ich voran großes Grinsen
ich hoffe ihr seid noch da, wenn ich weitere fragen hab smile
Auf diesen Beitrag antworten »
aal

Zitat:
Original von yoyo

ich hoffe ihr seid noch da, wenn ich weitere fragen hab smile


nö !!!
Auf diesen Beitrag antworten »
Ibn Batuta

Bei Fragen zum Code solltest du den Quellcode, wo es gerade hapert, immer auch mitposten. Sonst ist es schwer eine Ferndiagnose zu liefern, ohne zu wissen, wo es konkret scheitert. Augenzwinkern


Ibn Batuta
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »