Rauten in Console ausgeben

Yoshi86

Mitglied
Hallo allerseits :),

ich habe ein kleines Problem. Wir sollen ein Programm schreiben, bei dem als Ausgabe in der Konsole Rauten hintereinander in einem Koordinatensystem ausgegeben werden sollen. Dabei darf der User bestimmen wie groß die Gesamtbreite von der Koordinate x sein soll, wie Breit die Rauten sein sollen und wieviele Reihen es sein sollen. Ich habe folgenden code schonmal hinbekommen:

Java:
public static boolean inRaute (double px, double py, double cx,
                                 double cy, double b) 
    {
        double dx = px - cx;
        double dy = py - cy;
        return Math.abs(dx) + Math.abs(dy) <= b;
    }
    
    public static void main (String[] args){
    
      System.out.print("Geben Sie die gewuenschte Gesamtbreite ein: ");
      int gesamtbreite = Integer.parseInt(System.console().readLine());
      System.out.print("Geben Sie die gewuenschte Rautenbreite ein: ");
      int b = Integer.parseInt(System.console().readLine());
      System.out.print("Geben Sie die gewuenschte Reihenzahl ein: ");
      int reihenzahl = Integer.parseInt(System.console().readLine());
      
      double cx = b/2;
      double cy = b/2;
      
      for (int y = 0; y < reihenzahl; y++){
        for (int x = 0; x < gesamtbreite; x++){
          for (int z = 0; z < b; z++){
            if(inRaute(x, y, cx, cy, b)){
            System.out.print("#");
            } else{
                System.out.print(" ");
              }
            
          }
          
        }
        System.out.print("#");
      }
    
    }
}

Die ausgabe ist allerdings total falsch :/. Ich habe probleme mit den for schleifen. Ich habe ja die Methode inRaute(). Wenn ich diese am ende benutze in der if verzweigung prüft der ob die Koordinaten in der Raute sind. Falls ja wird # ausgegeben ansonsten leerstelle. Wie bekomme ich allerdings hin, dass ich die Koordinaten richtig durchgehe? dachte einfach for(int y...) und for(int x...) würde reichen. Könnte mir jmd einen kleinen Tipp geben? Danke schonmal

Die Ausgabe soll z.b wie folgt sein:

Aufgabenstellung; - Beispielbild
 
Zuletzt bearbeitet:

Yoshi86

Mitglied
So hab ein Bild hochgeladen, wodurch mein Problem vlt besser verständlich ist :). Ich weiss nicht wie ich es hinbekomm dass das eine Rautenform hat und die Reihen. Dachte die Methode inraute() und die if-abfrage in der main-metode reicht aus... aber ist leider nciht so :(.
 
Zuletzt bearbeitet:
N

nillehammer

Gast
- Dein Konzept der Rautenbreite ist mir nicht ganz klar.
- Die Ausgabe in Deinem Beispiel bringe ich auch irgendwie nicht mit den Werten für Breite und Höhe zusammen, wenn ich die Rauten durchzähle, sind es nicht 17 und es sind auch mehr als 2 Zeilen.
Deswegen vielleicht ein paar allgemeine Anmerkungen zum Code:
- Die zwei verschachtelnten for-Schleifen (y und x) sehen vernünftig aus.
- Die dritte (die mit z) nicht. Liegt aber vielleicht daran, dass ich die Rautenbreite nicht verstanden habe.
- Prinzipiell sind tiefe Mehrfachverschachtelungen nicht ratsam, weil schwer duchschaubar. Versuche mal, das in Methoden (paintRow, paintRaute o.ä.) aufzusplitten
- Die doubles cx und cy enthalten den selben Wert. Ist das Absicht?
- Bei der Berechnung der doubles machst Du eine ganzzahlige Division (zwei ints geteilt, gibt wieder einen int). Willst Du das?
 
N

nillehammer

Gast
Ahh, mit dem Bild wird einiges klarer. Ich war davon verwirrt, dass Du das Zeichen "#" benutzt hast. Das nennen nämlich auch einige Raute. Dass Du Rauten malen wolltest hab ich garnicht geblickt. Ok, die Reihenanzahl ist damit geklärt. Du möchtest halt 2 Reihen von Rauten malen.

Bleiben noch die anderen beiden Werte.
Ich nehme mal an 17 ist die Breite des gesamten Bildes? (Obwohl, in der Zeichnung sind es glaub ich mehr)

Und was ist dann Rautenbreite 4? Das blick ich noch nicht.
 

Yoshi86

Mitglied
So danke erstmal für die Antworten... also ich habe mich jetzt erstmal darauf beschränkt nur EINE Raute auszugeben. Dazu habe ich den Code wie folgt abgeändert:
Java:
public static boolean inRaute (double px, double py, double cx,
                                 double cy, double b) 
    {
        double dx = px - cx;
        double dy = py - cy;
        return Math.abs(dx) + Math.abs(dy) <= b;
    }
    
    public static void main (String[] args){
    
      System.out.print("Geben Sie die gewuenschte Gesamtbreite ein: ");
      int b = Integer.parseInt(System.console().readLine());

      
      double cx = b;
      double cy = b;
      
        for (int y = 0; y < b; y++){
          for (int x = 0; x < b; x++){
            if(inRaute(x*2, y*2, cx, cy, b)){
            System.out.print("#");
            } else{
                System.out.print(" ");
              }
            
          }
          System.out.println();
        }
       
      }
    
    
}

