Muster,Java

babuschka

Top Contributor
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.:)
 
S

SlaterB

Gast
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

Top Contributor
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?
 
S

SlaterB

Gast
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

Top Contributor
Java:
 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
 
S

SlaterB

Gast
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 ;)
 
Zuletzt bearbeitet von einem Moderator:

babuschka

Top Contributor
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..
 
S

SlaterB

Gast
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

Top Contributor
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

Java:
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

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

Java:
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(" ");
          }
            }
        }
        }
}
 
S

SlaterB

Gast
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

Top Contributor
Java:
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...
 
Zuletzt bearbeitet:

babuschka

Top Contributor
Danke Leute :)

Wenn ich ein "X" als Muster erstellen will :

wäre mein ansatz richtig:

Java:
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

Top Contributor
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.
 
Zuletzt bearbeitet:

babuschka

Top Contributor
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
 
S

SlaterB

Gast
> 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

Top Contributor
Java:
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 ??
 
S

SlaterB

Gast
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
 
S

SlaterB

Gast
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

Top Contributor
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?
 
S

SlaterB

Gast
eine wichtige Überlegung, ja

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

babuschka

Top Contributor
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

Top Contributor
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

Top Contributor
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...
Java:
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

Top Contributor
geht das auch ohne boolean?

also ich hätte es so:
Java:
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(" ");
        }
        }
        }
    }
}
 
S

SlaterB

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

babuschka

Top Contributor
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?
 
S

SlaterB

Gast
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

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

mal ganz langsam...
Java:
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("");
        }

    }

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 :(
 
S

SlaterB

Gast
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,
 

babuschka

Top Contributor
Java:
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?
 
S

SlaterB

Gast
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?
 

ARadauer

Top Contributor
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

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

Landei

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

Code:
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

Top Contributor
Java:
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

Top Contributor
Java:
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?
 
G

Gast2

Gast
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

Top Contributor
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

Mitglied
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

Java:
	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

Top Contributor
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 :
Java:
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

Mitglied
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:

Java:
		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 :D
 
Zuletzt bearbeitet:

Neue Themen


Oben