Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.02.2008, 13:54

bei int werten kein buchstaben eintippen sonst absturz ?

Gibt es eine möglichkeit das er erkennt, das wenn du einen Buchstaben eingegeben hast er das erkennt und ein test ausgibt?

Hier ein kleiner Code Auszug von meinem Spiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
do
                    {
                        cout << "Sie haben die Aktie BrokenHeimer gewaehlt\n";
                        cout << "Sie steht zur Zeit bei: " << BrokenHeimer << endl;
                        MaximalKauf = StartKapital / BrokenHeimer;
                        cout << "Sie koennen mit Ihrem Geld Maximal " << MaximalKauf << " Aktien Kaufen\n";
                        cout << "Wieviele moechten Sie kaufen: ";
                        cin >> Anzahl;
                        if (MaximalKauf >= Anzahl )
                        {
                            HabenBH += Anzahl; // Hinzufügen der Aktien die man Besitzt

                            StartKapital -= Anzahl * BrokenHeimer; // Das Kapital abziehen

                            // Zufallsberechnung der Aktien

                            Zufall (&BrokenHeimer, BrokenHeimer, &Pfirch, Pfirch, &Mucrosoft, Mucrosoft);
                            Tage--; // Bei kauf der Aktie wird ein Tag abgezogen

                        }
                        else // Wenn zu viele Aktien gewählt werden

                        {
                            cout << "Nicht genug Geld um so viele Aktien zu kaufen\n";
                        }
                    
                    } while (MaximalKauf<=Anzahl && MaximalKauf == 0);


Ich habe gehofft, das er durch den else erkennt das du was falsches eingegeben hast wenn if nicht zu trifft auch wenn es buchstaben sind.
Aber das wäre ja zu einfach gewesen :-))

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

16.02.2008, 14:39

Entweder du initialisierst MaximalKauf so, dass das if fehl schlägt sollte keine Zahl eingegeben werden (cin lässt den Wert des int dann nämlich unverändert) oder du fängst eine falsche Eingabe ab. cin.fail(); dürfte in letzterem Fall hilfreich sein ;)

Bugger

Frischling

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

3

16.02.2008, 14:44

Da dein Programm bei cin abstürzt(so habs ich verstanden) bringt dir deine if Verzweigung nicht besonders viel, eine Möglichkeit das zu verhindern wäre try & catch(Kapitel 8 ) :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
while(true){ // Endlosschleife

  try // versuchen eine richtige Eingabe reinzubekommen

  {
   cin >> Anzahl; // Eingabe

   }catch(char* pcFehlermeldung){ // Fehler bei der Eingabe - wahrscheinlich wurde ein Buchstabe eingegeben

        continue; // Nochmal versuchen

   }
   break; // richtige Eingabe - Schleife abbrechen

}
Hältst du nicht den Bug in Ehren, wird er dich noch manches Lehren.

Ein Gespräch setzt voraus, dass der andere Recht haben könnte.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

16.02.2008, 15:25

Der operator>> wirft keine Ausnahme. Ein try - catch ist hier ziemlich unnötig.
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

16.02.2008, 15:40

Ich kann jedem nur empfehlen, Zahleneingaben bei cin als String einzulesen und dann per Stringstream oder anderweitig zu konvertieren - so muss man nicht ständig erste Hilfe für den Inputstream leisten, sondern muss nur schaun, ob die Konvertierung erfolgreich war.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

16.02.2008, 15:47

Zitat von »"grek40"«

Ich kann jedem nur empfehlen, Zahleneingaben bei cin als String einzulesen und dann per Stringstream oder anderweitig zu konvertieren - so muss man nicht ständig erste Hilfe für den Inputstream leisten, sondern muss nur schaun, ob die Konvertierung erfolgreich war.


Genau so ist das! Auch wenn es, mehr oder weniger gute, Ansätze gibt den Konsolenpuffer wieder zu leeren, keiner der Ansätze ist wirklich portabel. Darum sollte man solche Fälle vermeiden.
@D13_Dreinig

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

7

16.02.2008, 16:55

Versuch es mal so :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
do{
    // Löscht alle Fehlermeldungen von cin

    cin.clear();
    // Löscht den Eingabe-stream

    cin.ignore(256,'\n');

    cin >> Anzahl; // Eingabe 


// Prüft ob bei der Eingabe ein Fahler aufgetreten ist..

}while( cin.fail() );

8

16.02.2008, 16:57

:-)

Erst mal wieder tausend dank für die ganzen Hilfen.

Also ich hab jetzt mal meinen Code getauscht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    do
                    {
                        cout << "Sie haben die Aktie BrokenHeimer gewaehlt\n";
                        cout << "Sie steht zur Zeit bei: " << BrokenHeimer << endl;
                        MaximalKauf = StartKapital / BrokenHeimer;
                        cout << "Sie koennen mit Ihrem Geld Maximal " << MaximalKauf << " Aktien Kaufen\n";
                        cout << "Wieviele moechten Sie kaufen: ";
                        cin.clear();
                        cin.ignore(256,'n');
                        cin >> Anzahl;

                        if (MaximalKauf < Anzahl )
                        {
                            cout << "test\n";
                        }
                        else
                        {
                            HabenBH += Anzahl; // Hinzufügen der Aktien die man Besitzt

                            StartKapital -= Anzahl * BrokenHeimer; // Das Kapital abziehen

                            // Zufallsberechnung der Aktien

                            Zufall (&BrokenHeimer, BrokenHeimer, &Pfirch, Pfirch, &Mucrosoft, Mucrosoft);
                            Tage--; // Bei kauf der Aktie wird ein Tag abgezogen                                                    

                        }
                    
                    } while (MaximalKauf<=Anzahl && MaximalKauf == 0 && cin.fail());


also das mit der cin.fail sache stürzt er zwar jetzt nicht mehr ab,
aber er erkennt meine eingaben nun garnicht mehr :-)

Ich hab zusätzlich noch eine Frage..... :-)
Bei dem Code den ich ganz oben gepostet hatte, liest er nun halt aus wie teuer die Aktie ist und wieviel man kaufen kann.

Das funktioniert auch super so weit.

Aber wenn ich nun die maximale Anzahl der Aktien gekauft habe, springt er wieder zum eigentlichen spiel zurück.
Das soll er ja auch.

Aber wenn ich diese Aktie wieder auswähle, springt er auch wieder in den oben geposteten code, und sagt mir das ich noch 0 Aktien kaufen kann. Das ist wiederum auch richtig. Aber normal müsste er doch laut do while scheife wieder zurück ins spiel springen weil ich ihm gesagt habe, ist MaximalKauf == 0 dann verlasse die schleife.

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

9

16.02.2008, 17:10

Mit do...while geht er alles mindestens einmal durch und
prüft dann erst deine Bedingungen ( ich hoffe das du das meintest )

neido

Treue Seele

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

10

16.02.2008, 17:10

Zitat von »"djxitec"«

Aber normal müsste er doch laut do while scheife wieder zurück ins spiel springen weil ich ihm gesagt habe, ist MaximalKauf == 0 dann verlasse die schleife.


Nein, das Gegenteil ist der Fall: while(a==0) bedeutet mache das solange a gleich null ist. Für deinen Fall müsstest du schreiben while (MaximalKauf!=0)

Werbeanzeige