Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Lottospiel

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.12.2009, 00:03 Uhr
Pamina



ähm ich hab schon wieder ne andere frage, es tut mir echt leid...
es ist nicht so das ich es nicht versuche aber da tauchen teilweise probleme auf wo ich einfach nicht weiterkomme,
so jetzt auch wieder...
hab mir zwar schon zig sachen aus dem inet zusammengesucht umgeschrieben selsbt geschrieben etc und das programm läuft auch aber halt nicht richtig.

es geht um folgendes :


Code:
Es soll ein Programm zum virtuellen Lottospielen implementiert werden. Die Gewinnzahlen sollen
nach dem bekannten 6 aus 49 System gezogen werden. Eine Zusatzzahl gibt es nicht. Das
Programm soll folgendermaen vorgehen:
 Der Spieler entscheidet zu Beginn, wieviele Tipps er abgeben will.
 Das Programm fragt, Zahl fur Zahl, jeden Tipp ab und speichert die Tipps in einem 2DArray.
 Die Gewinnzahlen werden per Zufallsgenerator gezogen.
 Das Programm gibt aus, wieviele 2er, 3er, 4er, 5er und 6er der Spieler getroen hat.





wo muss ich denn ne schleife starten damit er verschiedene tipps eingeben und ausgeben kann???




C++:

/* Übungsblatt 3 Aufgabe 2; Pamina Riedel, Annika Wiedemann
Lottoprogramm */


#include<iostream>
#include<ctime>

using namespace std;


class Lotto
{
public:
    Lotto();
    int zahlen_einlesen();
    void zahlen_auslesen();
    void loto_zahlen();
    void zahlen_vergleichen();
private:
    int zahlen[6];
    int Lzahlen[6];

};


Lotto::Lotto()
{
    int j=0;
    do
    {
        zahlen[j]=0;
        Lzahlen[j]=0;
        j++;
    }while(j<6);
}


int Lotto::zahlen_einlesen()
{
    int i=0;
    cout<<"Bitte geben sie ihre 6 Lottozahlen ein"<<endl<<endl;
    do
    {
        cout<<"Bitte geben sie die "<<i+1<<". Zahl ein:" << endl;
        cin>>zahlen[i];
        if(zahlen[i]>49||zahlen[i]<0)
        {
            cout<<"Die Zahl muss zwischen 0 und 49 sein !!!" << endl;
        }
        else
        {
        i++;
        }
    }while(i<6);
    return 0;
}

void Lotto::loto_zahlen()
{
    int l=0;

    srand(0);
    bool neueZahl;
    for(l=0; l<6; l++) // ziehe nacheinander sechs Zahlen
    {
        do  // wiederhole die Ziehung, bis die neue Zahl
        {   // nicht mit einer der vorigen identisch ist.
            Lzahlen[l] = rand() % 49 + 1;
            neueZahl = true; // positive Grundeinstellung
            int j;
            

            for (j=0; j<l; j++)
            {  // durchlaufe alle bisher gezogenen Kugeln
                if (Lzahlen[j]==Lzahlen[l])
                { // Hier wurde ein Doppelter entdeckt
                    neueZahl = false;
                }
            }
        } while (!neueZahl);
    }

}

void Lotto::zahlen_auslesen()
{
    

    cout<<endl;
    cout<<"Ihre geratenen Zahlen" << endl;
    cout<<endl;
    for(int k=0;k<6;k++)
    {
    cout<<"Die "<<k+1<<". Zahl:"<<zahlen[k]<< "" << endl;
    }
    cout<<endl;
    cout<<endl;
    cout<<"Die Lottozahlen"<< endl;
    cout<<endl;

        int k;

    for(k=0;k<6;k++)
    {
    cout<<"Die "<<k+1<<". Zahl: "<<Lzahlen[k]<< ""<<endl;
    }
    cout<<endl;

    
}

void Lotto::zahlen_vergleichen()
{
    int j,p=0,i=0;
    do
    {
        j=0;

        do
        {
            if(zahlen[i]==Lzahlen[j])
            {
            p++;
            }
                
        j++;
        }while(j<6);
    i++;
    }while(i<6);

        cout<<"Sie haben "<<p<<" Zahlen richtig" << endl;




    getchar();getchar();

}





void main()
{
    Lotto Game;
    cout<<"Lotto"<< endl;
    Game.zahlen_einlesen();
    Game.loto_zahlen();

    //sort.zahlen_sortieren();


    Game.zahlen_auslesen();
        Game.zahlen_vergleichen();
    
    

}



Dieser Post wurde am 20.12.2009 um 00:11 Uhr von Pamina editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.12.2009, 00:20 Uhr
Pamina



ähm sorry am anfang steht natürlich

srand( (unsigned)time( NULL ) );

nicht srand(0);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.12.2009, 00:38 Uhr
0xdeadbeef
Gott
(Operator)


