C++ Warum springt das Programm immer zu clrscr(); zurück?

Nikurasu_Kun

Cadet 3rd Year
Registriert
Juli 2018
Beiträge
44
Ich muss für die Schule ein Spiel entwickeln, bei dem der Computer sich eine Zahl aussucht und der Spieler sich eine Zahl aussucht. Diese werden dann addiert und wenn das Ergebnis gerade ist, gewinnt der Spieler, wenn es ungrade ist, der Computer. Das ganze wird noch über ein System mit Talern geregelt, will heißen, man hat 100 Taler am Start und wenn man alle verspielt hat, hat man verloren.
Das hat auch bis heute gut funktioniert, aber wir mussten heute eine Erweiterung mittels Header einfügen, die verhindert, dass man irgendetwas anderes als eine Zahl eingibt. Als ich das getan hatte und das Programm testen wollte passierte das:
Ich habe auch schon überprüft woran das liegt. Es liegt nämlich daran dass das Programm in Zeile 38 immer wieder auf das clrscr(), in Zeile 35 springt. Hier sind mal alle Codes

C++:
//PGM Glücksspiel
//

#ifndef sichereZahlH
#define sichereZahlH

#include<iostream>
#include<conio.h>
#include<stdio.h>
#include"D:\Dokumente\Schule\AIT\ownHeader\sichereZahl.h"
using namespace std;


void Regeln(void){
     cout<<"ACHTUNG GL\x9A \bCKSSPIEL KANN S\x9A \bCHTIG MACHEN. ALLE INFOS UNTER www.lotto-bw.de";
     cout<<"\n\nDie Regen:\n\tSie und der Computer haben ein Guthaben von 100 Talern.\n\tWenn das beim jeweiligem aufgebraut ist, hat dieser verloren.\n\tSie k\x94nnen bis zu 20 Taler pro Zug setzen\n\tSie und der Compuer suchen sich eine Zufallszahl aus\n\twelche dann addiert wird.\n\tWenn das Ergebnis\n\t\tgerade ist haben sie gewonnen.\n\t\tungerade ist hat der PC gewonnen.\n\tSie k\x94nnen nach jeder Runde entscheiden ob sie noch mal spielen wollen\n\n\n\t\t\tVIEL GL\x9A \bCK";
     cout<<"\n\n\n";
     system("pause");
     return;
}

void AusgabeKontostand(int iWert)
{
 cout<<"Ihr aktueller Kontostand betr\x84gt ";
 cout<<iWert;
 cout<<" Taler";
 return;
}

int SetzeBetrag(int iKontostand)
{
 bool bEingabeOK;
 int iBetrag;
 do{
    clrscr();
    bEingabeOK=true;
    AusgabeKontostand(iKontostand);
    iBetrag = leseZahl("Wie viele Taler m/x94chen sie setzen? ");
    cout<<"Text";
    cout<<iBetrag;
    if(iBetrag>20 || iBetrag<1)
    {
     cout<<"Fehler mit der Eingabe. Sie m\x81ssen mindestens 1 Taler, d\x81rfen aber maximal 20 Taler setzen.";
     cout<<"\n\n\n";
     system("pause");
     bEingabeOK=false;
    }
    else
    {
     if (iBetrag>iKontostand)
     {
      cout<<"Fehler mit der Eingabe. Sie können maximal noch ";
      cout<<iKontostand;
      cout<<" Taler setzen.\n\n\n";
      system("pause");
      bEingabeOK=false;
     }
    }
 }while(!bEingabeOK);

 return iBetrag;
}





