# Programmieraufgabe mit Arrays



## JavaRookie21 (20. Nov 2010)

Halli Hallo Leute,
hab eine Hausaufgabe in programmierung bekommen ich hab sie schon gelöst aber ich weiß nicht ob man diese aufgabe so lösen kann also ob es überhaupt von mir verlangt wurde sie so zu lösen man soll mit arrays arbeiten nur weiß ich nicht ob ich es mit arrays so hinbekommen hab wie es verlangt wurde die aufgabe lautet:

Schreiben Sie ein Java-Programm, das das folgende Treppenmuster erzeugt, und speichern Sie die
Informationen in eine geeignete Datenstruktur. Die Höhe der Treppe soll variabel sein und über
den Kommandozeilenparameter-Array vorgegeben werden. Verwenden Sie zur Repräsentation ein
dreieckiges Array. Zur Kontrolle ist das Muster auf den Bildschirm auszugeben.
Beispiel Treppe der Höhe 4:
11
11
2222
2222
333333
333333
44444444
44444444

meine lösung:

```
import java.util.Scanner;

public class treppe{
	
	public static void main(String[] args){
		
		Scanner in = new Scanner(System.in);
		int n;
		System.out.println("Geben sie an wie hoch sie Treppe sein soll");
		System.out.print("n=");
		n = in.nextInt();
		System.out.println();
		
		if(n>=1){
		int v=1, j, i;
		int[][] a = new int[2*n][2*n];
			while(v<=n){
				for(j=0;j<=1;j++){
					for(i=0;i<=2*v-1;i++){
						a[i][j]=v;
						System.out.print(a[i][j]);
					}
				System.out.println();
				}
			v++;
			}
		}
	}
}
```

danke im voraus:toll:


----------



## eRaaaa (20. Nov 2010)

> Die Höhe der Treppe soll variabel sein und über
> den Kommandozeilenparameter-Array vorgegeben werden



das hast du schon mal nicht so gemacht. Du sollst das nicht mit dem Scanner machen, sondern "args" nutzen!


----------



## Marcinek (20. Nov 2010)

Ein "dreieckiges" Array kannst du so machen:

zunächst die anzahl der Stufen. 2 * n (hast du ja schon richtig). 

array[2*n][]

in der Schleife muss man von 2 anfangen muss man dann das zweite [] initialisieren.


----------



## Jo.Mo. (21. Nov 2010)

...das interessiert mich jetzt auch mal, ich hatte so eine Aufgabe auch mal vor Ewigkeiten in der Uni, habe das aber nicht mit einem Array gemacht...

@eRaaaa: meinst du in etwa so...


```
for(int i=0; i<argv.length; i++){
			if (argv[i]== 'r' && Integer.parseInt(argv[i+1])==
```


----------



## Sagovana (21. Nov 2010)

Was mich (nicht nur bei diesem Sourcebesipiel, sondern sehr oft bei  Anfragen hier) wundert.

Bekommt Ihr überhaupt Punkte für die Lösungen?
- Keine Kommentare
- Keine Aussagekräftige Variablennamen, sondern nur a,b,c i,j etc.

Spätestens nach einigen Wochen versteht keiner mehr was programmiert wurde. Bei uns wurde das gleich mit 0 Punkten bewertet.

Oder sehen die fertigen Lösungen umfangreicher aus?

(Bitte nicht persönlich nehmen, aber mir ist das schon bei etlichen Postern aufgefallen)

Die zur Aufgabe benötige Datenstruktur wäre für mich ein Integer. Mehr braucht man nicht, um alles benötigte zu speichern. Wie man es in ein Array speichert, wurde ja schon gezeigt.


----------



## Marcinek (21. Nov 2010)

Jo.Mo. hat gesagt.:


> ...das interessiert mich jetzt auch mal, ich hatte so eine Aufgabe auch mal vor Ewigkeiten in der Uni, habe das aber nicht mit einem Array gemacht...
> 
> @eRaaaa: meinst du in etwa so...
> 
> ...



Denke, dass das klar ist


----------



## Jo.Mo. (21. Nov 2010)

@Marcinek: wie meinst du das?

@Sagovana:Bei uns gab es an der Uni keine Punkte im direkten Sinne, man sollte aber Aufgaben abgeben. Ob die dann richtig waren war eine andere Geschichte. Es ging ja auch primär ums nachvollziehen, ich kenne das von mir, der ablauf was das progamm machen soll ist selten das Hindernis, eher das Können dies in einen funktionsfähigen syntaktischen Zusammenhang zu bringen. 

