Java Formatierungsproblem mit Java

violentviper

Lt. Commander
Registriert
Mai 2008
Beiträge
1.661
Hallo,
ich versuche meine Java Kenntnisse aufzufrischen und habe ein Problem bei folgender kleinen Aufgabe.

Es soll ein Quadrat mit variabler Seitenlänge programmiert werden. Ich habe es bis auf die rechte Außenseite auch hinbekommen. Jedoch bekomme ich es formattechnisch einfach auf keine saubere Lösung . Es fehlt entweder immer der rechte Rand, oder es zerhaut total das Format.

So wie hier, mit 3 Rändern funktioniert es Astrein.
Ich habe mir überlegt den Abstand auszurechnen und dann mit System.out.print, immer genau den berechneten Abstand zwischen die Sterne zu packen. Aber das will auch nicht so recht.

Hier ist mein Code

Code:
import java.util.Scanner;

public class Sterne {

	public static void main(String[] args) {

		int length = 1, x = 1, y = 1, z = 0, a = 0, abstand = 0;
		String s = "* ";

		Scanner in = new Scanner(System.in);

		System.out.println("Geben sie die Seitenlänge des Quadrates ein: ");

		length = in.nextInt();
		abstand = length - 2;

		if (length >= 20) // Normierung auf 20
		{
			length = 20;
		}

		while (x++ < length) // oben
		{
			System.out.print(s);

		}

		while (y++ < length) // Seitenränder

		{
			System.out.println(s);

		}

		while (z++ < length) // unten
		{
			System.out.print(s);

		}

	}

}
 
violentviper schrieb:
Ich habe mir überlegt den Abstand auszurechnen und dann mit System.out.print, immer genau den berechneten Abstand zwischen die Sterne zu packen. Aber das will auch nicht so recht.

Ist aber die einzig sinnvolle Lösung. Pack halt dafür noch ne Schleife in die zweite Schleife rein.

Code:
import java.util.Scanner;

public class Sterne {

	public static void main(String[] args) {
		 
		int length = 1, x = 1, y = 1, z = 0, a = 0, abstand = 0;
		String s = "* ";
 
		Scanner in = new Scanner(System.in);
 
		System.out.println("Geben sie die Seitenlänge des Quadrates ein: ");
 
		length = in.nextInt();
		abstand = length - 2;
 
		if (length >= 20) // Normierung auf 20
		{
			length = 20;
		}
 
		while (x++ <= length) // oben
		{
			System.out.print(s);
 
		}
 
		System.out.println();
		
		while (y++ < length - 1) // Seitenränder
 
		{
			System.out.print(s);
			
			for (int spaces = 1 ; spaces < length - 1 ; spaces++) {
				System.out.print("  ");
			}
			
			System.out.println("*");
 
		}
 
		while (z++ < length) // unten
		{
			System.out.print(s);
 
		}
	}
}

Frag mich jetzt bitte keine Details dazu, ich hab ein paar Schleifengrenzen geändert, so dass es halt passt - die in deinem Originalcode IMHO falsch waren.
 
Zuletzt bearbeitet:
//Billiglösung

while (y++ < length) // Seitenränder
{
System.out.print(s);
for (int i = 1; i < length - 2; i++)
{
System.out.print(" ");
}
System.out.println(s);
}

Eventuell einen off-by-one Fehler drinnen, überprüfs :)
 
@F_GXdx

Genau den Ansatz hatte ich auch schon. Aber das funktioniert auch nicht sauber :).
 
Was meinst du damit? Ich hoffe doch du hast eine Monospaced-Schriftart ausgewählt, sonst sind die Abstände nicht gleich groß.
 
Dann poste einen Screenshot von deinem Ergebnis, "funktioniert nicht" ist keine Beschreibung, mit der wir hier etwas anfangen können.
 
Genau den Code den du vorgestellt hast, hatte ich auch schon. Jedoch bekomme ich dann immer das hier in der Ausgabe.

beweis.JPG


Edit
Ich hab noch ein Leerzeichen reinpackt, dann ging es. Grr so eine Mistaufgabe. Aber trotzdem danke!
 
Starte das Programm in der cmd Konsole und nicht in der integrierten IDE-"Konsole" und poste uns das Bild.

javac Program.java
java Program

Im richtigen Verzeichnis musst du dich dazu befinden und die Windows Umgebungsvariablen richtig gesetzt.

Edit: ach man braucht immer nen Space dazwischen? Hab ich wohl verschlafen
 
Zuletzt bearbeitet:
Ein Space ist auch falsch, es müssen 2 Spaces sein pro Schleifeniteration.

Die anderen beiden Schleifen gehen ja auch jeweils 2 Zeichen: Space und Stern. Denn schau mal deinen String s an.

Oder nimm meinen Code, dann siehst du dass es geht.
Ergänzung ()

Außerdem würde ich den Code ein bisschen aufräumen. Ziehe die ganzen int Definitionen nicht an den Anfang, sondern definiere die Variable mit "int" direkt in der Schleife. Die Variable soll außerhalb nicht sichtbar sein, und unübersichtlich ist es noch dazu. Mische nicht Deutsche und Englische Namen (abstand und length) und wähle sprechende Variablennamen statt Kommentare.
Ergänzung ()

Vergleiche als Beispiel dazu meine for-Schleife.
 
Ich verstehe nicht so ganz wie du darauf gekommen bist bei den Seitenrändern -1 zu rechnen. Ich hab das wenn dann immer mit -2 gerechnet, weil man doch links und rechts ein Sternchen hat und somit 2 "überschüssig" hat ?

Ja der Code ist etwas durcheinander geraten, da ich schon sehr viel daran rumprobiert habe...
 
Zurück
Oben