Es gibt auch einwandfrei eine Raute aus. Wie bekomme ich es jetzt hin, dass ich mehrere Rauten nebeneinander ausgebe und auch mehrere Reihen von Rauten wie im Beispiel...? ich weiss aufjedenfall, dass ich noch zwei weitere for schleifen bräuchte. und ein weiteres problem ist wie bekomme ich es hin, dass die rauten aneinander anknüpfen.

p.s.
@andi im ersten beitrag
@nillehammer genau 17 ist meine gesamtbreite und rautenbreite ist der "radius" von der raute. also eine raute mit der Rautenbreite 4 würde 8 mal # an der breitesten stelle ausgeben bzw. hätte ienen durchmesser von 8. P.S: Ich muss verschachtelte For-Schleifen benutzen :/. Steht in der Aufgabenstellung.
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Yoshi86 hat gesagt.:
@nillehammer genau 17 ist meine gesamtbreite und rautenbreite ist der "radius" von der raute. also eine raute mit der Rautenbreite 4 würde 8 mal # an der breitesten stelle ausgeben bzw. hätte ienen durchmesser von 8.
Ok, dann nenn es auch Rautenradius und nicht Breite ;)

Allerdings ist das nicht umsetzbar. Aus zwei Gründen:
1. Wenn Du Dir Deine Rauten anschaust, haben sie immer eine ungerade Anzahl von Zeichen in ihren Zeilen (1, 3, 5, ..., 3, 1). D.h. die Angabe eines Radius, den man mal 2 nimmt, geht nicht, weil da immer eine gerade Zahl herauskommt.
2. Die Angabe von Rautenradius und Gesamtbreite können sich widersprechen. Was ist, wenn die Gesamtbreite sich nicht durch den Radius teilen lässt? Malt man dan weniger Rauten und nutzt die Breite eben nicht voll aus? Was ist, wenn eine einzige Raute schon einen Radius hat, der größer als die Gesamtbreite ist? Malt man dann nichts oder sprengt man die Breite oder verkleinert man den Rautenradius, damit es passt?

Mögliche Lösung wäre: Auf die Angabe der Gesamtbreite zu verzichten und die Rautenbreite (und jetzt wirklich die Breite und nicht den Radius) immer auf eine ungerade Zahl zu normalisieren (z.B. bei Angabe gerader Zahlen eins dazuzählen).

Ist das ok? Wollen wir damit weitermachen?
 

Andi_CH

Top Contributor
Danke für die Hinweise - hm 17 - passt wenn sich die Rauten berühren -> ok
4 -> b
2-> klar

Aber warum die 17 angegeben wird ist unklar - was soll geschehen wenn das nicht aufgeht? Sollen einfach Teilrauten gezeichnet werden?

Rauten nebeneinander zeichnen geht nicht - du musst eine Zeile von Anfang an komplett ausgeben

Empfehlung:

Einen char Array[17] anlegen
Die Periode merken (in welchem Abstand sich das Muster widerholt) -> 8 (2 x 4)
Wenn du einen # an Position x in das Array schreibst, musst du den sofort an Position x+n*periode auch noch reinschreiben
Array ausgeben

--
Hm konnte man da früher nicht Attachments anhängen? Externe Links sind nämlich immer doof, denn die existieren bald nicht mehr
 

Yoshi86

Mitglied
ich würde gerne so weiter machen :D. allerdings hab ich eine definitive aufgabenstellung und da muss ich mich ranhalten. um aber deine frage zu beantworten was passiert wenn die rauten nicht ganz ins bild passen... die nicht passende raute wird einfach so weit abgebildet wie geht, danach "abgeschnitten. heisst also die letzte raute könnte einfach halb gezeichnet sein oder einviertel.
 

Yoshi86

Mitglied
Ich schreib jetzt mal einfach meine Aufgabenstellung hier hin, damit ihr seht wo ich mich dran halten muss.

Schreiben Sie ein Programm, das

