# Muster,Java



## babuschka (22. Mrz 2012)

Hallo Leute, hab mal ne Frage , wie man so ein Muster in Java mittels 2 Forschleifen programmiert:
XXXXXXXXXX
X00000000X
X00000000X
X00000000X
X00000000X
X00000000X
X00000000X
X00000000X
X00000000X
XXXXXXXXXX

das wäre meine lösung:

public class l{
public static void main (String[] args){

for (int i=1;i<11;i++){
for (int j=1;j<11;j++){

if(i==1) System.out.print("X");
else{
if(i==10) System.out.print("X");
else{
if(j==1) System.out.print("X");
else{if(j==10) System.out.print("X");
else System.out.print("0");
}
}
}
if(j==10) System.out.println("");


}
}



}
}
es sollen 10reihen und 10 spalten sein...hat sich beim kopieren leicht verschoben
allerdings soll es auch ne einfachere Lösung geben, bei der man nicht so oft diese System.out befehle hat.
Ich danke euch schreibe am Dienstag ne Klausur , wäre verdammt wichtig.


----------



## SlaterB (23. Mrz 2012)

du kannst die vielen ifs zu einem zusammenfassen
if(das oder das oder das oder das) X, sonst O

viel mehr geht kaum, wenn man nicht zum simplen 
System.out.println("X00000000X");
über gehen will


----------



## babuschka (23. Mrz 2012)

hey, genau das hab ich schon versucht allerdings wird bei mir einfach nichts ausgegeben..
könntest du mir vielleicht den quellentext schicken , so wie du es meinst?


----------



## SlaterB (23. Mrz 2012)

andersrum wird ein Schuh draus: poste deine geänderten Versuche,
evtl. mit Begründung was du vorhattest

denke dann auch an die Java-Tags, überall dicke rote Hinweise..


----------



## babuschka (23. Mrz 2012)

```
public class  l {
    public static void main (String args[]){
        
      
        for(int i=1; i<11; i++) {
            for (int j=1;j<11;j++) {
          
          if( i==1 || i==10 || j==1 || j==10 )
          {
        	  System.out.print("*");
          }
          if(j==10){
        	  System.out.println(" ");
          }
            }
        }
        }
}
```

allerdings bekomme ich kein Rahmen(viereck) , so wie ich es haben möchte


----------



## SlaterB (23. Mrz 2012)

bisher waren es X und 0, nun *?
jedenfalls ist es doch sonnenklar dass du nun nur noch den Rahmen malst, das else ohne Grund hast wegfallen lassen,
was spricht gegen ein else, welches vorher noch da war?
hast du verstanden was vorher dessen Funktion war?

viel wichtiger als der Code in diesem einen Programm wäre für dich, darüber nachzudenken, warum du das so gemacht hast, 
wieso du nicht erkennst dass die Füllung fehlt usw.,
das kann man kaum eintrichtern, das kann man nur anmerken


----------



## babuschka (23. Mrz 2012)

naja die "0" sollte nur als platzhalter dienen und ob da jetzt ein "X" oder ein "*" ist , soll egal sein 
wieso ein "else" ich brauch doch nur if bedingungen

und wo kommt das else hin??
hmm..


----------



## babuschka (23. Mrz 2012)

ne leider versteh ich nicht ,wieso ich das else hier wieder brauch und wohin es hinkommt


----------



## SlaterB (23. Mrz 2012)

tja, irgendeinen Platzhalter musst du nunmal malen, gern auch Leerzeichen statt 0,
wichtig ist dass der Platz zwischen linken und rechten Rand aufgefüllt wird

wie das ursprüngliche else funktionierte kannst du nachschauen, 
wenn du dieses Programm, was nun offensichtlich nicht von dir ist, nicht verstehst, 
kannst du auch kaum eine bessere eigene Version schreiben,

überlege dir zu jedem Index-Paar, was zu zeichnen ist, und wie das durch den Code erreicht wird, 
welche Fälle die vielen ifs abdecken und was dann als finales else übrigbleibt,
es gibt nur ein else mit 0 und 0 wird ziemlich viel gemalt

bedenke auch meinen Satz
> if(das oder das oder das oder das) X, sonst O
es gibt nur eine logische Möglichkeit für das else


