# Matrix: Schachbrett



## schlunz (23. Aug 2011)

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:

```
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?


----------



## schlunz (23. Aug 2011)

Oh habe bereits den ersten Fehler gesehen:

```
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 (23. Aug 2011)

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?)


----------



## schlunz (23. Aug 2011)

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?

```
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 (24. Aug 2011)

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


```
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:


```
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);
  }
```


----------



## Marco13 (24. Aug 2011)

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 (24. Aug 2011)

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


----------

