Java Funktion void mit while Schleife?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Guten Abend, hier meine Lösung. Wie immer gilt, viele Wege führen nach Rom.

Ein kleiner Ausblick auf das Ergebnis:

Bild zum Beitrag

Let's do it!

Zu Beginn bestimme ich die Größe, die jeder String pro Zeile besitzen wird, abhängig von der Länge der Nachricht:

final int length = message.length() + 4;

Nun definiere ich eine Abbruch-Bedingung abhängig von "length", damit keine zu kleinen oder zu großen Strings akzeptiert werden, da bei einem zu kleinen String sonst die Hände nicht mehr dargestellt werden würden:

if (length < 21 || length > 88) return;

Ist der eingegebene String zu klein oder zu groß, wird schlichtweg keine Figur dargestellt.

Als nächstes definiere ich, zur einfacheren Lösung der nächste Schritte, zwei Arrays vom Typ char. Diese werden einmal mit "-", bzw mit Leerzeichen gefüllt:

Edit: eine bessere Lösung dazu mit Schleife und StringBuilder ist im Kommentar zu finden!

final char[] arrBlank = new char[length - 2];
final char[] arrBorder = new char[length - 2];
Arrays.fill(arrBlank, ' ');
Arrays.fill(arrBorder, '-');

Und nun geht es auch schon ran an den Speck!

Wichtig: ich nutze für alle weitere Schritte einen StringBuilder! Bist Du Dir nicht sicher, was der sonst noch alles kann, informiere Dich am besten darüber!

Nun werden alle Teilkomponenten gebaut. Das ist ziemlich trivial und muss eigentlich, wenn man etwas über StringBuilder weiß, nicht weiter erläutert werden.

  • die Zeile für den Text:
StringBuilder text = new StringBuilder().append("| ").append(message).append(" |");
  • die Zeile über und unter dem Text:
StringBuilder blank = new StringBuilder().append("|").append(arrBlank).append("|");
  • der obere Rand der Tafel
StringBuilder upperBorder = new StringBuilder().append("|").append(arrBorder).append("|");
upperBorder.replace(length / 2 - 9, length / 2 + 2, "ooO-----(_)");
  • der untere Rand der Tafel
StringBuilder lowerBorder = new StringBuilder().append("|").append(arrBorder).append("|");
lowerBorder.replace(length / 2 + 7, length / 2 + 10, "Ooo");
  • das Gesicht:
StringBuilder face = new StringBuilder().append(" ").append(arrBlank);
face.replace(length / 2 - 3, length / 2 + 2, "( O O )");
  • das Haar:
StringBuilder hair = new StringBuilder().append(" ").append(arrBlank);
hair.replace(length / 2 - 3, length / 2 + 2, "\\|||||/");
  • die Oberschenkel
StringBuilder thights = new StringBuilder().append(" ").append(arrBlank);
thights.replace(length / 2 - 3, length / 2 + 2, "|_| |_|");
  • die Waden
StringBuilder calves = new StringBuilder().append(" ").append(arrBlank);
calves.replace(length / 2 - 2, length / 2 + 1, "|| ||");
  • die Füße
StringBuilder feet = new StringBuilder().append(" ").append(arrBlank);
feet.replace(length / 2 - 3, length / 2 + 2, "ooO Ooo");

Nachdem alle Teile gebastelt sind, muss man diese nur noch ausgeben:

System.out.println();
System.out.println(hair);
System.out.println(face);
System.out.println(upperBorder);
System.out.println(blank);
System.out.println(text);
System.out.println(blank);
System.out.println(lowerBorder);
System.out.println(thights);
System.out.println(calves);
System.out.println(feet);

Der Aufruf der Funktion könnte so aussehen:

showBillboard("Das ist meine Nachricht! Tadaaa!");

Die Funktion an sich:

