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

MSG

Frischling

  • »MSG« ist der Autor dieses Themas

Beiträge: 7

Beruf: Callcenter-Mitarbeiter

  • Private Nachricht senden

1

03.05.2009, 13:55

Kann keine Eingabe machen

Servus Leute.

Könnt ihr mir sagen wo der Fehler bei folgenden Code liegt? Ich kann wenn ich das Programm starte nur bei "cin >> operator_auswahl" eine Eingabe machen.

Bein cin >> zahl1; und cin >> zahl2; überspringt er einfach und das Programm wird dann wieder beendet...



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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>

using namespace std;

int main()
{
    // Initialisiere und deklariere Variablen

    int zahl1=0,zahl2=0;
    int operator_auswahl;
    // Welche Rechenart soll durchgeführt werden?

    cout << "Waehlen sie die Rechenoperation aus:\n";
    cout << "(A)ddition" << endl << "(S)ubtraktion" << endl << "(M)ultiplikation" << endl << "(D)ivision " << endl;
    cin >> operator_auswahl;
    
    // Eingabe der Zahlen die es zu rechnen gilt

    cout << "Zahl1:\n";
    cin >> zahl1;
    
    cout << "Zahl2:\n";
    cin >> zahl2;
    
    // Berechnung

    switch (operator_auswahl)
    {
        case ('A'):
        case ('a'):
            cout << zahl1 << " + " << zahl2 << " = " << zahl1+zahl2;
            break;
        case ('S'):
        case ('s'):
            cout << zahl1 << " - " << zahl2 << " = " << zahl1-zahl2;
            break;
        case ('M'):
        case ('m'):
            cout << zahl1 << " * " << zahl2 << " = " << zahl1*zahl2;
            break;
        case ('D'):
        case ('d'):
            cout << zahl1 << " / " << zahl2 << " = " << zahl1/zahl2 << endl;
            cout << "Rest: " << zahl1%zahl2;
            break;
    }
    cout << endl << "Ende";
    cin.get();
}


EDIT: Aaah jetzt wo ich hier den Code nochmal angeschaut habe, hab ich den Fehler selbst gefunden... operator_auswahl ist fallsch deklariert als INT-Variable. Wenn ich es mit char deklariere funzt alles.

Trotzdem wundert es mich warum überspringt das Programm die nächsten Eingaben in diesem Fall und wenn ich die Variable richtig deklariere nicht??
Jedes böse Erwachen setzt einen tiefen Schlaf voraus.

WhiteMike

Alter Hase

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

2

03.05.2009, 14:11

C-/C++-Quelltext

1
char operator_auswahl;


Die Variable muss ja ein Zeichen speichern, also solltest du auch den Typ char benutzen.

Mit freundlichen Grüßen,
WhiteMike

3

03.05.2009, 16:16

Re: Kann keine Eingabe machen

Zitat von »"MSG"«

Trotzdem wundert es mich warum überspringt das Programm die nächsten Eingaben in diesem Fall und wenn ich die Variable richtig deklariere nicht??

ganz einfach, du gibst ja buchstaben ein. Buchstaben sind keine Zahlen, also schlägt das einlesen in eine Zahl fehl (was du merken würdest, wenn du cin testen würdest), und die variable enthält hinterher denselben wert wie vorher ;)

MSG

Frischling

  • »MSG« ist der Autor dieses Themas

Beiträge: 7

Beruf: Callcenter-Mitarbeiter

  • Private Nachricht senden

4

03.05.2009, 16:21

Thx für die Antworten. Nun bin ich seit einer Stunde beim nächsten Problem und steh an, was ich falsch geschrieben habe...

Bin beim Zahlenraten-Beispiel aus Kapitel 4 und der Code sieht so aus:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include <iostream>
#include <windows.h>

using namespace std;

#pragma comment (lib, "winmm.lib")

// Funktionsprototypen

int Spielen(int Level);
int WaehleLevel(int Level);
int TesteHighscore (int Punkte, int Highsore);
void ZeigeInfos();

// Hauptprogramm

int main()
{
    // Variablen

    char Auswahl;        // Gewählter Menüpunkt

    int Level = 5;       // Aktueller Level

    int Highscore = 100; // Aktueller Highscore


    // Zufallsgenerator initialisieren

    srand (timeGetTime ());

    // Verarbeitung des Menüs

    do
    {
        // Menü ausgeben

        cout << "Zahlenraten - Menue" << endl;
        cout << "-------------------" << endl;
        cout << "(N)eues Spiel starten" << endl;
        cout << "(L)evel waehlen" << endl;
        cout << "(H)ighscore anzeigen " << endl;
        cout << "(I)nfo" << endl;
        cout << "(B)eenden " << endl;

        // Eingabe abfragen

        cout << "Auswahl: ";
        cin >> Auswahl;

        // Je nach Eingabe verzweigen

        switch (Auswahl)
        {
            // Neues Spiel starten?

            case ('n'):
            case ('N'):
            {
                // Spielen

                int Punkte;
                Punkte = Spielen(Level);
                Highscore = TesteHighscore (Punkte, Highscore);

            } break;

            // Level wählen?

            case ('l'):
            case ('L'):
            {
                Level = WaehleLevel(Level);
            } break;

            // Highscore anzeigen?

            case ('h'):
            case ('H'):
            {
                cout << "Der aktuelle Highscore liegt bei ";
                cout << Highscore << " Punkten\n\n";
            } break;

            // Informationen anzeigen?

            case ('i'):
            case ('I'):
            {
                ZeigeInfos();
            } break;

            // Spiel beenden?

            case ('b'):
            case ('B'):
            {
                cout <<"Spiel beenden." << endl;
            } break;

            // Falsche Eingabe?

            default:
            {
                cout << "FALSCHE EINGABE!\n\n";
            }
        }
    } while (Auswahl != 'b' & Auswahl != 'B'); // Spiel beenden?


    cout << "Bis zum nächsten Mal!" << endl;

    return 0;
}

// ZeigeInfos

void ZeigeInfos()
{
    cout << "Zahlenraten V1.0" << endl;
    cout << "Beispiel aus \"C++ fuer Spieleprogrammierer\"";
    cout << "\n\n";
} // ZeigeInfos Ende


// WaehleLevel

int WaehleLevel(int Level)
{
    int NeuerLevel;

    do
    {
        //Neuen Level wählen

        cout << "Aktueller Level: " << Level << endl;
        cout << "Neuer Level (1-10): ";
        cin >> NeuerLevel;

        //Ungültigen Level gewählt?

        if (NeuerLevel<1 || NeuerLevel>10)
            cout << "Bitte ein Level zwischen 1 und 10 waehlen!" << endl;
    } while (NeuerLevel<1 || NeuerLevel>10);

    return NeuerLevel;
} // WaehleLevel Ende


// Spielen

int Spielen(int Level)
{
    int Zufallszahl;        // Zufalszahl, die der Spieler erraten muss

    int GerateneZahl=0;     // Zahl, die der Spieler eingibt

    int Bereich=Level*10;   // Bereich der Zufallszahl

    int Versuche=0;         // Anzahl der bisherigen Versuche

    int Punkte=0;           // Punktzahl


    // Zufallszahl ermitteln

    Zufallszahl = (rand()%Bereich)+1;

    // Bereich ausgeben, in dem geraten wird

    cout << "\nDie gesuchte Zahl liegt zwischen 1 und " << Bereich << endl;

    // Solange raten bis die Zahl gefunden wurde

    while (GerateneZahl!=Zufallszahl)
    {
        cout << "Dein Tipp: ";
        cin >> GerateneZahl;
        Versuche++;

        // Zahl hat nicht gestimmt, also Hinweis ausgeben

        if (GerateneZahl < Zufallszahl)
            cout << "Die gesuchte Zahl ist groesser" << endl;
        if (GerateneZahl > Zufallszahl)
            cout << "Die gesuchte Zahl ist kleiner" << endl;
    }

    // Die Zahl wurde erraten!

    cout << "\nGeschafft !" << endl;
    cout << "Du hast die Zahl nach " << Versuche << " Versuchen erraten\n\n";

    // Punkte berechnen

    // Desto weniger Versuche und desto höher das Level, je mehr Punkte werden vergeben

    Punkte = Bereich - Versuche + 1;
    Punkte *= Level;

    // Wenn mehr Versuche benötigt wurden als es Zahlen gibt kann das Ergebnis negativ sein

    if (Punkte < 0)
        Punkte = 0;

    // Punkte ausgeben

    cout << "Punkte: " << Punkte << endl;

    // Punkte zurückgeben

    return Punkte;
} // Spielen ENDE


// TesteHighscore

