# Dreiecksmatrix erzeugen



## loese90 (2. Mai 2012)

Hallo,

bin ein blutiger Anfänger im Java-Programmieren und muss diese Aufgabe für die Uni machen:

Aufgabe 
Schreiben Sie ein Java-Programm, das folgende Dreiecksmatrix erzeugt und auf dem Bildschirm
anzeigt. Die Anzahl der Zeilen ist variabel und vom Benutzer einzugeben.
Beispielausgabe: n = 5
15
14 13
12 11 10
9 8 7 6
5 4 3 2 1

Wie sieht hier zu ein Programm aus, was muss ich beachten?

Vielen Dank schon an alle Beiträge im Voraus


----------



## Fab1 (2. Mai 2012)

Wenn auch im Hausaufgaben Forum. Fällt dir denn gar nichts dazu selbst ein? Was habt ihr denn in der Uni bereits gelernt? Der Sinn besteht ja sicherlich nicht darin, dir die Lösung zu präsentieren. Das würde dann nämlich ins Jobbörse Forum kommen.

Allerdings sind Schleifen und eine Consolenausgabe hier bereits ein gutes Stichwort.


----------



## loese90 (3. Mai 2012)

[JAVA=42]public class Symmetrisch{		

	public static void main (String[] args){


		// Variablen deklarieren, Quadratisches Array erstellen
		int[][] a = { 	{15}, 
					{14, 13},
					{12,11,10}	
                                         {9,8,7,6}       
                                        {5,4,3,2,1}               }; 
		boolean symmetrie = true;


		// Matrix ausgeben
		System.out.println("Matrix:");
		for (int i=0; i<a.length; i++)
		{
			for (int j=0; j<a.length; j++)
			{
				System.out.print(a_[j] + "\t");
			}
			System.out.println();
		} 


		// Matrix auf Symmetrie pruefen
		for (int i=0; i<a.length; i++)
		{
			if ( symmetrie == true )
			{
				for (int j=0; j<a.length; j++)
				{
					if ( a[j] == a[j] )
					{
						symmetrie = true;
					}
					else
					{
						symmetrie = false;
						break;
					}
				}
			}
		} 

		System.out.println("Symmetrie vorhanden: " + symmetrie);

	}
} [/code]

Wäre damit die Aufgabe5 gelöst?_


----------



## SlaterB (3. Mai 2012)

was ist Aufgabe5? die gepostete Aufgabe? hat es was mit dem genannten Beispiel-Parameter 5 zu tun?

dein Programm ist etwa so sinnvoll wie ein Taschenrechner, der addieren soll, und fest einprogrammiert 27 rausgibt,
funktioniert ja für 12 + 15, sogar noch für ziemlich viele andere Kombinationen..

du brauchst irgendwann eine Benutzereingabe, wie unmissverständlich in der Aufgabe steht,
vorerst aber ganz gut mit einem festen n zu testen,
wobei dieses n bisher in deinem Programm nicht auftaucht,

von diesem n aus musst du dynamisch die Zeilen zusammenstellen, nichts in einem Array vorgeben,
ein ähnliches Array kann dabei schon vorkommen, aber berechnet, nicht vorgegeben

die Berechnung ist sicher nicht leicht, aber fange dort an und stelle intelligente Frage,
was genau ist ein Hindernis?

-----

die Symmetrie-Prüfung ist in der Aufgabe nicht zu sehen und äußerst fragwürdig,
schließlich ist das Array gerade so aufgebaut, dass an jeder Position was anderes steht,
wozu dort irgendwo irgendwas auf Gleichheit prüfen?!

a_[j] == a[j] ist auch gefählich, da es kein quadratisches 2D-Array ist,
Überbleibsel aus anderem Programm?_


----------



## loese90 (3. Mai 2012)

[JAVA=42]public class Aufgabe5 {
	public static void main(String []args) {
// Verarbeitung	
	Scanner in = new Scanner(System.in);

// Eingabe
System.out.print("Eingabe wie viele Zeilen soll die Dreiecksmatrix haben");
int anz = in.next.Int();

// Berechnung,Quadratisches Array erstellen
int[][] array2dim = new [anz][];

 int zahl = {anz(anz+1)/2};

// Ausgabe der Ergebnisse

	for (int i=0; i < anz; i++) {
	int[] array = new int _;
		System.out.println("");
	};


		for(int j=0; j < spalten; j++) {
		int[] array = new int [j];
		System.out.print(""+\t+"");
		};






}	//	main
}// class Aufgabe5

[/code]

Wie kann ich jetz erzeugen, dass die Dreiecksmatrix mit der Höchsten Zahl beginnt und mit 1 endet. Habe den tipp mit gaußscher formel bekommen, hab diese eingefügt, komm jetz aber nicht darauf, wie man dies mit den immer größer werdenden Zeilen und Spalten macht?_


----------



## SlaterB (3. Mai 2012)

> int[][] array2dim = new [anz][];
ist eine gute Zeile, daran hätte ich an Erklärung verzweifelt und dir wohl so auch direkt gegeben 

> {anz(anz+1)/2}
ist wiederum kein guter Code, komische geschweifte Klammer und auch Rechenzeichen fehlen

den Maximalwert musst du meiner Ansicht nach aber gar nicht unbedingt berechnen, 
ergibt sich dann automatisch,

du brauchst eine Doppelschleife und füllst das Array von unten auf,
bei n=5 ist die unterste Zeile 5 Felder breit, von 1 an fülle diese Zeile mit 1 bis 5,
danach kommt die nächste Zeile, nur noch 4 Felder, von bisherigen Stand weiter (in einer Variable gemerkt) sind die Zahlen 6 - 9 dran 
usw., alle Zeilen der Reihe nach füllen, dann kommst du am Ende ohne direkte Rechnung bei 15 an

-------

lasse das Zahlen-Füllen zunächst weg und versuche nur mit einer Schleife, in array2dim die noch leeren Zeilen-Platzhalter mit eindimensionen Arrays zu füllen,
eine Ausgabe danach
0
0 0
0 0 0
0 0 0 0
0 0 0 0 0
wäre schon viel wert als Zwischenziel,

-----

wie gesagt die nervige Eingabe auch erstmal weglassen,
int anz = 5;
reicht völlig für die nächsten 50 Programmaufrufe zum Testen


----------



## Kaa (4. Mai 2012)

Hey,

ich bastel an der gleichen Aufgabe.

Folgendes, ich habe es nun geschafft mir folgendes ausgeben zu lassen:


0 0 0
0 0 0 
0 0 0

für n*n = 3

Doch wie bzw. wo "befülle" ich nun mein array. 



```
int matrix[][] = new int[zeilen][spalten];
		{

			for (int i = 0; i < matrix.length; i++) {
				for (int j = 0; j < matrix[i].length; j++) {
					System.out.print(matrix[i][j] + "  ");
				
				
				}
				System.out.println(" ");
			}
```

Hab grad gar keinen Ansatz, wo und wie ich anfangen soll.


----------



## SlaterB (4. Mai 2012)

die Doppelschleife ist gut, 
nur statt matrix_[j] auszugeben an der Stelle einen Wert speichern,

im Sinne des bisherigen Themas mit einer Variable, die außerhalb der Schleifen definiert und ständig erhöht wird_


----------



## loese90 (6. Mai 2012)

So bin jetz fast fertig, mein Problem jetz ist nur, das die letzte Zahl am ende der Zeilen nicht 1 sondern auch minus werden kann. Was muss ich verändern?

[JAVA=42]

import java.util.*;
public class Aufgabe5 {
	public static void main(String[] args) {
// Verarbeitung	


int anz;	

// Eingabe
System.out.println("Wie viele Zeilen soll die Dreiecksmatrix haben");
Scanner in = new Scanner(System.in);
anz = in.nextInt();

// Berechnung,Quadratisches Array erstellen
int zahl = ((anz*(anz-1))/2);

int array [][]= new int[anz][];



// Ausgabe der Ergebnisse
	for ( int i=0; i <anz; i++) {
	array _ = new int [i+1];
		System.out.println("");



		for( int j=0; j <= i; j++) {
		array [j]= zahl;
		zahl --;
		System.out.print(array [j]+"\t");
		};
		};
	System.out.println("");
//schleife von oben oder unten beginnen




}	//	main
}// class Aufgabe5

[/code]_


----------



## dima4400 (6. Mai 2012)

hey leute, 
habe die selbe Aufgabe bearbeitet. habe das mit hilfe eines kumpels auch geschafft. ich hab aber trotzdem ein problem damit, weil ich viel aus bereits bestehenden programmen im internet abgekupfert habe und probleme habe zu verstehen was die ein oder andere zeile explizit macht!
ich hab versucht es in meinen kommis unterzubringen was die jeweilige zeile macht und würde mich freuen wenn ihr mir ein paar fragen beantworten könntet.
also hier erstmal der komplette text:


```
import java.util.*;

public class Dreiecksmatrix {														//Beginn der Klasse -Dreiecksmatrix-							
	public static void main (String[] args) {										//Beginn der main-Methode
	
	Scanner in = new Scanner (System.in);											//Vorbereitung des Programms auf externe Eingabe
	System.out.println("Bitte geben Sie die gewuenschte Anzahl an Zeilen an.");		//Eingabeaufforderung
	
	int n = in.nextInt();															//Eingegebene Variable n = integer
	System.out.println("\n");														//Ausgabe einer "Freizeile" (für bessere Formatierung)
	int z = ((n*(n+1))/2)+1;														//Formel zur Berechnung der größten Zahl in einer Dreiecksmatrix - Formel:  z = ((n*(n+1))/2 (Quelle: wikipedia.de)
																					//Das "+1" ist dafür da, damit die erste Zahl (bzw. die letzte Zahl - unten recht in der Matrix) bei 1 und nicht bei 0 beginnt!
	
	int [][] matrix = new int [n][];												//Deklaration eines 2-dimensionalen Arrays mit n zeilen und (noch) unbekannter Anzahl an Spalten
	
	for (int i = 0; i < matrix.length; i++){										//1.for-Schleife - zur Bestimmung des Wertes an der Stelle (Zeile) i
		matrix [i] = new int [i+1];													//Festlegung der Länge des Feldes (erzeugt Platz für Kästchen)
		
		for (int j = 0; j <= i; j++){												//2.for-Schleife - zur Bestimmung des Wertes an der Stelle (Zeile) i und (Spalte) j
			z = z - 1;																//Ausdruck bestimmt, dass oben die höchste Zahl steht (unten steht die 1!) - abnehmende Zahlen im Verlauf der 2. Schleife
			matrix[i][j] = z;														//Wert an der Stelle (Zeile) i und (Spalte) j
			
		System.out.printf("%3d" , matrix[i][j]);									//Print-Funktion - das printf - bestimmt, dass Werte nebeneinander ausgegeben werden können - 2. Schleife für die Spaltenzahl wichtig!
		}																			//Ende der 2. Schleife
	
	System.out.println();															//Print-Line-Funktion - das println - bestimmt, dass Werte untereinander ausgegeben werden können - 1. Schleife für die Zeilenzahl wichtig!
	}																				//Ende der 1. Schleife
	}																				//Ende der main-Methode													
}																					//Ende der Klasse "Dreiecksmatrix"
```

besondere schwierigkeiten macht mir folgende zeile:


```
for (int i = 0; i < matrix.length; i++){										//1.for-Schleife - zur Bestimmung des Wertes an der Stelle (Zeile) i
		matrix [i] = new int [i+1];													//Festlegung der Länge des Feldes (erzeugt Platz für Kästchen)
```

was genau sagt diese schleife aus?! ich habe - so wie ich es denke in den kommi geschrieben.
Danke im voraus für die kommis!


----------



## SlaterB (6. Mai 2012)

int zahl = ((anz*(anz-1))/2);

->

int zahl = ((anz*(anz+1))/2);

--------

Kommentare a la 'zur Bestimmung des Wertes an der Stelle (Zeile) i' kann man sich sparen, abgesehen vom Zusammenhang i ?= Zeile, 
aber dass der Schleifenkopf den Wert der Variablen i bestimmt ist klar, gilt für alle Schleifen

die Schleife macht das was sie macht und du auch halbwegs beschreibst, da ist schwer zu erkennen was du daran nicht verstehst, 
i ist die Zeile, da es eine Schleife ist sind offensichtlich alle Zeilen betroffen, was matrix ist muss du schon vorher wissen,
sonst wäre es sinnlos hier den Code verstehen zu wollen 

> //Deklaration eines 2-dimensionalen Arrays mit n zeilen und (noch) unbekannter Anzahl an Spalten
ist dein Kommentar zum matrix-Array, nicht ganz klar aber der letzte Anteil klingt schon ziemlich intelligent,
die Spalten sind da noch unbekannt, in diese Schleife wird pro Zeile ein Array einer bestimmten Länge für eben bestimmte Anzahl Spalten erzeugt


----------



## dima4400 (6. Mai 2012)

ok also das hab ich ja schon alles verstanden, wo es bei mir aber hapert ist in der angegebenen zeile:


```
matrix [i] = new int [i+1];                                                 //Festlegung der Länge des Feldes (erzeugt Platz für Kästchen)
```

was genau sagt diese zeile aus? das ist eigentlich das einzige zumindest größere verständnisproblem...


----------



## SlaterB (6. Mai 2012)

matrix enthält n Plätze, von denen jeder ein int[], eine Zeile sein kann, 
mit dieser Codezeile wird einer dieser Plätze belegt, eine Zeile mit einer gewissen Anzahl Spalten initialisiert


----------