Wenn ich jetzt richtig verstehe, worauf du hinaus willst, dann wäre das wohl in der main am sinnvollsten. Pack den ganzen Kram, der jetzt in der main steht, in die Schleife, frag den Benutzer außerdem, ob er noch mal tippen will, und geh aus der Schleife, wenn das nicht der Fall ist.

Übrigens, zwei Anmerkungen:

1. main kann nicht void sein. Der Standard verlangt ausdrücklich, dass main int als Rückgabewert hat; garantierte Signaturen sind

C++:
int main();
int main(int argc, char *argv[]);


die zweite muss dich vermutlich noch nicht wirklich kümmern - es geht dabei um Kommandozeilenparameter - aber void main() haut dir jeder neuere Compiler um die Ohren. Sofern nicht anders angegeben, gibt main (aber auch nur main; das gilt nicht für andere int-Funktionen!) 0 zurück, was von der umgebenden Shell als erfolgreicher Programmverlauf gewertet wird. Alles andere ist üblicherweise ein Fehlercode.

2. Gewöhn dir die alten C-Casts am besten gar nicht erst an; sie sind Brachialcasts, die zum Beispiel auch cv-Qualifier wegcasten können. Es ist sehr leicht, damit Unfug zu bauen. Besser heißt das

C++:
srand(static_cast<unsigned>(time(0)));


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 20.12.2009 um 00:40 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.12.2009, 12:27 Uhr
Pamina



ah ok das mit dem srand hatte ich mir aus dem inet gesucht hatten dsa noch nicht und da hab ich wohl was altes gefunden, danke!



bei dem void hab ich mich wohl vertippt
danke!


das mit der schleife muss ich dann erstmal ausprobieren, dankeschön
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.12.2009, 12:35 Uhr
Pamina



Also das mit der Schleife fuktioniert prinzipiell, nur leider gibt er mir nicht die ergebnisse vom ersten tipp raus
woran liegt das jetzt schon wieder???


C++:


#include<iostream>
#include<ctime>
using namespace std;
class Lotto
{
public:
  Lotto();
  int zahlen_einlesen();
  void zahlen_auslesen();
  void loto_zahlen();
  void zahlen_vergleichen();
private:
  int zahlen[6];
  int Lzahlen[6];
};
Lotto::Lotto()
{
  int j=0;
  do
  {
  zahlen[j]=0;
  Lzahlen[j]=0;
  j++;
  }
  while(j<6);
}
int Lotto::zahlen_einlesen()
  {
  int i=0;
  cout<<"Bitte geben Sie ihre 6 Lottozahlen ein"<<endl<<endl;
  do
  {
  cout<<"Bitte geben Sie die "<<i+1<<". Zahl ein:" << endl;
  cin>>zahlen[i];
  if(zahlen[i]>49||zahlen[i]<0)
  {
  cout<<"Die Zahl muss zwischen 0 und 49 sein !!!" << endl;
  }
  else
  {
  i++;
  }
  }
  while(i<6);
return 0;
}
void Lotto::loto_zahlen()
  {
  int l=0;
  bool neueZahl;
srand(static_cast<unsigned>(time(0)));
  for(l=0; l<6; l++) // ziehe nacheinander sechs Zahlen
  {
  do // wiederhole die Ziehung, bis die neue Zahl
  { // nicht mit einer der vorigen identisch ist.
  Lzahlen[l] = rand() % 49 + 1;
  neueZahl = true; // positive Grundeinstellung
  int j;
  for (j=0; j<l; j++)
  { // durchlaufe alle bisher gezogenen Kugeln
  if (Lzahlen[j]==Lzahlen[l])
  { // Hier wurde ein Doppelter entdeckt
  neueZahl = false;
  }
  }
  }
  while (!neueZahl);
  }
}
void Lotto::zahlen_auslesen()
  {
  cout<<endl;
  cout<<"Ihre geratenen Zahlen" << endl;
  cout<<endl;
  for(int k=0;k<6;k++)
  {
  cout<<"Die "<<k+1<<". Zahl:"<<zahlen[k]<< "" << endl;
  }
  cout<<endl;
  cout<<endl;
  cout<<"Die Lottozahlen"<< endl;
  cout<<endl;
  int k;
  for(k=0;k<6;k++)
  {
  cout<<"Die "<<k+1<<". Zahl: "<<Lzahlen[k]<< ""<<endl;
  }
  cout<<endl;
}
void Lotto::zahlen_vergleichen()
{
  int j,p=0,i=0;
  do
  {
  j=0;
  do
  {
  if(zahlen[i]==Lzahlen[j])
  {   p++;
  }
  j++;
  }
  while(j<6);
  i++;
  }
  while(i<6);
  cout<<"Sie haben "<<p<<" Zahlen richtig" << endl;
  cout<<"Bitte druecken Sie 'Enter'!"<< endl;
getchar();getchar();
}
int main()
{
  Lotto Game;
cout<<"Lotto"<< endl;
cout <<"Wie viele Tipps moechten Sie abgeben?"<< endl;
cout<<""<< endl;
int x=0;
cin>>x;
  for (int o=1;o<=x;o++)//die Schleife wird so oft durchlaufen, wie Tipps gewünscht sind
  {
  cout<<"Bitte geben Sie den " <<o<<". Tipp ab!"<< endl;
  cout<<""<< endl;
  Game.zahlen_einlesen();
  Game.loto_zahlen();
  //sort.zahlen_sortieren();
  }
  for (int c=0;c<=x;c++)
  {
  Game.zahlen_auslesen();
  Game.zahlen_vergleichen();
  }
return 0;
}



