benimus schrieb:
Also,
warum wird "char" und "'A'+y" in Klammern geschrieben?
Die Streams, wie cout, sind klug und erkennen den Datentyp von Sachen, die sie ausgeben sollen. So werden Datentypen, die Zahlen repraesentieren (wie z.B. int) auch als Zahl ausgegeben und solche, die Buchstaben repraesentieren (wie z.B. char) als Buchstabe.
Fuer den Computer sind Zahlen und Buchstaben aber eigentlich das gleiche. Man kann daher mit Buchstaben auch rechnen (das kommt bei deinen anderen Fragen vor). In C++ ist aber vorgeschrieben, dass alle Rechnungen mindestens mit der Genauigkeit des Datentyps int durchgefuehrt werden (siehe zum Beispiel hier). Das Ergebnis einer solchen Rechnung ist daher (mindestens) auch int, selbst wenn man nur mit chars gerechnet hat. Der Stream wuerde daher einen int sehen und versuchen, das Ergebnis als Zahl auszugeben. Man moechte hier aber eine Ausgabe in Form von Buchstaben haben. Daher muss man das Ergebnis der Rechnung wieder zum Datentyp char machen. Das ist, was hier geschieht. Das nennt man einen Cast.
Ein paar Bemerkungen dazu:
-Es gibt zwei verschiedene Syntax fuer Casts, die alte C-Syntax, die hier benutzt wurde, und die neue C++-Syntax. Bei der C-Syntax schreibt man einfach den gewuenschten Datentyp in Klammern vor den Ausdruck. Bei der C++-Syntax muss man genau angeben, welche Art von Cast man wuenscht (es gibt verschiedene - siehe Lehrbuch) und welchen Typ man haben moechte. In C++-Syntax wuerde hier static_cast<char>('A'+y) stehen.
-Auch wenn die C++-Syntax zunaechst umstaendlich aussehen mag, hat sie zwei Vorteile: 1. Man weiss ganz genau, was passiert. Da es verschiedene Arten von Casts gibt, kann es nicht passieren, dass man versehentlich die falsche waehlt. 2. Man sieht sofort, dass ein Cast passiert und man kann auch theoretisch mit einem Editor damit suchen. Die C-Casts gehen hingegen im Quellcode leicht unter.
-Der C-Cast hat hingegen den Vorteil, bei unproblematischen Casts, wie diesem hier, kuerzer zu sein.
-Anfaenger tendieren dazu, Probleme weg zu casten. Gerade mit den C-Casts kann man fast jede Compilerwarnung oder -fehler beheben, wenn man bloss genug rum probiert. Aber es ist keine echte Loesung. In den meisten Faellen bedeutet ein Cast naemlich bloss, dass der Compiler gefaelligst den Code so akzeptieren soll, wie er ist, auch wenn er falsch aussieht. Das macht einen falschen Code aber nicht richtig. Im echten Leben braucht man Casts eher selten, wenn man ganz bestimmte Effekte erzielen moechte, die so von der Sprache nicht direkt vorgesehen sind. Der Cast hier ist ein Beispiel dafuer, ein anderes, welches einem oefters begegnet, ist der Cast einer Ganzzahl in eine Fliesskommazahl, wenn man zwei Ganzzahlen dividieren moechte, aber keine Ganzzahldivision wuenscht.
Warum wird von der Eingabe der Wert 'A' bzw '1' abgezogen?
Damit man besser damit rechnen kann. Wie schon gesagt, sind Zeichen fuer den Computer auch nur Zahlen. Aber das Zeichen '1' hat nicht notwendigerweise den Zahlenwert 1 (das waere sogar sehr ungewoehnlich). Es ist aber garantiert, dass die Zeichen fuer '0', '1', '2', usw. aufeinander folgende Werte haben. Das heisst, wenn man von der Ziffer '0' das Zeichen '0; abzieht, bekommt man den Wert 0. Wenn man von '1' das Zeichen '0' abzieht, bekommt man den Wert 1, wenn man von '2' das Zeichen '0' abzieht, bekommt man 2, usw.
Hier wurde statt der '0' das Zeichen '1' abgezogen, da die Beschriftung des Spielfelds mit einer '1' anfaengt, man dieser aber den Arrayindex 0 zuordnen moechte.
Aehnlich ist das mit den Buchstaben des Alphabets. Es ist zwar nicht vom Sprachstandard garantiert, dass 'A', 'B', 'C', usw. hintereinander liegen, aber bei jedem halbwegs normalem System ist das so.
Beachte, wie ich Zeichen und Zahlen voneinander unterscheide: '1' ist das Zeichen fuer die Ziffer "Eins". 1 ist die Zahl "Eins". So wird es auch im Quellcode gemacht.
Was genau hat die darauf folgende Schleifenbedingung zu bedeuten? Soweit ich das erkennen kann dürfen die eingegebenen x und die y- Koordinaten nur größer gleich null sein, aber warum müssen sie kleiner als X(=9) oder Y(=7) sein?
Weil das Spielfeld 9x7 Kaestchen gross ist.
Und was bewirkt das Ausrufezeichen vor der Variable "Schleifenende" in der Schleifenbedingung?
Das ist eine logische Verneinung. Ein verneinter Ausdruck wird wahr, wenn er unwahr ist und umgekehrt.