Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
18.02.2002, 12:03
Psychodad



Also mein Problem ist, dass in meiner Konsolenanwendung der Anwender einen Wert zwischen 1 und 6 angeben soll. Die Schleife dafür ist natürlich nicht das Problem sondern, dass der Anwender ja sowas wie z.B. 3333333333333333333 eingeben kann und somit mein Programm zum Absturz bringt. Kann man das irgendwie verhindern? Hane dazu leider nix in meinen Büchern und Tutorials gefunden.
Danke schonmal im Voraus.

--

zum Seitenanfang zum Seitenende Profil || Suche
001
18.02.2002, 12:28
mani



hmm ? welche schleife ?

--

zum Seitenanfang zum Seitenende Profil || Suche
002
18.02.2002, 13:04
Psychodad



Ist ja eigentlich egal oder? Das Problem ist, dass der Anwender (z.B.) eine Zahl zwischen 1 und 6 eingeben soll, das ganze in einer int-Variable gespeichert werden soll, jedoch aber z.B . 33333333333333 oder sonstewas hohes eingeben kann und mein Programm abstürzt.

--


Dieser Beitrag wurde am 18.02.2002 um 13:04 von Psychodad bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
18.02.2002, 15:15
Kriz



Quellcode:#include <iostream.h>
#include <limits.h>

int main()
{
....int zahl = 0;
....cout << "Zahl eingeben (1-6): ";
....cin >> zahl;
....if(zahl>INT_MAX)
....{
........cerr << "\nFehler: Zahl zu gross!";
........return 1;
....}
....else if(zahl<1 || zahl>6)
....{
........cerr << "\nNur zwischen 1 und 6, du alder Bappsack!";
........return1;
....}
....else cout << "\nZahl = " << zahl << endl;
....return 0;
}

Bemerkung: INT_MAX ist auf den 16 Bit int Datentyp beschränkt. Falls du das moderne int abfragen willst (32 Bit), dann setze statt INT_MAX einfach LONG_MAX ein.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
004
18.02.2002, 15:20
mani



kriz0r und was is wenner nen float wert eingibt ?

--

zum Seitenanfang zum Seitenende Profil || Suche
005
18.02.2002, 17:29
Kriz



Dann wird der nach int gewandelt... o_O

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
006
18.02.2002, 18:14
Psychodad



Okay danke. Alles klar. Ich hab da noch ein anderes Problem. D.h. eigentlich hab ich ne Lösung gefunden, jedoch ist mir unklar warum das erstere nicht funktioniert.
Ich poste mal schnell nur die betreffende Stelle des Codes. Falls ihr den Rest auch sehen wollt, dann sagt bescheid - es ist nur relativ wenig Code.

Code1:

int main()
{
int hv = 0;
int hv2 = 0;
player = 1;

do
{
do
{
tausch(x);
ausgabe();
}
while(y == (7-x));
hv2 = hv;
hv = player;
player = hv2;
}
while(erbsen[6] + erbsen[13] < 60);

return (0);
}

Code2:

int main()
{
int hv = 0;
int hv2 = 0;
player = 1;

do
{
tausch(x);
hv2 = hv;
hv = player;
player = hv2;
}
while(erbsen[6] + erbsen[13] < 60);

return (0);
}

Die zweite Lösung funktioniert. Ich habe einfach beide Funktionen zu einer zusammengestellt, und die Do-While-Schleife in die Funktion tausch mit reingeschrieben. Die Schleife soll bewirken (und tut sie in dem zweiten Code auch), dass Spieler1 unter der besagten Bedingung(siehe Schleife Code1) noch einmal dran ist. Ich hab die Schleife sogar gleich so hingekriegt, dass sie auch für Spieler2 funktioniert (while(y==(7-x) || y==(14-x)).
Aber warum die erste Variante nicht funktioniert ist mir unklar.
Toll wieso ist das ganze jetzt nicht entsprechend eingerückt - naja ich hoffe ihr findet Euch auch so zurecht :-)

--


Dieser Beitrag wurde am 18.02.2002 um 18:16 von Psychodad bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
18.02.2002, 18:28
Kriz



Solche Sachen sind im Abfragefehler... Die erste do..while geht ja auf die Abfrage zurück: Solange erbsen[6] + erbsen[13] < 60, dann führe die Schleife aus. Die innere Schleife geht zurück auf: Solange y == (7-x). Und wo kommt das x her?

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
008
18.02.2002, 19:27
Psychodad



Hä? Wie jetzt? Ich verstehe jetzt nicht, was die äußere Schleife damit zu tun hat. Die Schleife, die ich meinte, ist ja so oder so innerhalb der äußeren. Das x gibt man auch als Anwender ein. y = erbsen[x-1] und x ist dann halt das, was der Anwender ansprechen will. Am besten poste ich mal den ganzen Code:

#include<iostream>
#include<iomanip>
using namespace std;

int erbsen[14] = {5,5,5,5,5,5,0,5,5,5,5,5,5,0};
int e;
int x;
int player=1;
int tausch(int);
int ausgabe(void);
int y;

