Java: Wie erstelle ich folgendes Muster im Anhang?
Hallo zusammen!
Ich versuche nun schon seit längerer Zeit mit einer for-Schleife das Muster zu erstellen. Mit Hilfe von Unterlagen natürlich (siehe Anhang).
Folgenden Code habe ich bisher erstellt:
public class Extra {
public static void main(String[] args) {
for (int i = 1; i <= 5; i = i + 1) {
for (int j = 1; j <= 5 - i; j = j + 1) {
System.out.print(".");
}
for (int j = 1; j <= 2i - 1; j = j + 1) {
System.out.print(i);
}
for (int j = 1; j <= 5 - i; j = j + 1) {
System.out.print(".");
}
}
Kann mir vielleicht jemand einen Tipp geben, wie ich mit der Reihe fortfahre? Dieser Algorithmus erstellt mir ja nur das Muster bis 555.
Kann mir da jemand weiterhelfen?
Vielen Dank schon im Voraus!
Gruß
2 Antworten
Vom Beitragsersteller als hilfreich ausgezeichnet
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
programmieren, Java
- bitte nutz für deinen Quellcode auch den Code-Tag. Dadurch wird das viel besser lesbar, da die Einrückungen vorhanden bleiben
- wenn du einfach nur ne kurze Lösung willst, schau dir den unteren Teil meiner Antwort an.
Sonst, wenn du selbst drauf kommen willst, ein bisschen zum überlegen:
- Rein theoretisch brauchst du nur zwei For-Schleifen.
- Eine (bei mir unten im Code j) davon läuft von oben nach unten und gibt die Zahl an, die gedruckt werden soll
- die andere (i) läuft von links nach rechts und sucht aus, ob das aktuelle Zeichen . oder die Zahl sein soll
- Es ist hilfreich, den "Index" des mittleren Zeichens ODER die Länge der gesamten Zeile zu berechnen. Abhängig vom abstand des momentanen Zeichens zum mittleren Zeichen kannst du entscheiden, ob nun die Zahl oder der Punkt gezeigt wird
- Dazu musst du am Ende schauen, was ab der mittleren Zeile passieren soll: Es soll ja wieder weniger Zahl, dafür mehr Punkt angezeigt werden. Da ändert sich die Bedinung
public class Extra {
public static void main(String args[]) {
for (int i = 1; i < 6; i++) {
diamond(i);
System.out.println();
}
}
public static int abs(int a, int b) {
return a - b < 0 ? b - a : a - b;
}
public static void diamond(int middleElement){
if (middleElement > 5) return;
int len = middleElement * 2 - 1;
for(int j = 1; j <= len; j++) {
for (int i = 0; i < len; i++)
System.out.print(abs(len/2, i) < ((j <= len/2+1) ? j : len-j+1) ? j : ".");
System.out.println();
}
}
}
alternativ eine einfacherere Möglichkeit, die einfach nur mitzählt, dafür aber mehr Schleifen braucht:
public static void diamond2(int middleElement) {
int cnt = 1;
int len = middleElement * 2 - 1;
for(int j = 1; j <= len; j++) {
int dotCount = (len - cnt) / 2;
for (int i = 0; i < dotCount; i++)
System.out.print(".");
for (int i = 0; i < cnt; i++)
System.out.print(j);
for (int i = 0; i < dotCount; i++)
System.out.print(".");
System.out.println();
if (j < len/2 + 1)
cnt += 2;
else
cnt -= 2;
}
}
So in c#:
for (int i = 1; i < 10; i++)
{
char zahl = i.ToString().ToCharArray()[0];
int a = 5-Math.Abs(5 - i);
int b = Math.Abs(2 * a - 1);
int c = 5-a;
string t1 = new String(zahl,b);
string t2 = new String('.', c);
Console.WriteLine(t2 + t1 + t2);
}
Woher ich das weiß:Berufserfahrung – Studium der Informatik + Softwareentwickler seit 25 Jahren.