----------



## ARadauer (23. Mrz 2012)

ako hat gesagt.:


> ne leider versteh ich nicht ,wieso ich das else hier wieder brauch und wohin es hinkommt



na was heißt den else?
dict.leo.org - Ergebnisse fr "else"

du denks zu kompliziert... was willst du den machen, schreibs auf deutsch hin


```
if( i==1|| i==10 || j==1 || j==10 )  { // wenn erste spalte oder letze spalte oder erste zeile oder letze zeile ein *
              System.out.print("*");
}
if(j==10){ //wenn letze spalte dann ein " "
              System.out.println(" ");
} //kein else also sonst nix
```
Das willst du ja nicht, du willst wenn erste spalte oder letze spalte oder erste zeile oder letze spalte dann "*"  andernfals (das wäre das else) ein " ".

Einfach oder?


----------



## babuschka (23. Mrz 2012)

So, dann hätte ich dasfunktioniert jetzt auch)
Aber gibt es eine noch einfachere Möglichkeit, bei der man mit noch  wenigeren System.out/System.outln Befehlen zum Ziel kommt?


```
public class  l {
    public static void main (String args[]){
        
      
        for(int i=1; i<11; i++) {
            for (int j=1;j<11;j++) {
          
          if( i==1 || i==10 || j==1 || j==10 )
          {
              System.out.print("*");
          }
          else{
         
          System.out.print(" ");
          
          }
          if(j==10)
          {
        	  System.out.println(" ");
          }
            }
        }
        }
}
```


----------



## SlaterB (23. Mrz 2012)

du könntest den Stern oder das Leerzeichen in eine String-Variable schreiben und danach ausgeben,
ein bedingt angefügtes \n erspart für println einen Zeilenumbruch

oder die Prüfung in eine boolean-Variable:

boolean rand = ..
print(rand ? .. : ..);

aber das sind nur Techniken, nun genug von mir


----------



## Landei (23. Mrz 2012)

```
for(int i = 0; i < 100; i++) System.out.print(i % 10 == 9 ? "X\n" : i % 10 == 0 || (i/10 + 1) % 10 < 2 ? "X" : "O");
```

Ich bezweifle allerdings, dass das lesbarer ist...


----------



## babuschka (23. Mrz 2012)

Danke Leute 

Wenn ich ein "X" als Muster erstellen will :

wäre mein ansatz richtig:


```
public class  l {
    public static void main (String args[]){
        
      
        for(int i=1; i<11; i++) {
            for (int j=1;j<11;j++) {
          
          if( i==j || i+j==10)
          {
              System.out.print("*");
          }
          else{
         
          System.out.print(" ");
          
          }
         
            }
        }
        }
}
```

ich hab mir das aufgemalt und habe festgestellt, dass immer wenn i=j ist und wenn i+j=10 ergeben muss da ein "*" hin.
hoffe ihr könnt mir weiterhelfen.


----------



## Landei (23. Mrz 2012)

Der Ansatz ist richtig, es fehlen nur die Zeilenumbrüche. Am einfachsten ein [c]System.out.println();[/c] nach der inneren Schleife (also hier zwischen Zeile 20 und 21).

Ordentliche Einrückungen machen das ganze übrigens wesentlich übersichtlicher - normalerweise kann das die IDE deines Vertrauens.


----------



## babuschka (23. Mrz 2012)

und wenn man ein Schachbrett als Muster darstellen will , also ein Platz soll leer sein und der Platz nebendran  mit "*"(wie ein Schachbrett , schwarz-weiß)

mein ansatz wäre , dass man mit Modulo arbeiten muss

hoffe ihr könnt mir weiterhelfen


----------



## SlaterB (23. Mrz 2012)

> hoffe ihr könnt mir weiterhelfen 

ohne anderes auszuschließen aber nur für den Fall dass du die eine Variante schon wieder vergessen hast  :
ja, modulo klingt gut, baue was oder stelle konkrete Fragen, dann kann dazu was gesagt werden,
andersrum weniger


----------



## babuschka (23. Mrz 2012)

```
public class l {
    public static void main (String args[]){
        
      
        for(int i=10; i<10; i++) {
            for (int j=10;j<10;j++) {
       
      if(i%j==0)      	
      {  	
        System.out.print("*");            	
           
            }
      else
      {
    	  System.out.print(" ");
            }
     
    
        System.out.println("*");  
        }
}
}
}
```

