[java] dreieck zeichnen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [java] dreieck zeichnen

    Quellcode

    1. public class gleichschenkliges_Dreieck {
    2. /**
    3. * @author Torben Brodt
    4. * @version 1.0
    5. *
    6. * <p />Malt ein Dreieck aus Sternen (Leerzeichen helfen bei der Ausrichtung)
    7. * <p />Funktioniert mit Java <= 1.5
    8. *
    9. */
    10. public static void main(String[] args) {
    11. java.util.Scanner input = new java.util.Scanner(System.in);
    12. System.out.print("Bitte geben Sie die Hoehe des gleichschenkligen Dreiecks ein: ");
    13. int eingabe = input.nextInt();
    14. int anzahl = eingabe;
    15. //Nullen sind Leerzeichen
    16. String nullen, sterne="";
    17. while(anzahl > 0)
    18. {
    19. sterne += (anzahl == eingabe) ? "*" : "**";
    20. anzahl--;
    21. nullen = "";
    22. for(int i=0; i<anzahl; i++)
    23. nullen += " ";
    24. System.out.println(" "+nullen+sterne);
    25. }
    26. }
    27. }
    Alles anzeigen


    Alternativer Code:

    Quellcode

    1. public class A4_Dreieck_Sternchen {
    2. /**
    3. * @param args
    4. */
    5. public static void main(String[] args) {
    6. int max = 15, sternzahl=1;
    7. // Ausgabe
    8. signs(' ', max/2+1);
    9. System.out.println("*");
    10. for (int count=max/2; count >= 0; count--)
    11. {
    12. sternzahl += 2;
    13. signs(' ', count);
    14. signs('*', sternzahl);
    15. System.out.println();
    16. }
    17. }
    18. static void signs(char sign, int count) {
    19. for (int i=0; i<count; i++)
    20. System.out.print(sign);
    21. }
    22. }
    Alles anzeigen
  • hier meine änderungen für ein leeres Dreieck

    Quellcode

    1. public class A4b_Dreieck_Sternchen {
    2. /**
    3. * @param args
    4. */
    5. public static void main(String[] args) {
    6. int max = 15, sternzahl=1;
    7. // Ausgabe
    8. signs(' ', max/2+1, false);
    9. System.out.println("*");
    10. for (int count=max/2; count >= 0; count--)
    11. {
    12. sternzahl += 2;
    13. signs(' ', count, false);
    14. signs('*', sternzahl, (count == 0));
    15. System.out.println();
    16. }
    17. }
    18. static void signs(char sign, int count, boolean max) {
    19. for (int i=0; i<count; i++) {
    20. char newsign = (sign == '*' && i > 0 && i < count-1 && max == false) ? ' ' : sign;
    21. System.out.print(newsign);
    22. }
    23. }
    24. }
    Alles anzeigen
  • Das Programm von dir hatte nich so ganz funktioniert, hatte unten die letzte Zeile nich geschrieben oder eine falsche Anzahl an Sternchena ausgeben, also z.B. rechte und linke Zeile 5 Sternchen und unten die Seite 9 Sternchen...

    Hier ist das überarbeitete:

    Quellcode

    1. import java.io.BufferedReader;
    2. import java.io.IOException;
    3. import java.io.InputStreamReader;
    4. public class gleichschenkliges_Dreieck2 {
    5. public static void main(String[] args) throws IOException {
    6. int sternzahl=1;
    7. BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    8. System.out.print("Bitte geben Sie die Hoehe des gleichschenkligen Dreiecks ein: ");
    9. String max2 = input.readLine();
    10. int max = Integer.parseInt(max2);
    11. // Ausgabe
    12. signs(' ', max, 0);
    13. System.out.println("*");
    14. for (int count=max-1; count > 1; count-=1)
    15. {
    16. sternzahl += 2;
    17. signs(' ', count, 0);
    18. signs('*', sternzahl, max+999);
    19. System.out.println();
    20. }
    21. for (int bla=max; bla>0; bla-=1) {
    22. System.out.print(" *");
    23. }
    24. }
    25. static void signs(char sign, int count, int max) {
    26. for (int i=0; i<count; i++) {
    27. char newsign = (sign == '*' && i > 0 && i < count-1 && count != max) ? ' ' : sign;
    28. System.out.print(newsign);
    29. }
    30. }
    31. }
    Alles anzeigen
  • Hi,
    ich bin zwar nicht d0nUt aber ich erklär es dir trotzdem :wink: .

    Also erstmal der hintere Teil:

    Quellcode

    1. (anzahl == eingabe) ? "*" : "**"

    Das ganze ist ne Kurzversion von if/else.
    Wenn das was for dem Fragezeichen steht wahr ist wird der Ausdruck zu dem ausgewertet was direkt hinter dem Fragezeichen steht ansonsten wird er zu dem ausgewertet was hinter dem Doppelpunkt steht.

    Der vordere Teil ist wiederum ne kürzere Schreibweise für Wert = Wert + x.
    Was da insgesamt steht entspricht:

    Quellcode

    1. if(anzahl == eingabe)
    2. {
    3. sterne = sterne + "*";
    4. }
    5. else
    6. {
    7. sterne = sterne +"**";
    8. }


    Unterm Strich sollte man es vermeiden bei String mit dem + Operator zu arbeiten(zumindest nicht wenn das sehr oft passiert).
    Nen String ist in Java nen "konstantes" Objekt und jedesmal wenn man da mit + dran rumwerkelt wird nen neues String Objekt erstellt.

    Nur mal so zum Vergleich:

    Quellcode

    1. String str = new String();
    2. for(int i=0;i<100000;i++)
    3. str +='a';

    zu

    Quellcode

    1. String str = new String();
    2. StringBuilder strBuilder = new StringBuilder();
    3. strBuilder.setLength(100000);
    4. for(int i=0;i<100000;i++)
    5. strBuilder.setCharAt(i,'a');
    6. str = strBuilder.toString();

    Lass mal beide Versionen laufen.Die machen beide das selbe.

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • ah ok!
    soweit schon mal danke! So aufgelöst ist der Ausdruck für mich schon deutlicher klarer!
    jetzt steh ich aber trotzdem noch ein bisschen auf dem schlauch.
    Was besagt dieser ausdruck denn nun genau? Ich mein, ich seh ja was rauskommt, und ich habe auch schon mit den Variable und Operatoren rumgespielt und sehe die Veränderungen, aber ich checks noch nicht ganz.
    Wann ändert man die Leerzeichen und Sterne rechts bzw links des Dreiecks, oder beide gleichzeitig, oder wo ist die Vorgehensweise?
  • hi

    am besten verstehst du es, wenn du es schritt für schritt nachprogrammierst
    zeichne es dir erstmal auf ein blatt papier

    du zählst ein sternchen ganz oben
    3 sternchen in der zweiten zeile
    5 sternchen in der dritten zeile
    7 sternchen in der vierten zeile
    9 sternchen in der fünften zeile

    du erkennst also dass die anzahl der sternchen immer um 2 erhöht wird
    am anfang gibts nur ein sternchen
    das macht dieser ausdruck

    Quellcode

    1. sterne += (anzahl == eingabe) ? "*" : "**";


    und jetzt pack es mal in eine schleife

    Quellcode

    1. while(anzahl > 0) {
    2. sterne += (anzahl == eingabe) ? "*" : "**";
    3. System.out.println(" "+sterne);
    4. anzahl--;
    5. }


    deine ausgabe sieht so aus

    Quellcode

    1. *
    2. ***
    3. *****
    4. *******
    5. *********


    was fehlt? richtig, die einrückung
    überlege wie viele zeichen du einrücken musst
    machen wir doch in der ersten zeile 5 leerzeichen davor
    in der zweiten zeile machen wir 4 leerzeichen davor
    in der dritten nur noch 3
    dann 2
    dann 1

    Quellcode

    1. [ 5]*
    2. [ 4]***
    3. [ 3]*****
    4. [ 2]*******
    5. [1]*********


    was ist die einfachste möglichkeit um 5 leerzeichen zu erhalten?
    eine schleife

    Quellcode

    1. for(int i=0; i<anzahl; i++)
    2. nullen += " ";


    und diese ausgabe leerzeichen packen wir vor die sterne
  • ok,

    und der ausdruck der for schleife liest sich etwa so:

    wenn i kleiner als die anzahl (also die eingabe ist) dann passiert was?
    und das i++ heisst doch, das i bei jedem durchlaufen der schleife um 1 größer wird,
    d.h. es wird irgendwann (größer)gleich der anzahl womit die abbruchbedingung erreicht ist. so in etwa?
  • :oops:

    Irgendwie versteh ich das alles nich...

    Den ganzen Kram, der unten bei der Ausgabe steht hatten wir noch gar nich.
    Und mein Lehrer will trotzdem, dass wir das programmieren.
    Und der einzige, ders aus unserem Kurs versteht, kanns nich erklären.
    Und einfach nur irgendwas abtippen bringts ja auch nich.

    Also: geht das ganze auch einfacher? Oder irgendwie ohne diese ganzen Abkürzungen? Wahrscheinlich hab ich nur irgendeinen fehler dabei gemacht, aber bei mir funktioniert das nicht, wenn ich die schon erwähnten abkürzungen nehm.
    Und was will dieses programm eigentlich von mir?

    Wer immer mir helfen möchte und kann, bitte für Hirnblonde erklären...
  • hirnblonde, lol

    nun gut.. also mein Posting weiter oben ist eine recht ausführliche Erklärung. Zumindest so ausführlich, dass man dem ohne genaure Rückfragen nichts mehr hinzufügen kann.

    Jetzt bleibt also noch die Kurzschreibweise.
    In meinem ursprünglichen Code, verwende ich sie ja nur einmal.
    Wie du dieses eine Zeile durch "Langschreibweise" ersetzt, hat void in diesem Posing erklärt.

    Sorry, ist nicht böse gemeint, aber meiner Meinung nach ist alles geklärt, was in den paar Zeilen steht. Wenn du eine Frage formulierst, beantworte ich dir diese aber gerne nochmal.