Workshop von Zerd und XBelt geschlossen 

Status
Für weitere Antworten geschlossen.
Hallo zusammen,

erstmal möchte ich mich bei Zerd für seine Mühen bedanken. Danke für diese wirklich wertvolle Arbeit!

Auch ich habe den Weg hier her gefunden und taste mich in die Welt von C++ ein. Das Tutorial ist wirklich sehr verständlich und übersichtlich gehalten. Nochmals Danke dafür. Ich bin noch ziemlich am Anfang mit dem Programmieren und mit dem Tutorial. Nach den ersten Schritten stellen sich mir 2 Fragen, wäre nett wenn ihr mir weiterhelfen könntet!

1. Wieso wird immer "std::" und nicht "using namespace std" genommen? Hat das Nachteile? Sieht ja auf den ersten Blick "übersichtlicher" aus und die Fehlerquote (meiner Meinung nach) wird gesenkt!

2.Wieso "int main()" und nicht "void main()" ?

Also wieso

PHP:
#include 
#include 

int main() {
std::string nachname;
std::cout  std::cin >> nachname;
std::cout  return 0;
}

und nicht

PHP:
#include 
#include 

void main() {
std::string nachname;
std::cout  std::cin >> nachname;
std::cout }
?

Da ich ja eigentlich kein Rückgabewert erhalte.

Vielen Dank für eure Hilfe!

Beste Grüsse,

Abdurrahmen!
 
Hallo Abdurrahmen,

zu 1.
Du kannst natürlich wenn du möchtest using namespace std; benutzen.
Ich habe es mir angewöhnt die namespaces davor zu schreiben, da es gerade bei großen projekten zu fehler führen kann. Ein Beispiel (ist vielleicht nicht praxisrelevant, aber mir fällt grade nichts anderes ein ;) )

Stell dir vor du schreibst eine eigene string klasse und hast aber "using namespaces std;" benutzt um den namespace bekannt zu machen. Der compiler weiß in dem fall nicht ob du die string klasse der std benutzen möchtest oder deine eigene. Das ist ja auch der Sinn von namespaces, um eindeutig auf funktionen, klassen o.a. zugreifen zu können.

zu 2.
Der C++ standard gibt vor das die main funktion einen Wert zurück geben muss. (ja ich weiß, die compiler können auch void aber werden idr. eine warning ausgeben.) Das Betriebssystem bekommt diesen rückgabewert (errorlevel) mit. 0 wird üblicherweise für "kein fehler" zurück gegeben. Werte > 0 werden als fehler angesehen. Willst du den Rückgabewert des programs auslesen kannst du das mit der Windows systemvariable %ERRORLEVEL% machen.
Z.B. Starte dein Programm in der command shell. Nachdem es beendet wurde kannst du den Rückgabewert so ausgeben lassen: "echo %ERRORLEVEL%"

Viel spaß!
Zerd
 
Moin Moin

Ich habe auch mal wieder ein Problem und zwar wollte ich das kleine Spiel
3 Gewinnt programmieren. Es funktioniert auch super nur wills ich es noch verbessern und da weiß ich nicht so recht weiter:

Ich habe folgendes Problem:
Wenn jemand in der Funktion feldnrSp1 mehrere buchstaben oder ziffern eingibt,
dann tut das Programm die zweite ziffer gleich mit zu feldnrSp2 übertragen ohne, das der zweite Spieler vorher eine Eingabe machen kann.
Da dachte ich mir, mache ich aus s1 und s2 ein string, und überprüfe, dass dort nur 1 Ziffer drinsteht. Jedoch kann eine switch case anweisung keine strings verarbeiten, was kann ich tun.
Hier der vollständige Quellcode:

PHP:
#include 
#include 
#include 
using namespace std;

string Spieler1, Spieler2;
char s1, s2, x, y;
int i;
void feldnrSp1();
void feldnrSp2();

char feld[3][3] = {
{'.','.','.'},
{'.','.','.'},
{'.','.','.'}
};

//nächste verbesserungen: zufallsanfang von spieler 1 und 2, das spieler 1 sonst im vorteil und bessere eingabenverarbeitung, denn wenn eingabe gleich 11 wird x und y gleich vorher definiert

int main()
{

//Zählvariable, welche bei 9 das Programm beendet, da 9 Felder!
i=0;


cout  cout  cout  cout  getline (cin,Spieler1);
cout  getline (cin,Spieler2);

do {

feldnrSp1();

system("cls");

cout  cout  cout  cout  cout  cout 
if(feld[0][0] == 'x' && feld [0][1] == 'x' && feld[0][2] == 'x') {cout  
if(feld[1][0] == 'x' && feld [1][1] == 'x' && feld[1][2] == 'x') {cout 
if(feld[2][0] == 'x' && feld [2][1] == 'x' && feld[2][2] == 'x') {cout 
if(feld[0][0] == 'x' && feld [1][0] == 'x' && feld[2][0] == 'x') {cout 
if(feld[0][1] == 'x' && feld [1][1] == 'x' && feld[2][1] == 'x') {cout 
if(feld[0][2] == 'x' && feld [1][2] == 'x' && feld[2][2] == 'x') {cout 
if(feld[2][0] == 'x' && feld [1][1] == 'x' && feld[0][2] == 'x') {cout  
if(feld[0][0] == 'x' && feld [1][1] == 'x' && feld[2][2] == 'x') {cout 
i++;
if(i==9) break;

//Wiederholung vom oberen Teil für Spieler 2

feldnrSp2();

system("cls");

cout  cout  cout  cout  cout  cout 


if(feld[0][0] == 'y' && feld [0][1] == 'y' && feld[0][2] == 'y') {cout 
if(feld[1][0] == 'y' && feld [1][1] == 'y' && feld[1][2] == 'y') {cout 
if(feld[2][0] == 'y' && feld [2][1] == 'y' && feld[2][2] == 'y') {cout 
if(feld[0][0] == 'y' && feld [1][0] == 'y' && feld[2][0] == 'y') {cout 
if(feld[0][1] == 'y' && feld [1][1] == 'y' && feld[2][1] == 'y') {cout 
if(feld[0][2] == 'y' && feld [1][2] == 'y' && feld[2][2] == 'y') {cout 
if(feld[2][0] == 'y' && feld [1][1] == 'y' && feld[0][2] == 'y') {cout 
if(feld[0][0] == 'y' && feld [1][1] == 'y' && feld[2][2] == 'y') {cout  

i++;
if(i==9) break;

}
while (
1 
);

cout 


system("PAUSE");
return 0;
}


void feldnrSp1()
{
cout  cin >> s1;


switch (s1)
{ case '1':
if(feld[0][0]=='y' || feld[0][0]=='x')
{feldnrSp1();}
else {feld[0][0] = 'x';}
break;
case '2':
if(feld[0][1]=='y' || feld[0][1]=='x')
{feldnrSp1();}
else {feld[0][1] = 'x';}
break;
case '3':
if(feld[0][2]=='y' || feld[0][2]=='x')
{feldnrSp1();}
else {feld[0][2] = 'x';}
break;
case '4':
if(feld[1][0]=='y' || feld[1][0]=='x')
{feldnrSp1();}
else {feld[1][0] = 'x';}
break;
case '5':
if(feld[1][1]=='y' || feld[1][1]=='x')
{feldnrSp1();}
else {feld[1][1] = 'x';}
break;
case '6':
if(feld[1][2]=='y' || feld[1][2]=='x')
{feldnrSp1();}
else {feld[1][2] = 'x';}
break;
case '7':
if(feld[2][0]=='y' || feld[2][0]=='x')
{feldnrSp1();}
else {feld[2][0] = 'x';}
break;
case '8':
if(feld[2][1]=='y' || feld[2][1]=='x')
{feldnrSp1();}
else {feld[2][1] = 'x';}
break;
case '9':
if(feld[2][2]=='y' || feld[2][2]=='x')
{feldnrSp1();}
else {feld[2][2] = 'x';}
break;
default:
feldnrSp1();

}

}


void feldnrSp2()
{
cout  cin >> s2;

switch (s2)
{ case '1':
if(feld[0][0]=='x' || feld[0][0]=='y')
{feldnrSp2();}
else {feld[0][0] = 'y';}
break;
case '2':
if(feld[0][1]=='x' || feld[0][1]=='y')
{feldnrSp2();}
else {feld[0][1] = 'y';}
break;
case '3':
if(feld[0][2]=='x' || feld[0][2]=='y')
{feldnrSp2();}
else {feld[0][2] = 'y';}
break;
case '4':
if(feld[1][0]=='x' || feld[1][0]=='y')
{feldnrSp2();}
else {feld[1][0] = 'y';}
break;
case '5':
if(feld[1][1]=='x' || feld[1][1]=='y')
{feldnrSp2();}
else {feld[1][1] = 'y';}
break;
case '6':
if(feld[1][2]=='x' || feld[1][2]=='y')
{feldnrSp2();}
else {feld[1][2] = 'y';}
break;
case '7':
if(feld[2][0]=='x' || feld[2][0]=='y')
{feldnrSp2();}
else {feld[2][0] = 'y';}
break;
case '8':
if(feld[2][1]=='x' || feld[2][1]=='y')
{feldnrSp2();}
else {feld[2][1] = 'y';}
break;
case '9':
if(feld[2][2]=='x' || feld[2][2]=='y')
{feldnrSp2();}
else {feld[2][2] = 'y';}
break;
default:
feldnrSp2();

}

}

Sorry ist leider etwas lang.
Dann habe ich noch 2 Fragen, wie erstelle ich eine Zufallsfunktion, denn bei mir beginnt immer Spieler1 und damit ist er doch klar im Vorteil.
Dann fällt euch sicherlich auf, das feldnrSp1 und feldnrSp2 fast identisch sind, außer jeweils das x und das y welches sich unterscheidet, kann ich das einfacher bzw. kürzer umsetzen ?


mfg. Chaosbohne

Riesen Dank schonmal im Voraus
 
Hi Chaosbohne!

Ich hatte leider nicht eher zeit, habe mich aber mal rangesetzt und das ganze ein wenig umgebaut. Es ist etwas kürzer geworden und ich habe komplett auf globale variablen verzichtet. Die checkResult Funktion ist geschmackssache, aber mir persönlich gefällt es so besser ;)
Falls du was nicht verstehst versuch ichs zu erklären!!

Viel Spaß
Gruß Zerd

PHP:
#include 
#include 
#include 
using namespace std;

//nächste verbesserungen: zufallsanfang von spieler 1 und 2, das spieler 1 sonst im vorteil und bessere eingabenverarbeitung, denn wenn eingabe gleich 11 wird x und y gleich vorher definiert

void printField(char feld[][3]) {
cout  cout  for(int j = 0; j < 3; j++){
for(int k = 0; k < 3; k++){
cout  }
cout  }
cout }

bool checkResult(bool bPlayer1, char feld[][3]) {
char fieldValue1 = 'x';

if(!bPlayer1)
fieldValue1 = 'y';

bool ret = true;
for(int k = 0; k < 3; k++) {
for(int j = 0; j < 3; j++)
ret = ret && (feld[j][k] == fieldValue1);

if(ret)
return true;
ret = true;

for(int j = 0; j < 3; j++)
ret = ret && (feld[k][j] == fieldValue1);

if(ret)
return true;
ret = true;
}
if(feld[2][0] == fieldValue1 && feld [1][1] == fieldValue1 && feld[0][2] == fieldValue1) 
return true;
if(feld[0][0] == fieldValue1 && feld [1][1] == fieldValue1 && feld[2][2] == fieldValue1)
return true;

return false;
}

void handlePlayer(bool bPlayer1, char feld[][3]) {
char fieldValue1 = 'y';
char fieldValue2 = 'x';
char s2;

if(!bPlayer1) {
fieldValue1 = 'x';
fieldValue2 = 'y';
}

cin >> s2;
switch (s2)
{ case '1':
if(feld[0][0]==fieldValue1 || feld[0][0]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[0][0] = fieldValue2;}
break;
case '2':
if(feld[0][1]==fieldValue1 || feld[0][1]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[0][1] = fieldValue2;}
break;
case '3':
if(feld[0][2]==fieldValue1 || feld[0][2]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[0][2] = fieldValue2;}
break;
case '4':
if(feld[1][0]==fieldValue1 || feld[1][0]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[1][0] = fieldValue2;}
break;
case '5':
if(feld[1][1]==fieldValue1 || feld[1][1]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[1][1] = fieldValue2;}
break;
case '6':
if(feld[1][2]==fieldValue1 || feld[1][2]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[1][2] = fieldValue2;}
break;
case '7':
if(feld[2][0]==fieldValue1 || feld[2][0]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[2][0] = fieldValue2;}
break;
case '8':
if(feld[2][1]==fieldValue1 || feld[2][1]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[2][1] = fieldValue2;}
break;
case '9':
if(feld[2][2]==fieldValue1 || feld[2][2]==fieldValue2)
{handlePlayer(bPlayer1, feld);}
else {feld[2][2] = fieldValue2;}
break;
default:
{handlePlayer(bPlayer1, feld);}

}
}

int main()
{

//Zählvariable, welche bei 9 das Programm beendet, da 9 Felder!
int i=0;
string Spieler1, Spieler2;

char feld[3][3] = {
{'.','.','.'},
{'.','.','.'},
{'.','.','.'}
};

cout  cout  cout  cout  getline (cin,Spieler1);
cout  getline (cin,Spieler2);

bool finished = false;
do {
bool bPlayer1 = true;
for(int j = 0; j < 2; j++) {

if(bPlayer1)
cout  else
cout 
handlePlayer(bPlayer1, feld);
system("cls");
printField(feld);

if(checkResult(bPlayer1, feld)) {
if(bPlayer1)
cout  else 
cout  finished = true;
break;
}

i++;
if(i==9) {
finished = true;
break;
}
bPlayer1 = !bPlayer1;
}
}
while ( !finished );

cout 
system("PAUSE");
return 0;
}
 
EDIT: Ok die taste STRG und F5 haben's gelöst!

Hallo!

Hab mir jetzt gerade alles gedowloadet und auch
durchgelesen doch wenn ich eine Exe Starten will
ist es das das keine EXE erstellt wird!

Bin da ganz am anfang zum testen:

PHP:
#include 
int main() {
std::cout  return 0;
}

Und das speichere ich ab in dem ich F7 ab will es starten
doch es kommt dann das ,,öffnen mit'' Fenster!

Was mach ich denn da Falsch?
mfg wurM_9
 
Zuletzt bearbeitet von einem Moderator:
Hey Zerd,

Danke für deine Mühen, dass du meinen Code umgeschrieben hast,
selbstverständlich werde ich mich da mal durcharbeiten.

Auf den ersten Blick sieht einiges für mich neu aus.
Leider kann ich nur selten mit c++ arbeiten, da ich z.Z. beim Bund bin und
da viel zutun habe.
Bei Fragen komme ich selbstverständlich wieder auf dich zurück.

mfg. Chaosbohne
 
Hey Zerd,

ich will C++ lernen und würde auch gerne deinen Kurs durchgehen...alles so not the problem...aber was a problem ist...die 2005 Version von Visual Basic bekommt man nicht mehr von Microsoft...ich bin dem Link gefolgt und habe auch dort gesucht aber nix gefunden....gut dachte ich mir...nimmste einfach die 2008 Version...nix da...da ist garnichts gleich wie in deinem Tread von den Screenshots.

Hat einer die exe´n noch???

Würde es wirklich gerne lernen..

LG Nuramon
 
Mh.. also ich hab auch beide versionen installiert... Ich kann keinen großen unterschied zwischen 2005 und 2008 erkennen...

woran genau scheitert es denn???
 
2008 nutzt die SQL datenbank. die Version ist auch komplett auch Englisch. habe gerade mal geschaut ob ich da so ein paar ähnlichkeiten finde aber die anfangsschritte kann ich so nicht ganz ausführen da die Menüführung bei mir ganz anders ist
 
Zum einstellen der pfade gehst du über

Tools->Options -> Projects and Solutions -> VC++ Directories
Da musst du dann die Plattform SDK Pfade angeben

Die restlichen Sachen (Neues Projekt) sieht bei mir genauso aus und ist nur auf englisch übersetzt, das solltest du hinbekommen :)
 
also muß ich das SDK auch haben???

War der Meinung das SDK wie SQL ist...aber dann lad ich mir mal schnell die SDK
 
du brauchst das platform sdk bei der express version vom Studio 2008 damit du die standard bibliotheken benutzen kannst... Die werden bei der Express version nicht mitgeliefert
 
Hat sich erledigt...mit der Deutschen Version habe ich alles so wie es sein soll...die Englische ist da doch etwas anders..

LG Nuramon

Hallo Zerd,

so ich habe jetzt mal das erste durchführbare Programm geschrieben aus deinem Workshop.
Es beinhaltet folgenden Zeilen:

PHP:
#include 

int main() {
int eingabe;
std::cout  std::cin >> eingabe;
std::cout  return 0;
}

Laufen tut es soweit. Das Problem: Er Fragt nach der Zahl...nachdem ich die Zahl eingegeben habe passiert nix...drücke ich auf Enter schliest sich das Programm.
Laut Quelltext sollte er mir aber meine eingegebene Zahl anzeigen.

Ich habe den Quelltext einmal selbst abgeschrieben und einmal Kopiert um zu sehen ob ich irgendwo einen Fehler drinne habe aber das gleiche passiert auch bei dem Kopierten Quelltext.

Wo liegt da der Fehler drinn??

LG Nuramon

PHP:
#include 

int main() {
int eingabe1, eingabe2, eingabe3, ergebniss;
std::cout  std::cin >> eingabe1;
std::cout  std::cin >> eingabe2;
std::cout  std::cin >> eingabe3:
ergebniss = eingabe1 + eingabe2 + eingabe3;
std::cout  return 0;
}

Bei dem zeigt er mir 2 Fehler an bei 1.

???????
Versteh die Welt nicht...
 
Zuletzt bearbeitet:
Hallo Nuramon...

Benutz bitte die editier funktion und schreib nicht jedes mal einen neuen Beitrag (steht so auch in den forenrules).

Das erste Programm was du abgetippt hast ist so schon richtig. Das Fenster mit der Ausgabe wird nur direkt wieder geschlossen, so dass du die ausgabe nicht sehen kannst. Um das zu umgehen kannst du die erstellte exe datei entweder in einem konsolenfenster aufrufen oder mit Strg+F5 starten, dann sollte das Fenster stehen bleiben.


Bei deinem zweiten programm hast du ein : statt einem ; in der Zeile
Code:
std::cin >> eingabe3:
es muss aber
Code:
std::cin >> eingabe3;
heißen
 
hi all,

habe irgendwie Probleme mit Arrays.(oder die mit mir, egal)
Ich lerne mit der DVD von v2b C++ 2006 und im Kapitel Arrays (Array-Größe und Schleifen) schreibt er genau diesen Code hier um die größe der arrays zu sehen, ja bei ihm klappt es und bei mir nicht...ja bin ich so blöd oder warum zeigt mir dev++ immer bei der Ausgabe diesen Fehler.
Ich benutze auch noch ein Buch aus der Biblithek und da passiert genau der gleiche Fehler bei der Ausgabe. :ööm: Was ist der Trick?

#include
#include
using namespace std;

int main(int argc, char *argv[])
{
char carry[10];

carry[0] = 'a';
carry[1] = 'b';
carry[2] = 'c';

char array[] = {'x','y','z'};


// hier ist ein Fehler, ich finde ihn aber nicht! er sagt carray undeclared (first use this function)

cout
system("PAUSE");
return EXIT_SUCCESS;
}

gruß
kaufikaufi

p.s. ja hab den Fehler Gestern noch selber gefunden:rolleyes:
oh man...
trotzdem Danke für den Hinweis Biernase.
 
Zuletzt bearbeitet von einem Moderator:
gibt es noch ein extra tutorial zu den Konstanzen?

ja das Z ist neben dem T, Schreibfehler meinerseits!

Konstanten: wie dürfen Sie aussehen, was muss mann beachten, wofür sind sie überhaupt gut???
 
Zuletzt bearbeitet von einem Moderator:
Konstanzen?? Du meinst sicher Konstanten... Ich wüsste nicht warum das ein tutorial wert wäre... Wenn du fragen hast stell die einfach hier (vielleicht ändert sich dann meine Meinung noch und ich schreib dazu noch was). Aber wie man ja sieht ist die Zeit die ich ins tutorial stecke sehr stark zurück gegangen... Vielleicht komm ich ja bald endlich mal dazu Objektorientierung zu beginnen... wäre mal an der Zeit...
 
ja Zerd ich frage deshalb weil ich bei meinen Multiple Choice Test auf V2B diese Frage immer falsch beantworte.

Wie dürfen Variablen oder Konstanten heißen?

- 1er-zahl = ...
- GUT = ... ~
- ...besser = ... ~
- bool = ...

~ Lösung
warum nicht bool? steht der Wahrheitswert allein für sich?
 
Variablen in C++ beginnen immer mit einem Buchstaben ( ein _ ist auch gültig).
Ich verstehe bei deiner Frage die ... nicht, sollen das die typangaben darstellen???

bool ist kein gültiger variablenname weil bool ein datentyp ist (wahr / falsch). D.h. als Variablenname ist das nicht gültig.
 
Ich verstehe bei deiner Frage die ... nicht, sollen das die typangaben darstellen???

diese Punkte haben keinerlei Bedeutung,
Ich habe das so vom Multiple Choice Test von der Lehr DVD übernommen.

gruß
kaufikaufi

p.s. man ich seh immer nur DOS Fenster, wann können wir mal einen Schritt weiter gehen?
Ich will endlich meinen eigenen VST Synth entwerfen und den steuern und dann in Fruity Loops benutzen.
 
Zuletzt bearbeitet von einem Moderator:
Ein Schritt weiter würde bedeuten das du die Grundlagen beherrschst... Nach deiner letzten Frage glaube ich nich das du das schon tust ;)

Aber abgesehen davon zwingt dich ja niemand bei dem DOS Fenster zu bleiben. Wenn du für dich entscheidest weiter zu gehen, dann tu das. Aber bevor du das machst wirst du nicht drum herum kommen dich ausgiebig mit zeigern und objektorientierung zu beschäftigen.
 
Huhu,

hab hier mal ne Lösung für die beiden Makro Aufgaben:
PHP:
#include 
#define SQRE(x) ((x) * (x))
#define BIGGER(x,y) (((x) > (y)) ? (x) : (y))

int main() 
{
std::cout  std::cout  std::cout  return 0;
}

Super Workshop weiter so!

Mit freundlichen Grüßen,
sh4d0w89
 
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

S
Antworten
1
Aufrufe
6K
Antworten
0
Aufrufe
958
Antworten
11
Aufrufe
2K
bladerunner
B
N
Antworten
3
Aufrufe
788
Zurück
Oben Unten