Dieser Post wurde am 20.12.2009 um 12:35 Uhr von Pamina editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.12.2009, 15:51 Uhr
ao

(Operator)


... und noch ne Kleinigkeit, mal eben beim Durchblättern aufgefallen

C++:
  if(zahlen[i]>49||zahlen[i]<0)
  {
  cout<<"Die Zahl muss zwischen 0 und 49 sein !!!" << endl;
  }


Lottozahlen sind von 1 bis 49, du lässt hier aber auch 0 zu.

Für die wirklich wichtigen Fragen muss man sich das Ganze zu Gemüte führen. Vielleicht später.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.12.2009, 09:51 Uhr
ao

(Operator)


Hallo Pamina,

deine Ablauflogik hat Fehler, zumindest, wenn das das Lotto sein soll, das man aus dem Fernsehen kennt.

Es beginnt mit "Wieviele Tipps?", du antwortest, sagen wir, mit N.

Danach fragt das Programm einen Tipp ab und zieht anschließend die Lottozahlen, das Ganze N-mal.

Hast du schon mal einen Lottoschein gesehen? Da sind 8 (glaube ich) Kolonnen drauf, du kannst also 1 bis 8 Tipps abgeben, danach richtet sich, wie teuer der Einsatz ist. Am Wochenende werden einmal 6 Gewinnzahlen gezogen und mit den Tipps verglichen. Also alle Tipps mit denselben Gewinnzahlen.


Und tu dir und dem Rest der Welt einen Gefallen und verwende selbsterklärende Variablennamen.

zahlen [] und Lzahlen[] sind sich zu ähnlich, um dem Leser den Unterschied klarzumachen. Vorschlag: tipp[] und gewinnzahlen[]

Die Indexvariable jedesmal anders zu taufen (i, k, l, o, p, ...) ist verwirrend und unnötig. Es ist kein Zeichen von mangelnder Kreativität, immer i zu verwenden.

Und wenn man zwei oder mehr Indexvariablen gleichzeitig braucht (geschachtelte Schleifen), kann es die Lesbarkeit verbessern, wenn du die Indexvariablen nach dem Objekt benennst, das mit ihnen iteriert wird, also z.B. iTipp oder iGewinnzahl.

Dieser Post wurde am 21.12.2009 um 11:31 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.12.2009, 09:57 Uhr
ao

(Operator)


So, jetzt bin ich bis zu deiner Frage vorgedrungen.


Zitat:
nur leider gibt er mir nicht die ergebnisse vom ersten tipp raus
woran liegt das jetzt schon wieder???


Du hast nur eine Instanz vom Objekt Lotto (namens Game). Die überschreibst du N-mal mit einem neuen Tipp. Gespeichert wird immer nur der letzte Tipp. Und der wird am Ende (N+1)-mal ausgegeben (die Ausgabeschleife läuft von 0 bis x, einschließlich).

Übrigens, hat dein Entwicklungssystem einen Sourcecode-Debugger? Seeeeehr nützliches Tool, solltest du unbedingt bedienen können. Solche Strukturfehler wie hier findet man damit im Handumdrehen - was meinst du, womit ich dein Programm untersucht habe?

Gibts eigentlich keine Informatik-Dozenten, die ihren Studis gleich in der ersten Programmierübung erklären, wie man debuggt?

Dieser Post wurde am 21.12.2009 um 10:02 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.12.2009, 17:25 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ao:

Gibts eigentlich keine Informatik-Dozenten, die ihren Studis gleich in der ersten Programmierübung erklären, wie man debuggt?

man könnte leider meinen, das die meisten dozenten das wort auch nur aus büchern kennen

aber ein paar gibts schon die das wenigstens nach 2-3 vorlesungen erwähnen ;-)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.12.2009, 20:17 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von ao:

Gibts eigentlich keine Informatik-Dozenten, die ihren Studis gleich in der ersten Programmierübung erklären, wie man debuggt?


Obwohl es bei mir auch schon eine Weile her ist, kann ich mich nicht erinnern, den Begriff je in einer Übung gehört zu haben. Da ein solcher aber bereits in der IDE vorhanden war, und in der Onlinehilfe erwähnt, hab ihn auf diesem Weg kennen und schätzen gelernt.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 21.12.2009 um 20:20 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: