# Pascalsche Dreieck



## Roffel (24. Nov 2011)

Hi Leute
bin ganz neu hier im Forum und auch bei Java =)

und habe mit folgender Aufgabe schon ein Problem:

Aufgabe 4*) Java Programmierung: Pascalsche Dreieck
Erstellen Sie ein Programm das ein Pascalsches Dreieck erzeugt. Die Höhe des Dreiecks soll per Scanner
eingelesen werden.
Das Pascalsche Dreieck ist eine geometrische Darstellung der Binomialkoeffizienten
n
k
 Sie sind im Dreieck derart angeordnet, dass jeder Eintrag die Summe der zwei darüberstehenden Einträge ist. Dieser
Sachverhalt wird durch die Gleichung






 ausgedrückt.

also ich kenne mich leider mit Arrays auch noch nicht so gut aus.
soweit bin ich bis jetzt bei der Aufgabe gekommen...



```
import java.util.Scanner;

public class Aufgabe4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println(" Bitte geben Sie die Höhe des Dreieck's ein");
        int[][] pascal = new int[sc.nextInt()][];  // Alternative : n = in.nextInt();   
                                                   // int pascal [][] = new pascal [n][];
```

leider habe ich jetzt aber keine Anhung wie es weiter geht, bzw wie ich hier diese mathematische Formel in Java einbauen muss.

Wär nett wenn mir jemand weiter helfen könnte.

Grüße 
Roffel


----------



## kreacher (24. Nov 2011)

Hi!
Du weißt aber schon was das Pascalsche Dreieck ist, oder?

"dass jeder Eintrag die Summe der zwei darüberstehenden Einträge ist"
-> das ganze soll so eine Ausgabe machen:
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 

Dein Ansatz ist schon nicht schlecht, aber du kannst gleich Länge und Höhe der "int-Matrix" festlegen:


```
int lines = sc.nextInt();
int[][] pascal = new int[lines][lines];
```

Tip, du brauchst zwei for-Schleifen, die das was du oben siehst berechnen. Mals dir auf papier auf, bis dir klar ist wie du das Dreieck errechnest, dann programmier es.

In Pseudo-Code:

```
for(i=0; i<lines; i++){
     for(j=0; j<i; j++){

         // Case: Rand des Dreiecks -> array[i][j] = 1
         // Case: Innen im Dreieck -> array[i][j] = Summe aus den beiden darüberliegenden Ziffern.

     }
}
```

Danach kannst du mit nochmal zwei For-Schleifen das Array ausgeben.

Viel Spaß;-)


----------



## Andi_CH (24. Nov 2011)

Mit so hoch komplexen Sachen wie int[][] kenne ich mich auch nicht aus  , aber das braucht es auch nicht.


```
public class PascalschesDreieck {

	private static void print(int[] arr) {
		for (int i=0; (i<arr.length)&&(arr[i]!=0); i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
	
	/**
	 * Erstellt einen int[] der laenge "hoehe", der mit 0 intialisiert ist und
	 * an der ersten Stelle eine 1 hat
	 * 
	 * @param hoehe
	 * @return int[]
	 */
	private static int[] neueZeile(int hoehe) {
		int[] tmp = new int[hoehe];
		tmp[0] = 1;
		for (int i=1; i<hoehe; i++) {
			tmp[i]=0;
		}
		return tmp;
	}

	/**
	 * Druckt das Pascalsche Dreieck der Hoehe h aus.
	 * Der Berechnugsalgorithmus geht davon aus, dass der erstellte Array an erster
	 * Stelle eine 1 enthält und der Rest mit 0 initialisiert ist 
	 * 
	 * @param hoehe
	 */
	private static void printDreieck(int hoehe) {
		if (hoehe < 1)
			return;
		int[] zeile = neueZeile(hoehe);
		print(zeile);
		for (int x=1; x<hoehe; x++)  {
			int[] naechsteZeile = neueZeile(hoehe);
			// Bestimmen der nächsten Zeile
			for (int i=1; i<hoehe; i++) {
				naechsteZeile[i] = zeile[i-1] + zeile[i];
			}
			zeile = naechsteZeile;
			print(zeile);
		}
	}

	public static void main(String[] args) {
		printDreieck(6);
	}
}
```


