Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Sonstige Fragen (http://www.informatikerboard.de/board/board.php?boardid=25)
--- 0er wegbekommen (http://www.informatikerboard.de/board/thread.php?threadid=2057)


Geschrieben von SarahK. am 10.01.2015 um 00:18:

  0er wegbekommen

Meine Frage:
Hey zusammen,

ich habe folgendes Programm geschrieben:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:

public class Zwischenspeicher 
{
	public static void main (String[]args)
	{
		int hoehe = 6;    // Höhe muss laut Aufgabe frei wählbar sein
		int breite = 2*hoehe-1;
		int pascal [][] = new int [hoehe][breite]; //3x5 Matrix 
		int spalte = breite/2; 
		int zeile = 0; 
		for (int i=0; i<pascal.length; i++)
		{
			pascal[zeile][spalte]= 1;
			zeile++;
			spalte--;
		}
		
		spalte = breite/2; 
		zeile = 0; 
		for (int i=0; i<pascal.length; i++)
		{
			pascal[zeile][spalte]= 1;
			zeile++;
			spalte++; 
		}
		
		for (int j=0; j<pascal.length;j++)   // 2. for - Schleife
		{
			for(int k=0; k<pascal[0].length; k++)
			{
				System.out.print(pascal[j][k]);
			}
			System.out.println();
		}
	}
}






Meine Ideen:
Jetzt stören mich aber die 0er, es sollen nur die 1er in der Ausgabe stehen bleiben.

Hab's jetzt schon mit einer if - Anweisung versucht, nur müsste ich die 0er mit einem String " " ersetzen und das geht (zumindest mit meinen bisherigen Möglichkeiten) noch nicht.

Ich hoffe, Ihr könnt mir weiterhelfen.

Vielen Dank



Geschrieben von SarahK. am 10.01.2015 um 01:07:

 

Bitte die Kommentare nicht beachten, diese habe ich noch nicht passend abgeändert.



Geschrieben von eulerscheZahl am 10.01.2015 um 07:04:

 

Da stört noch mehr: die 1er stehen zu weit auseinander. Ich weiß nicht, in wie weit dir das Vorgehen vorgeschrieben ist. Aber eine quadratische Matrix wäre einfacher.

Wie auch immer, so kriegst du jedenfalls die 0en an den Enden weg:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
for (int j=0; j<pascal.length;j++)
{
	for(int k=0; k<pascal[0].length; k++)
	{
		if (k < spalte - j - hoehe || k > spalte + j - hoehe) {
			System.out.print(" ");
		}
		else {
			System.out.print(pascal[j][k]);
		}
	}	
	System.out.println();
}



Geschrieben von SarahK. am 10.01.2015 um 09:09:

 

Das mit den Einsern ist Absicht, soll am Ende das Pascalsche Dreieck werden.

Eine Frage noch:

code:
1:
for(int k=0; k<pascal[0].length; k++)


Was genau bedeutet das pascal[0].length?

Ich habe das im Internet mal recherchiert, da steht, dass es bei zweidimensionalen Arrays gebraucht wird?

Vielen Dank



Geschrieben von eulerscheZahl am 10.01.2015 um 09:35:

 

Mir ist schon klar, was du vorhast.
Trotzdem würde ich die Werte anders speichern (hätte auch den Vorteil, dass du auf einzelne Zahlen im Dreieck - die ja gleich den Binomialkoeffizienten sind - einfach zugreifen kannst, ohne Indexumrechnungen)
siehe hier

Du hast das Dreieck mit int pascal [][] = new int [hoehe][breite]; erzeugt.
pascal.length liefert die Länge der ersten Dimension, also hoehe.
Mit pascal[0].length holst du dir die erste Zeile und fragst deren Länge ab, erhältst also breite.



Geschrieben von SarahK. am 10.01.2015 um 09:49:

 

Dankeschön für die Erklärung :-)



Geschrieben von SarahK. am 10.01.2015 um 11:37:

 

Jetzt muss ich das Thema leider noch einmal aufgreifen, da ich die Berechnung nicht hinbekomme:

Einmal logisch überlegt, läuft die Berechnung folgendermaßen ab:

Das Ergebnis aus pascal [1][4] + pascal [1][6] muss in pascal [2][5] geschrieben werden.
Das Ergebnis aus pascal [2][3] + pascal [2][5] muss in pascal [3][4] geschrieben werden.
Das Ergebnis aus pascal [2][5] + pascal [2][7] muss in pascal [3][6] geschrieben werden.

So, jetzt dachte ich mir, man könnte doch mit 2 for - Schleife das Problem lösen?

for (int x=0;n<pascal.length;n++)
{
for (int y=0; y<pascal[0].length;y++)
{
int ergebnis = pascal [x][y] + pascal [x][y+2];
}

Allerdings wird mir das y+2 wieder Schwierigkeiten machen?

Danke für deine Hilfe smile



Geschrieben von eulerscheZahl am 10.01.2015 um 12:30:

 

Ja, das wird etwas aufwändiger, wenn das gewählte Modell zur Speicherung nicht optimal ist.

code:
1:
2:
3:
4:
5:
for (int x = 2; x < pascal.length; x++) {
	for (int y = spalte - hoehe - x + 2; y < spalte + x - hoehe; y += 2) {
		pascal[x][y] = pascal[x - 1][y - 1] + pascal[x - 1][y + 1];
	}
}



Geschrieben von SarahK. am 10.01.2015 um 12:41:

 

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
public class Zwischenspeicher 
{
	public static void main (String[]args)
	{
		int hoehe = 6;    // Höhe muss laut Aufgabe frei wählbar sein
		int breite = 2*hoehe-1;
		int pascal [][] = new int [hoehe][breite]; 
		int spalte = breite/2; 
		int zeile = 0; 
		for (int i=0; i<pascal.length; i++)
		{
			pascal[zeile][spalte]= 1;
			zeile++;
			spalte--;
		}
		
		spalte = breite/2; 
		zeile = 0; 
		for (int i=0; i<pascal.length; i++)
		{
			pascal[zeile][spalte]= 1;
			zeile++;
			spalte++; 
		}
			for (int j=0; j<pascal.length;j++)
		{
			for(int k=0; k<pascal[0].length; k++)
			{
				if (k < spalte - j - hoehe || k > spalte + j - hoehe) 
				{
					System.out.print(" ");
				}
				else 
				{
					System.out.print(pascal[j][k]);
				}
			}	
			System.out.println();
		}
		for (int x = 2; x < pascal.length; x++) 
		{
			for (int y = spalte - hoehe - x + 2; y < spalte + x - hoehe; y += 2) 
			{
				pascal[x][y] = pascal[x - 1][y - 1] + pascal[x - 1][y + 1];
			}
		}
	}
}





Kann das sein, dass noch etwas gelöscht werden muss? Bekomme immer noch die gleiche Ausgabe wie vorher?



Geschrieben von eulerscheZahl am 10.01.2015 um 13:01:

 

Die Zeilen 40-46 solltest du zwischen 24 und 25 einfügen. Sonst gibst du ja erst das Ergebnis aus, um es danach zu berechnen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
int hoehe = 6; // Höhe muss laut Aufgabe frei wählbar sein
int breite = 2 * hoehe - 1;
int pascal[][] = new int[hoehe][breite];
int spalte = breite / 2;
int zeile = 0;
for (int i = 0; i < pascal.length; i++) {
	pascal[zeile][spalte] = 1;
	zeile++;
	spalte--;
}

spalte = breite / 2;
zeile = 0;
for (int i = 0; i < pascal.length; i++) {
	pascal[zeile][spalte] = 1;
	zeile++;
	spalte++;
}
for (int x = 2; x < pascal.length; x++) { //nach oben geschoben
	for (int y = spalte - hoehe - x + 2; y < spalte + x - hoehe; y += 2) {
		pascal[x][y] = pascal[x - 1][y - 1] + pascal[x - 1][y + 1];
	}
}
for (int j = 0; j < pascal.length; j++) {
	for (int k = 0; k < pascal[0].length; k++) {
		if (k < spalte - j - hoehe || k > spalte + j - hoehe) {
			System.out.print(" ");
		} else {
			System.out.print(pascal[j][k]);
		}
	}
	System.out.println();
}



Geschrieben von SarahK. am 10.01.2015 um 14:44:

 

Dankeschön :-)


Forensoftware: Burning Board, entwickelt von WoltLab GmbH