Schachbrett Ausgabe

friedadt

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

Java:
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 :)
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

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

kneitzel

Gast
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

Mitglied
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?
 
K

kneitzel

Gast
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

Mitglied
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

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

Mitglied
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...
 
Zuletzt bearbeitet:
K

kneitzel

Gast
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
 

JStein52

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

Code:
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 !!
 
Zuletzt bearbeitet:

friedadt

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

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

Neue Themen


Oben