private static void showBillboard(String message) {
    final int length = message.length() + 4;

    if (length < 21 || length > 88) return;

    final char[] arrBlank = new char[length - 2];
    final char[] arrBorder = new char[length - 2];
    Arrays.fill(arrBlank, ' ');
    Arrays.fill(arrBorder, '-');

    // text to be displayed
    StringBuilder text = new StringBuilder().append("| ").append(message).append(" |");

    // blank areas over & under text
    StringBuilder blank = new StringBuilder().append("|").append(arrBlank).append("|");

    // upper border of billboard
    StringBuilder upperBorder = new StringBuilder().append("|").append(arrBorder).append("|");
    upperBorder.replace(length / 2 - 9, length / 2 + 2, "ooO-----(_)");

    // lower border of billboard
    StringBuilder lowerBorder = new StringBuilder().append("|").append(arrBorder).append("|");
    lowerBorder.replace(length / 2 + 7, length / 2 + 10, "Ooo");

    // face
    StringBuilder face = new StringBuilder().append(" ").append(arrBlank);
    face.replace(length / 2 - 3, length / 2 + 2, "( O O )");

    // hair
    StringBuilder hair = new StringBuilder().append(" ").append(arrBlank);
    hair.replace(length / 2 - 3, length / 2 + 2, "\\|||||/");

    // thights
    StringBuilder thights = new StringBuilder().append(" ").append(arrBlank);
    thights.replace(length / 2 - 3, length / 2 + 2, "|_| |_|");

    // calves
    StringBuilder calves = new StringBuilder().append(" ").append(arrBlank);
    calves.replace(length / 2 - 2, length / 2 + 1, "|| ||");

    // feet
    StringBuilder feet = new StringBuilder().append(" ").append(arrBlank);
    feet.replace(length / 2 - 3, length / 2 + 2, "ooO Ooo");

    // output
    System.out.println();
    System.out.println(hair);
    System.out.println(face);
    System.out.println(upperBorder);
    System.out.println(blank);
    System.out.println(text);
    System.out.println(blank);
    System.out.println(lowerBorder);
    System.out.println(thights);
    System.out.println(calves);
    System.out.println(feet);
}

Die kleinste Tafel könnte so aussehen:

Bild zum Beitrag

Eine große Tafel so:

Bild zum Beitrag

Bei weiteren Fragen kannst Du Dich gerne melden!

Grüße, Jacob

 - (Computer, programmieren, Informatik)  - (Computer, programmieren, Informatik)  - (Computer, programmieren, Informatik)

mathe999 
Beitragsersteller
 19.11.2021, 18:09

Vielen Dank Jacob. Kannst du die Lösung auch ohne Arrays machen? Die hatten wir leider noch nicht.. Liebe Grüße

0
Bananapeel321  19.11.2021, 20:00
@mathe999

Du benötigst zwei StringBuilder (um nichts weiter im Code umschreiben zu müssen, nenne ich diese arrBlank und arrBorder):

StringBuilder arrBlank = new StringBuilder();
StringBuilder arrBorder = new StringBuilder();

Und diese werden einfach mit einer Schleife gefüllt. Hätte ich eigentlich von Anfang an so machen können:

for (int i = 0; i < length - 2; ++i) {
    arrBlank.append(" ");
    arrBorder.append("-");
}

oder kürzer:

for (int i = 0; i < length - 2; ++i, arrBlank.append(" "), arrBorder.append("-"));

Gesamt sieht der Abschnitt zwischen der If-Abfrage und der Erstellung der Einzelteile so aus:

StringBuilder arrBlank = new StringBuilder();
StringBuilder arrBorder = new StringBuilder();
for (int i = 0; i < length - 2; ++i, arrBlank.append(" "), arrBorder.append("-"));

Grüße, Jacob

0
mathe999 
Beitragsersteller
 20.11.2021, 12:49
@Bananapeel321

Danke Jacob und wie ist der vollständige Code dann? Oder setze ich das einfach für die Arrays ein?

0
Bananapeel321  20.11.2021, 13:31
@mathe999

Du setzt das einfach für die 4 Zeilen von final char[] ... bis Array.Fill... ein

0
c0C4c014  20.11.2021, 18:02
@mathe999

Hi,

ich studiere Informatik in Marburg du wahrscheinlich Data-Sience.

Ich wollte nur einmal anmerken, dass wir in der OOP Vorlesung auch noch nicht mit Klassen gearbeitet haben und hier wird ja die Klasse StringBuilder genutzt. Ich weiß nicht wen du als Tutor hast, aber ich weiß nicht ob der das durchgehen lässt. Mir wurde gesagt, dass die Lösungen eigentlich immer nur mit den Mitteln gelöst werden dürfen, die auch bereits in der Vorlesung behandelt wurden.

Was man aber sagen kann, ist, dass diese Lösung hier, die du wahrscheinlich so übernommen hast, nicht der Musterlösung entsprechen wird. Da wir wie bereits gesagt, ja noch keine Klassen in der Vorlesung genutzt haben.

Außerdem wurde ja in der Aufgabenstellung erwähnt, dass wir Klaus mithilfe einer while-Schleife auf die Konsole ausgeben sollen, es wird in der Lösung von Jacob aber keine while Schleife verwendet. Das wird also wahrscheinlich auf jeden Fall zu Punktabzug führen.

Außerdem bin ich mir nicht sicher ob wir die length() Methode schon benutzen dürfen, da wir diese meines Wissens nach auch noch nicht in der OOP Vorlesung hatten. Genau deswegen bin ich nämlich auf diese Frage hier gestoßen, weil ich selber auch nicht wusste wie ich die Aufgabe lösen soll ohne die length() Methode zu nutzen. Ich hätte eine Lösung, welche aber die lenght() Methode nutzt und ich weiß leider nicht ob wir diese bereits benutzen dürfen.

