Probleme bei Darstellung von Brüchen

Zyrax

Mitglied
Hallo Community,

ich soll als Hausaufgabe ein Programm schreiben, dass Brüche darstellt. Ich hab's eig. auch geschafft, nur als ich etwas ändern wollte, erhalte ich folgende Fehlermeldung:

Compiliere J:\Schule_Programmierung\Projekte_Schuljahr_2011_12\Bruch_Sabor\Bruchtester.java mit Java-Compiler
Bruchtester.java:4:32: cannot find symbol
symbol : constructor Bruch(java.lang.String)
location: class Bruch
public static Bruch bruchq = new Bruch("Q");
^
1 error


Hier nochmal mein Programm:

Java:
public class Bruch{


  private int zaehler;
  private int nenner;
  private String Quotient;
  public int t=0;
  

  public Bruch(int zaehler, int nenner, String Quotient){
    this.zaehler = zaehler;
    this.nenner = nenner;
    this.Quotient = Quotient;
  }
  
  public void setWerte(int z, int n){
    zaehler = z;
    nenner = n;
  }
  
  public void Erweitern(int a){
     zaehler = a*zaehler;
     nenner = a*nenner;
  }
  
  public void Kehrwert(){
     int p = zaehler;
     zaehler = nenner;
     nenner = p;
  }
  
  public void reelleZahl(){
    t=1;
  }
  
  
  public String toString(){
    if(t==0){
      return new String("Der Bruch " + Quotient + " " + "lautet " + zaehler + "/" + nenner);
    }else{
      return new String("Der Bruch " + Quotient + " " + "lautet " + zaehler/nenner);
    }
  }
}


public class Bruchtester{


  private static Bruch bruchq = new Bruch("Q");
  
  public static void main (String [] argv){
    bruchq.setWerte(1, 1);
    System.out.println(bruchq);
  }
}

Ich habe zwei Klassen geschrieben, sozusagen ein "Haupt- und ein Nebenprogramm".


Hoffe, ihr könnt mir weiterhelfen ^^
 
So sieht der Konstruktor deiner Klasse aus:

Java:
public Bruch(int zaehler, int nenner, String Quotient){

so rufst du ihn auf:

Java:
Bruch bruchq = new Bruch("Q");

Fällt dir was auf?
 
du hast ja nur einen (int,int,String)-Konstruktor, willst aber den (String) aufrufen. Also entweder den aufruf anpassen oder den Konstruktor erstellen
 
Du hast keinen Constructor der nur einen String als Paramter erwartet, aber den rufst du auf, das ist der Inhalt der Fehlermeldung

Sieh dir noch mal den Konstruktor der Klasse Bruch an und dann den Aufruf in der Klasse Bruchtester
 
public static Bruch bruchq = new Bruch("Q");
^
1 error
Java:
  public Bruch(int zaehler, int nenner, String Quotient){
    ...
}

Es werden drei Parameter (zaehler, nenner, Quotient) erwartet:

Java:
public Bruch(int zaehler, int nenner, String Quotient)

du übergibst aber nur einen("Q"):

Java:
public static Bruch bruchq = new Bruch("Q");
 
OK, ich hab noch eine Frage ^^''

Ich habe das Programm um ein bis zwei Befehle erweirt, sodass er den Bruch in eine reelle Zahl umwandeln kann. Mein Problem ist jetzt aber, dass er mir immer 0,0 als Ergebnis gibt, außer, wenn es sich um ganze Zahlen als Ergebnis handeln. Könnt ihr mir vllt. weiterhelfen?

Java:
public class Bruch{

  // Anfang Attribute
  private int zaehler;       // Zaehler
  private int nenner;        // Nenner
  private String Quotient;   // Bezeichnung des Bruchs
  public int t=0;            // Fallunterscheidung (Bruch / reelle Zahl)
  // Ende Attribute
  
  
  // Anfang Konstruktor
  public Bruch(int zaehler, int nenner, String Quotient){
    this.zaehler = zaehler;
    this.nenner = nenner;
    this.Quotient = Quotient;
  }
  // Ende Konstruktor
  
  
  // Anfang Methoden
  public void Erweitern(int a){   // a = Faktor, mit dem man erweitert
     zaehler = a*zaehler;
     nenner = a*nenner;
  }
  
  public void Kehrwert(){
     int p = zaehler;             // p = Zwischenspeicher
     zaehler = nenner;
     nenner = p;
  }
  
  public void reelleZahl(){
    t=1;
  }
  
  float getReelleZahl(){
    return zaehler/nenner;
  }
  
  
  public String toString(){
    if(t==0 && nenner!=0){
      return new String("Der Bruch " + Quotient + " " + "lautet " + zaehler + "/" + nenner);
    }else if(t==1 && nenner!=0){
      return new String("Der Bruch " + Quotient + " " + "lautet " + getReelleZahl());
    }else{
      return new String("Math Error: Man kann nicht durch 0 teilen!");
    }
  }
  // Ende Methoden
}


public class Bruchtester{


  private static Bruch bruchq = new Bruch(1, 2, "Q");
  
  public static void main (String [] argv){
    bruchq.reelleZahl();
    System.out.println(bruchq);
  }
}
 
da zaehler und nenner beides int variablen sind, ist das ergebnis einer division auch ein int,

du solltest daher die Methode so schreiben

Java:
double getReelleZahl(){
    return ((double)zaehler)/(double)nenner;
  }
 
Ich bin's wieder ^^''

Ich wollte noch eine Methode zum Kürzen entwickeln, de den ggT nach Euklid sucht:

Java:
public class Bruch{

  // Anfang Attribute
  private int zaehler;       // Zaehler
  private int nenner;        // Nenner
  private String Quotient;   // Bezeichnung des Bruchs
  public int t=0;            // Fallunterscheidung (Bruch / reelle Zahl)
  public int z;              // z = ggT
  // Ende Attribute
  
  
  // Anfang Konstruktor
  public Bruch(int zaehler, int nenner, String Quotient){
    this.zaehler = zaehler;
    this.nenner = nenner;
    this.Quotient = Quotient;
  }
  // Ende Konstruktor
  
  
  // Anfang Methoden
  public void Erweitern(int a){   // a = Faktor, mit dem man erweitert
     zaehler = a*zaehler;
     nenner = a*nenner;
  }
  
  public void Kehrwert(){
     int p = zaehler;             // p = Zwischenspeicher
     zaehler = nenner;
     nenner = p;
  }
  
  public void reelleZahl(){
    t=1;
  }
  
  float getReelleZahl(){
    return (float)zaehler/(float)nenner;
  }
  
  int ggT(int z, int n){          // Methode zur Bestimmung vom ggT
    if(z==n){
      return z;
    }else if(z>n){
      return ggT(n, (z-n));
    }else{
      return ggT(n, (n-z));
    }
  }
  
  public void Kürzen(){
    ggT(zaehler, nenner);
    zaehler=zaehler/z;
    nenner=nenner/z;
  }
  
  
  public String toString(){
    if(t==0 && nenner!=0){
      return new String("Der Bruch " + Quotient + " " + "lautet " + zaehler + "/" + nenner);
    }else if(t==1 && nenner!=0){
      return new String("Der Bruch " + Quotient + " " + "lautet " + getReelleZahl());
    }else{
      return new String("Math Error: Man kann nicht durch 0 teilen!");
    }
  }
  // Ende Methoden
}

public class Bruchtester{


  private static Bruch bruchq = new Bruch(1, 2, "Q");
  
  public static void main (String [] argv){
    bruchq.Erweitern(3);
    bruchq.Kürzen();
    System.out.println(bruchq);
  }
}


Es kommt zwar keine Fehlermeldung, aber im Terminal steht irgendwas von Arethmetic Exception" und "/by zero" .... Könnt ihr mir vllt. weiterhelfen?
 
Steht doch alles da: du teilst durch 0. In der Fehlermeldung steht sogar die Zeilennummer: 53
dein z ist 0, weil du das Ergebnis von ggT da nicht speicherst.
 
die ggT-Methode liefert doch was zurück, also speichere auch diesen Wert:
Code:
z = ggT(zaehler, nenner);
in Zeile 52.
Und z würde ich erst gar nicht als Instanzvariable machen, sondern eben nur in der Methode verwenden.
 
Hallöchen, ich habe wieder einmal ein Problem mit dieser Aufgabe ^^'' Wir sollen nun ein GUI-Programm schreiben, mit dem man Zugriff auf die Klasse Bruch hat und neue Brüche (Objekte) erzeugen kann.
Mein Prolem ist jetzt, dass eine Variable einer Methode nicht von anderen Methoden erkannt wird. Hier ist mal der Quellcode beider Klassen:

Java:
import javax.swing.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 30.01.2012
  * @author
  */

public class BruchGUI extends JFrame {
  // Anfang Attribute
  private JLabel jLabel1 = new JLabel();
  private JTextField jTextField1 = new JTextField();
  private JTextField jTextField2 = new JTextField();
  private JButton jButton1 = new JButton();
  private JButton jButton2 = new JButton();
  // Ende Attribute

  public BruchGUI(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 520;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jLabel1.setBounds(141, 10, 321, 71);
    jLabel1.setText("");
    jLabel1.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel1);
    jTextField1.setBounds(8, 14, 95, 24);
    jTextField1.setText("");
    cp.add(jTextField1);
    jTextField2.setBounds(8, 55, 98, 24);
    jTextField2.setText("");
    cp.add(jTextField2);
    jButton1.setBounds(185, 125, 105, 33);
    jButton1.setText("Ergebnis");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    jButton2.setBounds(10, 91, 100, 25);
    jButton2.setText("Bruch erzeugen");
    jButton2.setMargin(new Insets(2, 2, 2, 2));
    jButton2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton2_ActionPerformed(evt);
      }
    });
    cp.add(jButton2);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);

    String z = jTextField1.getText();
    int zaehler = new Integer(z).intValue();
    String n = jTextField2.getText();
    int nenner = new Integer(n).intValue();
    Bruch bruchq = new Bruch (zaehler, nenner, "Q");
  }

  // Anfang Methoden
  public void jButton1_ActionPerformed(ActionEvent evt) {
    jLabel1.setText("" + bruchq);// TODO hier Quelltext einfügen
  }

  public void jButton2_ActionPerformed(ActionEvent evt) {
    String z = jTextField1.getText();
    int zaehler = new Integer(z).intValue();
    String n = jTextField2.getText();
    int nenner = new Integer(n).intValue();
    Bruch bruchq = new Bruch(zaehler, nenner, "Q");// TODO hier Quelltext einfügen
  }

  // Ende Methoden

  public static void main(String[] args){
    new BruchGUI("BruchGUI");
  }
}