int TesteHighscore (int Punkte, int Highscore)
{
    // Prüfen ob der Highscore geknackt wurde

    if (Punkte > Highscore)
    {
        cout << "Glueckwunsch! Neuer Highscore! \n\n";
        Highscore = Punkte;
    }
    else
    {
        cout << "Leider kein neuer Highscore. \n\n";
    }

    return Highscore;
}


Will ich nun das Programm kompilieren und starten kommt beim Kompilierungsvorgang folgende 2 Fehlermeldungen:

Zitat

main.cpp|6|warning: ignoring #pragma comment |
obj\Debug\main.o||In function `main':|
main.cpp|23|undefined reference to `_timeGetTime@0'|

||=== Build finished: 1 errors, 1 warnings ===|


Was ist das Problem? Benutze Code::Blocks als IDE.
Jedes böse Erwachen setzt einen tiefen Schlaf voraus.

5

03.05.2009, 16:27

guck mal, ob kernel32.lib und user32.lib gelinkt sidn

MSG

Frischling

  • »MSG« ist der Autor dieses Themas

Beiträge: 7

Beruf: Callcenter-Mitarbeiter

  • Private Nachricht senden

6

03.05.2009, 16:42

Zitat von »"PCShadow"«

guck mal, ob kernel32.lib und user32.lib gelinkt sidn

??

Bitte genauer erklären was du jetzt damit meinst....
Jedes böse Erwachen setzt einen tiefen Schlaf voraus.

7

03.05.2009, 16:49

ok, jetz wirds lustig

linken heißt, die objektdateien, die der compiler aus deinem quellcode erstellt hat, mit importbiliotheken zu einem programm zu verbinden. die Standardbiliothek wird immer gelinkt, die eben angegebenen bibliotheken (die windows' schnittstelle zur verfügung stellen) hingegen nicht.

um timeGetTime() verwenden zu können, musst du bei Project->Build Options...->Linker Settings->Link Libaries kernel32 und user32 hinzufügen ;)

MSG

Frischling

  • »MSG« ist der Autor dieses Themas

Beiträge: 7

Beruf: Callcenter-Mitarbeiter

  • Private Nachricht senden

8

03.05.2009, 17:05

Hm. Ok.

Warum kommt davon im Buch nichts vor?
Oder hab ich das übersehen? Ich mein beim Buch wird ja so getan als müsste es funktionieren wenn ich den Quellcode eingebe ^^

Wo finde ich diese 2 Dateien ?
Jedes böse Erwachen setzt einen tiefen Schlaf voraus.

9

03.05.2009, 17:08

Zitat von »"MSG"«

Warum kommt davon im Buch nichts vor?
Oder hab ich das übersehen? Ich mein beim Buch wird ja so getan als müsste es funktionieren wenn ich den Quellcode eingebe ^^

das buch geht davon aus, das du einen microsoft-compiler benutzt, die linken kernel32 und user32 automatisch mit; später in den SDL-Kapiteln müsste auch noch was zum linken stehen.

Zitat von »"MSG"«

Wo finde ich diese 2 Dateien ?

gute frage. irgendwo in den codeblocks oder mingw-ordnern. findet der linker die nciht?

MSG

Frischling

  • »MSG« ist der Autor dieses Themas

Beiträge: 7

Beruf: Callcenter-Mitarbeiter

  • Private Nachricht senden

10

03.05.2009, 17:10

Zitat von »"PCShadow"«

Zitat von »"MSG"«

Warum kommt davon im Buch nichts vor?
Oder hab ich das übersehen? Ich mein beim Buch wird ja so getan als müsste es funktionieren wenn ich den Quellcode eingebe ^^

das buch geht davon aus, das du einen microsoft-compiler benutzt, die linken kernel32 und user32 automatisch mit; später in den SDL-Kapiteln müsste auch noch was zum linken stehen.

Zitat von »"MSG"«

Wo finde ich diese 2 Dateien ?

gute frage. irgendwo in den codeblocks oder mingw-ordnern. findet der linker die nciht?

Ah ok, deswegen. ^^

Daheim benutze ich mit Code::Blocks einen Microsoft Compiler, also wirds da wohl funzen, aber ich versuch trotzdem mal hier auf der Arbeit das zu linken.

Vielen Dank für deine Antwort, jetzt versteh ichs wieder was da los ist. ^^
Jedes böse Erwachen setzt einen tiefen Schlaf voraus.

Werbeanzeige