----------



## Roffel (27. Nov 2011)

Danke für die schnellen Antworten.
Komme leider dennoch nicht weiter...


```
import java.util.Scanner;

public class Aufgabe4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println(" Bitte geben Sie die Höhe des Dreieck's ein");
        int l = sc.nextInt();
        int[][] pascal = new int[l][(2*l)+1];    /* neues Array: Anzahl der Zeilen=l, Anzahl der Spalten=2*l+1-->so dass außen immer 2 Nullen sind und schöne Darstellung entsteht: geht das so`? */
    
        for (int zeile=0; zeile<pascal.length;zeile++); {       //for Schleife um die einzelnen Einträge abzurufen -->"Reihenschleife"
            for(int spalte=0; spalte<pascal[zeile].length;spalte++); {
                
                    if (pascal[zeile][spalte] ==0) {         // if Schleife, dass nur Werte ungleich 0 ausgegeben werden
                        System.out.print("  "); }
                    else {
                        System.out.print(pascal[zeile][spalte] + "  ");
                    }
        }
            System.out.println();
```

Es soll glaube ich laut meiner Aufgabestelleung nur die Höhe des Dreiecks per Scanner eingegeben werden.
weiß aber nicht wie ich dann die tolle Form des dreiecks hinbekommen kann wenn ich nur die Höhe eingeben soll.

Leide kommt unten bei j,i auch immer noch der Fehler : " Cannot find Symbol". wieso kommt das? habe doch eigentlich j und i deklariert...

und wie müsste ich jetzt fortfahren?
bitte um dringende Hilfe, muss das heute noch abgeben 


Grüße
Roffel


----------



## Andi_CH (28. Nov 2011)

Was für ein Marke hat der Scanner? ist es einer von Canon oder ein Brother ???:L 

Oben steht die Lösung und wenn du mit "Scanner" einlesen von der Console meinst, dann ist das ein anderes Thema.

Ich würde mal google und die Forumssuche strapazieren wie das geht - du wirst herausfinden, dass das schon einige Leute irgendwann einmal gemacht haben.

Ich stell mir das etwa so vor


```
private static int einlesenMitScanner() {
		//TODO - ja genau to do - als mach es
		return 6;
	}

	public static void main(String[] args) {
		printDreieck(einlesenMitScanner());
	}
```

und der Rest ist genau wie oben.


----------



## SlaterB (28. Nov 2011)

desweiteren:

> Leide kommt unten bei j,i auch immer noch der Fehler : " Cannot find Symbol"

im geposteten Code gibts weder j noch i, mit zeilen und spalten aber denselben Fehler,
denn die Schleifen werden direkt mit einem Semikolon nach dem for beendet,

freilich sieht man auch bei laufenden Schleifen wenig, bei 0 werden ja nur Leerzeichen ausgegeben..


> if Schleife
gibts übrigens nicht, außer if-schleife.de
schnell besser lernen


----------



## Andi_CH (28. Nov 2011)

SlaterB hat gesagt.:


> schnell besser lernen



Wer nicht mal mit einer fertigen Lösung umgehen kann - :shock:


----------



## Roffel (29. Nov 2011)

Ja mir bringt das auch nichts wenn jemand eine fertige Lösung postet, d.h. ja nicht das ich es dann verstehen könnte. Außerdem habe ich auch noch nie etwas gehört wie "private" in seiner Lösung, das haben wir an der Uni nicht behandelt, auf jedenfall bisher nicht.
Und ja ich meine natürlich eine Scanner Eingabe mit der Console, was anderes kenn ich auch gar nicht =)

import java.util.Scanner; ....
Scanner sc = new Scanner (System.in);   ich sollte ja bei meiner Aufgabe NUR die Höhe des Dreiecks eingeben. soviel dazu.

habe es jetzt nach einer gefühlten Ewigkeit so gelöst:


```
import java.util.Scanner;									

    public class Aufgabe4 {			

	public static void main(String args[]) {
		
		Scanner sc = new Scanner(System.in);				//Deklaration des Scanners
                                        System.out.println("Bitte Höhe des Pascalschen Dreiecks eingeben:");	
		
        	int Höhe = sc.nextInt();					//Die Varriable Höhe wird eingelesen
        	int [][] matrix = new int [Höhe][(2*Höhe)+1];			//Erstellen eines Arrays "matrix"; zuerst die Anzahl der Zeilen = Höhe und danach die Anzahl der Spalten = 2*Höhe+1 
       		matrix = Werte(matrix, Höhe);                                   //neuer Methodenaufruf in Verbindung mit der neuen Methode "Werte" außerhalb der Methode "main"
        
        	for(int i = 0; i < matrix.length; i++) {                        //Wir brauchen 2 for-Schleifen um in das zweidimensionale Array zuzugreifen
                    for(int j = 0; j < matrix[i].length; j++) {                   
                        if(matrix[i][j] == 0) {                                 //if-Schleife: Überprüfung der Werte gleich 0, "==" testet zwei Variablen auf Gleichheit
				
                                        System.out.print("  ");			//Ausgabe von zwei Leerzeichen für den Wert 0 
			}
                        else{												
					System.out.print(matrix[i][j]+" ");     //Ausgabe der Werte + ein weiteres Leerzeichen
			}
                    }
                                        System.out.println("\n");		//Die Ausgabe "\n" bewirt den Zeilenumbruch der nächsten Werte auf die nächste Zeile
		}
        }
	
	public static int[][] Werte(int[][] matrix, int Höhe) {                 //Erstellen einer neuen Methode "Werte"
		
                matrix[0][Höhe] = 1;                                            //In "Zeile 1" (0) kann nur der Wert 1 ausgegeben werden, es bildet die Spitze des Pascalschen Dreiecks 
                for(int i = 1; i < matrix.length; i++) {                        //for-Schleife: Initialisierung des Zählers (ab welchem Wert wird gezählt)--> hier erst ab 1, da 0 schon definiert
                    for(int j = 1; j < 2*Höhe; j++) {                           
	    		  
                matrix[i][j] = matrix[i-1][j-1] + matrix[i-1][j+1];             //Berechnung der unteren Werte --> Addition des Wertes eine Reihe höher und eine Spalte weiter links mit dem Wert eine Reihe höher aber eine Spalte weiter rechts
	    	    }                                                           
	       }
	       return matrix;                                                   //greift auf die Inhalte(Werte) des Array's "matrix" zurück und gibt diese durch die Standardausgabe aus
	}    
    }
```

Dennoch Danke für die Mühen
Gruß 
ROffel


----------



## Andi_CH (29. Nov 2011)

Roffel hat gesagt.:


> Ja mir bringt das auch nichts wenn jemand eine fertige Lösung postet, d.h. ja nicht das ich es dann verstehen könnte. Außerdem habe ich auch noch nie etwas gehört wie "private" in seiner Lösung, das haben wir an der Uni nicht behandelt, auf jedenfall bisher nicht.



Mein Gott ist das ein Chaos in deinem Code - Also unter meinem Tisch steht ein Scanner von Cannon - den kannte ich vie früher als den von Java.

Aber eigentlich wollte ich nur zum letzten Satz etwas sagen: Mir haben fertige Lösungen immer beim lernen geholfen und sie tun es immer noch.

Dazu ein Zitat:
Wer immer nur das tut was er schon kann, wird immer das bleiben was er schon ist. (Henry Ford)


----------

