# Pascalsches Dreieck



## Wang (13. Okt 2010)

Moin',

ich lese mir gerade das Kapitel Arrays im Buch "Java als erste Programmiersprache" durch. Ein Programmcode aus diesem Kapitel bereitet mir etwas Kopfschmerzen. Es wäre super, wenn jemand auf meine Fragen eingehen könnte:

1.) Ich habe noch immer nicht verstanden, was ein mehrdimensionales Array eigentlich ist. Ein eindimensionales Array wird auf dem Bildschirm ja in einer Zeile dargestellt, z.B.

1 1 1 1 1 1 1 1 1 1 1 1 1 1

Wie muss man sich aber ein zweidimensionales Array vorstellen, das durch den Code "int [][] binom = new int [EBENE][];" realisiert wird?
Meint das wie in der Matematik eine Matrix aus n Zeilen x m Spalten, falls ja, was ist dann bei einem dreimensionalen Array?

2.) Im unteren Code wird ja durch "int [][] binom = new int [EBENE][];" ein Array-Objekt angelegt. 
Gleich nach der ersten for-Schleife steht "binom _ = new int [i+1];". Genau das verstehe ich nicht... Es müsste doch heißen "int [] binom  = new int [i+1];" oder ist damit das zweidimensionale Array gemeint? :bahnhof:

Denke wenn ich die zwei Punkte begreife, sollte der Rest kein Problem mehr darstellen. Vielen Dank für Eure Mühe.

Gruß
Wang



		Java:In die Zwischenablage kopieren


// Datei: PascalDreieck.java

public class PascalDreieck
{
   public static void main (String[] args)
   {
      final int EBENE = 10;
      int i;
      int j;
      int [][] binom = new int [EBENE][];

      for (i = 0; i < binom.length; i++)
      {
         // Anlegen eines Arrays mit der Größe der entsprechenden
         // Ebene.
         binom [i] = new int [i+1];

         // Erstes Element einer Ebene mit 1 belegen.
         binom [i][0] = 1;

         // Letztes Element einer Ebene mit 1 belegen.
         binom [i][binom [i].length-1] = 1;
         System.out.printf ("%1d ", binom [i][0]);

         for (j = 1; j < binom [i].length-1; j++)
         {
            binom [i][j] = binom [i-1][j-1] + binom [i-1][j];
            System.out.printf ("%3d ", binom [i][j]);
         }

         if (i > 0)
         {
            // Für alle Ebenen ausser der ersten wird zum Schluss
            // noch eine 1 ausgegeben.
            System.out.printf ("%3d", binom [i][binom [i].length-1]);
         }

         // Ausgabe eines Zeilenumbruchs nach jeder Ebene.
         System.out.println();
      }
   }
}

_


----------



## eRaaaa (13. Okt 2010)

1.) ja genau so ist es. 
1111
2222
3333

wäre z.B. eins (2D)  

2.) weil in Java mehrdimensionale Arrays einfach Arrays von Arrays sind.
Sprich in dem 2-D Array oben wäre arr[0] = {1,1,1,1} arr[1] = {2,2,2,2} usw.... daher kannst du auch sagen arr[2] = new int[4] (also lege in arr[2] ein Array der Größe 4 an)


----------



## Marcinek (13. Okt 2010)

Hallo,

ein drei Dimensinales Array ist, wenn du mehrere Ebenen hintereinander nimmst.

So wie in einem 3-D Koordinaten System: x y z

Oder ein Rubikwürfel.

Ein Pascalisches Dreieck ist ein Dreieck.

            *
     *            * 
*          *            *

... 


Und das macht der Code in der ersten Ebene hat es ein Käschen dan 2 3 ....


Gruß,

Marcinek


----------



## Wang (13. Okt 2010)

eRaaaa hat gesagt.:


> 1.) ja genau so ist es.
> 1111
> 2222
> 3333
> ...



Danke für die schnelle Antwort. Ich denke langsam beginne ich zu begreifen. 
Was mich noch verwirrt (wahrscheinlich denke ich zu mathematisch), wäre z.B. das hier (ein dreidimensionales Array):

"int [][][] binom = new int [EBENE][][];"

Bei einem zweidiensionalen meint doch das erste [] die Zeilen und das zweite [] die Spalten. Was meint dann hier aber das dritte []?



eRaaaa hat gesagt.:


> 2.) weil in Java mehrdimensionale Arrays einfach Arrays von Arrays sind.
> Sprich in dem 2-D Array oben wäre arr[0] = {1,1,1,1} arr[1] = {2,2,2,2} usw.... daher kannst du auch sagen arr[2] = new int[4] (also lege in arr[2] ein Array der Größe 4 an)



Okay. Meint dann aber das "binom _ = new int [i + 1];" unter der ersten for-Schleife das erste Array aus "int *[]* [] binom = new int [EBENE] [];" oder warum heißt es nicht "binom  [] = new int [i + 1];"?


