Laden...

Testen ob Zahl gerade

Erstellt von MisterXY vor 18 Jahren Letzter Beitrag vor 18 Jahren 15.893 Views
M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren
Testen ob Zahl gerade

Hi,

es ist zwar in Java aber ich denke das macht keinen großen unterschied.
Ich möchte testen, ob die Zahl gerade ist, aber irgendwie springt er nicht in die if-anweisung.

	for (int i = 0; i < 64; i++) {  
		if (i%2 == 1) {  
			flaeche.setBackground(Color.black);  
			frame.add(flaeche);  
		}   
		else {  
			frame.add(flaeche);  
		}  
	}  

Danke!

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo MisterXY,

mit i%2 == 1 testest du, ob die Zahl ungerade ist, aber sonst ist es ok.

herbivore

M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren

Viell. habe ich denn dann nen denkfehler drin, denn ich möchte nen Schachbrett erstellen, aber irgendwie erhalte ich in der ersten Reihe nur Schwarze und in allen anderen Reihen nur weiße Felder.

public class SchachbrettMuster extends java.awt.Frame {


public static void main(String[] args) {
		Frame frame = new Frame();
		frame.setSize(800, 800);

		Canvas flaeche = new Canvas();
		flaeche.setSize(8, 8);

		for (int i = 0; i < 64; i++) {
			if (i%2 == 1) {
				flaeche.setBackground(Color.black);
				frame.add(flaeche);
			} 
			else if (i == 1) {
				flaeche.setBackground(Color.black);
				frame.add(flaeche);
			}
			else {
				frame.setBackground(Color.white);
				frame.add(flaeche);
			}
		}

		GridLayout layout = new GridLayout(8,  8);
		frame.setLayout(layout);
		frame.setVisible(true);

	}

}


Ist aber Java 🙂

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo MisterXY,

das 'else if' ist zuviel.

herbivore

M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren

Dachte ich auch zuerst, aber daran liegt es nicht!

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo MisterXY,

sorry, aber es liegt daran. Aber das alleine reicht nicht, du musst noch dafür sorgen, dass in ungraden Zeilen die ungeraden und in geraden die geraden Felder schwarz werden.

herbivore

M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren

Habe den else - if Zweig herausgenommen und das selbe Problem besteht weiterhin.

Ich weise doch mit setBackground(Color.black) die farben der Felder zu.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo MisterXY,

mit


for (int i = 0; i < 64; i++) {
   if (i%2 == 1) {
      flaeche.setBackground(Color.black);
   } else {
      frame.setBackground(Color.white);
   }
   frame.add(flaeche);
}

werden die Felder abwechseln schwarz und weiß gefärbt. Da kannst du mich wohl auch nur schwer von Gegenteil überzeugen. Jetzt musst du nur noch, wie ich schon sagte, dafür sorgen, dass das bei graden und ungraden Zeilen wechselt.

Dafür könnte die Abfrage z.B. so aussehen (ungetestet):

(i+(i+1)/8)%2 == 1

Wenn dadurch das linke untere Feld weiß statt schwarz ist, nimm

(i+(i+1)/8)%2 == 0

herbivore

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo zusammen!

Da ich Schachspieler bin, interessiert mich das schon ein Wenig 😉

Aber ich frage mich immer noch, warum so ein kompliziertes Zählverfahren gewählt worden ist.

Wenn ich das Schachbrett in X und Y Koordinaten unterteile, dann kann ich doch mit einer einfachen Abfrage feststellen, ob Schwarz oder Weiß:



if ( (x%2 == 0) || (y%2 == 0) )
{
   // weiß
}
else
{
   // schwarz
}


Jetzt brauch ich nur noch eine ineinandergeschachtelte for Schleife, dass ich insgesamt auf die 64 Felder komme:



for (x=1; x <= 8; x++)
{
   for (y=1; y <= 8; y++)
   {
      // hier Feld erstellen
   }
}


Oder sehe ich das irgendwie falsch?

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo norman_timo,

Oder sehe ich das irgendwie falsch?

Ja! 😃 Dein Schachspiel wird überwiegend weiß sein.

Aber ich frage mich immer noch, warum so ein kompliziertes Zählverfahren gewählt worden ist.

Kompliziert?

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
Kompliziert?

herbivore

So ist's kompliziert 😁




			//Anzahl Felder 
			int intAnzFelder=64;
			//Wieviele Felder pro Linie
			int intAnzProLine=(int)Math.Sqrt((double)intAnzFelder);
			//Gegenprüfung
			if (Math.Pow(intAnzProLine,2D)!=intAnzFelder)
			{
				throw new Exception("Das ist aber ein komisches Quadrat");
			}

			//Wieviele haben auf 2 Linien Platz (ab dann wiederholt sich ja das ganze)
			int intAnzDoppelt=intAnzProLine*2;

			for (int i=0;i<intAnzFelder;i++)
			{
				string strColor=(i%intAnzDoppelt>=intAnzProLine) ^ i%2==0 ?"Black":"White";
				System.Diagnostics.Debug.WriteLine(string.Format("Feld: {0} {1}",i.ToString(),strColor));
			}



Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

563 Beiträge seit 2004
vor 18 Jahren

studier es halt 🙂 es ist übrehaupt nicht kompliziert, sondern genial 🙂

4.221 Beiträge seit 2005
vor 18 Jahren

Original von .unreal
studier es halt 🙂 es ist übrehaupt nicht kompliziert, sondern genial 🙂

Find ich auch 8) aber vorallem Anfänger habe nach dem Lesen einen Knoten in den Hirnwindungen 😁

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

563 Beiträge seit 2004
vor 18 Jahren

mit nur anschauen wird man nicht schlau, hirn einschalten und dann klappts... ich merk das wenn ich müde bin.. dann guck ich den code nur an, studiere aber nicht viel, kapiere darum auch fast nix (:

4.221 Beiträge seit 2005
vor 18 Jahren

Original von .unreal
mit nur anschauen wird man nicht schlau, hirn einschalten und dann klappts...

Oder Step by Step im Debugger anschauen dann wird's auch klar 🙂

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

563 Beiträge seit 2004
vor 18 Jahren

ich glaube, dass er mit kompliziert die formel meinte... diese kann man nicht sehr gut mit dem debugger verfolgen...

4.221 Beiträge seit 2005
vor 18 Jahren

Original von .unreal
ich glaube, dass er mit kompliziert die formel meinte... diese kann man nicht sehr gut mit dem debugger verfolgen...

Er hat sich wohl eher auf den vorher geposteten Code bezogen.... und ich habe das Kompliziert ? als Herausforderung gesehen die ganze Formel mit nur einem Loop auf einer Zeile darzustellen....

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Programmierhans,

hm, irgendwie verstehe ich das nicht mehr ganz. Mein Code von oben arbeitet auch nur mit einer Schleife und quasi einer Zeile in der Schleife (denn statt meiner if-Abfrage könnte man auch eine bedingte Bewertung verwenden und schwupps, wäre es eine Zeile). Und irgendwie erscheint mir auch mein Code einfacher als deiner - ok das ist natürlich Ansichtssache. Also ist dein Code - nach meiner Einschätzung - weder kürzer noch einfacher. Wo war da die Herausforderung?

Da ich weiß, dass du wenig Unsinn machst, übersehe ich wohl was. Ich weiß nur nicht was.

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren

@herbivore

Deine Lösung ist natürlich mindestens so elegant wie meine 🙂... mich hat einfach das +1 irgendwie gestört (man möge mir dies verzeihen)...

string strColor=(i+(i+1)/intAnzProLine)%2 == 1 ?"Black":"White";

Wobei ich den Sinn der Formel auch erst im zweiten Rutsch erkannt habe.

Es gibt so viele Variationen welche alle zum Ziel führen 🙂

string strColor=(i+1)/intAnzProLine %2 == 1 ^ i%2==1?"Black":"White";

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Programmierhans,

mich hat einfach das +1 irgendwie gestört

Damit hast du ganz recht! Das +1 ist falsch. 😃

So müsste es richtig sein: (i+i/8)%2 == 1

herbivore