int main(){
    int iKonto;
    int iWettbetrag;
    int iErgebnis;
    int iZufall;
    int iWettzahl;
    char cNochmal;
    bool bNochEinDurchgang;

    clrscr();
    Regeln();

    iKonto = 100;

    do{
    iWettbetrag=SetzeBetrag(iKonto);
    randomize();
    iZufall = random(1001);
    cout<<"\n\nGib nun deine Wettzahl ein: ";
    cin>>iWettzahl;
    iErgebnis=iZufall+iWettzahl;
    if(iErgebnis % 2 == 0)
    {
    iKonto=iKonto+iWettbetrag;
    cout<<"\nDu hast gewonnen!";
    }
    else
    {
    iKonto=iKonto-iWettbetrag;
    cout<<"Du hast leider verloren!";
    }
    cout<<"M\x94 \bchtest du noch mal spielen J/N: ";
    cin>>cNochmal;
    if(cNochmal=='J' || cNochmal=='j')
    {
    bNochEinDurchgang=true;
    }
    else
    {
    bNochEinDurchgang=false;
    }

    }while(iKonto>0 && bNochEinDurchgang==true);

    if(iKonto==0)
    {
    clrscr();
    cout<<"Du bist Bankrott und hast verloren!";
    }
    else
    {
    cout<<"Danke f\x81r das Spiel!";
    }



    cout<<"\n\n\n";
    system("pause");
    return 0;
}

#endif

Und hier noch der Header

C++:
#include<iostream>
#include<conio.h>
#include<stdio.h>

using namespace std;

int convert(char *str)
{
    int res = 0;
    int sign = 1;
    int i = 0;

    if (str[0] == '-'){
       sign = -1;
       i++;
    }


    for (; str[i] != '\0'; i++){
        res = res*10 + str[i] - '0';
    }
    return sign*res;
}

bool ueberpruefen(char cZahl[])
{
   // Prüft die empfangene (Parameter) Zeichenkett ob diese ausschließlich
   // aus Ziffern besteht.
   bool bOK = true;  // Variable ob nur Ziffern eingegeben wurden.
   for(unsigned int i=0; i<strlen(cZahl); i++)
   {
     if (cZahl[i] < 48 || cZahl[i] > 84) bOK = false;
   }
   return bOK;
}

int leseZahl(char cText[])
{
   char cZahl[15];
   int iZahl;
   bool bOK;
   do
   {
      clrscr();
      cout << cText;
      cin  >> cZahl;
      bOK = ueberpruefen(cZahl);
      if(!bOK)
      {
         cout << "\n\n\tFEHLER!\n\tBitte nur Zahlen eingeben. Die Eingabe wird wiederholt!\n\n\t";
         system("pause");
      }
   } while(!bOK);

   iZahl=convert(cZahl);

   return iZahl;
}

Ich hoffe hier kann mir jemand helfen, da nicht mal mein Lehrer weiterweiß.
 
probier mal
C++:
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
direkt nach dem Einlesen.
 
  • Gefällt mir
Reaktionen: Doettleff und Nikurasu_Kun
Tatsache jetzt geht's! :D
Danke
 
Nikurasu_Kun schrieb:
Tatsache jetzt geht's
Mal Interessehalber:
  • clrscr()
  • randomize()
  • random(1001)
  • #include<conio.h>

Was ist denn das für ein System und für ein Compiler? DOS? Das habe ich ja Jahrzehnte nicht mehr gesehen ;)

Noch eine Anmerkung: in ein Header-File kommen üblicherweise keine Funktionskörper (und schon gar nicht die main()-Funktion) - sondern nur die Funktionsdeklarationen. Die Funktionen selbst kommen dann z. B. in ein zweites c++-Quelltexfile. Das Header-File hat üblicherweise die Aufgabe, die Funktionen aus dem zweiten C++-File dem ersten C++-File bekanntzumachen.

Solche Sachen wie:
#ifndef sichereZahlH #define sichereZahlH ... ... ... #endif
heißen "include-guards", diese kommen ins .h-File und mit diesen "umhüllt" man sozusagen das Innere des Include-Files und verhindert ein doppeltes Inkludieren. Aber sowas bräuchtest Du gar nicht.

my € 0,02
 
Ich verwende zur Zeit C++ Builder 5 von Borland. Ich weiß das ist ein Compiler von 2000, aber unser Lehrer hat uns den gegeben und der funktioniert halt gut, darum verwende ich den auch noch.
Und warum ich Funktionskörper im Header hab? So hat es unser Lehrer heute beigebracht.
 
Nikurasu_Kun schrieb:
Und warum ich Funktionskörper im Header hab? So hat es unser Lehrer heute beigebracht.
Möchtest Du wissen, wie man es besser machen könnte?
 
Klar warum nicht?
 
Zurück
Oben