Ich hoffe jeder weiß, was ich meine... Es ist etwas schwer, das Problem in Worten zu fassen._


----------



## SlaterB (13. Okt 2010)

> Bei einem zweidiensionalen meint doch das erste [] die Zeilen und das zweite [] die Spalten. Was meint dann hier aber das dritte []?

Dimensionen kann man nicht immer visualisieren, in 2D gibts keine dritte, im Raum wäre die dritte Dimension die Höhe, in Raum und Zeit die 4. Dimension die Zeit

eine andere Aufreihung:
0. Dimension: ein Buchstabe
1: ein Wort = ein Array von Buchstaben
2: eine Zeile = ein Array von Worten bzw. ein 2D-Array von Buchstaben
3: eine Seite = ein Array von Zeilen bzw. ein 3D-Array von Buchstaben
4: ein Buch
eine Regalleiste
ein Regal, 
ein Reihe von Regalen
ein Raum
ein Stockwerk
eine Bibliothek
eine Stadt
ein Bundesland
...
eine Erde
ein Sonnensystem
eine Galaxis
42. Dimension: ein Universum = ein Array von Galaxien bzw. ein 42D-Array von Buchstaben wie jeder weiß


----------



## Wang (13. Okt 2010)

Danke soweit.

Es hapert bei mir noch immer am Verständnis der Formulierung 
	
	
	
	





```
binom [i] = new int [i + 1];
```
.
"binom" ist ja ein zweidimensionales Array. Die obige Formulierung meint, dass an der Stelle i des Arrays ein neues Array angelegt werden soll (?).

"binom" ist zweidimensional und ich verstehe jetzt nicht, ob "binom _" das linke oder rechte Klammernpaar von "int [] [] binom" meint.

Ich hoffe, jemand versteht wo mein Problem ist und hat eine Erklärung dafür...

Thanks!_


----------



## Illuvatar (13. Okt 2010)

Wang hat gesagt.:


> "binom" ist ja ein zweidimensionales Array.


In Java gibt es keine zweidimensionales Arrays. binom ist ein eindimensionales Array, und die Elemente davon sind wieder eindimensionale Arrays.
Ich denke, wenn du das verinnerlichst, müsste es deine Fragen beantworten 

Edit: Und um die Frage explizit zu beantworten: das rechte Klammerpaar


----------



## SlaterB (13. Okt 2010)

binom ist in erster Linie kein zweidimensionales Array sondern ein eindimensionales Array von was auch immer, das sei mal egal
binom_ = .. weist der i-ten Stelle einen Wert zu, die normalste Sache der Welt

zufällig ist binom ein Array von anderen Arrays, dann eben
binom = ein passendes Array

wenn man dann die Java-Syntax einbezieht und auf konkrete int[] geht, kommt das raus was du siehst,
das i ist die linke Klammer

edit:
> Edit: Und um die Frage explizit zu beantworten: das rechte Klammerpaar 

ich wollt schon schreiben 'natürlich die linke, was sonst?', aber das zeigt ja, dass man beides denken kann _


----------



## Illuvatar (13. Okt 2010)

SlaterB hat gesagt.:


> ich wollt schon schreiben 'natürlich die linke, was sonst?', aber das zeigt ja, dass man beides denken kann



Ja stimmt  Dass ich die rechte geschrieben hab, kam von der Vorstellung bei der Initialisierung: 
	
	
	
	





```
int[][] = (int[])[]
```
 - dort ist die rechte Klammer die äußere. Beim Zugriff über 
	
	
	
	





```
binom[i][j]
```
 ist es aber andersrum.


----------



## SlaterB (13. Okt 2010)

man schreibt aber auch bei der Initialisierung
> int [][] binom = new int [EBENE][];

anderes ist wohl wirklich nur abstrakte Vorstellung?


----------



## Wang (13. Okt 2010)

Danke.
Vorsichtshalber nochmal grafisch nachgefragt, ob ich's wirklich kapiert habe:

Das rot markierte i in "binom _ = new int [i+1];"

meint die rot markierte Stelle hier

"int [][] binom = new int [EBENE][];" ?_


----------



## SlaterB (13. Okt 2010)

genau


----------



## Wang (13. Okt 2010)

Vielen Dank.
Ich habe zusätzlich mit dem Compiler etwas "gespielt" und jetzt endlich gerafft, wie diese Arrays umgesetzt werden.
Find's vom Lehrbuch schon etwas schwach, dass da nicht näher auf die Details eingegangen wird und andere, quasi selbsterklärende Sachen, bis zum Erbrechen erklärt und wiederholt werden...

Vielen Dank nochmal an alle, für die starke Unterstützung. :toll:


----------



## Illuvatar (13. Okt 2010)