das wäre mein vorschlag , allerdings krieg da  nix raus :-(
habt ihr vielleicht auch tipps , wie man generell bei solchen aufgaben vorgeht ??


----------



## SlaterB (23. Mrz 2012)

for(int i=10; i<10; i++) {
macht gar nix, fange vielleicht mit einer Zeile an, das ist immer leichter als gleich 2D

Tipps:
viel mehr als 
> ich hab mir das aufgemalt und habe festgestellt, dass immer wenn i=j ist und wenn i+j=10 ergeben muss da ein "*" hin.
und allgemeines Denken kann man wohl nicht machen,
wie dann i%j==0 eine Bedeutung haben soll erscheint als Rätsel, ist wohl doch eher blind geraten?

irgendwas % 2 == 0 ist für 'abwechselnd' interessant


----------



## babuschka (23. Mrz 2012)

hmm komme nicht weiter............................


----------



## babuschka (23. Mrz 2012)

kann es sein dass man gar kein 2d braucht? sondern nur eine forschleife?


----------



## SlaterB (23. Mrz 2012)

wie Landeis Beispiel zeigt, gilt das strukturell immer, hier kann es durchaus leichter als eine Doppelschleife sein, stimmt,

wo auch immer du hängst, was auch immer deine Probleme oder Ideen sind, 
sofern du dich nicht mitteilst kannst du nur auf Musterlösungen hoffen, falls die jemand postet


----------



## babuschka (23. Mrz 2012)

mein problem ist mein ansatz:
wenn meine reihe gerade ist, dann soll er an allen ungeraden zahlen " * " hinzufügen.
wenn meine reihe ungerade ist, dann soll er an allen geraden zahlen ein " * " hinzufügen.

oder?


----------



## ARadauer (23. Mrz 2012)

ja und was ist das problem?


----------



## SlaterB (23. Mrz 2012)

eine wichtige Überlegung, ja

wenn du Code dazu hättest..,
wie gesagt wäre schon gut, eine Zeile zu schaffen


----------



## babuschka (23. Mrz 2012)

das problem ist, dass ich nicht weiss , wie ich das in nem Code schreibe


public class l {
    public static void main (String args[]){


        for(int i=10; i>0; i++) {
        	if(i%2==0)
        	{


also wenn meine reihenzahl gerade ist --> ( if(i%2==0) ) , soll er an allen ungeraden stellen ein "*" hinzufügen
nur wie schreib ich das in nem code


----------



## ARadauer (23. Mrz 2012)

wann ist eine zeile gerade und wann eine spalte?
boolean zeileGerade = ...
boolean spalteGerade =...

"wenn meine reihe gerade ist, dann soll er an allen ungeraden zahlen " * " hinzufügen."
ja dann mach das...

if(zieleGerade){
 if(spalteGerde{
    mach was;
}else{
 mach was... usw...
}


Ich versteh dein Problem nicht....


----------



## ARadauer (23. Mrz 2012)

ako hat gesagt.:


> nur wie schreib ich das in nem code


du weißt wie du herausfindest dass deine zeile gerade ist abe mit der spalte hast du probleme...

mal ganz langsam...

```
public class Test {

    public static void main(String[] args) {
        for (int i = 1; i < 11; i++) {
            for (int j = 1; j < 11; j++) {
                boolean zeileGerade = i % 2 == 0;
                boolean spalteGerade = j % 2 == 0;
                char zeichen = ' ';
                if (zeileGerade) {
                    if (spalteGerade) {
                        zeichen = '*';
                    }
                    else {
                        zeichen = ' ';
                    }
                }
                else {
                    if (spalteGerade) {
                        zeichen = ' ';
                    }
                    else {
                        zeichen = '*';
                    }
                }
                System.out.print(zeichen);

            }
            System.out.println("");
        }

    }
```


----------



## babuschka (23. Mrz 2012)

geht das auch ohne boolean?

also ich hätte es so:

```
public class l {
    public static void main (String args[]){
        
      
        for(int i=0; i<10; i++)
        {
        for(int j=0;j<10;j++)
       {
        if(i%2==0 || j%2==0 )
        	{
        	System.out.print(" * ");	
     }
        else{
        	System.out.print(" ");
        }
        }
        }
    }
}
```


----------



## SlaterB (23. Mrz 2012)

viele if/else mit Bedingung drin ersparen boolean

i%2==0 oder auch das andere einzeln bieten ansonsten nicht genug Information,
der nächste Trick ist nun, die Zahlen zusammenzuführen, wie sehen i+j, i*j, i*10+j (was denn der eindimensionalen Schleife entspräche) und ähnliche Kombinationen aus,
kann man von diesen Zahlen direkt modulo 2 rechnen so dass es in allen Zeilen klappt?
das ist vorher ohne ähnliche Kenntnisse kaum zu sagen, einfach im Programm ausprobieren bzw. auf Papier anschauen

(i%2==0) + (j%2==0) wäre natürlich auch eine Kombination die man anschauen könnte,
Informationen verknüpfen oder einzeln auswerten


----------



## babuschka (23. Mrz 2012)

Eine Frage:

Ist es immer so , dass die Variable der ersten Forschleife mir sagt, wie weit rechts ich bin und die Variable der zweiten forschleife sagt mir , wie weit unten ich bin?


----------



## SlaterB (23. Mrz 2012)

doch wohl eher andersrum und hier quasi unumgänglich, da du die Zeilen nacheinander ausgibst, da muss die äußere Schleife die Zeilen sein (oben/ unten)

wenn du alles erst in Variablen wie Strings sammelst kannst du beliebig vorgehen


----------



## babuschka (23. Mrz 2012)

ARadauer hat gesagt.:


> du weißt wie du herausfindest dass deine zeile gerade ist abe mit der spalte hast du probleme...
> 
> mal ganz langsam...
> 
> ...



also bis zeile 16 ist alles klar , das könnte man ja auch ohne boolean machen, aber weiter ab zeile17 versteh ichs nicht mehr, wieso du wieder mit if spalte gerade und so anfängst


----------



## SlaterB (23. Mrz 2012)

das if in Zeile 9 unterscheidet zwischen dein beiden Zeilenarten, Zeile gerade oder ungerade, 
werden ja verschieden behandelt wie du selber mal festgestellt hast
die inneren Blöcke 10-15 und 18-23 sind dann fast gleich aufgebaut aber agieren doch etwas anders, da das ja gerade das Ziel ist,


----------



## Landei (23. Mrz 2012)

Für ein Schachbrettmuster kannst du [c](i + j) % 2 == 0[/c] oder [c]((i + j) & 1) == 0[/c] nehmen.


----------



## babuschka (23. Mrz 2012)

```
public class l {
 
    public static void main(String[] args) {
        for (int i = 1; i < 11; i++) {
           for(int j=1;j<11;j++){
        	  
        	   if( (i + j) % 2 == 0)
        	   {
        		   System.out.print("*");
        	   }
        	   else{
        		   System.out.print(" ");
        	   }
           
        	   System.out.println();
           
        }
        
    }
}
    
}
```
könntest du mir bitte sagen, was falsch ist?


----------



## ARadauer (23. Mrz 2012)

Wozu machst du das eigentlich?
Studierst du?


----------



## babuschka (23. Mrz 2012)

ja ich schreibe am dienstag meine letzte info-klausur
dannach nie wieder info
respekt vor den leuten , die es können!


----------



## SlaterB (23. Mrz 2012)

du hast doch bisher schon einiges nachgedacht, wo ist das Problem?
1. Schritt: es sind offensichtlich zu viele Zeilenumbüche,
2. Schritt: nimm das System.out.println(); raus, 
zwar auch noch nicht fertig, aber nun überlege mal in Ruhe wann wo warum ein System.out.println(); nützlich wäre,
vergleich das auch mit vorherigen Programmen, wo stand es dort, mit Bedingungen verknüpft oder wie sonst?
warum war dort nicht jedes Zeichen einzeln?


----------



## babuschka (23. Mrz 2012)

die geschweifte klammer war falsch gesetzt
habs jetzt endlich 
danke leute


----------



## ARadauer (23. Mrz 2012)

du musst das System.out.println(); eine schleife nach aussen geben
du machst nach jedem zeichen einen zeilenumbruch



> respekt vor den leuten , die es können!


ich weiß nicht, wenn du 5 Beispiele nach dem gleichen schema hast und da passiert beim 6. was was dir beim 2. und 3. schon passiert ist und da kannst es selbst nicht lösen... mhn das hat nix mit können zu tun, das ist nur faulheit ;-)


----------



## babuschka (23. Mrz 2012)

also jetzt werd ichs mir auf jedenfall merken....
aber so richtig verstanden hab ichs immer noch nicht,wieso ausgerechnet da ein zeilenumbruch kommt^^


----------



## Landei (23. Mrz 2012)

Mache dir nochmal genau klar, wofür die Schleifen stehen:


```
Für Zeile i tue das Folgende {
  Für Zeichen j (in Zeile i) tue das Folgende {
     male das Zeichen
  }
  Zeilenumbruch
}
```

Dann sollte klar sein, dass am Ende jeder Zeile (nicht jeden Zeichens) ein Umbruch kommen muss.


----------



## babuschka (24. Mrz 2012)

```
public class k{
public static void main (String[]args){
for (int i=1;i<10;i++) {
for (int j=0;j<i;j++) {
System.out.print("*"); 
}
System.out.println();

}
}
}
```
Das wäre der Code für dieses Muster:
*
**
***
****
*****
******
*******
********
*********

könnte mir jemand sagen , wie der Code aussieht wenn ich das dreick vertikal spiegeln möchte?
Danke!


----------



## babuschka (24. Mrz 2012)

```
public class  l {
    public static void main (String args[]){
        
       
        for(int a=0; a<10; a++) {
            for (int b=0;b<10;b++) {
                if(b<a){
                    System.out.print(" ");
                }
                else {
                    System.out.print("*");
                }
            
            }
            System.out.println();
            
        }
        
    }
    
}
```

geht das auch ohne die if und else abfragen ???
so wie beim ursprungsdreieck?


----------



## Gast2 (24. Mrz 2012)

Klar geht das auch ohne if-else. Du könntest das if durch nen ternären operator verstecken. Oder die Anzahl der whitespaces und Sternchen für jede Zeile berechnen, oder...


----------



## babuschka (24. Mrz 2012)

naja von dem , was du da grad sagst, hatten wir noch nix im unterricht gehabt...
aber ne andere möglichkeit gibts nicht??? ohne if-else,halt nur mit diesen 2 for schleifen??


----------



## Wirago (24. Mrz 2012)

ako hat gesagt.:


> könnte mir jemand sagen , wie der Code aussieht wenn ich das dreick vertikal spiegeln möchte?
> Danke!



im prinzip musst du das dreieck quasi 2x zeichnen nur eben invertiert quasi. das sieht dann ca so aus


```
for (int i=1; i<=zeilen; i++)
	{
		for (int x=i; x<zeilen; x++)
			System.out.print(" ");
		
		for (int x=1; x<=((i*2)-1); x++)
			System.out.print("+");
		
		
		System.out.println();
	}
```


----------



## babuschka (24. Mrz 2012)

einfacher gehts nicht??? NAJA wenn man dieses dreieck jetzt horizontal spiegeln will hättet ihr auch nen code dazu?
am besten ohne if-else , aber wenns ohne if-else noch schwieriger wird, dann reicht es auch schon mit if-else...
komme da nicht weiter- 
also das dreieck :

```
public class  l {
    public static void main (String args[]){
        
       
        for(int a=0; a<10; a++) {
            for (int b=0;b<10;b++) {
                if(b<a){
                    System.out.print(" ");
                }
                else {
                    System.out.print("*");
                }
            
            }
            System.out.println();
            
        }
        
    }
```

horizontal spiegeln


----------



## Wirago (24. Mrz 2012)

wie? "Einfacher gehts nicht??" is doch nur n flotter 5-zeiler ^^

anders rum isses genauso, nur dass du halt nicht bei i=1 beginnst sondern eben bei i=10 (bei 10 zeilen) und dekrementierst bis auf 1 runter

dann hast halt so ne raute:


```
zeilen = 5;
		
		for (int i=1; i<=zeilen; i++)
		{
			for (int x=i; x<zeilen; x++)
				System.out.print(" ");
			
			for (int x=1; x<=((i*2)-1); x++)
				System.out.print("+");
			
			
			System.out.println();
		}
		
		for (int i=(zeilen-1); i>=1; i--)
		{
			for (int x=(zeilen-i); x>=1; x--)
				System.out.print(" ");
			
			for (int x=1; x<=((i*2)-1); x++)
				System.out.print("+");

			System.out.println();
		}
```

PS:
so n "spoiler"-tag wäre super ^^

Edit:
ok... spoiler gibts eh... sry


----------



## Gast2 (24. Mrz 2012)

Gibts:


Spoiler: Klick mich



http://www.java-forum.org/forum-faq-beitraege/80991-bbcode-textauszeichnung-forum-2.html#post873544


----------



## babuschka (24. Mrz 2012)

Nein, ich mein , wenn ich z.B. dieses Dreieck erstellen will:
*
**
***
****
*****
******
*******
********
*********
Dann ist mein Code ganz einfach:

```
public class muster{
public static void main (Strings[]args){

for(int i=0;i<10;i++) {
for(int j=0;j<i;j++) {
System.out.print("*");
}
System.out.println();
}
}
}
[/Java]

Hier habe ich keine IF,Else usw. sondern nur meine forschleifen und meine ausgaben.
Und wenn ich das jetzt vertikal spiegeln will,gibt da keine so einfache möglichkeit , wie hier?
Einfach 2 forschleifen und ausgaben....
Hoffe ihr könnt helfen :-)
```


----------



## Landei (24. Mrz 2012)

Der Unterschied ist doch, dass du dann Leerzeichen vor den Sternen brauchst. Mit der aktuellen Version schenkst du dir die Leerzeichen hinter den Sternen -  weil die ja eh niemand sieht


----------



## Landei (24. Mrz 2012)

Als ich in meinem Gerümpel-Projekt nach "Stern" gesucht habe, kam übrigens das zum Vorschein 


```
public static void sterne(int zeilen) {
        for(int i = 1; i <= zeilen*(zeilen+1)/2; i++) {
            int r = (int) Math.sqrt((i<<3)+1);
            System.out.print(r*r == (i<<3)+1 ? "*\n" : "*");
        }
    }

   public static void main(String... args) {
       sterne(16);
   }
```

Rube Goldberg wäre stolz auf mich!


----------



## babuschka (24. Mrz 2012)

Hahahah :-D
Das heisst , nur weil ich das Dreieck vertikal spiegeln will , muss ich viele Zeilen dazu schreiben :-(.
Dachte es geht auch einfacher ^^


----------



## babuschka (24. Mrz 2012)

Hää also mit dem wird das dreieck garnicht vertikal gespiegelt...sondern ich kriege ne pyramide


```
for (int i=1; i<=zeilen; i++)
    {
        for (int x=i; x<zeilen; x++)
            System.out.print(" ");
        
        for (int x=1; x<=((i*2)-1); x++)
            System.out.print("+");
        
        
        System.out.println();
    }
```


----------



## Landei (24. Mrz 2012)

Na ja, bei dem ganzen Dreieckszeug wäre es hilfreich, eine Methode zu haben, die dir x-mal den Buchstaben y liefert, etwa so (aus'm Kopp - ohne Gewähr):


```
public static String repeatChar(int x, char y) {
  char[] array = new char[x];
  java.util.Arrays.fill(array, y);
  return new String(array);
}
```


----------



## babuschka (24. Mrz 2012)

Ne passt schon , aslo ich meinte das hier: habs jetzt hinbekommen ;-)

```
public class  g {
    public static void main (String args[]){
        
     
        for(int a=0; a<10; a++) {
            for (int b=0;b<10;b++) {
                if(b<a){
                    System.out.print (" ");
                }
                else {
                    System.out.print("*");
                }
            
            }
            System.out.println();
            
        }
        
    }
}
```


----------



## Landei (24. Mrz 2012)

Das geht ungefähr so:


```
for (int i=0; i < zeilen; i++) {
        for (int x = 0; x< i; x++)
            System.out.print(" ");
        
        for (int x = i; x < zeilen; x++)
            System.out.print("+");
        
        
        System.out.println();
}
```


----------