Ist übrigens auch eine Sache, die mich in manchen Foren extrem anstinkt - manche wissen ganz genau, wie man den Fehler behebt, aber anstatt es zu sagen wird drumrum geschwafelt - meist ist der lerneffekt gleich gross (und bedeutend schneller erreichbar) wenn man die richtige Antwort vorgelegt bekommt. Man sieht so auf Anhieb, wo es "hängt". 

Das man nicht alles lang und breit erklärt, ist aber logisch, das muss der Fragesteller dan selbst erarbeiten... ;-)


----------



## eRaaaa (21. Nov 2010)

Jo.Mo. hat gesagt.:


> @eRaaaa: meinst du in etwa so...
> 
> 
> ```
> ...



In seinem Falle meinte ich, dass er den Scanner nicht braucht/nutzen soll, sondern einfach [c] int n = Integer.parseInt(args[0]); [/c]

Dein Code ist fehlerhaft, da das Array der main-Methode immer ein String-Array ist und kein char-Array. Daher wäre in argv_ eben ein String und ein vergleich mit 'r' macht keinen Sinn. argv.charAt(index) == 'r' hingegen könnte klappen._


----------



## Jo.Mo. (21. Nov 2010)

...achso, gut zu wissen. Hatte es mehr als Bsp. gemeint aber das muss ich mir auch merken...


----------



## 012210 (22. Nov 2010)

Wie nutzt man denn nun "args"?
Ich kann das noch nicht wirklich nachvollziehen.


----------



## XHelp (22. Nov 2010)

Das ist ein Array von Strings... welche Probleme hast du damit: mit "Array" oder mit "String"?


----------



## ARadauer (22. Nov 2010)

wenn du über die konsole ein Programm startest, kannst du parameter mitgeben

java MeinProgramm param1 param2
... diese parameter stehen dir dann als Sting Array in der main Methode zur Verfügung... keine Magie nur String array...


----------



## Sovrano (22. Nov 2010)

mich plagt das problem ich weiß wie das gemneint ist mit args nutzen nur weiß ich nicht wie ich das umsetze im falle des java programmes weil muss ja dann umgeschrieben werden nur komm ich auf keinen logischen ansatz wie das zu schaffen ist


----------



## XHelp (22. Nov 2010)

Versuch mal eine konkrete Frage zu formulieren. Am besten unter Verwendung von folgenden Stichwörtern: Subjekt, Objekt, Prädikat, Satzzeichen.


----------



## Sagovana (22. Nov 2010)

Sovrano hat gesagt.:


> mich plagt das problem ich weiß wie das gemneint ist mit args nutzen nur weiß ich nicht wie ich das umsetze im falle des java programmes weil muss ja dann umgeschrieben werden nur komm ich auf keinen logischen ansatz wie das zu schaffen ist



Kleines Beispiel, daß java Name -u User -f File als Eingabe auswertet.


```
if (  args.length == 4 )
		{
			if ((args[0].equals("-u")) && (args[2].equals("-f")))
			{
				myUser = args[1];
				myFile = args[3];
			}
			else
			{
				if ((args[0].equals("-f")) && (args[2].equals("-u")))
				{
					myFile = args[1];
					myUser = args[3];
				}
				else
				{
					helpAndTerminate();				
				}
			}
		}
```


----------



## ARadauer (22. Nov 2010)

Sovrano hat gesagt.:


> mich plagt das problem ich weiß wie das gemneint ist mit args nutzen nur weiß ich nicht wie ich das umsetze im falle des java programmes weil muss ja dann umgeschrieben werden nur komm ich auf keinen logischen ansatz wie das zu schaffen ist



statt


```
Scanner in = new Scanner(System.in);
        int n;
        System.out.println("Geben sie an wie hoch sie Treppe sein soll");
        System.out.print("n=");
        n = in.nextInt();
```
schreibst du zb 
int n = Integer.parseInt(args[0]);

das heißt das erste element aus dem string array, parst du als zahl.. natürlich wenn keine parameter mitegeben werden oder diese keine zahl sind, dann krachts


----------



## Sovrano (22. Nov 2010)

ich idiot hätt ich eig selber drauf kommen müssen  aber thx für die hilfe dann weiß ich wenigstens wie ich weiter verfahren kann


----------



## Jo.Mo. (23. Nov 2010)

@Sovrano: ...wäre gut wenn du uns über das fertige Resultat aufklärst.

Ich hab das mal kurz probiert, erhalte aber den beschriebenen "Knall", sprich eine Outof Bounds Exception. Jetzt könnte ich die zwar via for-bedingung abfangen aber ich will ja wissen wo es hängt...bin halt auch kein Fachmann...


----------



## JavaRookie21 (24. Nov 2010)

ok ihr seit schon viel weiter aber ich will erstmal verstehen wie das mit den arrays funktioniert das andere mit dem args ist ja schon das ende eigtl...hab das so einigermaßen verstanden aber können wir nicht dazu später kommen nachdem ich das mit den arrays gelöst hab?!:rtfm:


```
import java.util.Scanner;

public class treppe{
	
	public static void main(String[] args){
		
		Scanner in = new Scanner(System.in);
		int n;
		System.out.println("Geben sie an bis zur wievielten Zeile das Pascal-Dreieck angezeigt werden soll");
		System.out.println("n=");
		n = in.nextInt();
		System.out.println();
		
		if(n>=1){
		
			int[][] a = new int[2*n][];
			int j;
			int i=0;
			int v=1;
			
			while(i<2*n){
			
				a[i] = new int[2*(i+1)];//in dem array der i-ten zeile wird ein neues array mit doppelter länge erzeugt
				for(j=0; j<=2*v-1; j++){
					a[i][j]=v;
					System.out.print(a[i][j]);
				}
				System.out.println();
				i++;
				if(i%2==0){
					v++;
				}
			}
		}
		else{
			System.out.println("error");
		}
	}
}
```

ich bin jetzt soweit ungefähr denke ich hab das mit den arrays verstanden...oder ist da noch was falsch jetzt ohne args halt aber sonst irgendwas?
also ich hab es jetzt so verstanden das args ein string ist der werte beinhaltet auf die man zugreifen kann...liege ich da richtig?
wenn ja woher kommen die werte? einfach zufällig aus allen zahlen eine zahl rausgenommen?


----------



## Andi_CH (24. Nov 2010)

JavaRookie21 hat gesagt.:


> also ich hab es jetzt so verstanden das args ein string ist der werte beinhaltet auf die man zugreifen kann...liege ich da richtig?
> wenn ja woher kommen die werte? einfach zufällig aus allen zahlen eine zahl rausgenommen?



Nein, agrs ist kein String sonder ein Array of String. Wie die Strings interpretierst und ob das gut geht ist etwas anderes

Woher die kommen? Vom Aufruf

Ach ja, so nebenbei siehst du in meinem Bonsaiprogramm auch wie man einen Array bearbeitet, auch wie man es machen muss um keine ArrayOutOfBounds Exception zu bekommen.

Aufruf: 

java argsDemo Hallo Welt heute ist der 24. November 2010

Ausgabe:
Anzahl Argumente = 8
Arg[0] = Hallo
Arg[1] = Welt
Arg[2] = heute
Arg[3] = ist
Arg[4] = der
Arg[5] = 24.
Arg[6] = November
Arg[7] = 2010


```
public class argsDemo {
	public static void main(String[] args) {
		System.out.println("Anzahl Argumente = " + args.length);
		for(int i=0; i<args.length; i++)
			System.out.println("Arg["+i+"] = " + args[i]);
	}
}
```


----------



## Andi_CH (24. Nov 2010)

Jetzt hab ich doch glatt die elegante Variante vergessen ;-)

```
public class argsDemo {
	public static void main(String[] args) {
		System.out.println("Anzahl Argumente = " + args.length);
		for(String s : args)
			System.out.println(s);
	}
}
```


----------



## JavaRookie21 (25. Nov 2010)

achsoooo jetzt hab ichs verstanden:applaus:
danke für das beispiel hat mir echt weitergeholfen!
ich hab mein programm bisschen geändert...wollte die eingegebenen arrays noch als treppenzahlen verwenden...so sieht mein programm aus:

```
public class treppe{
	