SlaterB hat gesagt.:


> man schreibt aber auch bei der Initialisierung
> > int [][] binom = new int [EBENE][];
> 
> anderes ist wohl wirklich nur abstrakte Vorstellung?



Hm, das stimmt auch wieder... wenn ich da genauer drüber nachdenk find ich das eigentlich nicht so schön ???:L
Dann ist meins wohl wirklich eher nur als abstrakte Vorstellung zu sehen.


----------



## Wang (13. Okt 2010)

Jetzt habe ich doch noch eine Frage zu dem Code:


```
// Datei: PascalDreieck.java
 
public class PascalDreieck
{
   public static void main (String[] args)
   {
      final int EBENE = 10;
      int i;
      int j;
      int [][] binom = new int [EBENE][];
 
      for (i = 0; i < binom.length; i++)
      {
         // Anlegen eines Arrays mit der Größe der entsprechenden
         // Ebene.
         binom [i] = new int [i+1];
 
         // Erstes Element einer Ebene mit 1 belegen.
         binom [i][0] = 1;
 
         // Letztes Element einer Ebene mit 1 belegen.
         binom [i][binom [i].length-1] = 1;
         System.out.printf ("%1d ", binom [i][0]);
 
         for (j = 1; j < binom [i].length-1; j++)
         {
            binom [i][j] = binom [i-1][j-1] + binom [i-1][j];
            System.out.printf ("%3d ", binom [i][j]);
         }
 
         if (i > 0)
         {
            // Für alle Ebenen ausser der ersten wird zum Schluss
            // noch eine 1 ausgegeben.
            System.out.printf ("%3d", binom [i][binom [i].length-1]);
         }
 
         // Ausgabe eines Zeilenumbruchs nach jeder Ebene.
         System.out.println();
      }
   }
}
```

Wozu dient der Code ab Zeile 33, schließlich wird doch bereits mit dem Code in Zeile 21 als letztes Element einer Ebene eine 1 ausgegeben...?

EDIT:
Hat sich erledigt, nachdem ich einen genaueren Blick in die Ausgabemethoden geworfen habe...


----------



## SlaterB (13. Okt 2010)

Zeile 21 ist ein Kommentar, gibt gar nix aus, Zeile 22 vielleicht, dort wird aber nur ein Wert zugewiesen, nicht ausgegeben, wäre auch die falsche Stelle (vor anderen Ausgaben)

kommentiere doch einfach Zeile 33 aus und schaue dir an was sich ändert

man kann aber schon sagen, dass das ziemlich kompliziert gemacht ist statt einfach nur
System.out.print("1");


----------



## Wang (13. Okt 2010)

Noch eine Frage zur Methode 
	
	
	
	





```
printf()
```
.

Im Buch wurde das nur kurz angesprochen und nicht wirklich verständlich erklärt.

Bei der Methode 
	
	
	
	





```
System.out.printf ("%3d ", binom [i][j]);
```
 wurde ein Leerzeichen gelassen und bei der hier nicht 
	
	
	
	





```
System.out.printf ("%3d", binom [i][binom [i].length-1]);
```
.

printf() habe ich soweit verstanden, dass sie der Formatierung der Ausgabe dient. Die gewünschte Formatierung wird immer mit dem Prozentoperator innerhalb von Anführungsstrichen angegeben.

Ist es richtig, dass mit dem 3d drei Stellen für die Ausgabe einer dezimalen Zahl reserviert werden und diese Zahl wird automatisch rechtsbündig ausgegeben?

Warum wird bei dem ersten 3d ein Leerzeichen gelassen?


Thanks!


----------



## Illuvatar (13. Okt 2010)

Weil in dem String hinter dem 3d ein Leerzeichen ist 

```
System.out.printf ("%3d ", binom [i][j]);
                       ^
                       |
                   das hier
```


----------



## Wang (13. Okt 2010)

Genau darauf bezog sich meine Frage. 

Es wäre sehr nett, wenn jemand die Arbeitsweise der Methode printf() erklären könnte (also so etwas wie "%3d").

Thanks.


----------



## Illuvatar (14. Okt 2010)

Achso, dann hab ich die Frage gerade falschrum verstanden 
Das Leerzeichen da bedeutet, dass in der Ausgabe hinter der Zahl noch ein Leerzeichen kommt. Du kannst es ja mal weglassen und ausprobieren, was passiert.

Was so etwas wie %3d bedeutet, kann man hier ganz genau nachlesen. In diesem Fall ist d die "conversion" und 3 die "width". Das bedeutet: Nimm das übergebene Argument, interpretiere es als ganze Zahl im Dezimalsystem und verwende mindestens 3 Stellen zur Ausgabe (wenn dann zum Beispiel 1 übergeben wird, wird 
	
	
	
	





```
__1
```
 daraus gemacht).


----------