Ich möchte damit nicht die Lösung von Jacob kritisieren. Weil dies ist eine sehr gute Lösung. Ich möchte dir nur sagen, dass du mit dem Kopieren dieser Lösung riskierst auf die Aufgabe 0 Punkte zu bekommen, weil du mit Dingen arbeitest die wir noch nicht behandelt haben. Wenn dies nicht der Fall ist, wirst du auf jeden Fall ein paar Punkte abgezogen bekommen, weil du keine while-Schleife verwendest und in der Aufgabenstellung ist ja konkret erwähnt, dass du eine nutzen sollst.

Liebe Grüße

0
Bananapeel321  20.11.2021, 19:04
@c0C4c014

Den StringBuilder kann man sich zur Not selber bauen, ist natürlich ein mittelgroßer Aufwand.

length() kann man selber implementieren, die erstbeste Möglichkeit, die mir dafür einfällt ist folgende, da hast Du dann auch Deine Schleife:

Angenommen, wir nutzen

String string = "Ich liebe Tomaten!";

Möchten wir die Länge des Strings ermitteln, fix eine Methode gebastelt:

private static int strLength(String str) {
    int length = 0;

    try {
        while (str.charAt(length) > 0) {
            ++length;
        }
    } catch (Exception e) {
    }

    return length;
}

Jetzt nutze ich try-Catch und charAt(), ob das besser ist? ^^

Anwendung:

String string = "Ich liebe Tomaten!";

System.out.println(strLength(string));
System.out.println(string.length());

Output:

18
18

Process finished with exit code 0
1
c0C4c014  20.11.2021, 19:30
@Bananapeel321

Deine Lösungen sind sehr gut, aber ich glaube, da wird immer zu viel verwendet was wir nicht hatten. Ich habe erfahren, dass wir die length() Methode nutzen dürfen, aber mehr nicht.

Ich habe nun einen Weg gefunden, das Problem mit der length() Methode zu lösen. Aber ohne Klassen und Arrays zu verwenden. Dein Code ist natürlich um einiges besser, aber nutzt wie gesagt einige Konzepte die wir noch nicht genutzt haben.

Leider kann ich meinen Code hier nicht zeigen, weil ich Angst habe, dass andere Leute aus der Uni diese Frage hier finden und den Code dann kopieren werden. Wenn das den Tutoren auffällt, dass alle die gleiche Lösung haben, dann gibts Null Punkte für alle und das möchte ja keiner.

Meinen Lösungsansatz kann ich aber gerne präsentieren:

Man nimmt die Länge der Nachricht, subtrahiert diese Zahl z.B mit der Länge des Strings "\|||||/". (Dies ist für die erste Zeile, bei der zweiten Zeile nimmt man dann die Länge des Strings "( O O )".)

Nun halbiert man die bei der Subtraktion entstehende Zahl und kommt somit auf die Zahl x. Anschließend schreibt man eine while-Schleife die an die linke Seite x " " anhängt. Dann schreibt man eine weitere while-Schleife die an die rechte Seite x " " anhängt.

Diese Idee ist die Grundidee und die muss man pro Zeile etwas verändern.

Der Code ist natürlich sehr unschön und nicht ideal, aber mit dieser Lösung verwendet man nur Konzepte die wir auch bereits in der OOP Vorlesung behandelt haben und somit ist glaube ich diese Lösung ansich idealer um viele Punkte zu bekommen.

Aber Jacobs Lösung ist natürlich sehr viel besser, aber verwendet halt Konzepte die wir noch nicht hatten, was zu Punktabzug führen kann.

0
Bananapeel321  20.11.2021, 20:04
@c0C4c014

Du kannst ihn mir privat schicken, dann werde ich einmal einen Blick drauf.

1
c0C4c014  20.11.2021, 20:10
@Bananapeel321

Mache ich morgen früh, okay? Ich habe ihn zwar jetzt fertig, habe aber noch ein paar Verbesserungsideen, die ich umsetzen möchte :)

Aber vielen Dank :)

1
Von Experte BeamerBen bestätigt

Ich sehe von deiner Seite aus keinerlei Bemühungen, die Aufgabe einmal selber versucht zu haben. Dementsprechend gibt es auch keine Lösung von mir. Deine Hausaufgaben solltest du selber lösen.

Wenn du eine spezifische Frage bzw. Problem hast, DANN kannst du gerne nochmals fragen.

Auf jeden Fall musst du halt, je nachdem wie lang der Text ist, das Schild grösser machen. Du musst dort irgendwie dann die Mitte berechnen und den Rest mit Leerzeichen füllen.

Also setz dich erstmal selbst heran, ansonsten lernst du einfach nix.

Woher ich das weiß:Berufserfahrung – Informatiker Applikationsentwicklung

mathe999 
Beitragsersteller
 18.11.2021, 17:47

Hab ich schon, aber ich finde keinen Anfang, kannst du mir helfen?

0