int main()
{
int hv = 0;
int hv2 = 0;
player = 1;

do
{
do
{
tausch(x);
ausgabe();
}
while(y == (7-x));
hv2 = hv;
hv = player;
player = hv2;
}
while(erbsen[6] + erbsen[13] < 60);

return (0);
}

int tausch(int x)
{
if (player == 1)
{
do
{
cout << "Welche Schale solls denn sein (1-6)";
cin >> x;
}
while( x < 1 || x > 6 || (erbsen[x-1] == 0));
}
if (player == 0)
{
do
{
cout << "Welche Schale solls denn sein (8-13)";
cin >> x;
}
while( x < 8 || x > 13 || (erbsen[x-1] == 0));
}


y = erbsen[x-1];
erbsen[x-1]=0;
cout << "Schale Nr." << x << " enthält " << erbsen[x-1] << " Erbsen" << endl;
for(int zaehler = x, countdown = y; countdown > 0; ++zaehler , --countdown)
{
if (zaehler == 14)
zaehler = 0;
++erbsen[zaehler];
//cout << "Schale Nr." << zaehler+1 << " enthält " << erbsen[zaehler] << " Erbsen." << endl;
}
return(0);
}

int ausgabe()
{
e=12;

do
{
cout << " |" << setw(2) << erbsen[e] << "| ";
e--;
if(e==6) //doppeltes == ist wichtig
cout<<endl;
}
while(e>6);

cout << endl;

cout << " |" << setw(2) << erbsen[13] << "| |" << setw(2) << erbsen[6] << "|" << endl;

e=0;

cout << endl;

do
{
cout << " |" << setw(2) << erbsen[e] << "| ";
e++;
if(e==6)
cout << endl;
}
while(e<6);

return(0);
}

So, wenn ich jetzt als Anwender x=2 angebe, dann müsste ja die Bedingung y==(7-x) erfüllt sein, da ich ja für erbsen[2-1]=5 habe.
Du kannst Dir den Code ja mal compilen. Es funktioniert auch in der Version alles, bis halt auf dieses Problem.

--

zum Seitenanfang zum Seitenende Profil || Suche
009
18.02.2002, 19:33
Tron



[code]while(y == (7-x));

DAS nennt man ENDLOSSCHLEIFE

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
010
18.02.2002, 20:40
TheTinySteini



Nein, nennt man es nicht, weil ja ein do { ...blablabla... } davor steht. Also ne do..while Schleife, keine while..nix.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
011
19.02.2002, 10:29
Psychodad



Das ist auf keinen Fall ne Endlosschleife. Das hätte ich ja bemerkt. Eher umgedreht. Die Schleife scheint ja in der Art und Weise gar nicht zu funktionieren. Aus irgendeinem Grund scheint ja die while-Bedingung nicht erfüllt zu sein. Aber warum? Ich hab ja ne andere Lösung gefunden. Die Frage ist ja wirklich nur, warum es nicht funktioniert. Und wenn mir da jemand was sagen könnte, wäre schon toll. Ihr könnt den Code so wie er oben steht, wenn ihr wollt direkt mal compilen und Euch angucken.

--


Dieser Beitrag wurde am 19.02.2002 um 10:30 von Psychodad bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
012
19.02.2002, 11:21
mani



hm, was willst du eigentlich immer mit #include <iomanip> ? kA für was das gut ist, aber für deinen code brauchste das glaub net...

--

zum Seitenanfang zum Seitenende Profil || Suche
013
19.02.2002, 11:48
Tron



Zitat:
TheTinySteini postete
Nein, nennt man es nicht, weil ja ein do { ...blablabla... } davor steht. Also ne do..while Schleife, keine while..nix.

ups... *schaem* das kommt davon wenn man sich das nur etwa 2 sekunden anguckt *nochmehrschaem*

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
014
19.02.2002, 12:09
Tron



so... jetzt hab ich mir mal deinen code genau angesehen, dein problem sind dein globalen variablen!

du deklarierst ein globales x und ein lokales x in tausch!!
das globale x WERTuebergibst du an tausch, was sinnlos ist, da du den wert des parameters (lokales x in tausch) gleich darauf ueberschreibst (cin >> x)
also ist nach der eingabe von 2 ist dein lokales x in tausch 2, aber das globale x bleibt nach wie vor 0, also lautet nacher deine bedingung (5 == 7 - 0) und das ist falsch.

gewoehn dir schnellsten diesen unstil mit globalen variablen ab, globale variblen sind zwar machmal notwendig, aber NICHT fuer sowas, komm erstmal ohne aus.
hoechstens dein spielfeld kanns global machen, wuerde ich aber auch nicht empfehlen.

anbei: gewoehn dir auch return (0); ab, return ist keine funkion, es heisst einfach return 0; und basta.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
015
19.02.2002, 12:10
Kriz



@jc: <iomanip.h> ist die Formatierungsbibliothek für Streams.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
016
19.02.2002, 12:28
mani



