# Schachbrett Ausgabe



## friedadt (17. Jan 2016)

Hallo zusammen,

brauche bei folgender Hausaufgabe Hilfe:



> Schreiben Sie ein Programm Chessboard das eine ganze Zahlen als Kommandozeilenparameter akzeptiert und ein Schachbrett dieser Größe ausgibt.
> 
> Statt der Farben Weiß und Schwarz verwenden Sie die Symbole - und +. Das erste ausgegebene Symbol muss ein - sein.
> 
> Die Symbole wechseln dann jeweils ab, so dass nie zwei gleiche Symbole direkt neben- oder untereinander stehen. Geben Sie nach jedem Symbol *außer* dem letzten in einer Zeile ein Leerzeichen aus.



Krieg das mit dem Leerzeichen in einer Zeile nicht hin... Kann mir jemand nen Tipp geben wo es bei mir hakt oder was ich verbessern kann??


```
class Chessboard {
   public static void main(String[] args) {
      int a = Integer.parseInt(args[0]);
      int k = 1;
      int i = 1;
      while (k <= a) {
         k++;
         i = 1;
         while (i <= a) {
            i++;
            if ((i + k) % 2 != 0) {
               System.out.print("+");
            } else {
               System.out.print("-");
               System.out.print(" ");
            }
            System.out.print("\n");
         }
      }
   }
}
```

PS: Aus Versehen falschen Betreff geschrieben


----------



## kneitzel (18. Jan 2016)

Also Dein Problem ist, dass bei Dir das Leerzeichen hinter jedem Zeichen ausgegeben wird, also auch nach dem letzten.

Wie kannst Du denn prüfen, ob es das letzte Zeichen in der Zeile ist? Was für Möglichkeiten hast Du in Java, dies zu prüfen?

Konrad


----------



## friedadt (18. Jan 2016)

ja, genau. 

ich komm einfach nicht drauf! ist wahrscheinlich eine if-anweisung oder?


----------



## kneitzel (18. Jan 2016)

Ja genau. Mit if kann man eine Bedingung überprüfen. Woran erkennst Du denn, dass Du das letzte Zeichen geschrieben hast? In der while Schleife prüfst Du ja i<=a - welchen Wert hat denn i in dem letzten Schleifendurchgang? Achte dabei darauf, dass Du i direkt am Anfang erhöhst!


----------



## friedadt (18. Jan 2016)

Erstmal Danke für Deine Hilfe...

Ich komme einfach nicht drauf! 

i hat im letzten Durchgang den gleichen Wert wie a, oder?

Muss ich "i++" woanders platzieren bzw. welche Zeile stimmt denn hier nicht?


----------



## kneitzel (18. Jan 2016)

Also ich würde das i++ eher ans Ende der While-Schleife setzen. Aber das spielt keine wirkliche Rolle.

Genau - im letzten Durchgang ist i=a. Aber das stimmt nur am Anfang der While-Schleife. Dann kommt ja das i++ so dass i = a+1 ist.

Nun soll das Leerzeichen immer ausgegeben werden außer am Ende der Zeile. i ist immer kleiner, also hast Du doch jetzt die Prüfung zusammen bekommen.

i <= a ist die Bedingung, die erfüllt sein muss, um das Leerzeichen auszugeben. (Wäre i noch nicht erhöht worden, dann wäre es i < a, aber durch die Erhöhung am Anfang ändert sich das halt auf i <= a).

Und den Befehl für so eine Bedingung hast Du ja auch schon richtig benannt: if. Also ein "if (bedingung) befehl" wäre die Syntax, die Du verwenden musst.


----------



## friedadt (18. Jan 2016)

Nochmals vielen Dank für Deine Hilfe... Weiß ich zu schätzen 

Ich befürchte ich steh voll aufm Schlauch! 

Brauch doch folgende Anweisung: If (a == 0) ... aber wie gehts weiter?


----------



## Joose (18. Jan 2016)