	public static void main(String[] args){
		System.out.println();
		
		if(args.length>=1){
		
			int[][] a = new int[2*args.length][];
			int j;
			int i=0;
			int v=1;
			
			while(i<2*args.length){
			
				a[i] = new int[2*(i+1)];//in dem array der i-ten zeile wird ein neues array mit doppelter länge zu erzeugen
				for(j=0; j<=2*v-1; j++){
					a[i][j]=v;
					System.out.print(a[i][j]);
				}
				System.out.println();
				i++;
				if(i%2==0){
					v++;
				}
			}
		}
		else{
			System.out.println("error");
		}
	}
}
```
ich versteh die aufgabe immer noch nicht ganz, also ich soll durch eingabe in der kommandozeile die höhe der treppe bestimmen in dem ich 4 hinschrreibe und der 4 als zahl erkennt oder soll ich 1 2 3 4 hinschreiben und er gibt mir das vorgegebene treppenmuster aus? dazu müsste ich mein programm noch ändern ist mir bewusst weil ich ein parameter v hab und damit das ganze umgehe oder ist es ok so?


----------



## Andi_CH (25. Nov 2010)

Die Überprüfung args.length>=1 ist schon mal gut!

Es dürfte allerdings reichen wenn du danach args[0] einliest und dann versuchst den darin enthaltenen String in einen int zu wandeln

 Tipp: Integer.parseInt()

und dann den wert an deine funktion übergibst die die Treppe zeichnet.

Ach du hast das immer noch nicht in eine Funktion gekapselt? ;(

Na dann schreib den Wert in n - das dürfte reichen.


----------



## Jo.Mo. (25. Nov 2010)

...hat jemand eine Ahnung wie ich Programme in JCreator beim Programmaufruf (ich nehme meist "run") Parameter übergeben kann...?

...nutzt das überhaupt jemand...? :autsch:


----------



## XHelp (25. Nov 2010)

Jo.Mo. hat gesagt.:


> ...hat jemand eine Ahnung wie ich Programme in JCreator beim Programmaufruf (ich nehme meist "run") Parameter übergeben kann...?



In wie fern hat es was mit diesem Thema zu tun? :bahnhof:
1. Treffer bei google ist JCreator &mdash; Java IDE


----------



## Jo.Mo. (25. Nov 2010)

...das hat insofern damit zu tun, als das ich in dem Programm ja einen Parameter übergeben will/muss. Trotzdem danke, hatte ich meiner Verzweiflung google völlig vergessen... :autsch:


----------



## JavaRookie21 (25. Nov 2010)

```
public class treppe{
	
	public static void main(String[] args){
		System.out.println();
		
		if(args.length>=1){
		
			int[][] a = new int[2*args.length][];
			int j;
			int i=0;
			int v=1;
			
			while(i<2*args.length){
			
				a[i] = new int[2*(i+1)];//in dem array der i-ten zeile wird ein neues array mit doppelter länge zu erzeugen
				for(j=0; j<=2*v-1; j++){
					a[i][j] = Integer.parseInt(args[v-1]);
					System.out.print(a[i][j]);
				}
				System.out.println();
				i++;
				if(i%2==0){
					v++;
				}
			}
		}
		else{
			System.out.println("error");
		}
	}
}
```
ich denke mal das ist jetzt richtig bisschen durcheinander alles aber klapptD was sagst du dazu?


----------



## Jo.Mo. (27. Nov 2010)

...ist es nicht so dass der Kommandozeilen-Parameter als String ausgelesen wird? (zumindest bei JCreator bin ich mir da fast sicher) - demzufolge  wäre es essentiell, wie Andi CH geschrieben hat, den String als Zahl zu übergeben, sonst kannst du meinestwegen 9999 eingeben und es wäre trotzdem nur als ein Absatz (im falle des Treppenmusters) interpretiert, also ausgabe:

11
11

...und eigentlich sollte es ja so laufen, das bei eingabe der Zahl 4 auch 4 Absätze bzw. "Treppenstufen" zu sehen sind...


----------



## biatsch btu (17. Feb 2011)

```
public class b4a2b{
    
   public static void main(String[] args){
        System.out.println();
        


	
		int zeile = 0;
		int spalten = 0;
		int enthalteneNummer = 0;	
		int x = 2*Integer.parseInt(args[0]);


        if(x >= 1){
        
		int[][] treppe = new int[2*x][];
	   System.out.println(x + "\n");
	      for (int count = 0; count <= x-1; count++) {

		
		
			if (zeile%2 == 0) {
				enthalteneNummer = enthalteneNummer + 1;
				spalten = spalten + 2;
			}								// end if
			
			treppe[zeile] = new int[spalten];
			

			for (int spaltenCount = 0; spaltenCount < spalten; spaltenCount++) {
				treppe[zeile][spaltenCount] = enthalteneNummer;
				System.out.print(treppe[zeile][spaltenCount]);
			}								//end for

			zeile = zeile + 1;
			System.out.println();		
            
		}									//end for





	} else {									//end if
		System.out.println("uebergebe zahl groesser 1!");
	}										// end else
 } 											//end main
} 											//end class
```


----------