gut, aber brauchen tut er's, soweit ich's überblicken kann, nicht :)

--

zum Seitenanfang zum Seitenende Profil || Suche
017
19.02.2002, 12:31
Tron



Zitat:
cout << " |" << setw(2) << erbsen[13] << "| |" << setw(2) << erbsen[6] << "|" << endl;

doch, zumindest mit manchen standardbibliotheken.
bei einigen standardbibliotheken wird mit iostream.h automatisch iomanip.h eingebunden, bei anderen nicht. (z.b. beim BCC wird's automatisch eingebunden)

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
018
19.02.2002, 13:09
Psychodad



Oh, oh, oh. Danke für die Hilfe. Aber komme ich dann net besser die globale Variable x beizubehalten und dafür lieber tausch(void) zu machen? Falls Ihr noch mehr Schlampigkeiten findet sagt ruhig bescheid. Ich denke das Problem war, dass ich so Stück für Stück programmiert hab. Ich hätte wohl gleich mit einmal und mit Konzept loslegen sollen. Aber nochmal Danke für die Hilfe.

--

zum Seitenanfang zum Seitenende Profil || Suche
019
19.02.2002, 13:20
Tron



Zitat:
Psychodad postete
Oh, oh, oh. Danke für die Hilfe. Aber komme ich dann net besser die globale Variable x beizubehalten und dafür lieber tausch(void) zu machen?

nein, tu's nicht, du wirst dich dafuer selbst hassen.
da du bisher noch sehr wenig code hast, empfehle ich dir mit deinen neuen erkenntnissen nochmal von vorne anzufangen.

Zitat:
Ich denke das Problem war, dass ich so Stück für Stück programmiert hab. Ich hätte wohl gleich mit einmal und mit Konzept loslegen sollen.

uebertreib's nicht mit dem planen, sonst kommst du nimmer zum proggen. (;

Zitat:
Aber nochmal Danke für die Hilfe.

kp

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
020
19.02.2002, 14:21
Psychodad



So, und nun nochmal nach ganz vorne ;-)
Mein zweites Problem hab ich (/wir) gelöst. Aber das erste steht leider noch. Hier mein neuer Code:

if (player == 1)
{
do
{
cout << "Welche Schale solls denn sein (1-6)";
cin >> x;
if (x > LONG_MAX)
{
cerr << "\nFehler: Zahl zu gross!";
return 1;
}

}
while( x < 1 || x > 6 || (erbsen[x-1] == 0));

Trotz diesem neuen if stürzt mein Prog leider ab, wenn ich den int-Wert übersteige. Hab ich den Code falsch eingebunden? Ne, oder?

--

zum Seitenanfang zum Seitenende Profil || Suche
021
19.02.2002, 14:42
Psychodad



Und jetzt hackts mich ganz weg. Hier praktisch das Programm von Kriz:

#include<iostream>
#include<iomanip>
//#include<limits.h>
using namespace std;

int main()
{
int x=0;

cout << "Geben Sie eine Zahl zwischen 1 und 6 ein" << endl;
cin >> x;
/*if (x > INT_MAX)
{
cerr << "Depp!" << endl;
return 1;
}
else */if ( x < 1 || x > 6)
{
cerr << "Zwischen 1 und 6 Du Depp!" << endl;
return 1;
}
else
cout << "Zahl = " << x << endl;
return 0;
}

Und selbst ohne den Teil mit INT_MAX stürtzt dieses Programm nicht ab. Hä?
Was nun?

--

zum Seitenanfang zum Seitenende Profil || Suche
022
19.02.2002, 14:48
Tron



Zitat:
Psychodad postete
if (x > LONG_MAX)

ich vermute mal du hast x als int deklariert...
das ist ziemlich sinnlos, denn ein int kann niemals einen groeseren wert behinhalten als ein int beinhalten kann... logisch oder?

wenn ich ne zu grose zahl eingebe, wird zwar irgend eine zahl in x geschreiben (um genau zu sein das 2^32 modulo der eingegeben zahl) und ich muss nochmal eine zahl eingeben

probleme gibt's bei mir nur wenn ich was ungueltiges eingebe (z.b. ein 'a')
dann wird das zur endlosschleife und ignoriert das cin einfach?!

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
023
19.02.2002, 15:16
Psychodad



Bei mir im Code hab ich ja auch INT_MAX stehen. Das LONG_MAX war eher ein Versuch. Aber das scheint wirklcih in einer Endlosschleife zu enden - soweit ich da sauf dem Bildschirm dann nich erkennen kann. Blos halt, dass das Prog leider nicht auf meine Eingabe wartet. ?!?

--

zum Seitenanfang zum Seitenende Profil || Suche
024
19.02.2002, 15:33
Tron



INT_MAX, LONG_MAX ... jacke wie hose (zumindest auf dem meisten heutigen compilern ist int == long)

ich meinte dieses ganze if (x==INT_MAX) ist sinnlos, da ein int nunmal keinen groeseren wert als (2^31 - 1) annehmen KANN.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche