Schachbrett
-
Guten Morgen,
meine momentane Aufgabe besteht ein Schachbrett auszugeben.
Es soll wie folgt aussehen:
A8 B8 C8 . . .
A7 B7 . . .
A6 . . .
. . .
. .
.Mein jetziger Code:
#include<iostream> using namespace std; int main() { char y; // ebenso mit "int" probiert int x; int Zaehler = 0; const char h=72; // ebenso mit "const char h='H'" const int w=8; int Dame; int Schachbrett[h][w]; cout << "Schachbrett" << endl << endl; for (y=65; y<=h; y++) // "y='A'" siehe Zeile 10 { for (x=1; x<=w; x++) { Schachbrett[y][x] = Zaehler; Zaehler++; } } for (y=65; y<=h; y++) // "y='A'" siehe Zeile 10 { for (x=1; x<=w; x++) { cout << Schachbrett[y][x]; /* <--Zahlenreihe, durch "<< endl" 64 zeilen*/ } } cout << endl << endl << "Zaehler: " << Zaehler << endl; cin.get(); return 0; }
Frage 1: Wie gebe ich es wie oben gezeigt aus? (Dachte vllt an eine if-Schleife, bei der er nach 8 Feldern in die nächste Zeile springt, sollte doch aber einfacher gehen, oder?)
Frage 2: Warum wird kein A-H ausgegeben, sondern nur 0-63? (alles probiert, vllt etwas übersehen)
Frage 3: (bezieht sich ebenso auf Frage 2) Wie würde ich es schaffen, dass er mit "1" anfängt und nicht mit "0"?
Habe jetzt viele Foren durchforstet in der letzten Stunde (auch dieses), vieles ausprobiert, steh total aufm Schlauch momentan
Schöne Grüße
Stryke
-
xStrykex schrieb:
Frage 1: Wie gebe ich es wie oben gezeigt aus? (Dachte vllt an eine if-Schleife, bei der er nach 8 Feldern in die nächste Zeile springt, sollte doch aber einfacher gehen, oder?)
Deine verschachtelte Schleife ist schon richtig gedacht. Was nicht stimmt, sind die Indizes. Arrays sind 0-basiert. Also
for (y=0; y<h; y++) { for (x=0; x<w; x++) { cout << Schachbrett[y][x]; } cout << endl; // Zeilenumbruch nach Ausgabe von acht Feldern }
Wieso zum Geier initialisiert du w mit 72? Ein Schachbrett hat doch 8*8 Felder und nicht 8*72.
xStrykex schrieb:
Frage 2: Warum wird kein A-H ausgegeben, sondern nur 0-63? (alles probiert, vllt etwas übersehen)
weil du ein array von Integern hast.
xStrykex schrieb:
Frage 3: (bezieht sich ebenso auf Frage 2) Wie würde ich es schaffen, dass er mit "1" anfängt und nicht mit "0"?
indem du den Zähler mit "1" initialisiert.
-
daddy_felix schrieb:
Wieso zum Geier initialisiert du w mit 72? Ein Schachbrett hat doch 8*8 Felder und nicht 8*72.
Habe im Kopf, dass z.B. "char h=72" bei der Ausgabe ein "H" ausgibt (ASCII eben), oder hab ich da i-was falsch verstanden?
EDIT: ok, jetz gibt er 72 aus, ändere das eben um
EDIT_2: Habe jetzt "char h = 'H'" bzw "int h = 'H'" und Zähler steht immer noch bei 72, weiß nicht, wie ich sonst die Buchstaben A-H ausgeben kann (ausgenommen string), oder kann ich sie mit int initialisieren und eine (sry wenn ich das jetzt falsch sage :p ) impliziten umwandlung machen?
EDIT_3: Habe das x in den for-Schleifen auf 1 gesetzt, Zaehler gibt jetzt aber auf 65 ausdaddy_felix schrieb:
xStrykex schrieb:
Frage 2: Warum wird kein A-H ausgegeben, sondern nur 0-63? (alles probiert, vllt etwas übersehen)
weil du ein array von Integern hast.
Also etwas wie "char Schachbrett[h][w]"?
daddy_felix schrieb:
xStrykex schrieb:
Frage 3: (bezieht sich ebenso auf Frage 2) Wie würde ich es schaffen, dass er mit "1" anfängt und nicht mit "0"?
indem du den Zähler mit "1" initialisiert.
gesagt, getan
Danke
-
daddy_felix schrieb:
for (y=0; y<h; y++) { for (x=0; x < w; x++) /* x<=w , ansonsten wurden 8,16,24,... nicht ausgegeben*/ { cout << Schachbrett[y][x]; } cout << endl; // Zeilenumbruch nach Ausgabe von acht Feldern }
Istm mir grade aufgefallen
-
xStrykex schrieb:
daddy_felix schrieb:
for (y=0; y<h; y++) { for (x=0; x < w; x++) /* x<=w , ansonsten wurden 8,16,24,... nicht ausgegeben*/ { cout << Schachbrett[y][x]; } cout << endl; // Zeilenumbruch nach Ausgabe von acht Feldern }
Istm mir grade aufgefallen
damit erzeugst du dir einen Zugriffsfehler. du benötigst die Indizes 0-7, nicht 0-8.
probierst du überhaupt aus, was du hier postest?
-
daddy_felix schrieb:
xStrykex schrieb:
for (y=0; y<h; y++) { for (x=0; x < w; x++) /* x<=w , ansonsten wurden 8,16,24,... nicht ausgegeben*/ { cout << Schachbrett[y][x]; } cout << endl; // Zeilenumbruch nach Ausgabe von acht Feldern }
Istm mir grade aufgefallen
damit erzeugst du dir einen Zugriffsfehler. du benötigst die Indizes 0-7, nicht 0-8.
probierst du überhaupt aus, was du hier postest?
Natürlich probier ich es aus, und ich weiß, dass es dann mit 0-8, also insgesamt 9 mal gezählt wird, aber ansonsten steht dort:
1234567
9101112131415
...wie kann ich das ändern? bzw es soll ja auch eig
A8-H8
A7-H7 etc.stehen.
Die Frage von mir anschließend war aufdaddy_felix schrieb:
xStrykex schrieb:
Frage 2: Warum wird kein A-H ausgegeben, sondern nur 0-63? (alles probiert, vllt etwas übersehen)
weil du ein array von Integern hast.
xStrykex schrieb:
Also etwas wie "char Schachbrett[h][w]"?
Ich weiß mir dabei nicht zu helfen, sry
-
Bin, nochmal alles durchgegangen, Problem lag daran, dass ich es bei den anderen for-Schleifen vergessen habe zu ändern.
Sieht jetzt so aus:
#include<iostream> using namespace std; int main() { int y; int x; int Zaehler = 1; const int h=8; const int w=8; int Dame; int Schachbrett[h][w]; cout << "Schachbrett" << endl << endl; for (y=0; y<h; y++) { for (x=0; x<w; x++) { Schachbrett[y][x] = Zaehler; Zaehler++; } } for (y=0; y<h; y++) { for (x=0; x<w; x++) { cout << Schachbrett[y][x]; } cout << endl; } cout << endl << endl << "Zaehler: " << Zaehler << endl; cin.get(); return 0; }
Problem 1: Zähler steht noch auf 65 statt 64.
Problem 2: Ausgabe der Felder A8 B8 C8 ... (Wie muss ich den Datentyp für das Array (oder den Array?) wählen?)
EDIT: Problem 2 zur Hälfte gelöst durch
cout << static_cast<char>(y+65) << Schachbrett[y][x];
zweite Hälfte des Problems 2: A1 bis A8, B9 bis B16
Habe es mit return x=0 versucht, jedoch ohne Erfolg, kleiner Tipp?
-
Problem 1: Zähler steht noch auf 65 statt 64. <- Zeile 9?
Problem 2: Division - Rest? oder bits schieben?
-
xStrykex schrieb:
Problem 1: Zähler steht noch auf 65 statt 64.
Initial steht der Zähler auf 1.
Nach dem ersten Schleifendurchlauf steht er auf 2.
Nach dem 64. Durchlauf steht er auf 65.
-
Änderungen sind mit !!! markiert:
#include <iostream> using namespace std; int main() { // int y; !!! Variablen möglichst lokal definieren (s.u.) // int x; int Zaehler = 0; // !!! die Anzahl der belegten Felder ist jetzt 0 const int h=8; const int w=8; // int Dame; // !!! unreferenced local variable int Schachbrett[h][w]; cout << "Schachbrett" << endl << endl; for (int y=0; y<h; y++) { for (int x=0; x<w; x++) { Schachbrett[y][x] = ++Zaehler; // !!! zuerst inkrementieren, dann zuweisen } } for (int y=h; y-->0; ) { for (int x=0; x<w; x++) { const int zeilenNr = (Schachbrett[y][x] - 1) / 8 + 1; // zeilenNr e{1..8} // !!! erst Zeilen-Nr. und Spaltenindes bestimmen const int spaltenIndex = (Schachbrett[y][x] - 1) % 8; // spaltenIndex e{0..7} cout << char('A'+spaltenIndex) << zeilenNr; // !!! } cout << endl; } cout << endl << endl << "Zaehler: " << Zaehler << endl; cin.get(); return 0; }
-
Danke, habs jetzt aber einfacher gemacht und die Lösung ist dieselbe
#include<iostream> using namespace std; int main() { int y; int x; int Zaehler = 0; const int h=8; const int w=8; int Schachbrett[h][w]; int hilfe; cout << "Schachbrett" << endl << endl; for (y=0; y<h; y++) { for (x=0; x<w; x++) { Schachbrett[y][x] = ++Zaehler; } } for (y=0; y<h; y++) { for (x=0; x<w; x++) { cout << static_cast<char>(y+65) << (x+1); } cout << endl; } cout << endl << endl << "Zaehler: " << Zaehler << endl; cin.get(); return 0; }
-
Ich hätte da mal zwei Fragen
Der-Korregator schrieb:
Schachbrett[y][x] = ++Zaehler;
Ist das garantiert das zuerst inkrementiert wird und dann zugewiesen wird?
Hab da noch nen Thread in Erinnerung wo es hieß dass nur garantiert wird das eine Anweisung späterZaehler
inkrementiert ist und nicht dasSchachbrett[y][x] == Zaehler+1;
ist.
Der-Korregator schrieb:
for (int y=h; y-->0; ) { for (int x=0; x<w; x++) { const int zeilenNr = (Schachbrett[y][x] - 1) / 8 + 1; const int spaltenIndex = (Schachbrett[y][x] - 1) % 8; } cout << endl; }
Ist das überhaupt legal?
-
Um_Antwort_suchender schrieb:
Ist das überhaupt legal?
das y-->0 geht meines Wissens seit c++11
-
[quote="daddy_felix]das y-->0 geht meines Wissens seit c++11[/quote]
Entschuldigung, nicht genug präzisiert
Ich meinte ob
const int zeilenNr = (Schachbrett[y][x] - 1) / 8 + 1; const int spaltenIndex = (Schachbrett[y][x] - 1) % 8;
innerhalb von for-schleifen legal ist
-
y-->0
y-- > 0
c++11 feature : O@Um_Antwort_suchender
jopp, ist es - wieso sollte es nicht?
-
unskilled schrieb:
y-- > 0
*kopfaufschreibtischhau*
-
xStrykex schrieb:
Danke, habs jetzt aber einfacher gemacht und die Lösung ist dieselbe
Das sieht bei mir aber so aus:
A1A2A3A4A5A6A7A8 B1B2B3B4B5B6B7B8 C1C2C3C4C5C6C7C8 D1D2D3D4D5D6D7D8 E1E2E3E4E5E6E7E8 F1F2F3F4F5F6F7F8 G1G2G3G4G5G6G7G8 H1H2H3H4H5H6H7H8
Das entspricht nicht dem, was Du ursprünglich gesagt hast, was Du wolltest:
xStrykex schrieb:
meine momentane Aufgabe besteht ein Schachbrett auszugeben.
Es soll wie folgt aussehen:
A8 B8 C8 . . .
A7 B7 . . .
A6 . . .
. . .
. .
.Stellt sich mir die Frage: was willst Du denn nun?
Ein Schachbrett ausgeben? Geht in 5-6 Zeilen.Oder eine Anwendung schreiben um mit der Programmierung vertrauter zu werden?
Dann würde ich Dir raten, das ganze mal etwas mehr objektorientiert anzugehen. Zum Beispiel mit einer Klasse Schachbrett und einer Klasse Spielfeld, Ausgabeoperatoren usw.
Wie Du seit heute morgen sicherlich gemerkt hast, ist "hinsetzen und losprogrammieren", "alles in die main", "schnell-schnell", "ist ja nur Kinderkram" am Ende des Tages doch sehr zeitintensiv.Glückauf!
daddy_felix schrieb:
unskilled schrieb:
y-- > 0
*kopfaufschreibtischhau*
Den "going-to Operator" hatten wir hier doch vor kurzem schon mal...
-
Die Aufgabe bezieht sich auf das 8-Damen-Problem.
Die Aufgabe hat mir ein Arbeitskollege gestellt und da ich mit Rekursionen noch nicht so vertraut bin wie mit Schleifen etc, meinte er, ich solle es mit 8 Schleifen versuchen.
Und vorher wollte ich das Schachbrett erstmal "in Form bringen" um damit arbeiten zu können.
Hast Recht mit dem was du sagst, aber ich denke, das klappt so auch.
Außerdem sieht das für mich so aus (auf einen schnellen Blick), dass ich theoretisch x und y tauschen müssteEDIT: x und y in den for-Schleifen ausgetauscht, jetzt ist es so, wie am Anfang beschrieben, aber trotzdem Danke für die Anmerkung
EDIT_2: Zahlen gehen zwar noch aufsteigend nach unten, aber das mach ich später, erstmal bissel Pause, auch wenns Spaß macht
-
Ich möchte eine if Schleife machen, wie z.B.:
"von Schachbrett[0][0] bis Schachbrett[0][7]" = Spalte1; if ( "irgendein Feld der Spalte1" = 1) // 1 Für das Setzen einer Dame Spalte1 = 1;
Oder gibt es etwas wie "von bis" nicht und muss ich jedes Feld einzeln einlesen o.ä.?
-
xStrykex schrieb:
Ich möchte eine if Schleife machen ...
xStrykex schrieb:
Oder gibt es etwas wie "von bis" nicht und muss ich jedes Feld einzeln einlesen o.ä.?
Alles einzeln.