Matrix: Schachbrett

S

schlunz

Gast
Hallo.

Habe die Aufgabe ein kleines Programm zu schreiben, das diese Geschichte in leicht abgewandelter Form mit Münzen statt Reiskörnern und einer variablen Schachbrettgröße simuliert, der Benutzer gibt die Maße des Brettes und den Wert der Münzen ein, das Programm soll die Gesamtsumme der Münzen berechnen.

Ich bin soweit eigentlich fertig, allerdings scheint irgendwo ein Fehler drinzustecken, die gelieferten Werte sind viel zu niedrig.

Hier der Code:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

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

public class kfc extends JApplet {
  // Anfang Attribute
  private JTextField jTextField1 = new JTextField();
  private JButton jButton1 = new JButton();
  private JTextField jTextField2 = new JTextField();
  private JTextField jTextField3 = new JTextField();
  private JTextField jTextField4 = new JTextField();
  // Ende Attribute

  public void init() {
    Container cp = getContentPane();
    cp.setLayout(null);
    cp.setBounds(0, 0, 381, 297);
    // Anfang Komponenten

    jTextField1.setBounds(32, 80, 177, 41);
    cp.add(jTextField1);
    jButton1.setBounds(264, 128, 89, 33);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    jTextField2.setBounds(32, 128, 177, 41);
    cp.add(jTextField2);
    jTextField3.setBounds(48, 40, 33, 25);
    cp.add(jTextField3);
    jTextField4.setBounds(96, 40, 33, 25);
    cp.add(jTextField4);
    // Ende Komponenten

  }
  // Anfang Methoden

  public void jButton1_ActionPerformed(ActionEvent evt) {
    int a, b, x, y;
    x = Integer.parseInt(jTextField3.getText());
    y = Integer.parseInt(jTextField4.getText());
    b = 0;
    int [][] matrix = new int[x][y];
    a = Integer.parseInt(jTextField1.getText());
    for(int zeile = 0; zeile < x; zeile++){
          for(int spalte = 0; spalte < y; spalte++){
                  (matrix[zeile][spalte]) = a*2^(spalte+spalte*(zeile));
          }
    }
    for(int zeile = 0; zeile < x; zeile++){
          for(int spalte = 0; spalte < y; spalte++){
                  b =+ (matrix[zeile][spalte]);
          }
    }
    jTextField2.setText(""+b);
  }

  // Ende Methoden

}

In Feld 3 und 4 werden die Maße des brettes eingegeben, in Feld 1 der Wert der Münzen und in Feld 2 sollte die Summe erscheinen, nachdem der Button gedrückt wurde.

Sieht jemand den Fehler?
 
S

schlunz

Gast
Oh habe bereits den ersten Fehler gesehen:
Java:
  for(int zeile = 0; zeile < x; zeile++){
          for(int spalte = 0; spalte < y; spalte++){
                  (matrix[zeile][spalte]) = a*2^(spalte+[COLOR="Red"][B]y[/B][/COLOR]*(zeile));
          }
    }
(Zeile 58). Scheint aber nicht der eigentliche Fehler zu sein.
 

Marco13

Top Contributor
Das ^ ist ein Bitweises Exklusives Oder. Du suchst vermutlich
int x = (int)Math.pow(y,z); // x = y hoch z

(EDIT: Das könnte man effizienter und geschickter mit bitshifts machen, und dann auch das Ergebnis direkt ohne Schleife ausrechnen, aber... das ist wohl nicht Sinn der Sache, oder?)
 
S

schlunz

Gast
Das wird es wohl sein, vielen Dank.

Noch eine dumme Frage: Müssen die int's dabei sein oder schreibe ich das Ganze dann so?
Java:
 for(int spalte = 0; spalte < y; spalte++){
                  (matrix[zeile][spalte]) = a*Math.pow(2,(spalte+y*zeile));
          }

Kanns leider gerade nicht testen, weil mein Java Editor seit 10 Minuten nichts mehr fertig kompiliert, aber mit dem Anstoß bekomme ich es bestimmt hin.
 

MarderFahrer

Gesperrter Benutzer
Math.pow liefert ein Double zurück. Du müsstest also dein Ergebnis zumindest als int casten.

Java:
for(int spalte = 0; spalte < y; spalte++){
    (matrix[zeile][spalte]) = a*(int)Math.pow(2,(spalte+y*zeile));
}

Nachtrag:
Wenn du da allerdings mit int arbeitest, werden dort ab einer gewissen Schachbrett Größe ebenfalls falsche Ergebnisse rauskommen. Schon ein original 8x8 Schachfeld stösst an diese Grenze.
Integer sind hierfür zu klein, sodass du das besser mit Doubles lösen solltest. Ungefähr so:

Java:
  public void jButton1_ActionPerformed(ActionEvent evt) {
    int a, x, y;
    x = Integer.parseInt(jTextField3.getText());
    y = Integer.parseInt(jTextField4.getText());
    double b = 0;
    double [][] matrix = new double[x][y];
    a = Integer.parseInt(jTextField1.getText());
    for(int zeile = 0; zeile < x; zeile++){
          for(int spalte = 0; spalte < y; spalte++){
        	  (matrix[zeile][spalte]) = a*Math.pow(2,(spalte+y*zeile));
          }
    }
    for(int zeile = 0; zeile < x; zeile++){
          for(int spalte = 0; spalte < y; spalte++){
                  b =+ (matrix[zeile][spalte]);
          }
    }
    jTextField2.setText(""+b);
  }
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Da es immer um ganze Zahlen geht, wäre [c]long[/c] statt double angebrachter (sonst kommen irgendwann noch 2134215999.9999 Münzen raus...)
 

Landei

Top Contributor
Wenn du auf Nummer sicher gehen willst, nimm gleich [c]BigInteger[/c], die sind genau dafür da (beliebig große Ganzzahlen).
 

Neue Themen


Oben