PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Kugelspiel Problem



Salimox
06.10.2010, 23:28
Nabend Jungs,

also Aufgabe war ein Kugelspiel zu erstellen was je nach Weicheneinstellung dann die Kugel an Ausgang 1 oder Ausgang 0 rausgibt. Hier mein Code

#include<iostream>
using namespace std;

int main()
{
double kugel, weiche1, weiche2, weiche3, weiche4, ;

cout<<"Weicheneinstellung 1 eingeben:"<<endl;
cin>>weiche1;

cout<<"Weicheneinstellung 2 eingeben:"<<endl;
cin>>weiche2;

cout<<"Weicheneinstellung 3 eingeben:"<<endl;
cin>>weiche3;

cout<<"Weicheneinstellung 4 eingeben:"<<endl;
cin>>weiche4;

if(weiche1==0)
{ kugel=1;
goto weiche 2;
}
else
{ kugel=0;
}

weiche 2:
if(weiche2==0)
{ kugel=1;
goto weiche 3;
}
else
{ kugel=0
}

weiche 3:
if(weiche3==0)
{ kugel=1;
goto weiche 4;
}
else
{ kugel=0;
}

weiche 4:
if(weiche4==0)
{
kugel=1;
}
else
{
kugel=0;
}



cout<<"Ausgang:"<<kugel<<endl;



return 0;

}



Ich bin verzweifelt, als ich es gedebuggt hab funktionierte alles wunderbar nun gibt er mir haufenweise Syntaxfehler aus.. falls welche drin sind, weist mich darauf hin.

Grüße

Hat sich erledigt er hat die Sprungmarke mit Leerzeichen nicht erkannt..

ZoX
06.10.2010, 23:29
schreib ma über return noch

cin.sync();
cin.get();

und ich glaub du musst die weichen in ne klammer packen und hinter der 4. muss das , weg ;)

also so:


double kugel (weiche1, weiche2, weiche3, weiche4) ;

bin mir aber bei den klammern nicht ganz sicher ;)

Salimox
06.10.2010, 23:34
cin.sync und cin.get bewirkt was?

ne das geht auch ohne klammer :)
das komma ist nur ein tipfehler..

danke für deine hilfe

EDIT: Läuft jetzt übrigens der hat die sprungmarken mit Leerzeichen nicht erkannt -.-

blackberry
06.10.2010, 23:46
Ich bin verzweifelt, als ich es gedebuggt hab funktionierte alles wunderbar nun gibt er mir haufenweise Syntaxfehler aus.. falls welche drin sind, weist mich darauf hin.
Ein Programm zu debuggen erfordert doch erstmal, dass es überhaupt existiert. Wenn dein Code nicht compiliert werden kann ist das wohl nicht der Fall.



double kugel (weiche1, weiche2, weiche3, weiche4) ;
Ich bin mir unsicher, ob ich jetzt traurig, gequält, belustigt, entsetzt, oder doch alles zusammen sein sollte.
Aber das hat ja wohl nicht mehr viel mit C++ zu tun.


cin.sync und cin.get bewirkt was?
Dass der Code compiliert wird.
An der Stelle würde ich dir Google ans Herz legen, jedoch kann ich dir versichern, dass dir die beiden Methoden nicht weiterhelfen werden (wieso auch?!).


EDIT: Läuft jetzt übrigens der hat die sprungmarken mit Leerzeichen nicht erkannt -.-
Kannst du mir mal erklären, wieso du da überhaupt mit Labels und goto arbeitest?
Dein Code macht doch sowieso nichts anderes als das:
kugel = !weiche1;
kugel = !weiche2;
kugel = !weiche3;
kugel = !weiche4;
Zumal die goto's völlig redundant sind, da nach dem Ende vom if-Block sowieso immer zu der Stelle gesprungen wird ist es auch in der Implementierung völlig egal, wie du Weiche1/2/3 setzt, da das Ergebnis nur von Weiche4 abhängt.
Wieso du da double's benutzt ist mir auch völlig unverständlich.

Salimox
06.10.2010, 23:54
Ich weiß dass er erst Debuggen kann wenn es funktioniert.. Nur wie gesagt er hat es mir am Anfang wirklich gedebuggt.

Hab die goto's entfernt.

Danke :)
und OpCodez kriegt ein thx weil er es kurz und knapp ebenfalls auf den punkt gebracht hat.. :P

blackberry
06.10.2010, 23:56
Hab die goto's entfernt.
Ändert aber trotzdem nichts daran, dass die Ausgabe nur von Weiche4 abhängt.

Salimox
07.10.2010, 00:02
http://img85.imageshack.us/img85/4714/kugel.jpg

so das ist dieses kugelspiel und das programm funktioniert, soweit ich nicht ganz am rad drehe.

blackberry
07.10.2010, 00:26
Pseudocode:

if (w1)
if (w2)
==> 1
else
if (w4)
==> 1
else
==> 0
else
if (w2)
if (w4)
==> 1
else
==> 0
else
==> 0

Kompakt:
(w1 && w2) || (w1 && !w2 && w4) || (!w1 && w3 && w4)
==> 1

Rifler
07.10.2010, 08:48
In deinem Pseudocode gehört w3 beim ersten else Zweig bei der if bedingung, hast dich anscheinend vertippt, unten passts wieder =)
Außerdem gibts da noch einen Fehler: Nämlich z.b. bei Weiche 1 bedeutet 0, dass die Kugel links rollt, da die Weiche 1 rechts oben ist. Also alles in anderer Logik

Außerdem geht es noch einfacher (diesmal in der Richtigen logik):

Kugel = (!w3 && !w4) || (!w1 && !w2) || (!w1 && !w4);

Z.b.: hattest du oben (w1 && !w2 && w4), allerdings wird hier !w2 nicht benötigt, da es ja auch im Falle von w2=true zu einer 1 als Ergebnis kommt. (letzter Satz war jetzt wieder in Umgekehrter Logik).
Problemlösung ist:
Kugel = (!w3 && !w4) || (!w1 && !w2) || (!w1 && !w4);


Des weiteren solltest du niemals Goto benutzen!! (nie!)! Und double benötigst du da auch nicht. Außerdem würde ich statt w1,w2, usw. Weiche[0] - Weiche[3] nehmen, falls du das schon gelernt hast. Dann kannst du die Einstellungen in einer Schleife einlesen.

Salimox
07.10.2010, 12:27
Wunderbar erklärt!

Ne das haben wir noch nicht gelernt, ich hatte erst 4 schulstunden programmierunterricht. Aber es wäre nett wenn du mir sagen könntest wie ich mit Weiche[0] usw, die einstellungen in einer schleife einlesen kann.

EDIT: Dass du goto's hier total überflüssig sind habe ich verstanden, aber wieso soll man das nie benutzen?

Thx

inout
07.10.2010, 12:52
Weil gotos in Hochsprachen einfach nichts verloren haben und man sie normalerweise immer durch andere Sprachkonstrukte (if, while, ...) problemlos ersetzen kann.
In extrem seltenen Fällen ist eine Verwendung von gotos evtl. gerechtfertigt, dies ist aber auch umstritten...

Das mit dem Einlesen in ein Array kannst du ungefähr so machen:


bool weiche[4];
for(int i=0;i<4;++i) {
cout<<"weiche"<<i<< ": ";
cin>>weiche[i];
}

Beachte aber, dass hier natürlich eine Plausibilitätsüberprüfung fehlt.

Rifler
07.10.2010, 13:14
Das sind sogenannte Arrays, wenn du int weiche[4] schreibst, dann kannst du 4-int Variablen über den gleichen Namen "weiche" ansprechen, allerdings mit unterschiedlichen Indexes. Allerdings laufen die Indexes nicht von 1-4 sondern von 0-3 (weil immer bei 0 zu zählen begonnen wird.) Deshalb geht auch die For Schleife von 0 bis 3.
Am besten du googelst einfach nach Arrays.

Und zum Thema gotos:
inout hat eigentlich schon fast alles wichtige gesagt.
Bei kleinen Programmen geht es vll. noch gut (obwohl es da auch schon sehr unübersichtlich werden kann), aber sobald du größere Programme schreibst und überall gotos benutzt, kennst du dich selbst nicht mehr aus. Da springst du von einem zum anderen und dann wieder ganz wo anders hin usw. Sowas wird Spagetti-Code genannt und ist ÄUßERST schlechter Programmierstil. Vll. ist wirklich in ganz ganz speziellen Fällen ein Goto angebracht, aber selbst dann könnte man es auch durch if und for usw. lösen (vll. ein bisschen umständlicher, aber trotzdem). Ich würd trotzdem davon abraten, auch wenn dadurch das Programm ein bisschen "hässlicher" wird.

Salimox
07.10.2010, 13:54
Achso, ich habe nicht dran gedacht dass es bei größeren Programmen unübersichtlich wird, weil ich noch keine geschrieben habe aber ich verstehe es.

Hier der überarbeitete Code, sieht doch um einiges schöner aus :)

#include <iostream>
using namespace std;



int main()
{

int kugel,w1,w2,w3,w4;
cin>>w1;
cin>>w2;
cin>>w3;
cin>>w4;

kugel = (!w3 && !w4) || (!w1 && !w2) || (!w1 && !w4);

cout<<"Ausgang:"<<kugel<<endl;

system("pause");
}

Eine Frage noch: Nehmen wir nur diesen part kugel = (!w3 && !w4) was würde das auf deutsch bedeuten?

inout
07.10.2010, 14:56
Hier der überarbeitete Code, sieht doch um einiges schöner aus :)
Joa, mit einem Array + Schleife, bools, einem return und ohne system() noch schöner.

kugel = (!w3 && !w4) was würde das auf deutsch bedeuten?
bedeutet, kugel ist gesetzt/1 (ungleich 0)/true, wenn w3 und w4 nicht gesetzt/0/false sind, sonst nicht gesetzt/0/false.