Warum "a == 0"? Du willst doch hinter dem letzten Zeichen kein Leerzeichen mehr ausgeben oder? 
Die Variable "i" läuft von 1 an bis "i <= a". Sprich "a" ist der höchste Wert den "i" erreichen kann.


----------



## friedadt (18. Jan 2016)

Sorry, meinte eigentlich folgendes: if (a == i)

Wenn i den Wert von a erreicht, soll kein Leerzeichen mehr ausgegeben werden.


----------



## friedadt (20. Jan 2016)

Kann mir keiner helfen?

Hätte noch eine Frage zum Leerzeichen nach dem "+" - wie kommt das da hin? Der Code gibt doch nur ein Leerzeichen nach dem "-" aus...


----------



## kneitzel (20. Jan 2016)

a) Wenn die Ausgabe nur nach dem "-" erfolgt: Wo müsste der Ausgabe Befehl stehen, damit es nach Ausgabe vom "+" oder "-" ausgeführt wird?
b) Wo müsste der Zeilenumbruch hin? 
c) Wenn Du einen Befehl ausführen willst wenn eine Bedingung erfüllt ist (oder nicht erfüllt ist) Welchen befehl setzt Du dann wie ein?

Wir geben Die nicht die Lösung vor. Wenn Du es absolut nicht hin bekommst, dann musst Du entweder dem Lehrer sagen, dass Du da Inhalte aus dem vorhergehenden Unterricht nicht verstanden hast (dann erklärt er es evtl. noch einmal) oder Du musst mal ein Buch darüber lesen oder so. (Und stammt der Code, den Du da hast, von Dir? Fällt mir schwer das zu glauben. Evtl. falsch abgeschrieben und eine } ist an die falsche Stelle gerutscht?)

Konrad


----------



## friedadt (23. Jan 2016)

kann mir bitte jemand helfen bei der Aufgabe...


----------



## JStein52 (24. Jan 2016)

Hallo,

du hattest es ja fast richtig. Aber die Ausgabe des Zeilenvorschubs war in der falschen Schleife. Und ich finde es auch lesbarer wenn du da for-Schleifen verwendest. Jetzt fehlte in der Spalten-Schleife noch die Abfrage ob du am Ende der Schleife bist. Ich habe es dir mal ein bisschen lesbarer geschrieben:


```
public class Chessboard {

    public static void main(String[] args) {
        int a = Integer.parseInt(args[0]);
        for (int zeile = 0; zeile < a; zeile++) {
            for (int spalte = 0; spalte < a; spalte++) {
                if ((zeile + spalte) % 2 != 0) {
                    System.out.print("+");
                } else {
                    System.out.print("-");
                }
                if (spalte < (a - 1)) // solange wir noch nicht am Ende der Zeile sind
                {
                    System.out.print(" ");
                }
            }
            System.out.print("\n");
        }
    }
}
```

Du kannst zeile und spalte auch jweils bei 1 anfangen lassen. Dann ändert sich die Endebedingung auf <= a  und die Abfrage auf Zeilenende auf spalte < a !!


----------



## friedadt (24. Jan 2016)

VIELEN DANK!!! Habs endlich gecheckt


----------



## friedadt (24. Jan 2016)

```
public class Chessboard {

    public static void main(String[] args) {

        int a = Integer.parseInt(args[0]);
        int k = 0;
        int i = 0;

        while (k < a) {
            k++;
            i = 0;
            while (i < a) {
                i++;

                if ((i + k) % 2 != 0) {
                    System.out.print("+");
                } else {
                    System.out.print("-");
                }
                if (i <= (a - 1)) {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
}
```

hier mit while schleifen


----------



## JStein52 (24. Jan 2016)

Ja, so gehts auch.  Ich persönlich finde an dieser Stelle eine for-Schleife besser. Ich finde die angebracht wenn man einen Anfangswert, eine Endebedingung und eine Inkrement-Anweisung hat. Das sind ja schliesslich die charakteristischen Elemente einer for-Schleife. Aber egal. Du hast was gelernt dabei.


----------

