Programmieraufgabe mit Arrays

JavaRookie21

Mitglied
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:
Java:
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:
 
M

Marcinek

Gast
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.
 
J

Jo.Mo.

Gast
...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...

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

Sagovana

Mitglied
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.
 
M

Marcinek

Gast
...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...

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

Denke, dass das klar ist ;)
 
J

Jo.Mo.

Gast
@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

Top Contributor
@eRaaaa: meinst du in etwa so...

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

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.
 
J

Jo.Mo.

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

ARadauer

Top Contributor
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

Neues Mitglied
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

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

Sagovana

Mitglied
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.

Java:
		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

Top Contributor
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

Java:
 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

Neues Mitglied
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
 
J

Jo.Mo.

Gast
@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

Mitglied
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:

Java:
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

Top Contributor
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

Java:
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

Top Contributor
Jetzt hab ich doch glatt die elegante Variante vergessen ;-)
Java:
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

Mitglied
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:
Java:
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

Top Contributor
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.

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

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

Jo.Mo.

Aktives Mitglied
...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

Mitglied
Java:
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 klappt:DD was sagst du dazu?
 

Jo.Mo.

Aktives Mitglied
...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...
 
B

biatsch btu

Gast
Java:
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
 

Neue Themen


Oben