public class Bruch{

  // Anfang Attribute
  private int zaehler;                     // Zaehler
  private int nenner;                      // Nenner
  private String Quotient;                 // Bezeichnung des Bruchs
  public int t=0;                          // Fallunterscheidung (Bruch / reelle Zahl)
  // Ende Attribute
  
  
  // Anfang Konstruktor
  public Bruch(int zaehler, int nenner, String Quotient){
    this.zaehler = zaehler;
    this.nenner = nenner;
    this.Quotient = Quotient;
  }
  // Ende Konstruktor
  
  
  // Anfang Methoden
  public void Erweitern(int a){            // a = Faktor, mit dem man erweitert
     zaehler = a*zaehler;
     nenner = a*nenner;
  }
  
  public void Kehrwert(){
     int p = zaehler;                      // p = Zwischenspeicher
     zaehler = nenner;
     nenner = p;
  }
  
  public void reelleZahl(){
    t=1;
  }
  
  float getReelleZahl(){                   // Methode zur Umwandlung in eine reelle Zahl
    return (float)zaehler/(float)nenner;
  }
  
  int ggT(int z, int n){                   // Methode zur Bestimmung vom ggT nach Euklid
    if(z==n){
      return z;
    }else if(z>n){
      return ggT(n, (z-n));
    }else{
      return ggT(n, (n-z));
    }
  }
  
  public void Kürzen(){
    int z = ggT(zaehler, nenner);          // z = ggT
    zaehler=zaehler/z;
    nenner=nenner/z;
  }
  
  
  public String toString(){
    if(t==0 && nenner!=0){
      return new String("Der Bruch " + Quotient + " " + "lautet " + zaehler + "/" + nenner);      // Fall 1: Bruch
    }else if(t==1 && nenner!=0){
      return new String("Der Bruch " + Quotient + " " + "lautet " + getReelleZahl());             // Fall 2: Reelle Zahl
    }else{
      return new String("Math Error: Man kann nicht durch 0 teilen ... Nur Chuck Norris kann durch 0 teilen :P");                            // Fall 3: unbestimmter Ausdruck
    }
  }
  // Ende Methoden
}


Hier ist noch die Fehlermeldung:


BruchGUI.java:80:26: cannot find symbol
symbol : variable bruchq
location: class BruchGUI
jLabel1.setText("" + bruchq);// TODO hier Quelltext einfügen
^
1 error
 

Zurück
Oben