1. den Benutzer nach der Gesamtbreite g, der Rautenbreite b und der gewünschten Anzahl von Reihen l fragt und als Antwort jeweils eine Integer-zahl einliest.
2. Schleifen verwendet,
- um die gewünschte Anzahl von Reihen zu erstellen (hier denke ich mal muss noch eine for-schleife)
- um alle Koordinaten abzulaufen (habe ich mit den zwei for-schleifen gelöst)
- um zu überprüfen, ob die aktuelle Koordinate in der Raute liegt (hier habe ich die
if-Anweisung benutzt)
als Hilfesatz steht zum letzten punkt in 2.: in dieser inneren Schleife müssen Sie die Koordinaten der Mittelpunkte der Rauten in der aktuellen Reihe bestimmen. Dabei ist C_i,k+1 = C_i,k +(2*b,0), d.h. sie müssen die Position von C_i,1 bestimmen und dann immer um 2*b auf der x-Achse weiterspringen. Sie müssen keine Rauten betrachten, bei denen der Mittelpunkt rechts von (g+b,0) liegt.

Das mit dem 2*b habe ich auch verstanden. Das bedeutet ja nur, dass der Mittelpunkt der zweiten Raute genau 2*b entfernt von dem Mittelpunkt der ersten Raute liegt. Hier muss sicherlich auch eine for schleife hin... ich habe einfach nur probleme dass dann in code umzusetzen :/

@andi haben noch keine arrays eingeführt, was bedeutet, dass wir das nicht benutzen dürfen :/.

ich versuch grad for-schleife für die gesamtbreite hinzubekommen.
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Ist Fütterungszeit

Java:
public class Raute {

	private static int b = 4;
	private static int gesamtbreite = 17;
	private static int reihenzahl = 2;
	private static char[] linie;

	private static int periode = 2*b;

	private static void addChar(char[] cArr, int pos, int per) {
		for (int i = pos; i < cArr.length; i+=per)
			cArr[i] = '#';
	}

	private static void init(char[] cArr) {
		for(int i=0; i<cArr.length; i++)
			cArr[i] = ' ';
	}

	private static void zeichneRaute(char[] cArr) {
		for(int i=0; i<=b; i++) {
			init(cArr);
			for(int j=(b-i); j<=(b+i); j++) {
				addChar(cArr, j, periode);
			}
			System.out.println(new String(cArr));
		}
		for(int i=b-1; i>=0; i--) {
			init(cArr);
			for(int j=(b-i); j<=(b+i); j++) {
				addChar(cArr, j, periode);
			}
			System.out.println(new String(cArr));
		}
	}

	public static void main(String[] args) {
		linie = new char[gesamtbreite];
		for (int i=0; i<reihenzahl; i++)
			zeichneRaute(linie);
	}
}
 

Yoshi86

Mitglied
danke für deinen post andi :). aber wie gesagt darf arrays nicht benutzen. ich bin jetzt aufjedenfall einen schritt weiter und kann die reihenzahl auch ausgeben. allerdings weiss ich immer noch nicht wie ich jetzt genau die gesamtbreite durchlaufe und die ganzen rauten einer reihe ausgebe.

bis jetzt bin ich soweit:
Bis jetzt kann ich eine Raute pro Reihe ausgeben und mehrere Reihen. Will aber soviele Rauten pro Reihe ausgeben wie Gesamtbreite ist. Kann einer kleinen Tipp geben? :)

Java:
public static boolean inRaute (double px, double py, double cx,
                                 double cy, double b) 
    {
        double dx = px - cx;
        double dy = py - cy;
        return Math.abs(dx) + Math.abs(dy) <= b;
    }
    
    public static void main (String[] args){
      
      // hier wird die Rautenbreite b abgefragt
      System.out.print("Geben Sie die gewuenschte Rautenbreite ein: ");
      int b = Integer.parseInt(System.console().readLine());
      // hier wird die Gesamtbreite g abgefragt
      System.out.print("Geben Sie die gewuenschte Gesamtbreite ein: ");
      int g = Integer.parseInt(System.console().readLine());
      // hier wird die Reihenzahl l abgefragt
      System.out.print("Geben Sie die gewuenschte Reihenzahl ein: ");
      int l = Integer.parseInt(System.console().readLine());
     
      
      //hier deklarieren wir den Mittelpunkt (cx,cy)
      double cx = b;
      double cy = b;
      
      //z ist für die reihenanzahl
        for (int z = 0; z < l; z++){
          for (int x = 0; x <= b*2; x++){
            for (int y = 0; y <= b*2; y++){
              /* hier wird überprüft ob die aktuellen Koordinaten in der 
              ** Raute liegen
              ** Falls true: Gebe "#" aus
              ** Falls false: Gebe " " aus
              */
              if(inRaute(x, y, cx, cy, b)){
              System.out.print("#");
              } else{
                  System.out.print(" ");
                
                }
            
            }
          
            System.out.println();
          }
         
        }
    }
}
 

Yoshi86

Mitglied
ja hab ich danke :). ich hätte einfach die x koordinate bis zur gesamtbreite ablaufen müssen :) und einen parameter hatte ich falsch übergeben. trotzdem danke der nachfrage :)
 

Neue Themen


Oben